{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE OverloadedStrings #-} module HaskellWorks.Data.Xml.Succinct.Cursor.BalancedParensSpec ( spec ) where import Data.Monoid ((<>)) import Data.String import HaskellWorks.Data.Bits.BitShown import HaskellWorks.Data.ByteString import HaskellWorks.Data.Xml.Internal.BalancedParens import HaskellWorks.Data.Xml.Internal.Blank import HaskellWorks.Data.Xml.Internal.List import HaskellWorks.Data.Xml.Succinct.Cursor.BlankedXml import HaskellWorks.Hspec.Hedgehog import Hedgehog import Test.Hspec import qualified Data.ByteString as BS {-# ANN module ("HLint: Ignore Redundant do" :: String) #-} spec :: Spec spec = describe "HaskellWorks.Data.Xml.Succinct.Cursor.BalancedParensSpec" $ do it "Blanking XML should work 1" $ requireTest $ do let blankedXml = BlankedXml [">"] let bp = BitShown $ BS.concat (compressWordAsBit (blankedXmlToBalancedParens (getBlankedXml blankedXml))) bp === fromString "11011000" it "Blanking XML should work 2" $ requireTest $ do let blankedXml = BlankedXml [ "<><><><><><><><>" , "<><><><><><><><>" ] let bp = BitShown $ BS.concat (compressWordAsBit (blankedXmlToBalancedParens (getBlankedXml blankedXml))) bp === fromString "1010101010101010\ \1010101010101010" let unchunkedInput = "\n\n \n \n \n \n \n \n\n" let chunkedInput = chunkedBy 15 unchunkedInput let chunkedBlank = blankXml chunkedInput let unchunkedBadInput = "\n\n \n \n \n \n \n \n\n" let chunkedBadInput = chunkedBy 15 unchunkedBadInput let chunkedBadBlank = blankXml chunkedBadInput it "Same input" $ requireTest $ do unchunkedInput === BS.concat chunkedInput it "Blanking XML should work 3" $ requireTest $ do let bp = BitShown $ BS.concat (compressWordAsBit (blankedXmlToBalancedParens chunkedBlank)) annotate $ "Good: " <> show chunkedBlank bp === fromString "11101010 10001101 01010100" it "Blanking XML should work 3" $ requireTest $do let bp = BitShown $ BS.concat (compressWordAsBit (blankedXmlToBalancedParens chunkedBadBlank)) annotate $ "Bad: " <> show chunkedBadBlank bp === fromString "11101010 10001101 01010100" describe "Chunking works" $ do let document = "free" let whole = mkBlank 4096 document let chunked = mkBlank 15 document it "should BP the same with chanks" $ requireTest $do BS.concat chunked === BS.concat whole it "should produce same bits" $ requireTest $do BS.concat (mkBits chunked) === BS.concat (mkBits whole) mkBlank :: Int -> BS.ByteString -> [BS.ByteString] mkBlank csize bs = blankXml (chunkedBy csize bs) mkBits :: [BS.ByteString] -> [BS.ByteString] mkBits = compressWordAsBit . blankedXmlToBalancedParens