packages feed

moonlight-category-0.1.0.0: test/indexed/SimplexSpec.hs

module SimplexSpec
  ( tests,
  )
where

import Prelude hiding ((.))

import qualified Moonlight.Category.Indexed as Indexed
import Moonlight.Category.Indexed (Category ((.), src, tgt))
import Moonlight.Category.Test.IndexedSimplexFixture
  ( One,
    Three,
    Two,
    Zero,
    codegeneracy0At0,
    codegeneracy0At1,
    codegeneracy0At2,
    codegeneracy1At1,
    codegeneracy1At2,
    codegeneracy2At2,
    coface0At0,
    coface0At1,
    coface0At2,
    coface1At0,
    coface1At1,
    coface1At2,
    coface2At1,
    coface2At2,
    coface3At2,
    one,
    two,
    zero,
  )
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit ((@?=), testCase)

three :: Indexed.Simplex Three Three
three = Indexed.simplexSucc two

firstVertex01 :: Indexed.Simplex Zero One
firstVertex01 = Indexed.cofaceLast zero

lastVertex01 :: Indexed.Simplex Zero One
lastVertex01 = Indexed.cofaceFirst zero

collapse10 :: Indexed.Simplex One Zero
collapse10 = Indexed.codegeneracyFirst zero

lastFace12 :: Indexed.Simplex One Two
lastFace12 = Indexed.cofaceFirst one

collapse20 :: Indexed.Simplex Two Zero
collapse20 = Indexed.simplexCollapse two

standardZero :: Indexed.StandardSimplex Zero
standardZero = Indexed.Hom_X zero

standardZeroIdentity :: Indexed.SSet (Indexed.StandardSimplex Zero) (Indexed.StandardSimplex Zero)
standardZeroIdentity = Indexed.natId standardZero

tests :: TestTree
tests =
  testGroup
    "Indexed Simplex"
    [ testCase "src and tgt return object identities" $ do
        src lastVertex01 @?= zero
        tgt lastVertex01 @?= one
        src collapse10 @?= one
        tgt collapse10 @?= zero,
      testCase "identity laws hold for concrete simplex arrows" $ do
        lastVertex01 . src lastVertex01 @?= lastVertex01
        tgt lastVertex01 . lastVertex01 @?= lastVertex01
        collapse10 . src collapse10 @?= collapse10
        tgt collapse10 . collapse10 @?= collapse10,
      testCase "composition is associative on concrete simplex arrows" $ do
        (collapse10 . lastVertex01) . zero @?= collapse10 . (lastVertex01 . zero)
        (collapse20 . lastFace12) . firstVertex01 @?= collapse20 . (lastFace12 . firstVertex01),
      testCase "forgetful functor maps arrows to finite-ordinal functions" $ do
        let firstVertexMap = Indexed.ForgetSimplex Indexed.% firstVertex01
            lastVertexMap = Indexed.ForgetSimplex Indexed.% lastVertex01
            collapseMap = Indexed.ForgetSimplex Indexed.% collapse10
        firstVertexMap Indexed.Fz @?= Indexed.Fz
        lastVertexMap Indexed.Fz @?= Indexed.Fs Indexed.Fz
        collapseMap Indexed.Fz @?= Indexed.Fz
        collapseMap (Indexed.Fs Indexed.Fz) @?= Indexed.Fz,
      testCase "simplexValues decodes monotone maps" $ do
        Indexed.simplexValues zero @?= [0]
        Indexed.simplexValues one @?= [0, 1]
        Indexed.simplexValues two @?= [0, 1, 2]
        Indexed.simplexValues three @?= [0, 1, 2, 3]
        Indexed.simplexValues firstVertex01 @?= [0]
        Indexed.simplexValues lastVertex01 @?= [1]
        Indexed.simplexValues collapse10 @?= [0, 0]
        Indexed.simplexValues lastFace12 @?= [1, 2],
      testCase "coface constructors decode to classical skipped-index maps" $ do
        Indexed.simplexValues coface0At0 @?= [1]
        Indexed.simplexValues coface1At0 @?= [0]
        Indexed.simplexValues coface0At1 @?= [1, 2]
        Indexed.simplexValues coface1At1 @?= [0, 2]
        Indexed.simplexValues coface2At1 @?= [0, 1]
        Indexed.simplexValues coface0At2 @?= [1, 2, 3]
        Indexed.simplexValues coface1At2 @?= [0, 2, 3]
        Indexed.simplexValues coface2At2 @?= [0, 1, 3]
        Indexed.simplexValues coface3At2 @?= [0, 1, 2],
      testCase "codegeneracy constructors decode to classical repeated-index maps" $ do
        Indexed.simplexValues codegeneracy0At0 @?= [0, 0]
        Indexed.simplexValues codegeneracy0At1 @?= [0, 0, 1]
        Indexed.simplexValues codegeneracy1At1 @?= [0, 1, 1]
        Indexed.simplexValues codegeneracy0At2 @?= [0, 0, 1, 2]
        Indexed.simplexValues codegeneracy1At2 @?= [0, 1, 1, 2]
        Indexed.simplexValues codegeneracy2At2 @?= [0, 1, 2, 2],
      testCase "coface/coface cosimplicial identity holds concretely" $ do
        coface1At1 . coface0At0 @?= coface0At1 . coface0At0
        coface2At1 . coface0At0 @?= coface0At1 . coface1At0
        coface2At1 . coface1At0 @?= coface1At1 . coface1At0,
      testCase "codegeneracy/codegeneracy cosimplicial identity holds concretely" $ do
        codegeneracy0At0 . codegeneracy0At1 @?= codegeneracy0At0 . codegeneracy1At1
        codegeneracy0At1 . codegeneracy0At2 @?= codegeneracy0At1 . codegeneracy1At2
        codegeneracy1At1 . codegeneracy0At2 @?= codegeneracy0At1 . codegeneracy2At2
        codegeneracy1At1 . codegeneracy1At2 @?= codegeneracy1At1 . codegeneracy2At2,
      testCase "mixed left cosimplicial identity holds concretely" $ do
        codegeneracy1At1 . coface0At1 @?= coface0At0 . codegeneracy0At0
        codegeneracy2At2 . coface0At2 @?= coface0At1 . codegeneracy1At1
        codegeneracy2At2 . coface1At2 @?= coface1At1 . codegeneracy1At1,
      testCase "mixed identity cosimplicial cases hold concretely" $ do
        codegeneracy0At0 . coface0At0 @?= zero
        codegeneracy0At0 . coface1At0 @?= zero
        codegeneracy0At1 . coface0At1 @?= one
        codegeneracy0At1 . coface1At1 @?= one
        codegeneracy1At1 . coface1At1 @?= one
        codegeneracy1At1 . coface2At1 @?= one,
      testCase "mixed right cosimplicial identity holds concretely" $ do
        codegeneracy0At1 . coface2At1 @?= coface1At0 . codegeneracy0At0
        codegeneracy0At2 . coface2At2 @?= coface1At1 . codegeneracy0At1
        codegeneracy0At2 . coface3At2 @?= coface2At1 . codegeneracy0At1
        codegeneracy1At2 . coface3At2 @?= coface2At1 . codegeneracy1At1,
      testCase "domain extension preserves the lower endpoint" $ do
        Indexed.simplexExtendDomain lastVertex01 @?= one,
      testCase "representable standard simplex inhabits SSet" $ do
        let component = standardZeroIdentity Indexed.! Indexed.Op zero
        component zero @?= zero
    ]