{-# LANGUAGE BangPatterns        #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE ScopedTypeVariables #-}

module HaskellWorks.Data.DsvSpec (spec) where

import HaskellWorks.Data.Bits.BitShow
import HaskellWorks.Data.Dsv.Internal.Char (comma)
import HaskellWorks.Data.FromByteString
import HaskellWorks.Hspec.Hedgehog
import Hedgehog
import Test.Hspec

import qualified HaskellWorks.Data.Dsv.Strict.Cursor.Internal.Reference as SVS

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

spec :: Spec
spec = describe "HaskellWorks.Data.DsvSpec" $ do
  it "Parsing Basic DSV" $ requireTest $ do
    let bs =  "12345678,12345678,123456,abcdefghijklmnopqrstuvwxyz\n\
              \12345678,12345678,123456,abcdefghijklmnopqrstuvwxyz\n\
              \12345678,12345678,123456,abcdefghijklmnopqrstuvwxyz\n\
              \12345678,12345678,123456,abcdefghijklmnopqrstuvwxyz"

    let v = fromByteString bs
    let actual = SVS.mkIbVector comma v

    bitShow actual ===  "00000000 10000000 01000000 10000000 00000000 00000000 00010000 00001000 \
                        \00000100 00001000 00000000 00000000 00000001 00000000 10000000 01000000 \
                        \10000000 00000000 00000000 00010000 00001000 00000100 00001000 00000000 \
                        \00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000"
  it "Parsing Quoted DSV" $ requireTest $ do
    let bs =  "12345678,12345678,123456,\"bcdefghijklmnopqrstuvwxy\"\n\
              \12345678,12345678,123456,\"bcdefghijklmnopqrstuvwxy\"\n\
              \12345678,12345678,123456,\"bcdefghijklmnopqrstuvwxy\"\n\
              \12345678,12345678,123456,\"bcdefghijklmnopqrstuvwxy\""

    let v = fromByteString bs
    let !actual = SVS.mkIbVector comma v

    bitShow actual ===  "00000000 10000000 01000000 10000000 00000000 00000000 00010000 00001000 \
                        \00000100 00001000 00000000 00000000 00000001 00000000 10000000 01000000 \
                        \10000000 00000000 00000000 00010000 00001000 00000100 00001000 00000000 \
                        \00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000"
  it "Parsing Quoted DSV" $ requireTest $ do
    let bs =  "12345678,12345678,123456,\"bcdefghijklm,opqrstuvwxy\"\n\
              \12345678,12345678,123456,\"bcdefghijklm,opqrstuvwxy\"\n\
              \12345678,12345678,123456,\"bcdefghijklm,opqrstuvwxy\"\n\
              \12345678,12345678,123456,\"bcdefghijklm,opqrstuvwxy\""

    let v = fromByteString bs
    let !actual = SVS.mkIbVector comma v

    bitShow actual ===  "00000000 10000000 01000000 10000000 00000000 00000000 00010000 00001000 \
                        \00000100 00001000 00000000 00000000 00000001 00000000 10000000 01000000 \
                        \10000000 00000000 00000000 00010000 00001000 00000100 00001000 00000000 \
                        \00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000"