libstackexchange-0.1.0.0: tests/aeson-lens/Main.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE UnicodeSyntax #-}
module Main (main) where
import System.Exit (exitFailure, exitSuccess)
import Data.ByteString.Lazy (ByteString)
import Control.Lens
import qualified Data.Aeson as A
import Network.StackExchange.Request
import Network.StackExchange.Response
import qualified Data.Attoparsec.Lazy as AP
import Test.HUnit
import TH (string)
main ∷ IO ()
main = do
let AP.Done _ parsed = AP.parse A.json json
Counts { errors, failures } ← runTestTT (tests $ SE parsed)
if errors + failures == 0 then exitSuccess else exitFailure
json ∷ ByteString
json = [string|
{ "apples": 4
, "bananas":
{ "bananas": 7
}
, "pinapples": [4, 7]
, "peaches":
[ { "peaches": [4, 7] }
, { "peaches": [4, 7] }
]
}
|]
tests ∷ SE a → Test
tests = TestList . sequence
[ testKeyLookup
, testNestedKeyLookup
, testFailedKeyLookup
, testKeysLookup
, testNestedKeysLookup
]
where
testKeyLookup parsed = TestCase . assertEqual "key lookup" (Just 4) $
(parsed ^! field "apples" ∷ Maybe Int)
testNestedKeyLookup parsed = TestCase . assertEqual "nested key lookup" (Just 7) $
(parsed ^! field "bananas" . field "bananas" ∷ Maybe Int)
testFailedKeyLookup parsed = TestCase . assertEqual "failed key lookup" Nothing $
(parsed ^! field "oranges" ∷ Maybe Int)
testKeysLookup parsed = TestCase . assertEqual "keys lookup" (Just [4,7]) $
(parsed ^! field "pinapples" ∷ Maybe [Int])
testNestedKeysLookup parsed = TestCase . assertEqual "nested keys lookup" (Just [4,7,4,7]) $
(parsed ^! field "peaches" . fields "peaches" . traverse ∷ Maybe [Int])