1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
import Control.Monad (unless)
import Data.Aeson (Value (..), eitherDecode, encode)
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString as B
import Data.Ipynb
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Encoding as TE
import qualified Data.Text.Lazy.Encoding as TLE
import Lens.Micro
import Lens.Micro.Aeson
import System.Directory
import System.FilePath
import Test.Tasty
import Test.Tasty.HUnit
import Data.Monoid
main :: IO ()
main = do
let rtdir = "test" </> "rt-files"
createDirectoryIfMissing False rtdir
fs <- map (rtdir </>) . filter isIpynb <$> getDirectoryContents rtdir
defaultMain $ testGroup "round-trip tests" $ map rtTest fs
isIpynb :: FilePath -> Bool
isIpynb fp = takeExtension fp == ".ipynb"
rtTest :: FilePath -> TestTree
rtTest fp = testCase fp $ do
inRaw <- BL.readFile fp
let format = inRaw ^? key "nbformat" . _Number
case format of
Just 4 -> rtTest4 inRaw
_ -> rtTest3 inRaw
rtTest3 :: BL.ByteString -> IO ()
rtTest3 inRaw = do
(nb :: Notebook NbV3) <- either error return $ eitherDecode inRaw
let outRaw = encode nb
(nb' :: Notebook NbV3) <- either error return $ eitherDecode outRaw
-- test that (write . read) == id
assertEqual "write . read != read" nb nb'
rtTest4 :: BL.ByteString -> IO ()
rtTest4 inRaw = do
(nb :: Notebook NbV4) <- either error return $ eitherDecode inRaw
let outRaw = encode nb
(nb' :: Notebook NbV4) <- either error return $ eitherDecode outRaw
-- test that (write . read) == id
assertEqual "write . read != read" nb nb'
|