packages feed

hw-balancedparens-0.3.0.4: test/HaskellWorks/Data/BalancedParens/SimpleSpec.hs

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE ScopedTypeVariables        #-}

module HaskellWorks.Data.BalancedParens.SimpleSpec where

import Data.Maybe
import Data.Word
import HaskellWorks.Data.BalancedParens
import HaskellWorks.Data.Bits.BitLength
import HaskellWorks.Data.Bits.BitRead
import HaskellWorks.Hspec.Hedgehog
import Hedgehog
import Test.Hspec

import qualified Data.Vector.Storable                 as DVS
import qualified HaskellWorks.Data.BalancedParens.Gen as G
import qualified Hedgehog.Gen                         as G
import qualified Hedgehog.Range                       as R

{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}
{-# ANN module ("HLint: ignore Reduce duplication"  :: String) #-}

spec :: Spec
spec = describe "HaskellWorks.Data.BalancedParens.SimpleSpec" $ do
  describe "For (()(()())) 1101101000" $ do
    let bs = SimpleBalancedParens (91 :: Word64)
    it "Test 1a" $ requireTest $ findClose bs  1 === Just 10
    it "Test 1b" $ requireTest $ findClose bs  2 === Just  3
    it "Test 1b" $ requireTest $ findClose bs  3 === Just  3
    it "Test 1b" $ requireTest $ findClose bs  4 === Just  9
    it "Test 1b" $ requireTest $ findClose bs  5 === Just  6
    it "Test 1b" $ requireTest $ findClose bs  6 === Just  6
    it "Test 1b" $ requireTest $ findClose bs  7 === Just  8
    it "Test 1b" $ requireTest $ findClose bs  8 === Just  8
    it "Test 1b" $ requireTest $ findClose bs  9 === Just  9
    it "Test 1b" $ requireTest $ findClose bs 10 === Just 10
    it "Test 2a" $ requireTest $ findOpen  bs 10 === Just  1
    it "Test 2b" $ requireTest $ findOpen  bs  3 === Just  2
    it "Test 3a" $ requireTest $ enclose   bs  2 === Just  1
    it "Test 3b" $ requireTest $ enclose   bs  7 === Just  4
  describe "For (()(()())) 1101101000" $ do
    let bs = SimpleBalancedParens (fromJust (bitRead "1101101000") :: [Bool])
    it "Test 1a"        $ requireTest $ findClose   bs  1 === Just 10
    it "Test 1b"        $ requireTest $ findClose   bs  2 === Just  3
    it "Test 1b"        $ requireTest $ findClose   bs  3 === Just  3
    it "Test 1b"        $ requireTest $ findClose   bs  4 === Just  9
    it "Test 1b"        $ requireTest $ findClose   bs  5 === Just  6
    it "Test 1b"        $ requireTest $ findClose   bs  6 === Just  6
    it "Test 1b"        $ requireTest $ findClose   bs  7 === Just  8
    it "Test 1b"        $ requireTest $ findClose   bs  8 === Just  8
    it "Test 1b"        $ requireTest $ findClose   bs  9 === Just  9
    it "Test 1b"        $ requireTest $ findClose   bs 10 === Just 10
    it "Test 2a"        $ requireTest $ findOpen    bs 10 === Just  1
    it "Test 2b"        $ requireTest $ findOpen    bs  3 === Just  2
    it "Test 3a"        $ requireTest $ enclose     bs  2 === Just  1
    it "Test 3b"        $ requireTest $ enclose     bs  7 === Just  4
    it "firstChild 1"   $ requireTest $ firstChild  bs  1 === Just  2
    it "firstChild 4"   $ requireTest $ firstChild  bs  4 === Just  5
    it "nextSibling 2"  $ requireTest $ nextSibling bs  2 === Just  4
    it "nextSibling 5"  $ requireTest $ nextSibling bs  5 === Just  7
    it "parent 2"       $ requireTest $ parent      bs  2 === Just  1
    it "parent 5"       $ requireTest $ parent      bs  5 === Just  4
    it "depth  1"       $ requireTest $ depth       bs  1 === Just  1
    it "depth  2"       $ requireTest $ depth       bs  2 === Just  2
    it "depth  3"       $ requireTest $ depth       bs  3 === Just  2
    it "depth  4"       $ requireTest $ depth       bs  4 === Just  2
    it "depth  5"       $ requireTest $ depth       bs  5 === Just  3
    it "depth  6"       $ requireTest $ depth       bs  6 === Just  3
    it "depth  7"       $ requireTest $ depth       bs  7 === Just  3
    it "depth  8"       $ requireTest $ depth       bs  8 === Just  3
    it "depth  9"       $ requireTest $ depth       bs  9 === Just  2
    it "depth 10"       $ requireTest $ depth       bs 10 === Just  1
    it "subtreeSize  1" $ requireTest $ subtreeSize bs  1 === Just  5
    it "subtreeSize  2" $ requireTest $ subtreeSize bs  2 === Just  1
    it "subtreeSize  3" $ requireTest $ subtreeSize bs  3 === Just  0
    it "subtreeSize  4" $ requireTest $ subtreeSize bs  4 === Just  3
    it "subtreeSize  5" $ requireTest $ subtreeSize bs  5 === Just  1
    it "subtreeSize  6" $ requireTest $ subtreeSize bs  6 === Just  0
    it "subtreeSize  7" $ requireTest $ subtreeSize bs  7 === Just  1
    it "subtreeSize  8" $ requireTest $ subtreeSize bs  8 === Just  0
    it "subtreeSize  9" $ requireTest $ subtreeSize bs  9 === Just  0
    it "subtreeSize 10" $ requireTest $ subtreeSize bs 10 === Just  0
  describe "For (()(()())) 11011010 00000000 :: DVS.Vector Word8" $ do
    let bs = SimpleBalancedParens (fromJust (bitRead "11011010 00000000") :: DVS.Vector Word8)
    it "Test 1a"        $ requireTest $ findClose   bs  1 === Just 10
    it "Test 1b"        $ requireTest $ findClose   bs  2 === Just  3
    it "Test 1b"        $ requireTest $ findClose   bs  3 === Just  3
    it "Test 1b"        $ requireTest $ findClose   bs  4 === Just  9
    it "Test 1b"        $ requireTest $ findClose   bs  5 === Just  6
    it "Test 1b"        $ requireTest $ findClose   bs  6 === Just  6
    it "Test 1b"        $ requireTest $ findClose   bs  7 === Just  8
    it "Test 1b"        $ requireTest $ findClose   bs  8 === Just  8
    it "Test 1b"        $ requireTest $ findClose   bs  9 === Just  9
    it "Test 1b"        $ requireTest $ findClose   bs 10 === Just 10
    it "Test 2a"        $ requireTest $ findOpen    bs 10 === Just  1
    it "Test 2b"        $ requireTest $ findOpen    bs  3 === Just  2
    it "Test 3a"        $ requireTest $ enclose     bs  2 === Just  1
    it "Test 3b"        $ requireTest $ enclose     bs  7 === Just  4
    it "firstChild 1"   $ requireTest $ firstChild  bs  1 === Just  2
    it "firstChild 4"   $ requireTest $ firstChild  bs  4 === Just  5
    it "nextSibling 2"  $ requireTest $ nextSibling bs  2 === Just  4
    it "nextSibling 5"  $ requireTest $ nextSibling bs  5 === Just  7
    it "parent 2"       $ requireTest $ parent      bs  2 === Just  1
    it "parent 5"       $ requireTest $ parent      bs  5 === Just  4
    it "depth  1"       $ requireTest $ depth       bs  1 === Just  1
    it "depth  2"       $ requireTest $ depth       bs  2 === Just  2
    it "depth  3"       $ requireTest $ depth       bs  3 === Just  2
    it "depth  4"       $ requireTest $ depth       bs  4 === Just  2
    it "depth  5"       $ requireTest $ depth       bs  5 === Just  3
    it "depth  6"       $ requireTest $ depth       bs  6 === Just  3
    it "depth  7"       $ requireTest $ depth       bs  7 === Just  3
    it "depth  8"       $ requireTest $ depth       bs  8 === Just  3
    it "depth  9"       $ requireTest $ depth       bs  9 === Just  2
    it "depth 10"       $ requireTest $ depth       bs 10 === Just  1
    it "subtreeSize  1" $ requireTest $ subtreeSize bs  1 === Just  5
    it "subtreeSize  2" $ requireTest $ subtreeSize bs  2 === Just  1
    it "subtreeSize  3" $ requireTest $ subtreeSize bs  3 === Just  0
    it "subtreeSize  4" $ requireTest $ subtreeSize bs  4 === Just  3
    it "subtreeSize  5" $ requireTest $ subtreeSize bs  5 === Just  1
    it "subtreeSize  6" $ requireTest $ subtreeSize bs  6 === Just  0
    it "subtreeSize  7" $ requireTest $ subtreeSize bs  7 === Just  1
    it "subtreeSize  8" $ requireTest $ subtreeSize bs  8 === Just  0
    it "subtreeSize  9" $ requireTest $ subtreeSize bs  9 === Just  0
    it "subtreeSize 10" $ requireTest $ subtreeSize bs 10 === Just  0
  describe "Does not suffer exceptions" $ do
    it "when calling nextSibling from valid locations" $ requireProperty $ do
      v <- forAll $ G.storableVector (R.linear 1 64) (G.word64 R.constantBounded)
      [nextSibling v p | p <- [1..bitLength v]] === [nextSibling v p | p <- [1..bitLength v]]