{-# LANGUAGE ExplicitForAll #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE NoMonomorphismRestriction #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} {-# OPTIONS_GHC -fno-warn-missing-signatures #-} 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.FromForeignRegion 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.Succinct.Index import HaskellWorks.Data.Xml.Type 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: redundant bracket" :: String) #-} fc = TC.firstChild ns = TC.nextSibling spec :: Spec spec = describe "HaskellWorks.Data.Xml.TypeSpec" $ do describe "Cursor for [Bool]" $ do it "initialises to beginning of empty object" $ do let cursor = "" :: XmlCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool]) xmlTypeAt cursor `shouldBe` Just XmlTypeElement it "initialises to beginning of empty object preceded by spaces" $ do let cursor = " " :: XmlCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool]) xmlTypeAt cursor `shouldBe` Just XmlTypeElement it "cursor can navigate to attr list" $ do let cursor = "" :: XmlCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool]) (fc >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeAttrList it "cursor can navigate through attrs" $ do let cursor = "" :: XmlCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool]) (fc >=> fc >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeToken --foo (fc >=> fc >=> ns >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeToken --bar (fc >=> fc >=> ns >=> ns >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeToken --boo (fc >=> fc >=> ns >=> ns >=> ns >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeToken --buzz (fc >=> fc >=> ns >=> ns >=> ns >=> ns >=> xmlTypeAt) cursor `shouldBe` Nothing --back off! it "cursor can navigate to children" $ do let cursor = "" :: XmlCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool]) (fc >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeElement --b (fc >=> ns >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeElement --c (fc >=> ns >=> ns >=> xmlTypeAt) cursor `shouldBe` Nothing --back off! it "cursor recognises child element as an element child next to attr list" $ do let cursor = "" :: XmlCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool]) (fc >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeAttrList (fc >=> ns >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeElement (fc >=> ns >=> ns >=> xmlTypeAt) cursor `shouldBe` Nothing -- no more! 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. ( Eq t , Show t , Select1 t , Eq u , Show u , Rank0 u , Rank1 u , BalancedParens u , TestBit u , FromForeignRegion (XmlCursor BS.ByteString t u) , IsString (XmlCursor BS.ByteString t u) , XmlIndexAt (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" $ xmlTypeAt cursor `shouldBe` Just XmlTypeElement forXml " " $ \cursor -> do it "should have correct type" $ xmlTypeAt cursor `shouldBe` Just XmlTypeElement forXml "" $ \cursor -> do it "cursor can navigate to second attribute" $ do (fc >=> fc >=> ns >=> ns >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeToken it "cursor can navigate to first attribute of an inner element" $ do (fc >=> ns >=> fc >=> fc >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeToken it "cursor can navigate to first atrribute value of an inner element" $ do (fc >=> ns >=> fc >=> fc >=> ns >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeToken describe "For a single element" $ do let cursor = "text" :: XmlCursor BS.ByteString t u it "can navigate down and forwards" $ do ( xmlTypeAt) cursor `shouldBe` Just XmlTypeElement (fc >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeToken (fc >=> ns >=> xmlTypeAt) cursor `shouldBe` Nothing (fc >=> ns >=> ns >=> xmlTypeAt) cursor `shouldBe` Nothing describe "For sample Xml" $ do let cursor = " \ \ \ \ 500 \ \ 600.01e-02 \ \ false \ \ \ \" :: XmlCursor BS.ByteString t u it "can navigate down and forwards" $ do ( xmlTypeAt) cursor `shouldBe` Just XmlTypeElement --widget (fc >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeAttrList --widget attrs (fc >=> ns >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeElement --window (fc >=> ns >=> fc >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeAttrList --window attrs (fc >=> ns >=> fc >=> ns >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeElement --dimension 500 (fc >=> ns >=> fc >=> ns >=> ns >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeElement --dimension 600 (fc >=> ns >=> fc >=> ns >=> ns >=> ns >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeElement --dimension false (fc >=> ns >=> fc >=> ns >=> ns >=> ns >=> fc >=> xmlTypeAt) cursor `shouldBe` Just XmlTypeToken --false