content: module Test.Language.Spectacle.Interaction.Pos
    ( -- * Pos/Interval tests
      tests,
    )
  where
  
  import Control.Monad (when)
  import Lens.Micro.Extras (view)
  
  import Hedgehog (Property, diff, forAll, property)
  import Hedgehog.Range (linearBounded)
  import Test.Tasty (TestTree, testGroup)
  import Test.Tasty.Hedgehog (testProperty)
  
  import Language.Spectacle.Interaction.Pos (pcol, prow)
  
  import qualified Test.Gen as Gen
  import qualified Test.Laws.Lens
  import qualified Test.Laws.Ord
  
  -- ---------------------------------------------------------------------------------------------------------------------
  
  tests :: TestTree
  tests =
    testGroup
      "Pos"
      [ testsPos
      , testsInterval
      ]
  
  -- ---------------------------------------------------------------------------------------------------------------------
  
  testsPos :: TestTree
  testsPos =
    testGroup
      "Pos.Pos"
      [ testProperty "row ordering" propRowOrder
      , Test.Laws.Ord.laws "pos" Gen.pos
      , Test.Laws.Lens.laws pcol "pcol" Gen.pos (Gen.int linearBounded)
      , Test.Laws.Lens.laws prow "prow" Gen.pos (Gen.int linearBounded)
      ]
  
  -- | This property characterizes the order on 'Pos'.
  propRowOrder :: Property
  propRowOrder = property do
    p <- forAll Gen.pos
    q <- forAll Gen.pos
    when (view prow p < view prow q) do
      diff p (<) q
  
  -- ---------------------------------------------------------------------------------------------------------------------
  
  testsInterval :: TestTree
  testsInterval =
    testGroup
      "Pos.Interval"
      [ Test.Laws.Ord.laws "interval" Gen.pos
      ]
  