{-# Language OverloadedStrings #-}
{-|
Module : Main
Description : Unit tests for config-schema
Copyright : (c) Eric Mertens, 2017
License : ISC
Maintainer : emertens@gmail.com
-}
module Main (main) where
import Config
import Config.Schema
import Control.Applicative
import Data.Foldable
import Data.Text (Text)
import qualified Data.Text as Text
-- tests that are expected to pass.
--
-- The input sources are a list of lists of lines. Each outer list
-- element contains a list of lines representing a complete input
-- source. Each of these variations must pass the test.
test ::
Show a =>
Eq a =>
ValueSpecs a {- ^ specification to match -} ->
a {- ^ expected output -} ->
[[Text]] {- ^ inputs sources -} ->
IO ()
test spec expected txtss =
for_ txtss $ \txts ->
case parse (Text.unlines txts) of
Left e -> fail (show e)
Right v ->
case loadValue spec v of
Left e -> fail (show e)
Right x | x == expected -> return ()
| otherwise -> fail ("Got " ++ show x ++ " but expected " ++
show expected)
main :: IO ()
main = sequenceA_
[ test valuesSpec ("Hello world"::Text)
[["\"Hello world\""]
,["\"H\\101l\\&l\\o157 \\"
," \\w\\x6frld\""]
]
, test valuesSpec (1234::Integer)
[["1234"]
,["1234.0"]
]
, test valuesSpec (0.65::Rational)
[["0.65e0"]
,["65e-2"]
,["6.5e-1"]
,["0.65"]
]
, test anyAtomSpec "default"
[["default"]]
, test (atomSpec "testing-1-2-3") ()
[["testing-1-2-3"]]
, test (listSpec valuesSpec) ([]::[Integer])
[["[]"]
,["[ ]"]]
, test (listSpec anyAtomSpec) ["ḿyatoḿ"]
[["[ḿyatoḿ]"]
,[" [ ḿyatoḿ ] "]
,["* ḿyatoḿ"]
]
, test valuesSpec [1,2,3::Int]
[["[1,2,3]"]
,["[1,2,3,]"]
,["* 1"
,"* 2"
,"* 3"]
]
, test (listSpec valuesSpec) [[1,2],[3,4::Int]]
[["[[1,2,],[3,4]]"]
,["*[1,2]"
,"*[3,4]"]
,["**1"
," *2"
,"* *3"
," *4"
]
]
, test (assocSpec valuesSpec) ([]::[(Text,Int)])
[["{}"]
,["{ }"]
]
, test (assocSpec valuesSpec) [("k1",10::Int), ("k2",20)]
[["{k1: 10, k2: 20}"]
,["{k1: 10, k2: 20,}"]
,["k1 : 10"
,"k2: 20"]
]
, test valuesSpec [ Left (1::Int), Right ("two"::Text) ]
[["[1, \"two\"]"]
,["* 1"
,"* \"two\""]
]
, test (sectionsSpec "test"
(liftA2 (,) (reqSection "k1" "") (reqSection "k2" "")))
(10 :: Int, 20 :: Int)
[["k1: 10"
,"k2: 20"]
,["k2: 20"
,"k1: 10"]
]
, test (sectionsSpec "test"
(liftA2 (,) (optSection "k1" "") (reqSection "k2" "")))
(Just 10 :: Maybe Int, 20 :: Int)
[["k1: 10"
,"k2: 20"]
,["k2: 20"
,"k1: 10"]
]
, test (sectionsSpec "test"
(liftA2 (,) (optSection "k1" "") (reqSection "k2" "")))
(Nothing :: Maybe Int, 20 :: Int)
[["k2: 20"]
,["{k2: 20}"]
]
-- This isn't a good idea, but it currently works
, test (sectionsSpec "test"
(liftA2 (,) (reqSection "k1" "") (reqSection "k1" "")))
("first"::Text, 50::Int)
[["k1: \"first\""
,"k1: 50"]
]
, test (sectionsSpec "test" (pure ())) ()
[["{}"]
]
]