@@ -17,67 +17,72 @@ main = defaultMain
1717 , testCase "encode/decode" caseEncodeDecode
1818 , testCase "encode/decode file" caseEncodeDecodeFile
1919 , testCase "interleaved encode/decode" caseInterleave
20− , testCase "interleaved encode/decode monadic" caseInterleaveMonad
2120 ]
2221
2322caseCountScalars :: Assertion
2423caseCountScalars = do
25− res <- decode yamlBS fold accum
24+ res <- decode yamlBS $ counter accum
2625 res @?= (7, 1, 2)
2726 where
2827 yamlString = "foo:\n baz: [bin1, bin2, bin3]\nbaz: bazval"
2928 yamlBS = B8.pack yamlString
30− fold (s, l, m) (EventScalar {}) = return $ More (s + 1, l, m)
31− fold (s, l, m) EventSequenceStart = return $ More (s, l + 1, m)
32− fold (s, l, m) EventMappingStart = return $ More (s, l, m + 1)
33− fold res EventNone = return $ Done res
34− fold res _ = return $ More res
29+ counter (s, l, m) = do
30+ e <- parseEvent
31+ case e of
32+ EventScalar {} -> counter (s + 1, l, m)
33+ EventSequenceStart -> counter (s, l + 1, m)
34+ EventMappingStart -> counter (s, l, m + 1)
35+ EventNone -> return (s, l, m)
36+ _ -> counter (s, l, m)
3537 accum = (0, 0, 0) :: (Int, Int, Int)
3638
3739caseLargestString :: Assertion
3840caseLargestString = do
39− res <- decodeFile filePath fold accum
41+ res <- decodeFile filePath $ dec accum
4042 res @?= (length expected, expected)
4143 where
4244 expected = "this one is just a little bit bigger than the others"
4345 filePath = "test/largest-string.yaml"
44− fold (i, s) (EventScalar bs _ _) =
45− let s' = B8.unpack bs
46− i' = length s'
47− in if i' > i
48− then return $ More (i', s')
49− else return $ More (i, s)
50− fold res EventNone = return $ Done res
51− fold res _ = return $ More res
46+ dec (i, s) = do
47+ e <- parseEvent
48+ case e of
49+ (EventScalar bs _ _) -> do
50+ let s' = B8.unpack bs
51+ i' = length s'
52+ dec $ if i' > i then (i', s') else (i, s)
53+ EventNone -> return (i, s)
54+ _ -> dec (i, s)
5255 accum = (0, "no strings found")
5356
5457caseEncodeDecode :: Assertion
5558caseEncodeDecode = do
56− eList' <- decode yamlBS fold id
57− let eList = eList' []
59+ eList <- decode yamlBS $ dec id
5860 bs <- encode $ mapM_ emitEvent eList
59− eList2' <- decode bs fold id
60− let eList2 = eList2' []
61+ eList2 <- decode bs $ dec id
6162 map MyEvent eList @=? map MyEvent eList2
6263 where
6364 yamlString = "foo: bar\nbaz:\n - bin1\n - bin2\n"
6465 yamlBS = B8.pack yamlString
65− fold x EventNone = return $ Done x
66− fold x e = return $ More $ x . (:) e
66+ dec front = do
67+ e <- parseEvent
68+ case e of
69+ EventNone -> return $ front []
70+ _ -> dec $ front . (:) e
6771
6872caseEncodeDecodeFile :: Assertion
6973caseEncodeDecodeFile = do
70− eList' <- decodeFile filePath fold id
71− let eList = eList' []
74+ eList <- decodeFile filePath $ dec id
7275 encodeFile tmpPath $ mapM_ emitEvent eList
73− eList2' <- decodeFile filePath fold id
74− let eList2 = eList2' []
76+ eList2 <- decodeFile filePath $ dec id
7577 map MyEvent eList @=? map MyEvent eList2
7678 where
7779 filePath = "test/largest-string.yaml"
7880 tmpPath = "tmp.yaml"
79− fold x EventNone = return $ Done x
80− fold x e = return $ More $ x . (:) e
81+ dec front = do
82+ e <- parseEvent
83+ case e of
84+ EventNone -> return $ front []
85+ _ -> dec $ front . (:) e
8186
8287newtype MyEvent = MyEvent Event deriving Show
8388instance Eq MyEvent where
@@ -87,22 +92,8 @@ instance Eq MyEvent where
8792
8893caseInterleave :: Assertion
8994caseInterleave = do
90− encodeFile tmpPath $ decodeFile filePath emitEvent' ()
91− encodeFile tmpPath2 $ decodeFile tmpPath emitEvent' ()
92− f1 <- readFile tmpPath
93− f2 <- readFile tmpPath2
94− f1 @=? f2
95− where
96− filePath = "test/largest-string.yaml"
97− tmpPath = "tmp.yaml"
98− tmpPath2 = "tmp2.yaml"
99− emitEvent' () EventNone = return $ Done ()
100− emitEvent' () e = emitEvent e >> return (More ())
101−
102−caseInterleaveMonad :: Assertion
103−caseInterleaveMonad = do
104− decodeFile' filePath $ encodeFile tmpPath inside
105− decodeFile' tmpPath $ encodeFile tmpPath2 inside
95+ decodeFile filePath $ encodeFile tmpPath inside
96+ decodeFile tmpPath $ encodeFile tmpPath2 inside
10697 f1 <- readFile tmpPath
10798 f2 <- readFile tmpPath2
10899 f1 @=? f2