packages feed

rdf4h-4.0.0: testsuite/tests/W3C/TurtleTest.hs

{-# LANGUAGE OverloadedStrings #-}

module W3C.TurtleTest
  ( testsParsec
  , testsAttoparsec
  , mfBaseURITurtle
  ) where

import Test.Tasty
import qualified Test.Tasty.HUnit as TU

import Data.Semigroup ((<>))
import Data.Maybe (fromJust)
import qualified Data.Text as T

import W3C.Manifest
import W3C.W3CAssertions

import Data.RDF.Types
import Data.RDF.Query
import Text.RDF.RDF4H.TurtleParser
import Text.RDF.RDF4H.NTriplesParser
import Text.RDF.RDF4H.ParserUtils
import Data.RDF.Graph.TList

testsParsec :: String -> Manifest -> TestTree
testsParsec = runManifestTests . (`mfEntryToTest` testParserParsec)

testsAttoparsec :: String -> Manifest -> TestTree
testsAttoparsec = runManifestTests . (`mfEntryToTest` testParserAttoparsec)

mfEntryToTest :: String -> (String -> TurtleParserCustom) -> TestEntry -> TestTree
mfEntryToTest dir parser (TestTurtleEval nm _ _ act res) =
  let pathExpected = getFilePath dir res
      pathAction = getFilePath dir act
      parsedRDF   = (fromEither <$> parseFile (parser (nodeURI act)) pathAction) :: IO (RDF TList)
      expectedRDF = (fromEither <$> parseFile NTriplesParser pathExpected) :: IO (RDF TList)
  in TU.testCase (T.unpack nm) $ assertIsIsomorphic parsedRDF expectedRDF
mfEntryToTest dir parser (TestTurtleNegativeEval nm _ _ act) =
  let pathAction = getFilePath dir act
      rdf = parseFile (parser (nodeURI act)) pathAction :: IO (Either ParseFailure (RDF TList))
  in TU.testCase (T.unpack nm) $ assertIsNotParsed rdf
mfEntryToTest dir parser (TestTurtlePositiveSyntax nm _ _ act) =
  let pathAction = getFilePath dir act
      rdf = parseFile (parser (nodeURI act)) pathAction :: IO (Either ParseFailure (RDF TList))
  in TU.testCase (T.unpack nm) $ assertIsParsed rdf
mfEntryToTest dir parser (TestTurtleNegativeSyntax nm _ _ act) =
  let pathAction = getFilePath dir act
      rdf = parseFile (parser (nodeURI act)) pathAction :: IO (Either ParseFailure (RDF TList))
  in TU.testCase (T.unpack nm) $ assertIsNotParsed rdf
mfEntryToTest _ _ x = error $ "unknown TestEntry pattern in mfEntryToTest: " <> show x

-- [NOTE] Was previously: http://www.w3.org/2013/TurtleTests/
mfBaseURITurtle :: BaseUrl
mfBaseURITurtle = BaseUrl "http://w3c.github.io/rdf-tests/turtle/"

-- testParser :: TurtleParser
-- testParser = TurtleParser (Just mfBaseURITurtle) Nothing

testParserParsec :: String -> TurtleParserCustom
testParserParsec dUrl = TurtleParserCustom (Just mfBaseURITurtle) (Just . T.pack $ dUrl) Parsec

testParserAttoparsec :: String -> TurtleParserCustom
testParserAttoparsec dUrl = TurtleParserCustom (Just mfBaseURITurtle) (Just . T.pack $ dUrl) Attoparsec

getFilePath :: String -> Node -> String
getFilePath dir (UNode iri) = fixFilePath' iri
  where fixFilePath' = (dir <>) . T.unpack . fromJust . T.stripPrefix (unBaseUrl mfBaseURITurtle)
getFilePath _ _ = error "Unexpected node"