packages feed

hw-json-lens-0.0.0.1: test/HaskellWorks/Data/Json/LensSpec.hs

{-# LANGUAGE OverloadedStrings #-}
module HaskellWorks.Data.Json.LensSpec (spec) where

import           GHC.Base
import           Control.Lens
import qualified Data.ByteString as Strict
import           HaskellWorks.Data.ListMap (fromList)
import qualified Data.Vector.Storable                                       as DVS
import           Data.Word
import           Prelude hiding (null)
import           HaskellWorks.Data.BalancedParens.Simple
import           HaskellWorks.Data.Bits.BitShown
import           HaskellWorks.Data.Json.Succinct.Cursor
import           HaskellWorks.Data.Json.Succinct.PartialIndex
import           HaskellWorks.Data.Json.PartialValue
import           HaskellWorks.Data.Json.Lens
import           HaskellWorks.Data.FromByteString
import           Test.Hspec

{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}
{-# ANN module ("HLint: ignore Reduce duplication"  :: String) #-}

loadJson :: Strict.ByteString -> JsonCursor Strict.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64))
loadJson = fromByteString

j :: Strict.ByteString -> JsonPartialValue
j = jsonPartialJsonValueAt . jsonPartialIndexAt . loadJson

spec :: Spec
spec = describe "Nth Spec" $ do
  let json = j "{\"d\": 1.5, \"s\": \"xyz\", \"b\": true, \"n\": null, \"o\": {}}"

  it "key" $ do
    json ^? key "d"             `shouldBe` Just (JsonPartialNumber 1.5)
    j "[1,2,3]" ^? key "s"      `shouldBe` Nothing

  it "key composed" $ do
    json ^? key "d" . _Number   `shouldBe` Just 1.5
    json ^? key "s" . _String   `shouldBe` Just "xyz"
    json ^? key "b" . _Bool     `shouldBe` Just True
    json ^? key "n" . _Null     `shouldBe` Just ()
    json ^? key "b" . _Null     `shouldBe` Nothing

  it "nonNull" $ do
    json ^? key "s" . nonNull   `shouldBe` Just (JsonPartialString "xyz")
    json ^? key "o" . nonNull   `shouldBe` Just (JsonPartialObject [])
    json ^? key "n" . nonNull   `shouldBe` Nothing

  it "preview" $ do
    preview _Value (j "[1,2,3]") `shouldBe` Just (JsonPartialArray [JsonPartialNumber 1.0,JsonPartialNumber 2.0,JsonPartialNumber 3.0])

  it "object" $ do
    json ^? key "o" . _Object   `shouldBe` Just (fromList [])
    json ^? key "n" . _Object   `shouldBe` Nothing

  it "members" $ do
    fromList (json ^@.. members) `shouldBe` fromList [("d", JsonPartialNumber 1.5), ("s", JsonPartialString "xyz"), ("b", JsonPartialBool True), ("n", JsonPartialNull), ("o", JsonPartialObject [])]
    (json & members . _Number *~10) ^? key "d" `shouldBe` Just (JsonPartialNumber 15)

  it "values" $ do
    j "[1,2,3]" ^.. values                  `shouldBe` [JsonPartialNumber 1, JsonPartialNumber 2, JsonPartialNumber 3]
    (j "[1,2,3]" & values . _Number *~ 10)  `shouldBe` JsonPartialArray [JsonPartialNumber 10, JsonPartialNumber 20, JsonPartialNumber 30]