nbparts-0.1.0.0: tests/Tests/Types/OutputsSpec.hs
module Tests.Types.OutputsSpec where
import Control.Arrow (left)
import Data.Aeson qualified as Aeson
import Data.Text (Text)
import Data.Yaml qualified as Yaml
import Hedgehog (Gen, forAll, tripping)
import Hedgehog.Gen qualified as Gen
import Hedgehog.Range qualified as Range
import Nbparts.Types.Outputs
( UnembeddedCellOutput (DisplayData, Err, ExecuteResult, Stream),
UnembeddedNotebookOutputs (UnembeddedNotebookOutputs),
)
import Test.Hspec (Spec, describe, it)
import Test.Hspec.Hedgehog (hedgehog)
import Tests.Types.MetadataSpec (genJSONMeta)
import Tests.Types.MimeSpec (genUnembeddedMimeBundle)
import Tests.Types.SourcesSpec (genCellId)
genStreamName :: Gen Text
genStreamName = Gen.element ["stdout", "stderr"]
genUnembeddedCellOutput :: Gen UnembeddedCellOutput
genUnembeddedCellOutput =
Gen.choice
[ Stream <$> genStreamName <*> Gen.list (Range.linear 0 5) (Gen.text (Range.linear 1 100) Gen.unicode),
DisplayData <$> genUnembeddedMimeBundle <*> genJSONMeta,
ExecuteResult <$> Gen.int (Range.linear 0 100) <*> genUnembeddedMimeBundle <*> genJSONMeta,
Err
<$> Gen.text (Range.linear 10 20) Gen.unicode
<*> Gen.text (Range.linear 30 50) Gen.unicode
<*> Gen.list (Range.linear 0 5) (Gen.text (Range.linear 30 50) Gen.unicode)
]
genUnembeddedNotebookOutputs :: Gen UnembeddedNotebookOutputs
genUnembeddedNotebookOutputs =
UnembeddedNotebookOutputs
<$> Gen.map
(Range.linear 0 3)
((,) <$> genCellId <*> Gen.list (Range.linear 0 3) genUnembeddedCellOutput)
spec :: Spec
spec = do
describe "UnembeddedCellOutput" $ do
it "JSON roundtrip" $ hedgehog $ do
out <- forAll genUnembeddedCellOutput
tripping out Aeson.encode Aeson.decode
it "YAML roundtrip" $ hedgehog $ do
out <- forAll genUnembeddedCellOutput
tripping out Yaml.encode (left (const ()) . Yaml.decodeEither')
describe "UnembeddedNotebookOutputs" $ do
it "JSON roundtrip" $ hedgehog $ do
outs <- forAll genUnembeddedNotebookOutputs
tripping outs Aeson.encode Aeson.decode
it "YAML roundtrip" $ hedgehog $ do
outs <- forAll genUnembeddedNotebookOutputs
tripping outs Yaml.encode (left (const ()) . Yaml.decodeEither')