packages feed

gltf-loader-0.1.0.0: test/Text/GLTF/LoaderSpec.hs

module Text.GLTF.LoaderSpec (spec) where

import Text.GLTF.Loader

import Lens.Micro
import Linear (V3(..))
import RIO
import Test.Hspec

spec :: Spec
spec = do
  describe "fromByteString" $ do
    it "Parses embedded gltf content" $ do
      gltfText <- readFileBinary "data/cube.gltf"
      res <- fromByteString gltfText
      res `shouldSatisfy` has _Right

    it "Fails on invalid content" $ do
      res <- fromByteString "Invalid GLTF"
      res `shouldSatisfy` has (_Left . _ReadError)

  describe "fromFile" $ do
    it "Parses embedded gltf file" $ do
      gltf <- fromFile "data/cube.gltf"
      gltf `shouldSatisfy` has _Right

    it "Parses expected nodes" $ do
      gltf <- fromFile "data/cube.gltf"
      let expected = Gltf
            { gltfAsset = Asset
                { assetVersion = "2.0",
                  assetGenerator = Just "Khronos glTF Blender I/O v3.2.40",
                  assetCopyright = Nothing,
                  assetMinVersion = Nothing
                },

              gltfMeshes
                = [ Mesh
                     { meshPrimitives
                         = [ MeshPrimitive
                               { meshPrimitiveMode = Triangles,
                                 meshPrimitiveIndices
                                   = [ 1, 14, 20, 1, 20, 7, 10, 6, 19, 10, 19, 23,
                                       21, 18, 12, 21, 12, 15, 16, 3, 9, 16, 9,
                                       22, 5, 2, 8, 5, 8, 11, 17, 13, 0, 17, 0, 4
                                     ],
                                 meshPrimitivePositions
                                   =  [ V3 1.0 1.0 (-1.0),      -- 1
                                        V3 1.0 1.0 (-1.0),      -- 2
                                        V3 1.0 1.0 (-1.0),      -- 3
                                        V3 1.0 (-1.0) (-1.0),   -- 4
                                        V3 1.0 (-1.0) (-1.0),   -- 5
                                        V3 1.0 (-1.0) (-1.0),   -- 6
                                        V3 1.0 1.0 1.0,         -- 7
                                        V3 1.0 1.0 1.0,         -- 8
                                        V3 1.0 1.0 1.0,         -- 9
                                        V3 1.0 (-1.0) 1.0,      -- 10
                                        V3 1.0 (-1.0) 1.0,      -- 11
                                        V3 1.0 (-1.0) 1.0,      -- 12
                                        V3 (-1.0) 1.0 (-1.0),   -- 13
                                        V3 (-1.0) 1.0 (-1.0),   -- 14
                                        V3 (-1.0) 1.0 (-1.0),   -- 15
                                        V3 (-1.0) (-1.0) (-1.0),-- 16
                                        V3 (-1.0) (-1.0) (-1.0),-- 17
                                        V3 (-1.0) (-1.0) (-1.0),-- 18
                                        V3 (-1.0) 1.0 1.0,      -- 19
                                        V3 (-1.0) 1.0 1.0,      -- 20
                                        V3 (-1.0) 1.0 1.0,      -- 21
                                        V3 (-1.0) (-1.0) 1.0,   -- 22
                                        V3 (-1.0) (-1.0) 1.0,   -- 23
                                        V3 (-1.0) (-1.0) 1.0    -- 24
                                      ],
                                 meshPrimitiveNormals = []
                               }
                           ],
                       meshWeights = [],
                       meshName = Just "Cube"
                     }
                  ],

              gltfNodes
                = [ Node
                      { nodeMeshId = Just 0,
                        nodeName = Just "Cube",
                        nodeRotation = Nothing,
                        nodeScale = Nothing,
                        nodeTranslation = Nothing,
                        nodeWeights = []
                      }
                  ]
            }
      
      gltf `shouldBe` Right expected