{-# LANGUAGE ExplicitForAll #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
{-# OPTIONS_GHC -fno-warn-simplifiable-class-constraints #-}
module HaskellWorks.Data.Xml.TypeSpec (spec) where
import Control.Monad
import Data.String
import Data.Word
import HaskellWorks.Data.BalancedParens.BalancedParens
import HaskellWorks.Data.BalancedParens.Simple
import HaskellWorks.Data.Bits.BitShown
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.RankSelect.Base.Rank0
import HaskellWorks.Data.RankSelect.Base.Rank1
import HaskellWorks.Data.RankSelect.Base.Select1
import HaskellWorks.Data.RankSelect.Poppy512
import HaskellWorks.Data.Xml.Succinct.Cursor as C
import HaskellWorks.Data.Xml.Type
import HaskellWorks.Hspec.Hedgehog
import Hedgehog
import Test.Hspec
import qualified Data.ByteString as BS
import qualified Data.Vector.Storable as DVS
import qualified HaskellWorks.Data.TreeCursor as TC
{-# ANN module ("HLint: ignore Redundant do" :: String) #-}
{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}
{-# ANN module ("HLint: ignore Redundant bracket" :: String) #-}
fc = TC.firstChild
ns = TC.nextSibling
spec :: Spec
spec = describe "HaskellWorks.Data.Xml.TypeSpec" $ do
genSpec "DVS.Vector Word8" (undefined :: XmlCursor BS.ByteString (BitShown (DVS.Vector Word8 )) (SimpleBalancedParens (DVS.Vector Word8 )))
genSpec "DVS.Vector Word16" (undefined :: XmlCursor BS.ByteString (BitShown (DVS.Vector Word16)) (SimpleBalancedParens (DVS.Vector Word16)))
genSpec "DVS.Vector Word32" (undefined :: XmlCursor BS.ByteString (BitShown (DVS.Vector Word32)) (SimpleBalancedParens (DVS.Vector Word32)))
genSpec "DVS.Vector Word64" (undefined :: XmlCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64)))
genSpec "Poppy512" (undefined :: XmlCursor BS.ByteString Poppy512 (SimpleBalancedParens (DVS.Vector Word64)))
genSpec :: forall t u.
( Show t
, Select1 t
, Show u
, Rank0 u
, Rank1 u
, BalancedParens u
, TestBit u
, IsString (XmlCursor BS.ByteString t u)
)
=> String -> (XmlCursor BS.ByteString t u) -> SpecWith ()
genSpec t _ = do
describe ("XML cursor of type " ++ t) $ do
let forXml (cursor :: XmlCursor BS.ByteString t u) f = describe ("of value " ++ show cursor) (f cursor)
forXml "" $ \cursor -> do
it "should have correct type" . requireTest $ xmlTypeAt cursor === Just XmlTypeElement
forXml " " $ \cursor -> do
it "should have correct type" . requireTest $ xmlTypeAt cursor === Just XmlTypeElement
forXml "" $ \cursor -> do
it "cursor can navigate to second attribute" $ requireTest $ do
(fc >=> fc >=> ns >=> ns >=> xmlTypeAt) cursor === Just XmlTypeToken
it "cursor can navigate to first attribute of an inner element" $ requireTest $ do
(fc >=> ns >=> fc >=> fc >=> xmlTypeAt) cursor === Just XmlTypeToken
it "cursor can navigate to first atrribute value of an inner element" $ requireTest $ do
(fc >=> ns >=> fc >=> fc >=> ns >=> xmlTypeAt) cursor === Just XmlTypeToken
describe "For a single element" $ do
let cursor = "text" :: XmlCursor BS.ByteString t u
it "can navigate down and forwards" $ requireTest $ do
( xmlTypeAt) cursor === Just XmlTypeElement
(fc >=> xmlTypeAt) cursor === Just XmlTypeToken
(fc >=> ns >=> xmlTypeAt) cursor === Nothing
(fc >=> ns >=> ns >=> xmlTypeAt) cursor === Nothing
describe "For sample Xml" $ do
let cursor = " \
\ \
\ 500 \
\ 600.01e-02 \
\ false \
\ \
\" :: XmlCursor BS.ByteString t u
it "can navigate down and forwards" $ requireTest $ do
( xmlTypeAt) cursor === Just XmlTypeElement --widget
(fc >=> xmlTypeAt) cursor === Just XmlTypeAttrList --widget attrs
(fc >=> ns >=> xmlTypeAt) cursor === Just XmlTypeElement --window
(fc >=> ns >=> fc >=> xmlTypeAt) cursor === Just XmlTypeAttrList --window attrs
(fc >=> ns >=> fc >=> ns >=> xmlTypeAt) cursor === Just XmlTypeElement --dimension 500
(fc >=> ns >=> fc >=> ns >=> ns >=> xmlTypeAt) cursor === Just XmlTypeElement --dimension 600
(fc >=> ns >=> fc >=> ns >=> ns >=> ns >=> xmlTypeAt) cursor === Just XmlTypeElement --dimension false
(fc >=> ns >=> fc >=> ns >=> ns >=> ns >=> fc >=> xmlTypeAt) cursor === Just XmlTypeToken --false