packages feed

gltf-codec-0.1.0.1: test/Spec.hs

module Main where

import Control.Monad (guard)
import Data.Foldable (toList)
import Data.List (isSuffixOf)
import Debug.Trace (traceM)
import Shower (printer)
import System.Directory (listDirectory)
import System.FilePath ((</>))

import qualified Data.ByteString as ByteString

import qualified Codec.GLB as GLB
import qualified Codec.GlTF as GlTF
import qualified Codec.GlTF.Buffer as Buffer
import qualified Codec.GlTF.Image as Image
import qualified Codec.GlTF.Root as Root
import qualified Codec.GlTF.URI as URI

assetsPath :: FilePath
assetsPath = ".." </> "assets"

main :: IO ()
main = do
  assets <- listDirectory assetsPath

  mapM_ testGltf do
    fp <- assets
    guard $ ".gltf" `isSuffixOf` fp
    pure $ assetsPath </> fp

  mapM_ testGlb do
    fp <- assets
    guard $ ".glb" `isSuffixOf` fp
    pure $ assetsPath </> fp

testGltf :: FilePath -> IO ()
testGltf source =
  GlTF.fromFile source >>= \case
    Left err -> do
      traceM err
      fail $ "gltf load error in " <> source
    Right gltf -> do
      printer gltf
      testBuffers source gltf

testGlb :: FilePath -> IO ()
testGlb source =
  GLB.fromFile source >>= \case
    Left (offset, err) -> do
      traceM err
      fail $ "glb error at " <> show offset
    Right glb -> do
      printer
        ( GLB.header glb
        , fmap (\GLB.Chunk{..} -> (chunkLength, chunkType)) (GLB.chunks glb)
        )
      case GlTF.fromChunk (head . toList $ GLB.chunks glb) of
        Left err -> do
          traceM err
          fail $ "glb json error inside " <> source
        Right gltf ->
          printer gltf

testBuffers :: FilePath -> Root.GlTF -> IO ()
testBuffers source gltf = do
  case Root.buffers gltf of
    Nothing ->
      pure ()
    Just buffers ->
      mapM_ (testURI source) $ concatMap (toList . Buffer.uri) buffers

  case Root.images gltf of
    Nothing ->
      pure ()
    Just images ->
      mapM_ (testURI source) $ concatMap (toList . Image.uri) images

testURI :: FilePath -> URI.URI -> IO ()
testURI _source uri = do
  URI.loadURI testLoader uri >>= \case
    Left err ->
      fail err
    Right bs ->
      printer (uri, ByteString.length bs)
  where
    testLoader path =
      fmap Right $ ByteString.readFile (assetsPath </> path)