packages feed

hw-succinct-0.0.0.1: test/HaskellWorks/Data/Conduit/JsonSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module HaskellWorks.Data.Conduit.JsonSpec (spec) where

import           Data.ByteString                                      as BS
import           Data.Conduit
import           Data.Int
import           HaskellWorks.Data.Bits.BitShown
import           HaskellWorks.Data.Bits.Conversion
import           HaskellWorks.Data.Conduit.Json
import           HaskellWorks.Data.Conduit.List
import           HaskellWorks.Data.Conduit.Tokenize.Attoparsec
import           HaskellWorks.Data.Conduit.Tokenize.Attoparsec.Offset
import           HaskellWorks.Data.Json.Token
import           Test.Hspec

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

markerToBits :: [Int64] -> [Bool]
markerToBits = runListConduit (markerToByteString =$= byteStringToBits)

jsonToBits :: [ByteString] -> [Bool]
jsonToBits = runListConduit (textToJsonToken =$= jsonToken2Markers =$= markerToByteString =$= byteStringToBits)

jsonToken2Markers2 :: [(ParseDelta Offset, JsonToken)] -> [Int64]
jsonToken2Markers2 = runListConduit jsonToken2Markers

blankedJsonToInterestBits2 :: ByteString -> BitShown ByteString
blankedJsonToInterestBits2 bs = BitShown (BS.concat (runListConduit blankedJsonToInterestBits [bs]))

spec :: Spec
spec = describe "Data.Conduit.Succinct.JsonSpec" $ do
  it "No markers should produce no bits" $
    markerToBits [] `shouldBe` []
  it "One marker < 8 should produce one byte with one bit set" $ do
    markerToBits [0] `shouldBe` stringToBits "10000000"
    markerToBits [1] `shouldBe` stringToBits "01000000"
    markerToBits [2] `shouldBe` stringToBits "00100000"
    markerToBits [3] `shouldBe` stringToBits "00010000"
    markerToBits [4] `shouldBe` stringToBits "00001000"
    markerToBits [5] `shouldBe` stringToBits "00000100"
    markerToBits [6] `shouldBe` stringToBits "00000010"
    markerToBits [7] `shouldBe` stringToBits "00000001"
  it "One 8 <= marker < 16 should produce one byte empty byte and another byte with one bit set" $ do
    markerToBits [ 8] `shouldBe` stringToBits "00000000 10000000"
    markerToBits [ 9] `shouldBe` stringToBits "00000000 01000000"
    markerToBits [10] `shouldBe` stringToBits "00000000 00100000"
    markerToBits [11] `shouldBe` stringToBits "00000000 00010000"
    markerToBits [12] `shouldBe` stringToBits "00000000 00001000"
    markerToBits [13] `shouldBe` stringToBits "00000000 00000100"
    markerToBits [14] `shouldBe` stringToBits "00000000 00000010"
    markerToBits [15] `shouldBe` stringToBits "00000000 00000001"
  it "All markers 0 .. 7 should produce one full byte" $
    markerToBits [0, 1, 2, 3, 4, 5, 6, 7] `shouldBe` stringToBits "11111111"
  it "All markers 0 .. 7 except 1 should produce one almost full byte" $ do
    markerToBits [1, 2, 3, 4, 5, 6, 7] `shouldBe` stringToBits "01111111"
    markerToBits [0, 2, 3, 4, 5, 6, 7] `shouldBe` stringToBits "10111111"
    markerToBits [0, 1, 3, 4, 5, 6, 7] `shouldBe` stringToBits "11011111"
    markerToBits [0, 1, 2, 4, 5, 6, 7] `shouldBe` stringToBits "11101111"
    markerToBits [0, 1, 2, 3, 5, 6, 7] `shouldBe` stringToBits "11110111"
    markerToBits [0, 1, 2, 3, 4, 6, 7] `shouldBe` stringToBits "11111011"
    markerToBits [0, 1, 2, 3, 4, 5, 7] `shouldBe` stringToBits "11111101"
    markerToBits [0, 1, 2, 3, 4, 5, 6] `shouldBe` stringToBits "11111110"
  it "All markers 0 .. 8 should produce one almost full byte and one near empty byte" $
    markerToBits [0, 1, 2, 3, 4, 5, 6, 7, 8] `shouldBe` stringToBits "11111111 10000000"
  it "Matching bits for bytes" $
    runListConduit byteStringToBits [pack [0x80], pack [0xff], pack [0x01]] `shouldBe`
      stringToBits "00000001 11111111 10000000"
  it "Every interesting token should produce a marker" $
    jsonToken2Markers2 [
      (ParseDelta (Offset 0) (Offset 1), JsonTokenBraceL),
      (ParseDelta (Offset 1) (Offset 2), JsonTokenBraceL),
      (ParseDelta (Offset 2) (Offset 3), JsonTokenBraceR),
      (ParseDelta (Offset 3) (Offset 4), JsonTokenBraceR)] `shouldBe` [0, 1]
  describe "When converting Json to tokens to markers to bits" $ do
    it "Empty Json should produce no bits" $
      jsonToBits [""] `shouldBe` []
    it "Spaces and newlines should produce no bits" $
      jsonToBits ["  \n \r \t "] `shouldBe` []
    it "number at beginning should produce one bit" $
      jsonToBits ["1234 "] `shouldBe` stringToBits "10000000"
    it "false at beginning should produce one bit" $
      jsonToBits ["false "] `shouldBe` stringToBits "10000000"
    it "true at beginning should produce one bit" $
      jsonToBits ["true "] `shouldBe` stringToBits "10000000"
    it "string at beginning should produce one bit" $
      jsonToBits ["\"hello\" "] `shouldBe` stringToBits "10000000"
    it "string at beginning should produce one bit" $
      jsonToBits ["\"\\\"\" "] `shouldBe` stringToBits "10000000"
    it "left brace at beginning should produce one bit" $
      jsonToBits ["{ "] `shouldBe` stringToBits "10000000"
    it "right brace at beginning should produce one bit" $
      jsonToBits ["} "] `shouldBe` stringToBits ""
    it "left bracket at beginning should produce one bit" $
      jsonToBits ["[ "] `shouldBe` stringToBits "10000000"
    it "right bracket at beginning should produce one bit" $
      jsonToBits ["] "] `shouldBe` stringToBits ""
    it "right bracket at beginning should produce one bit" $
      jsonToBits [": "] `shouldBe` stringToBits ""
    it "right bracket at beginning should produce one bit" $
      jsonToBits [", "] `shouldBe` stringToBits ""
    it "Four consecutive braces should produce four bits" $
      jsonToBits ["{{}}"] `shouldBe` stringToBits "11000000"
    it "Four spread out braces should produce four spread out bits" $
      jsonToBits [" { { } } "] `shouldBe` stringToBits "01010000"
  describe "Can convert blanked json to Json interest bits" $ do
    it "where blanked json is \" { (  ): 100, [(), t___], n___}\"" $ do
      blankedJsonToInterestBits2 " { (  ): 100, [(), t___], n___}" `shouldBe` "01010000 01000011 00010000 00100000"