packages feed

membrain-0.0.0.0: test/Test/Memory/ValueLevel.hs

-- | All unit tests for runtime values and functions.

module Test.Memory.ValueLevel
       ( unitTests
       ) where

import Data.Ratio ((%))
import Test.Hspec (Spec, describe, it, shouldBe)

import qualified Membrain as Mem


unitTests :: Spec
unitTests = describe "Membrain: Unit tests" $ do
    unitConversionSpec
    unwrappingSpec
    readMemorySpec

unitConversionSpec :: Spec
unitConversionSpec = describe "toMemory" $ do
    it "converting to the same unit does nothing" $
        Mem.byte 42 `shouldBe` Mem.toMemory @Mem.Byte (Mem.byte 42)
    it "converting to the another unit" $
        Mem.byte 1 `shouldBe` Mem.toMemory @Mem.Byte (Mem.bit 8)

unwrappingSpec :: Spec
unwrappingSpec = describe "fromMemory" $ do
    it "toBits from bits" $
        Mem.toBits (Mem.bit 42) `shouldBe` 42
    it "toBits from bytes" $
        Mem.toBits (Mem.byte 2) `shouldBe` 16
    it "toRat from bits" $
        Mem.toRat (Mem.toMemory @Mem.Byte $ Mem.bit 7) `shouldBe` (7 % 8)
    it "flooring bytes" $
        Mem.floor @Int (Mem.byte 2) `shouldBe` 2
    it "flooring bytes from bits" $
        Mem.floor @Int (Mem.toMemory @Mem.Byte $ Mem.bit 15) `shouldBe` 1

readMemorySpec :: Spec
readMemorySpec = describe "readMemory" $ do
    it "reads correct integral Byte" $
        Mem.readMemory @Mem.Byte "2B" `shouldBe` Just (Mem.byte 2)
    it "reads correct integral with '.' Byte" $
        Mem.readMemory @Mem.Byte "2.75B" `shouldBe` Just (Mem.Memory 22)
    it "doesn't read non-representable amount of Bytes" $
        Mem.readMemory @Mem.Byte "2.22B" `shouldBe` Nothing
    it "doesn't read if type and unit symbol don't match" $
        Mem.readMemory @Mem.Terabyte "42MB" `shouldBe` Nothing
    it "doesn't read if whole part is missing" $
        Mem.readMemory @Mem.Megabyte ".42MB" `shouldBe` Nothing
    it "reads correct integral Kibibyte" $
        Mem.readMemory @Mem.Kibibyte "42KiB" `shouldBe` Just (Mem.kibibyte 42)
    it "reads correct integral Kibibyte" $
        Mem.readMemory @Mem.Kibibyte "42.5KiB" `shouldBe` Just (Mem.Memory 348160)
    it "doesn't read string with letters" $
        Mem.readMemory @Mem.Megabyte "1a.42MB" `shouldBe` Nothing
    it "doesn't read string with double dots" $
        Mem.readMemory @Mem.Megabyte "1.4.2MB" `shouldBe` Nothing
    it "doesn't read string without unit" $
        Mem.readMemory @Mem.Megabyte "42" `shouldBe` Nothing