--{-# LANGUAGE OverloadedStrings #-} module Main where import Data.Aeson import Data.ByteString.Char8 as Strict.Char8 import Data.ByteString.Lazy.Char8 as Lazy import qualified Data.Vector as Vector import Lens.Micro import Lens.Micro.Aeson import Test.Tasty import Test.Tasty.HUnit import qualified Data.HashMap.Strict as HMS import qualified Data.Text as T --- main :: IO () main = defaultMain suite suite :: TestTree suite = testGroup "Unit Tests" [ testGroup "Scientific Traversals" [ testCase "" $ ("[1, \"x\"]" ^? nth 0 . _Number) @?= Just 1.0 , testCase "" $ ("[1, \"x\"]" ^? nth 1 . _Number) @?= Nothing , testCase "" $ ("[10.2]" ^? nth 0 . _Double) @?= Just 10.2 , testCase "" $ ("[10]" ^? nth 0 . _Integer) @?= Just 10 , testCase "" $ ("[10.5]" ^? nth 0 . _Integer) @?= Just 10 , testCase "" $ ("42" ^? _Integer) @?= Just 42 ] , testGroup "Conversion Traversals" [ testCase "" $ ("[10]" ^? nth 0 . _Integral) @?= Just 10 , testCase "" $ ("[10.5]" ^? nth 0 . _Integral) @?= Just 10 ] , testGroup "Nulls and Primitives" [ testCase "" $ ("[1, \"x\", null, true, false]" ^? nth 0 . _Primitive) @?= Just (NumberPrim 1.0) , testCase "" $ ("[1, \"x\", null, true, false]" ^? nth 1 . _Primitive) @?= Just (StringPrim $ T.pack "x") , testCase "" $ ("[1, \"x\", null, true, false]" ^? nth 2 . _Primitive) @?= Just NullPrim , testCase "" $ ("[1, \"x\", null, true, false]" ^? nth 3 . _Primitive) @?= Just (BoolPrim True) , testCase "" $ ("[1, \"x\", null, true, false]" ^? nth 4 . _Primitive) @?= Just (BoolPrim False) , testCase "" $ ("{\"a\": \"xyz\", \"b\": true}" ^? key (T.pack "a") . _String) @?= Just (T.pack "xyz") , testCase "" $ ("{\"a\": \"xyz\", \"b\": true}" ^? key (T.pack "b") . _String) @?= Nothing , testCase "" $ ("{\"a\": \"xyz\", \"b\": true}" ^? key (T.pack "b") . _Bool) @?= Just True , testCase "" $ ("{\"a\": \"xyz\", \"b\": true}" ^? key (T.pack "a") . _Bool) @?= Nothing , testCase "" $ ("{\"a\": \"xyz\", \"b\": null}" ^? key (T.pack "b") . _Null) @?= Just () , testCase "" $ ("{\"a\": \"xyz\", \"b\": null}" ^? key (T.pack "a") . _Null) @?= Nothing , testCase "" $ ("{\"a\": \"xyz\", \"b\": null}" ^? key (T.pack "a") . nonNull) @?= Just (String $ T.pack "xyz") , testCase "" $ ("{\"a\": {}, \"b\": null}" ^? key (T.pack "a") . nonNull) @?= Just (Object (HMS.fromList [])) , testCase "" $ ("{\"a\": \"xyz\", \"b\": null}" ^? key (T.pack "b") . nonNull) @?= Nothing ] , testGroup "Non-primitive Traversals" [ testCase "" $ ("{\"a\": {}, \"b\": null}" ^? key (T.pack "a") . _Object) @?= Just (HMS.fromList []) , testCase "" $ ("{\"a\": {}, \"b\": null}" ^? key (T.pack "b") . _Object) @?= Nothing , testCase "" $ ("{\"a\": 100, \"b\": 200}" ^? key (T.pack "a")) @?= Just (Number 100.0) , testCase "" $ ("[1,2,3]" ^? key (T.pack "a")) @?= Nothing , testCase "" $ ("{\"a\": 4, \"b\": 7}" ^.. members) @?= [Number 4.0,Number 7.0] , testCase "" $ ("{\"a\": 4, \"b\": 7}" & members . _Number %~ (* 10)) @?= "{\"a\":40,\"b\":70}" , testCase "" $ ("[1,2,3]" ^? nth 1) @?= Just (Number 2.0) , testCase "" $ ("{\"a\": 100, \"b\": 200}" ^? nth 1) @?= Nothing , testCase "" $ ("[1,2,3]" & nth 1 .~ Number 20) @?= "[1,20,3]" , testCase "" $ ("[1,2,3]" ^.. values) @?= [Number 1.0,Number 2.0,Number 3.0] , testCase "" $ ("[1,2,3]" & values . _Number %~ (* 10)) @?= "[10,20,30]" ] ]