packages feed

jsonlogic-0.1.0.0: test/Operation/Array/TestReduce.hs

{-# LANGUAGE OverloadedLists #-}

module Operation.Array.TestReduce where

import JsonLogic.Pure.Evaluator
import JsonLogic.Pure.Type (Exception (EvalException))
import Test.Tasty
import Test.Tasty.HUnit as U
import Utils

reduceUnitTests :: TestTree
reduceUnitTests =
  testGroup
    "reduce unit tests"
    [ testCase "logic {reduce\":[{\"var\":\"integers\"}, {\"+\":[{\"var\":\"current\"}, {\"var\":\"accumulator\"}]}, 0 ]} data {\"integers\":[1,2,3,4,5]}" $
        U.assertEqual
          "sums to 15"
          (Right $ jNum 15)
          (apply [] (jObj [("reduce", jArr [jObj [("var", jStr "integers")], jObj [("+", jArr [jObj [("var", jStr "current")], jObj [("var", jStr "accumulator")]])], jNum 0])]) (jObj [("integers", jArr [jNum 1, jNum 2, jNum 3, jNum 4, jNum 5])])),
      testCase "Reduce right to left" $
        U.assertEqual
          "reduces right to left"
          (Right $ jNum 1.5)
          (apply [] (jObj [("reduce", jArr [jObj [("var", jStr "integers")], jObj [("/", jArr [jObj [("var", jStr "current")], jObj [("var", jStr "accumulator")]])], jNum 1])]) (jObj [("integers", jArr [jNum 2, jNum 3])])),
      testCase "Errors with invalid arguments" $
        U.assertEqual
          "Default value missing"
          (Left $ EvalException "Wrong number of arguments for reduce")
          (apply [] (jObj [("reduce", jArr [jObj [("var", jStr "integers")], jObj [("/", jArr [jObj [("var", jStr "current")], jObj [("var", jStr "accumulator")]])]])]) jNull),
      testCase "Evaluate initial value" $
        U.assertEqual
          "Initial value evaluates to 1"
          (Right $ jNum 6)
          (apply [] (jObj [("reduce", jArr [jObj [("var", jStr "integers")], jObj [("+", jArr [jObj [("var", jStr "current")], jObj [("var", jStr "accumulator")]])], jObj [("var", jStr "integer")]])]) (jObj [("integer", jNum 1), ("integers", jArr [jNum 2, jNum 3])])),
      testCase "Empty list" $
        U.assertEqual
          "Returns initial value"
          (Right $ jStr "abc")
          (apply [] (jObj [("reduce", jArr [jObj [("var", jStr "integers")], jObj [("+", jArr [jObj [("var", jStr "current")], jObj [("var", jStr "accumulator")]])], jStr "abc"])]) (jObj [("integers", jArr [])]))
    ]