packages feed

yaml-unscrambler-0.1.0.18: test/Main.hs

module Main where

import qualified Control.Foldl as Fold
import qualified Data.Text as Text
import qualified NeatInterpolation as NeatInterpolation
import Test.QuickCheck.Instances ()
import Test.Tasty
import Test.Tasty.HUnit
import qualified YamlUnscrambler as U
import Prelude hiding (assert)

main :: IO ()
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
      ]