packages feed

yaml-0.2.0: runtests.hs

import Test.Framework (defaultMain)

import Text.Libyaml
import qualified Data.ByteString.Char8 as B8
import Control.Monad.Trans

--import Test.Framework (testGroup, Test)
import Test.Framework.Providers.HUnit
--import Test.Framework.Providers.QuickCheck (testProperty)
import Test.HUnit hiding (Test, path)
--import Test.QuickCheck

main :: IO ()
main = defaultMain
    [ testCase "count scalars" caseCountScalars
    , testCase "largest string" caseLargestString
    , testCase "encode/decode" caseEncodeDecode
    , testCase "encode/decode file" caseEncodeDecodeFile
    , testCase "interleaved encode/decode" caseInterleave
    ]

caseCountScalars :: Assertion
caseCountScalars = do
    res <- decode yamlBS $ counter accum
    res @?= (7, 1, 2)
    where
        yamlString = "foo:\n  baz: [bin1, bin2, bin3]\nbaz: bazval"
        yamlBS = B8.pack yamlString
        counter (s, l, m) = do
            e <- parseEvent
            case e of
                EventScalar {} -> counter (s + 1, l, m)
                EventSequenceStart -> counter (s, l + 1, m)
                EventMappingStart -> counter (s, l, m + 1)
                EventNone -> return (s, l, m)
                _ -> counter (s, l, m)
        accum = (0, 0, 0) :: (Int, Int, Int)

caseLargestString :: Assertion
caseLargestString = do
    res <- decodeFile filePath $ dec accum
    res @?= (length expected, expected)
    where
        expected = "this one is just a little bit bigger than the others"
        filePath = "test/largest-string.yaml"
        dec (i, s) = do
            e <- parseEvent
            case e of
                (EventScalar bs _ _) -> do
                    let s' = B8.unpack bs
                        i' = length s'
                    dec $ if i' > i then (i', s') else (i, s)
                EventNone -> return (i, s)
                _ -> dec (i, s)
        accum = (0, "no strings found")

caseEncodeDecode :: Assertion
caseEncodeDecode = do
    eList <- decode yamlBS $ dec id
    bs <- encode $ mapM_ emitEvent eList
    eList2 <- decode bs $ dec id
    map MyEvent eList @=? map MyEvent eList2
    where
        yamlString = "foo: bar\nbaz:\n - bin1\n - bin2\n"
        yamlBS = B8.pack yamlString
        dec front = do
            e <- parseEvent
            case e of
                EventNone -> return $ front []
                _ -> dec $ front . (:) e

caseEncodeDecodeFile :: Assertion
caseEncodeDecodeFile = do
    eList <- decodeFile filePath $ dec id
    encodeFile tmpPath $ mapM_ emitEvent eList
    eList2 <- decodeFile filePath $ dec id
    map MyEvent eList @=? map MyEvent eList2
    where
        filePath = "test/largest-string.yaml"
        tmpPath = "tmp.yaml"
        dec front = do
            e <- parseEvent
            case e of
                EventNone -> return $ front []
                _ -> dec $ front . (:) e

newtype MyEvent = MyEvent Event deriving Show
instance Eq MyEvent where
    (MyEvent (EventScalar s t _)) == (MyEvent (EventScalar s' t' _)) =
        s == s' && t == t'
    MyEvent e1 == MyEvent e2 = e1 == e2

caseInterleave :: Assertion
caseInterleave = do
    decodeFile filePath $ encodeFile tmpPath inside
    decodeFile tmpPath $ encodeFile tmpPath2 inside
    f1 <- readFile tmpPath
    f2 <- readFile tmpPath2
    f1 @=? f2
    where
        filePath = "test/largest-string.yaml"
        tmpPath = "tmp.yaml"
        tmpPath2 = "tmp2.yaml"
        inside :: YamlEncoder (YamlDecoder IO) ()
        inside = do
            e <- lift parseEvent
            case e of
                EventNone -> return ()
                _ -> emitEvent e >> inside