module Data.Yaml.Marked.InternalSpec
( spec
) where
import Prelude
import qualified Data.Aeson as Aeson
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as BS8
import Data.Foldable (traverse_)
import qualified Data.Yaml as Yaml
import Data.Yaml.Marked
import Data.Yaml.Marked.Decode
import Data.Yaml.Marked.Parse
import Test.Hspec
import Test.Hspec.Expectations.Json
spec :: Spec
spec = do
context "matching Data.Yaml.decode" $ do
decodeTestCases
[ "x: 1e-100000"
, "x: 9.78159610558926e-5"
, "12345"
, "+12345"
, "0o14"
, "0o123"
, "0xC"
, "0xc"
, "0xdeadBEEF"
, "0xDEADBEEF"
, "1.23015e+3"
, "12.3015e+02"
, "1230.15"
, "---\na:\n &id5 value: 1.0\nb:\n *id5: 1.2"
, "foo:\n - &anchor bin1\n - bin2\n - bin3"
, "foo: &anchor\n - bin1\n - bin2\n - bin3"
, "foo: &anchor\n key1: bin1\n key2: bin2\n key3: bin3"
, "foo: &anchor\n key1: bin1\n key2: bin2\n key3: bin3\nboo: *anchor"
, "foo: !bar\n k: v\n k2: v2"
, "foo: !\n k: v\n k2: v2"
, "foo: !bar [x, y, z]"
, "foo: ! [x, y, z]"
, "foo: [x, y, z]"
, "foo:\n- x\n- y\n- z\n"
, "foo: { bar: 1, baz: 2 }"
, "foo: bar\nbaz: quux"
, "foo:\n baz: [bin1, bin2, bin3]\nbaz: bazval"
, "m1: &m1\n k1: !!str 1\n k2: !!str 2\nm2: &m2\n k1: !!str 3\n k3: !!str 4\nfoo1: foo\n<<: [ *m1, *m2 ]"
, "- &anch foo\n- baz\n- *anch"
, "seq: &anch\n - foo\n - baz\nseq2: *anch"
, "map: &anch\n key1: foo\n key2: baz\nmap2: *anch"
, "- &anch foo\n- baz\n- *anch\n- &anch boo\n- buz\n- *anch"
, "foo1: foo\nfoo2: baz\nfoo1: buz"
, "foo1: foo\nfoo2: baz\n<<:\n foo1: buz\n foo3: fuz"
, "m1: &m1\n k1: !!str 1\n k2: !!str 2\nm2: &m2\n k1: !!str 3\n k3: !!str 4\nfoo1: foo\n<<: [ *m1, *m2 ]"
, "foo: \"1234\""
, "foo: 1234"
, "foo: !!str 1234"
, "1\n"
, "foo: off\nbar: y\nbaz: true"
, "foo: FALSE\nbar: Y\nbaz: ON"
, "foo: No\nbar: Yes\nbaz: True"
, "Default: &def\n foo: 1\n bar: 2\nObj:\n <<: *def\n key: 3\n"
, "null"
, "Null"
, "NULL"
, "~"
, ""
, "# comment\n"
]
context "matching Data.Yaml.decodeAll" $ do
decodeAllTestCases
[ ""
, "# foo\n# bar"
, "foo: true"
, "--- 1\n--- 2"
]
context "decode failing" $ do
decodeFailTestCases
[ " - foo\n - baz\nbuz"
, "\tthis is 'not' valid :-)"
, "map: *anch\nmap2: &anch\n key1: foo\n key2: baz"
, "map: &anch\n key1: foo\n key2: *anch"
]
decodeTestCases :: [ByteString] -> Spec
decodeTestCases = traverse_ $ \yaml -> do
it ("for " <> toDocStringYaml yaml) $ do
expected <- Yaml.decodeThrow yaml
actual <- decodeThrow value "" yaml
expected `shouldBeJson` markedItem actual
decodeAllTestCases :: [ByteString] -> Spec
decodeAllTestCases = traverse_ $ \yaml -> do
it ("for " <> toDocStringYaml yaml) $ do
expected <- Yaml.decodeAllThrow @_ @Aeson.Value yaml
actual <- decodeAllThrow value "" yaml
Aeson.toJSON expected `shouldBeJson` Aeson.toJSON (map markedItem actual)
decodeFailTestCases :: [ByteString] -> Spec
decodeFailTestCases = traverse_ $ \yaml -> do
it ("for " <> toDocStringYaml yaml) $ do
Yaml.decodeThrow @Maybe @Aeson.Value yaml `shouldBe` Nothing
decodeThrow value "" yaml `shouldBe` Nothing
toDocStringYaml :: ByteString -> String
toDocStringYaml yaml = show truncated
where
truncated
| BS8.length yaml > limit = (<> "...") $ BS8.take (limit - 3) yaml
| otherwise = yaml
limit = 50