packages feed

cherry-core-alpha-0.1.0.0: tests/Main.hs

{-# LANGUAGE OverloadedStrings #-}

module Main where

import Test.Hspec
import qualified Data.Map.Strict as Map
import qualified Json.Decode as Decode
import Cherry.Prelude (Result(..))


main :: IO ()
main = hspec $ do
  describe "Cherry.Json.Decode" $ do
    it "can decode a string" $
      let bytestring = "\"string\""
          decoder = Decode.string
      in
      Decode.fromString decoder bytestring `shouldBe` Ok "string"

    it "can decode an int" $
      let bytestring = "12"
          decoder = Decode.int
      in
      Decode.fromString decoder bytestring `shouldBe` Ok 12

    it "can decode a negative int" $
      let bytestring = "-4"
          decoder = Decode.int
      in
      Decode.fromString decoder bytestring `shouldBe` Ok (negate 4)

    it "can decode a large int" $
      let bytestring = "1801439850948"
          decoder = Decode.int
      in
      Decode.fromString decoder bytestring `shouldBe` Ok 1801439850948

    it "can decode a negative large int" $
      let bytestring = "-1801439850948"
          decoder = Decode.int
      in
      Decode.fromString decoder bytestring `shouldBe` Ok (negate 1801439850948)

    it "can decode an exponent" $
      let bytestring = "2e8"
          decoder = Decode.float
      in
      Decode.fromString decoder bytestring `shouldBe` Ok 2.0e8

    it "can decode a whole float" $
      let bytestring = "0.4"
          decoder = Decode.float
      in
      Decode.fromString decoder bytestring `shouldBe` Ok 0.4

    it "can decode a negative whole float" $
      let bytestring = "-0.4"
          decoder = Decode.float
      in
      Decode.fromString decoder bytestring `shouldBe` Ok (negate 0.4)

    it "can decode a float" $
      let bytestring = "4.2"
          decoder = Decode.float
      in
      Decode.fromString decoder bytestring `shouldBe` Ok 4.2

    it "can decode a negative float" $
      let bytestring = "-4.2"
          decoder = Decode.float
      in
      Decode.fromString decoder bytestring `shouldBe` Ok (negate 4.2)

    it "can decode a large float" $
      let bytestring = "0.1274960773527468635486"
          decoder = Decode.float
      in
      Decode.fromString decoder bytestring `shouldBe` Ok 0.12749607735274687

    it "can decode true" $
      let bytestring = "true"
          decoder = Decode.bool
      in
      Decode.fromString decoder bytestring `shouldBe` Ok True

    it "can decode false" $
      let bytestring = "false"
          decoder = Decode.bool
      in
      Decode.fromString decoder bytestring `shouldBe` Ok False

    it "can decode null" $
      let bytestring = "null"
          decoder = Decode.null 0
      in
      Decode.fromString decoder bytestring `shouldBe` Ok (0 :: Int)

    it "can decode a tuple" $
      let bytestring = "[1, false]"
          decoder = Decode.pair Decode.int Decode.bool
      in
      Decode.fromString decoder bytestring `shouldBe` Ok (1, False)

    it "can decode an object" $
      let bytestring = "{ \"property\": 13 }"
          decoder = Decode.field "property" Decode.int
      in
      Decode.fromString decoder bytestring `shouldBe` Ok 13

    it "can decode an object with several properties" $
      let bytestring = "{ \"name\": \"Tereza\", \"age\": 24 }"
          decoder =
            Decode.map2 (,)
              (Decode.field "name" Decode.string)
              (Decode.field "age" Decode.int)
      in
      Decode.fromString decoder bytestring `shouldBe` Ok ( "Tereza", 24 )


    it "can decode a dict" $
      let bytestring = "{ \"a\": \"1\", \"b\": \"2\" }"
          decoder = Decode.dict Decode.string
      in
      Decode.fromString decoder bytestring `shouldBe` Ok (Map.fromList [ ( "a", "1" ), ( "b", "2" ) ])