radix-tree-1.0.0.0: test/properties/Test/RadixNTree/Word8/Key.hs
{-# LANGUAGE BangPatterns
, OverloadedLists
, OverloadedStrings #-}
module Test.RadixNTree.Word8.Key
( test
) where
import Data.RadixTree.Word8.Key as Radix
import Data.RadixTree.Word8.Key.Unsafe as Radix
import Data.Radix1Tree.Word8.Key as Radix1
import Data.Radix1Tree.Word8.Key.Unsafe as Radix1
import qualified Data.ByteString.Lazy.Internal as LazyBS (ByteString (..))
import Data.String
import Data.List.NonEmpty (NonEmpty (..))
import qualified Data.Primitive.ByteArray as Prim
import qualified Data.Text.Array as Array
import qualified Data.Text.Internal as Strict (Text (..))
import qualified Data.Text.Internal.Lazy as LazyText (Text (..))
import Data.Word
import Test.Hspec
buildRef :: Build
buildRef = Build (Snoc (Snoc (Snoc Lin [0xC2]) [0xA3, 0x24, 0xE2]) [0x82, 0xAC])
buildRef1 :: Build1
buildRef1 = Build1 $ ((\(Build x) -> x) buildRef) :/ [0xC2, 0xA4]
rawRef, rawRef1, utf8Ref, utf8Ref1 :: IsString a => a
rawRef = "\xC2\xA3$\xE2\x82\xAC"
rawRef1 = "\xC2\xA3$\xE2\x82\xAC\xC2\xA4"
utf8Ref = "£$€"
utf8Ref1 = "£$€¤"
feedRef :: [Word8]
feedRef = [0xC2, 0xA3, 0x24, 0xE2, 0x82, 0xAC]
feedRef1 :: NonEmpty Word8
feedRef1 = 0xC2 :| [0xA3, 0x24, 0xE2, 0x82, 0xAC, 0xC2, 0xA4]
destroy :: Feed -> [Word8]
destroy (Feed feed) =
feed $ \step ->
let go s =
case step s of
More w s' -> w : go s'
Done -> []
in go
destroy1 :: Feed1 -> NonEmpty Word8
destroy1 (Feed1 w feed) = w :| destroy (Feed feed)
test :: Spec
test = do
describe "build" $ do
it "bytes" $
Radix.buildBytes buildRef `shouldBe` feedRef
it "bytes/1" $
Radix1.buildBytes buildRef1 `shouldBe` feedRef1
it "ByteString" $
Radix.buildByteString buildRef `shouldBe` rawRef
it "ByteString/1" $
Radix1.buildByteString buildRef1 `shouldBe` rawRef1
it "ShortByteString" $
Radix.buildShortByteString buildRef `shouldBe` rawRef
it "ShortByteString/1" $
Radix1.buildShortByteString buildRef1 `shouldBe` rawRef1
it "Text" $
Radix.unsafeBuildText buildRef `shouldBe` utf8Ref
it "Text/1" $
Radix1.unsafeBuildText buildRef1 `shouldBe` utf8Ref1
describe "feed" $ do
it "bytes" $
destroy (Radix.feedBytes feedRef) `shouldBe` feedRef
it "bytes/1" $
destroy1 (Radix1.feedBytes feedRef1) `shouldBe` feedRef1
it "ByteString" $
destroy (Radix.feedByteString rawRef) `shouldBe` feedRef
it "ByteString/1" $
destroy1 (Radix1.unsafeFeedByteString rawRef1) `shouldBe` feedRef1
it "ShortByteString" $
destroy (Radix.feedShortByteString rawRef) `shouldBe` feedRef
it "ShortByteString/1" $
destroy1 (Radix1.unsafeFeedShortByteString rawRef1) `shouldBe` feedRef1
it "Text" $
destroy (Radix.feedText utf8Ref) `shouldBe` feedRef
it "Text/1" $
destroy1 (Radix1.unsafeFeedText utf8Ref1) `shouldBe` feedRef1
it "lazy ByteString" $
let ref = LazyBS.Chunk [0xC2] . LazyBS.Chunk [0xA3, 0x24, 0xE2]
$ LazyBS.Chunk [0x82, 0xAC] LazyBS.Empty
in destroy (Radix.feedLazyByteString ref) `shouldBe` feedRef
it "lazy ByteString/1" $
let rest = LazyBS.Chunk [0xA3, 0x24, 0xE2]
. LazyBS.Chunk [0x82, 0xAC]
$ LazyBS.Chunk [0xC2, 0xA4] LazyBS.Empty
in destroy1 (Radix1.unsafeFeedLazyByteString "\xC2" rest) `shouldBe` feedRef1
it "lazy Text" $
let !(Prim.ByteArray c1) = [0xC2]
!(Prim.ByteArray c2) = [0xA3, 0x24, 0xE2]
!(Prim.ByteArray c3) = [0x82, 0xAC]
ref = LazyText.Chunk (Strict.Text (Array.ByteArray c1) 0 1)
. LazyText.Chunk (Strict.Text (Array.ByteArray c2) 0 3)
. LazyText.Chunk (Strict.Text (Array.ByteArray c3) 0 2)
$ LazyText.Empty
in destroy (Radix.feedLazyText ref) `shouldBe` feedRef
it "lazy Text/1" $
let !(Prim.ByteArray c1) = [0xC2]
!(Prim.ByteArray c2) = [0xA3, 0x24, 0xE2]
!(Prim.ByteArray c3) = [0x82, 0xAC]
!(Prim.ByteArray c4) = [0xC2, 0xA4]
first = Strict.Text (Array.ByteArray c1) 0 1
ref = LazyText.Chunk (Strict.Text (Array.ByteArray c2) 0 3)
. LazyText.Chunk (Strict.Text (Array.ByteArray c3) 0 2)
. LazyText.Chunk (Strict.Text (Array.ByteArray c4) 0 2)
$ LazyText.Empty
in destroy1 (Radix1.unsafeFeedLazyText first ref) `shouldBe` feedRef1