packages feed

moonlight-category-0.1.0.0: test/abstract/PolynomialFunctorWitnessSpec.hs

{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}

module PolynomialFunctorWitnessSpec
  ( tests,
  )
where

import Moonlight.Category
  ( Direction,
    Exists (..),
    ParameterizedDirection,
    ParameterizedPolynomialFunctor (..),
    PolynomialFunctor (..),
  )
import Moonlight.Category.Test.PolynomialFixture
  ( BranchPosition,
    DemoParameterizedPolynomial,
    DemoPolynomial,
    FullSliceBranchPosition,
    FullSliceRootPosition,
    RootPosition,
    TrimmedSliceRootPosition,
  )
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit ((@?=), testCase)

rootDirectionWitness :: Direction DemoPolynomial RootPosition
rootDirectionWitness = True

branchDirectionWitness :: Direction DemoPolynomial BranchPosition
branchDirectionWitness = Just False

fullSliceRootDirectionWitness :: ParameterizedDirection DemoParameterizedPolynomial FullSliceRootPosition
fullSliceRootDirectionWitness = True

fullSliceBranchDirectionWitness :: ParameterizedDirection DemoParameterizedPolynomial FullSliceBranchPosition
fullSliceBranchDirectionWitness = Just True

trimmedSliceRootDirectionWitness :: ParameterizedDirection DemoParameterizedPolynomial TrimmedSliceRootPosition
trimmedSliceRootDirectionWitness = ()

tests :: TestTree
tests =
  testGroup
    "PolynomialFunctor"
    [ testGroup
        "closed witness families"
        [ testCase "position witnesses enumerate the polynomial support" $
            length demoPositions @?= 2,
          testCase "root positions admit the indexed direction carrier" $
            rootDirectionWitness @?= True,
          testCase "branch positions admit a distinct indexed direction carrier" $
            branchDirectionWitness @?= Just False
        ],
      testGroup
        "parameterized witness families"
        [ testCase "positionsAt enumerates the requested slice" $
            ( length (demoParameterizedPositions True),
              length (demoParameterizedPositions False)
            )
              @?= (2, 1),
          testCase "parameterized positions admit slice-specific directions" $
            ( fullSliceRootDirectionWitness,
              fullSliceBranchDirectionWitness,
              trimmedSliceRootDirectionWitness
            )
              @?= (True, Just True, ())
        ]
    ]

demoPositions :: [Exists (Position DemoPolynomial)]
demoPositions = allPositions

demoParameterizedPositions :: Bool -> [Exists (ParameterizedPosition DemoParameterizedPolynomial)]
demoParameterizedPositions = positionsAt