packages feed

rdf4h-5.0.1: testsuite/tests/Text/RDF/RDF4H/TurtleSerializerTest.hs

{-# LANGUAGE OverloadedStrings #-}

module Text.RDF.RDF4H.TurtleSerializerTest (tests) where

import Data.ByteString as BS

import Data.RDF.Namespace
import Data.Function ((&))
import Data.Map as Map
import Data.RDF as RDF
import Text.RDF.RDF4H.TurtleSerializer.Internal
import System.IO
import System.IO.Temp (withSystemTempFile)
import Test.Tasty
import Test.Tasty.HUnit

tests :: TestTree
tests = testGroup "Turtle serializer tests"
  [ testGroup "findMappings Tests"
    [ testCase "findMapping correctly finds rdf mapping" $
      assertEqual "" (Just ("http://www.w3.org/1999/02/22-rdf-syntax-ns#", "subject")) (findMapping standard_ns_mappings "rdf:subject")
    , testCase "findMapping correctly finds rdfs mapping" $
      assertEqual "" (Just ("http://www.w3.org/2000/01/rdf-schema#", "domain")) (findMapping standard_ns_mappings "rdfs:domain")]

  , testGroup "writeUNodeUri tests"
    [ testCase "Serialization of QName UNode where prefix exists in PrefixMappings should not contain < or >" $
      withSystemTempFile "rdf4h-"
      (\_ h -> do
          writeUNodeUri h "rdf:subject" standard_ns_mappings
          hSeek h AbsoluteSeek 0
          contents <- BS.hGetContents h
          "rdf:subject" @=? contents)
    , testCase "Serialization of QName UNode where prefix does not exist in PrefixMappings should not contain < or >" $
      withSystemTempFile "rdf4h-"
      (\_ h -> do
          writeUNodeUri h "foo:subject" standard_ns_mappings
          hSeek h AbsoluteSeek 0
          contents <- BS.hGetContents h
          "foo:subject" @=? contents)
    , testCase "Serialization of non-namespaced UNode should be wrapped in < and >" $
      withSystemTempFile "rdf4h-"
      (\_ h -> do
          writeUNodeUri h "http://www.w3.org/1999/02/22-rdf-syntax-ns#subject" standard_ns_mappings
          hSeek h AbsoluteSeek 0
          contents <- BS.hGetContents h
          "<http://www.w3.org/1999/02/22-rdf-syntax-ns#subject>" @=? contents)
    ]

  , testGroup "writeRdf tests"
    [ testCase "triples with the same subject should be grouped" $
      let g :: RDF TList
          g = RDF.empty
            & flip addTriple (triple (unode ":something") (unode "rdf:type") (unode "schema:Document"))
            & flip addTriple (triple (unode ":another") (unode "rdf:type") (unode "schema:Document"))
            & flip addTriple (triple (unode ":something") (unode "dc:title") (lnode (plainL "Some title")))
          mappings = PrefixMappings $ Map.fromList [ ("schema", "http://schema.org/")
                                                   , ("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#")
                                                   , ("dc", "http://purl.org/dc/elements/1.1/")]
          serializer = TurtleSerializer Nothing mappings
      in
      withSystemTempFile "rdf4h-"
      (\_ h -> do
          expected <- BS.readFile "testsuite/tests/Text/RDF/RDF4H/data/common-subject.ttl"
          hWriteRdf serializer h g
          hSeek h AbsoluteSeek 0
          actual <- BS.hGetContents h
          expected @=? actual)
    ]
  ]