packages feed

jsons-to-schema-0.1.0.0: test/UtilsSpec.hs

module UtilsSpec where

import           Data.Scientific
import           JSONSchema.Draft4.Internal.Utils
import           Test.Hspec

import           Protolude

spec :: Spec
spec = do
  describe "Maximum Constraint Tests" maximumConstraintTests
  describe "Minimum Constraint Tests" minimumConstraintTests

maximumConstraintTests :: Spec
maximumConstraintTests = do
  it "will compute a maximum from some numbers" $
    computeMaximumConstraints
      [ Just $ scientific 20 1
      , Just $ scientific 30 1
      , Nothing
      , Nothing
      , Just $ scientific 25 1
      ]
      [Just True, Just False, Nothing, Just True, Just True] `shouldBe`
    (Just $ scientific 30 1, Just False)

  it "will not be clobbered by a nothing" $
    computeMaximumConstraints
      [ Just $ scientific 20 1
      , Nothing
      ]
      [Just True, Just False] `shouldBe`
    (Just $ scientific 20 1, Just True)

  it "will not be clobbered by False when both are nothing " $
    computeMaximumConstraints
      [   Nothing
        , Nothing
      ]
      [Just False, Just True] `shouldBe`
    (Nothing, Just True)

  it "will not be clobbered by Nothing when both are nothing " $
    computeMaximumConstraints
      [   Nothing
        , Nothing
      ]
      [Nothing, Just True] `shouldBe`
    (Nothing, Just True)

  it
    "will compute a maximum from the existence of an exclusive maximum when there is a tie" $
    computeMaximumConstraints
      [ Just $ scientific 59 1
      , Just $ scientific 52 1
      , Nothing
      , Just $ scientific 59 1
      , Nothing
      ]
      [Just False, Just True, Just True, Just True, Just True] `shouldBe`
    (Just $ scientific 59 1, Just False)
  it "will be able to return a sensible value when nothing is defined" $
    computeMaximumConstraints
      [Nothing, Nothing, Nothing]
      [Nothing, Nothing, Nothing] `shouldBe`
    (Nothing, Nothing)

minimumConstraintTests :: Spec
minimumConstraintTests = do
  it "will compute a minimum from some numbers" $
    computeMinimumConstraints
      [ Just $ scientific 20 1
      , Just $ scientific 30 1
      , Nothing
      , Nothing
      , Just $ scientific 25 1
      ]
      [Just True, Just False, Nothing, Just True, Just True] `shouldBe`
    (Just $ scientific 20 1, Just True)

  it "will not be clobbered by a nothing" $
    computeMinimumConstraints
      [ Just $ scientific 20 1
      , Nothing
      ]
      [Just True, Just False] `shouldBe`
    (Just $ scientific 20 1, Just True)

  it "will not be clobbered by False when both are nothing " $
    computeMinimumConstraints
      [   Nothing
        , Nothing
      ]
      [Just False, Just True] `shouldBe`
    (Nothing, Just True)

  it "will not be clobbered by Nothing when both are nothing " $
    computeMinimumConstraints
      [   Nothing
        , Nothing
      ]
      [Nothing, Just True] `shouldBe`
    (Nothing, Just True)

  it
    "will compute a minimum from the existence of an exclusive minimum when there is a tie" $
    computeMinimumConstraints
      [ Just $ scientific 59 1
      , Nothing
      , Just $ scientific 12 1
      , Just $ scientific 14 1
      , Just $ scientific 12 1
      , Just $ scientific 59 1
      , Nothing
      ]
      [ Just False
      , Just True
      , Just True
      , Just True
      , Just False
      , Just False
      , Just True
      ] `shouldBe`
    (Just $ scientific 12 1, Just False)
  it "will be able to return a sensible value when nothing is defined" $
    computeMinimumConstraints
      [Nothing, Nothing, Nothing]
      [Nothing, Nothing, Nothing] `shouldBe`
    (Nothing, Nothing)