module BoxSpec (spec) where import Test.Hspec import Data.ByteString.IsoBaseFileFormat.Boxes import qualified Data.ByteString.Builder as B import qualified Data.ByteString.Lazy as BL import qualified Data.Binary.Get as Binary spec :: Spec spec = do describe "IsBoxContent instances" $ do describe "()" $ do describe "boxSize" $ it "returns 0" $ boxSize () `shouldBe` 0 describe "boxBuilder" $ it "emits no data" $ BL.length (B.toLazyByteString (boxBuilder ())) `shouldBe` 0 describe "Box" $ do describe "boxSize" $ it "returns the header size if the content is empty" $ boxSize testBox1 `shouldBe` (4 + 4) describe "Boxes" $ do describe "boxSize" $ do describe "a box with one nested box" $ do it "returns the sum of both boxSizes" $ boxSize (testParentBox1 $ singletonBox testBox1) `shouldBe` (2 * boxSize testBox1) it "returns the same value as written by boxBuilder" $ let b = testParentBox1 $ singletonBox testBox1 writtenSize = let out = toLazyByteString (boxBuilder b) getSize = Binary.runGet Binary.getWord32be in BoxSize $ fromIntegral $ getSize out reportedSize = boxSize b in writtenSize `shouldBe` reportedSize data TestBrand instance IsBrand TestBrand where type BoxLayout TestBrand = '[ 'OnceMandatory TestParentBox1 '[ 'SomeOptional TestBox1 '[]] ] data TestBox1 instance IsBoxType TestBox1 where toBoxType _ _ = StdType "tst1" testBox1 :: Box TestBrand TestBox1 testBox1 = closedBox () data TestParentBox1 instance IsBoxType TestParentBox1 where toBoxType _ _ = StdType "par1" testParentBox1 :: ValidContainerBox TestBrand TestParentBox1 ts => Boxes TestBrand ts -> Box TestBrand TestParentBox1 testParentBox1 = containerBox