{-# LANGUAGE ExplicitForAll #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MonoLocalBinds #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE NoMonomorphismRestriction #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} {-# OPTIONS_GHC -fno-warn-missing-signatures #-} module HaskellWorks.Data.Xml.RawValueSpec (spec) where import Control.Monad import Data.String import Data.Text (Text) 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.RawValue import HaskellWorks.Data.Xml.Succinct.Cursor as C import HaskellWorks.Data.Xml.Succinct.Index 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) #-} fc = TC.firstChild ns = TC.nextSibling attrs :: [(Text, Text)] -> RawValue attrs as = RawAttrList $ as >>= (\(k, v) -> [RawAttrName k, RawAttrValue v]) spec :: Spec spec = describe "HaskellWorks.Data.Xml.ValueSpec" $ 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))) rawValueVia :: XmlIndexAt (XmlCursor BS.ByteString t u) => Maybe (XmlCursor BS.ByteString t u) -> RawValue rawValueVia mk = case mk of Just k -> rawValueAt (xmlIndexAt k) --either (\(DecodeError e) -> XmlError e) id (rawValueAt <$> xmlIndexAt k) Nothing -> RawError "No such element" 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 value" $ requireTest $ rawValueVia (Just cursor) === RawElement "a" [] forXml "" $ \cursor -> do it "should have correct value" $ requireTest $ rawValueVia (Just cursor) === RawElement "a" [attrs [("attr", "value")]] forXml "" $ \cursor -> do it "should have correct value" $ requireTest $ rawValueVia (Just cursor) === RawElement "a" [attrs [("attr", "value")], RawElement "b" [attrs [("attr", "value")]]] forXml "value text" $ \cursor -> do it "should have correct value" $ requireTest $ rawValueVia (Just cursor) === RawElement "a" [RawText "value text"] forXml "" $ \cursor -> do it "should parse space separared comment" $ requireTest $ rawValueVia (Just cursor) === RawComment " some comment " forXml "" $ \cursor -> do it "should parse space separared comment" $ requireTest $ rawValueVia (Just cursor) === RawComment "some comment ->" forXml " tag]]>" $ \cursor -> do it "should parse cdata data" $ requireTest $ rawValueVia (Just cursor) === RawCData "a
tag" forXml "]>" $ \cursor -> do it "should parse metas" $ requireTest $ rawValueVia (Just cursor) === RawMeta "DOCTYPE" [RawMeta "ELEMENT" []] forXml "free" $ \cursor -> do it "should parse xml header" $ requireTest $ rawValueVia (Just cursor) === RawDocument [ attrs [("version", "1.0"), ("encoding", "UTF-8")], RawElement "a" [attrs [("text", "value")], RawText "free"]] it "navigate around" $ requireTest $ do rawValueVia (ns cursor) === RawElement "a" [attrs [("text", "value")], RawText "free"] rawValueVia ((ns >=> fc) cursor) === attrs [("text", "value")] rawValueVia ((ns >=> fc >=> fc) cursor) === RawAttrName "text" rawValueVia ((ns >=> fc >=> fc >=> ns) cursor) === RawAttrValue "value" rawValueVia ((ns >=> fc >=> ns) cursor) === RawText "free"