module Main where import qualified Control.Foldl as Fold import qualified Data.Text as Text import GHC.Exts (fromList) import qualified NeatInterpolation as NeatInterpolation import qualified Test.QuickCheck as QuickCheck import Test.QuickCheck.Instances import Test.Tasty import Test.Tasty.HUnit import Test.Tasty.QuickCheck import Test.Tasty.Runners import qualified YamlUnscrambler as U import Prelude hiding (assert) main = defaultMain $ testGroup "All tests" [ testCase "Should fail on sequence when no sequence is specified" $ let unscrambler = U.value [] (Just mapping) Nothing where mapping = U.foldMapping (,) Fold.list U.textString value where value = U.value [nullScalar, intScalar] Nothing Nothing where nullScalar = U.nullScalar Nothing intScalar = fmap Just $ U.boundedIntegerScalar @Int (U.Signed True) U.DecimalNumeralSystem input = [NeatInterpolation.text| a: 2 b: 3 c: - 1 - 2 |] in case U.parseText unscrambler input of Right res -> assertFailure (show res) Left failure -> assertEqual (Text.unpack failure) "Error at path /c. Unexpected sequence value" failure, testCase "Domain sum-type regression" $ let unscrambler = doc where doc = U.mappingValue $ U.byKeyMapping (U.CaseSensitive True) $ asum [ Just <$> U.atByKey "sums" sum, pure Nothing ] sum = U.mappingValue $ U.foldMapping (,) Fold.list U.textString sumVariant sumVariant = U.mappingValue $ U.foldMapping (,) Fold.list U.textString params params = U.value [nullScalar, intScalar] Nothing Nothing where nullScalar = U.nullScalar Nothing intScalar = fmap Just $ U.boundedIntegerScalar @Int (U.Signed True) U.DecimalNumeralSystem input = [NeatInterpolation.text| sums: A: a: - Int - Bool b: Char, Double |] in case U.parseText unscrambler input of Right res -> assertFailure (show res) Left failure -> assertEqual "" "Error at path /sums/A/a. Unexpected sequence value" failure, testCase "Domain sum-type correct" $ let unscrambler = doc where doc = U.mappingValue $ U.byKeyMapping (U.CaseSensitive True) $ asum [ Just <$> U.atByKey "sums" sum, pure Nothing ] sum = U.mappingValue $ U.foldMapping (,) Fold.list U.textString sumVariant sumVariant = U.mappingValue $ U.foldMapping (,) Fold.list U.textString params params = U.value [nullScalar, valueScalar] Nothing Nothing where nullScalar = U.nullScalar Nothing valueScalar = fmap Just $ U.stringScalar U.textString input = [NeatInterpolation.text| sums: A: a: Text b: Int |] in case U.parseText unscrambler input of Right res -> assertEqual "" (Just [("A", [("a", Just "Text"), ("b", Just "Int")])]) res Left failure -> assertFailure (Text.unpack failure), testCase "Scalar errors are readable" $ let unscrambler = doc where doc = U.mappingValue $ U.byKeyMapping (U.CaseSensitive True) $ asum [ Just <$> U.atByKey "sums" sum, pure Nothing ] sum = U.mappingValue $ U.foldMapping (,) Fold.list U.textString sumVariant sumVariant = U.mappingValue $ U.foldMapping (,) Fold.list U.textString params params = U.value [nullScalar, intScalar] Nothing Nothing where nullScalar = U.nullScalar Nothing intScalar = fmap Just $ U.boundedIntegerScalar @Int (U.Signed True) U.DecimalNumeralSystem input = [NeatInterpolation.text| sums: A: a: Int b: Char |] in case U.parseText unscrambler input of Right res -> assertFailure (show res) Left failure -> assertEqual "" "Error at path /sums/A/a. Expecting one of the following formats: null, signed decimal. Got input: \"Int\"" failure ]