module Main (main) where import AesonDecode import Essentials import Control.Applicative (Alternative (..)) import Data.Aeson.QQ (aesonQQ) import Data.Text (Text) import Prelude (Integer, (+)) import System.IO (IO) import Test.Hspec (describe, it, hspec, shouldBe) import Data.Either (Either (..)) import Data.String (String) import qualified Examples.Asset import qualified Examples.Policy main :: IO () main = hspec do describe "either" do let d :: Decoder (Either Text Integer) = (text <&> Left) <|> (integer <&> Right) it "Just Left" $ ([aesonQQ| "x" |] ^? d) `shouldBe` Just (Left "x") it "Just Right" $ ([aesonQQ| 5 |] ^? d) `shouldBe` Just (Right 5) it "Nothing" $ ([aesonQQ| null |] ^? d) `shouldBe` Nothing describe "eitherTagged" do let d :: Decoder (Either Integer Integer) = (at "type" (textIs "x") *> at "value" integer <&> Left) <|> (at "type" (textIs "y") *> at "value" integer <&> Right) it "Just Left" $ ([aesonQQ| {"type": "x", "value": 1} |] ^? d) `shouldBe` Just (Left 1) it "Just Right" $ ([aesonQQ| {"type": "y", "value": 2} |] ^? d) `shouldBe` Just (Right 2) it "Nothing" $ ([aesonQQ| {"type": "z", "value": 3} |] ^? d) `shouldBe` Nothing describe "constSuccessDecoder" do it "is lazy" $ (undefined ^? constSuccessDecoder @Integer 6) `shouldBe` Just 6 describe "failDecoder" do it "returns Nothing" $ (undefined ^? failDecoder @Integer) `shouldBe` Nothing describe "mapDecoder" do let d = mapDecoder (+ 1) integer it "Just" $ ([aesonQQ| 4 |] ^? d) `shouldBe` Just 5 it "Nothing" $ ([aesonQQ| "x" |] ^? d) `shouldBe` Nothing describe "apDecoder" do let d = (,) `mapDecoder` (at "x" integer) `apDecoder` (at "y" text) it "works" $ ([aesonQQ| {"x": 4, "y": "abc"} |] ^? d) `shouldBe` Just (4, "abc") describe "composeDecoderFunctions" do let f x = at (textPath x) text d = composeDecoderFunctions f f "a" it "works" $ ([aesonQQ| {"a": "b", "b": "c"} |] ^? d) `shouldBe` Just "c" describe "orElse" do let d = orElse (Left <$> text) (Right <$> integer) it "Just Right" $ ([aesonQQ| 4 |] ^? d) `shouldBe` Just (Right 4) it "Just Left" $ ([aesonQQ| "x" |] ^? d) `shouldBe` Just (Left "x") it "Nothing" $ ([aesonQQ| null |] ^? d) `shouldBe` Nothing describe "defaultDecoder" do it "Integer" $ ([aesonQQ| 4 |] ^? defaultDecoder :: Maybe Integer) `shouldBe` Just 4 it "String" $ ([aesonQQ| "x" |] ^? defaultDecoder :: Maybe String) `shouldBe` Just "x" it "[Integer]" $ ([aesonQQ| [4,5,6] |] ^? defaultDecoder :: Maybe [Integer]) `shouldBe` Just [4, 5, 6] describe "is" do it "Just" $ ([aesonQQ| 4 |] ^? is @Integer 4) `shouldBe` Just () it "Nothing" $ ([aesonQQ| 5 |] ^? is @Integer 4) `shouldBe` Nothing describe "only" do it "0" $ ([aesonQQ| [] |] ^? at only integer) `shouldBe` Nothing it "1" $ ([aesonQQ| [4] |] ^? at only integer) `shouldBe` Just 4 it "2" $ ([aesonQQ| [4,5] |] ^? at only integer) `shouldBe` Nothing describe "null" do it "null -> Just" $ ([aesonQQ| null |] ^? null) `shouldBe` Just () it "[] -> Nothing" $ ([aesonQQ| [] |] ^? null) `shouldBe` Nothing it "number -> Nothing" $ ([aesonQQ| 4 |] ^? null) `shouldBe` Nothing describe "nullable" do it "Just Just" $ ([aesonQQ| 4 |] ^? nullable integer) `shouldBe` Just (Just 4) it "Just Nothing" $ ([aesonQQ| null |] ^? nullable integer) `shouldBe` Just Nothing it "Nothing" $ ([aesonQQ| "x" |] ^? nullable integer) `shouldBe` Nothing describe "text" do it "Just" $ ([aesonQQ| "x" |] ^? text) `shouldBe` Just "x" it "Nothing" $ ([aesonQQ| 4 |] ^? text) `shouldBe` Nothing describe "textIs" do it "Just" $ ([aesonQQ| "x" |] ^? textIs "x") `shouldBe` Just () it "Nothing" $ ([aesonQQ| "a" |] ^? textIs "x") `shouldBe` Nothing describe "integer" do it "Just" $ ([aesonQQ| 4 |] ^? integer) `shouldBe` Just 4 it "Nothing" $ ([aesonQQ| "x" |] ^? integer) `shouldBe` Nothing describe "integerIs" do it "Just" $ ([aesonQQ| 4 |] ^? integerIs 4) `shouldBe` Just () it "Nothing" $ ([aesonQQ| 5 |] ^? integerIs 4) `shouldBe` Nothing describe "bool" do it "Just True" $ ([aesonQQ| true |] ^? bool) `shouldBe` Just True it "Just False" $ ([aesonQQ| false |] ^? bool) `shouldBe` Just False it "Nothing" $ ([aesonQQ| "x" |] ^? bool) `shouldBe` Nothing describe "boolIs" do it "Just" $ ([aesonQQ| true |] ^? boolIs True) `shouldBe` Just () it "Nothing" $ ([aesonQQ| false |] ^? boolIs True) `shouldBe` Nothing describe "true" do it "Just" $ ([aesonQQ| true |] ^? true) `shouldBe` Just () it "Nothing" $ ([aesonQQ| false |] ^? true) `shouldBe` Nothing describe "false" do it "Just" $ ([aesonQQ| false |] ^? false) `shouldBe` Just () it "Nothing" $ ([aesonQQ| true |] ^? false) `shouldBe` Nothing describe "vectorOf" do it "Just empty" $ ([aesonQQ| [] |] ^? vectorOf integer) `shouldBe` Just [] it "Just nonempty" $ ([aesonQQ| [4,5,6] |] ^? vectorOf integer) `shouldBe` Just [4, 5, 6] it "Nothing" $ ([aesonQQ| ["4","5","6"] |] ^? vectorOf integer) `shouldBe` Nothing describe "listOf" do it "Just empty" $ ([aesonQQ| [] |] ^? listOf integer) `shouldBe` Just [] it "Just nonempty" $ ([aesonQQ| [4,5,6] |] ^? listOf integer) `shouldBe` Just [4, 5, 6] it "Nothing" $ ([aesonQQ| ["4","5","6"] |] ^? listOf integer) `shouldBe` Nothing describe "hashMapOf" do it "Just empty" $ ([aesonQQ| {} |] ^? hashMapOf integer) `shouldBe` Just [] it "Just nonempty" $ ([aesonQQ| {"a": 4, "b": 5} |] ^? hashMapOf integer) `shouldBe` Just [("a", 4), ("b", 5)] it "Nothing" $ ([aesonQQ| 4 |] ^? hashMapOf integer) `shouldBe` Nothing describe "ordMapOf" do it "Just empty" $ ([aesonQQ| {} |] ^? ordMapOf integer) `shouldBe` Just [] it "Just nonempty" $ ([aesonQQ| {"a": 4, "b": 5} |] ^? ordMapOf integer) `shouldBe` Just [("a", 4), ("b", 5)] it "Nothing" $ ([aesonQQ| 4 |] ^? ordMapOf integer) `shouldBe` Nothing Examples.Asset.spec Examples.Policy.spec