module IntegrationSpec where
import ConditionalRestriction
( Result (Ok),
Type (TBool, TTime),
evaluate,
needsData,
)
import ConditionalRestriction.Result (Result (Ok), fromResult)
import Test.Hspec (Spec, describe, it, shouldBe, shouldMatchList)
spec :: Spec
spec = do
let term = "no @ (09:00-17:00); destination @ (09:00-17:00 AND disabled)"
in describe term $ do
it "returns 'time' and 'disabled' as needed data" $
fromResult [] (needsData term) `shouldMatchList` [("time", TTime), ("disabled", TBool)]
it "returns 'destination' on (time = 2022-05-10 10:00) and (disabled = true)" $
evaluate term [("time", "2022-05-10 10:00"), ("disabled", "true")] `shouldBe` Ok (Just "destination")
it "returns unknown on (time = 2022-05-10 08:00) and (disabled = true)" $
evaluate term [("time", "2022-05-10 08:00"), ("disabled", "true")] `shouldBe` Ok Nothing
let term = "120 @ (06:00-20:00); 80 @ wet"
in describe term $ do
it "returns 80 on (time = 2022-05-10 07:00) and (wet = true)" $
evaluate term [("time", "2022-05-10 07:00"), ("wet", "true")] `shouldBe` Ok (Just "80")
it "returns 120 on (time = 2022-05-10 07:00) and (wet = false)" $
evaluate term [("time", "2022-05-10 07:00"), ("wet", "false")] `shouldBe` Ok (Just "120")
let term = "delivery @ (07:00-11:00); customers @ (07:00-17:00)"
in describe term $ do
it "returns 'customers' on (time = 2022-05-10 07:00)" $
evaluate term [("time", "2022-05-10 07:00")] `shouldBe` Ok (Just "customers")
it "returns unknown on (time = 2022-05-10 06:00)" $
evaluate term [("time", "2022-05-10 06:00")] `shouldBe` Ok Nothing
let term = "foo @ (24/7); bar @ (Mo-Sa 10:00-12:00,13:00-20:00; Tu off); baz @ (Su-Tu 11:00-01:00, We-Th 11:00-03:00, Fr 11:00-06:00, Sa 11:00-07:00)"
in describe term $ do
it "returns 'foo' on (time = 2022-05-10 10:00 (Tuesday))" $
evaluate term [("time", "2022-05-10 10:00")] `shouldBe` Ok (Just "foo")
it "returns 'baz' on (time = 2022-05-10 11:00 (Tuesday))" $
evaluate term [("time", "2022-05-10 11:00")] `shouldBe` Ok (Just "baz")
it "returns 'bar' on (time = 2022-05-09 10:30 (Monday))" $
evaluate term [("time", "2022-05-09 10:30")] `shouldBe` Ok (Just "bar")