packages feed

hw-bits-0.7.0.4: test/HaskellWorks/Data/Bits/Writer/StorableSpec.hs

{-# LANGUAGE BinaryLiterals      #-}
{-# LANGUAGE ScopedTypeVariables #-}

module HaskellWorks.Data.Bits.Writer.StorableSpec where

import Data.Word
import HaskellWorks.Hspec.Hedgehog
import Hedgehog
import Test.Hspec

import qualified Data.Vector.Storable                   as DVS
import qualified HaskellWorks.Data.Bits.Writer.Storable as WS

{-# ANN module ("HLint: Ignore Redundant do" :: String) #-}

spec :: Spec
spec = describe "HaskellWorks.Data.Bits.Writer.StorableSpec" $ do
  it "unsafeWriteBit" $ requireTest $ do
    let v :: DVS.Vector Word64 = DVS.create $ do
          mw <- WS.newWriter 10
          WS.unsafeWriteBit mw 1
          WS.unsafeWriteBit mw 0
          WS.unsafeWriteBit mw 1
          WS.unsafeWriteBit mw 1
          WS.unsafeWriteBit mw 0
          WS.unsafeWriteBit mw 0
          WS.unsafeWriteBit mw 1
          WS.unsafeWriteBit mw 1
          WS.unsafeWriteBit mw 1
          WS.unsafeWriteBit mw 0
          WS.unsafeWriteBit mw 0
          WS.unsafeWriteBit mw 0
          WS.written mw

    v === DVS.fromList [0b111001101]
  it "unsafeWriteBits 1" $ requireTest $ do
    let v :: DVS.Vector Word64 = DVS.create $ do
          mw <- WS.newWriter 10
          WS.unsafeWriteBits mw 1 1
          WS.unsafeWriteBits mw 1 0
          WS.unsafeWriteBits mw 1 1
          WS.unsafeWriteBits mw 1 1
          WS.unsafeWriteBits mw 1 0
          WS.unsafeWriteBits mw 1 0
          WS.unsafeWriteBits mw 1 1
          WS.unsafeWriteBits mw 1 1
          WS.unsafeWriteBits mw 1 1
          WS.unsafeWriteBits mw 1 0
          WS.unsafeWriteBits mw 1 0
          WS.unsafeWriteBits mw 1 0
          WS.written mw

    v === DVS.fromList [0b111001101]
  it "unsafeWriteBits 2" $ requireTest $ do
    let v :: DVS.Vector Word64 = DVS.create $ do
          mw <- WS.newWriter 10
          WS.unsafeWriteBits mw 1 0b1
          WS.unsafeWriteBits mw 1 0b0
          WS.unsafeWriteBits mw 2 0b11
          WS.unsafeWriteBits mw 2 0b00
          WS.unsafeWriteBits mw 3 0b111
          WS.unsafeWriteBits mw 3 0b000
          WS.written mw
    v === DVS.fromList [0b111001101]
  it "unsafeWriteBits 2" $ requireTest $ do
    let v :: DVS.Vector Word64 = DVS.create $ do
          mw <- WS.newWriter 10
          WS.unsafeWriteBits mw 1 0b1
          WS.unsafeWriteBits mw 1 0b0
          WS.unsafeWriteBits mw 2 0b11
          WS.unsafeWriteBits mw 2 0b00
          WS.unsafeWriteBits mw 3 0b111
          WS.unsafeWriteBits mw 3 0b000
          WS.unsafeWriteBits mw 4 0b1111
          WS.unsafeWriteBits mw 4 0b0000
          WS.unsafeWriteBits mw 5 0b11111
          WS.unsafeWriteBits mw 5 0b00000
          WS.unsafeWriteBits mw 6 0b111111
          WS.unsafeWriteBits mw 6 0b000000
          WS.unsafeWriteBits mw 7 0b1111111
          WS.unsafeWriteBits mw 7 0b0000000
          WS.unsafeWriteBits mw 8 0b11111111
          WS.unsafeWriteBits mw 8 0b00000000
          WS.unsafeWriteBits mw 9 0b111111111
          WS.unsafeWriteBits mw 9 0b000000000
          WS.written mw
    v === DVS.fromList
      [ 0b1111111100000001111111000000111111000001111100001111000111001101
      , 0b0000000000000000000000000000000000000000000000011111111100000000
      ]
  it "unsafeWriteBits 2" $ requireTest $ do
    let v :: DVS.Vector Word64 = DVS.create $ do
          mw <- WS.newWriter 10
          WS.unsafeWriteBits mw 9 0b111111111
          WS.unsafeWriteBits mw 9 0b000000000
          WS.unsafeWriteBits mw 8 0b11111111
          WS.unsafeWriteBits mw 8 0b00000000
          WS.unsafeWriteBits mw 7 0b1111111
          WS.unsafeWriteBits mw 7 0b0000000
          WS.unsafeWriteBits mw 6 0b111111
          WS.unsafeWriteBits mw 6 0b000000
          WS.unsafeWriteBits mw 5 0b11111
          WS.unsafeWriteBits mw 5 0b00000
          WS.unsafeWriteBits mw 4 0b1111
          WS.unsafeWriteBits mw 4 0b0000
          WS.unsafeWriteBits mw 3 0b111
          WS.unsafeWriteBits mw 3 0b000
          WS.unsafeWriteBits mw 2 0b11
          WS.unsafeWriteBits mw 2 0b00
          WS.unsafeWriteBits mw 1 0b1
          WS.unsafeWriteBits mw 1 0b0
          WS.written mw
    v === DVS.fromList
      [ 0b1111000000111111000000011111110000000011111111000000000111111111
      , 0b0000000000000000000000000000000000000001001100011100001111000001
      ]