packages feed

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])