content: module W3C.W3CAssertions
    ( runManifestTests,
      assertIsIsomorphic,
      assertIsParsed,
      assertIsNotParsed,
      nodeURI,
    )
  where
  
  import Data.RDF
  import Data.Semigroup ((<>))
  import qualified Data.Text as T
  import qualified Test.HUnit as TU
  import Test.Tasty
  import W3C.Manifest
  
  runManifestTests :: (TestEntry -> TestTree) -> Manifest -> TestTree
  runManifestTests mfEntryToTest manifest =
    testGroup (T.unpack $ description manifest) $ mfEntryToTest <$> entries manifest
  
  assertIsIsomorphic :: IO (RDF TList) -> IO (RDF TList) -> IO ()
  assertIsIsomorphic r1 r2 = do
    gr1 <- r1
    gr2 <- r2
    TU.assertBool ("not isomorphic: " <> show gr1 <> " compared with " <> show gr2) (isSame gr1 gr2) -- (isGraphIsomorphic gr1 gr2)
    where
      -- noBlankNodes g = (all noBlanks . expandTriples) g
      -- noBlanks (Triple s p o) =
      --   not (blankNode s)
      --     && not (blankNode p)
      --     && not (blankNode o)
      -- blankNode (BNode _) = True
      -- blankNode (BNodeGen _) = True
      -- blankNode _ = False
      isSame g1 g2 = isIsomorphic g1 g2
  
  -- if (noBlankNodes g1) && (noBlankNodes g2)
  -- -- can compare URIs and literals as well as structure
  -- then isIsomorphic g1 g2
  -- -- cannot compare blank nodes with generated blank nodes,
  -- -- so instead just compare the RDF graph structure of the
  -- -- mf:action parsed RDF with the expected mf:result structure.
  -- else isGraphIsomorphic g1 g2
  
  assertIsParsed :: IO (Either ParseFailure (RDF TList)) -> TU.Assertion
  assertIsParsed r1 = do
    gr1 <- r1
    TU.assertBool ("unable to parse, reason:\n" <> show gr1) (isParsed gr1)
  
  assertIsNotParsed :: IO (Either ParseFailure (RDF TList)) -> TU.Assertion
  assertIsNotParsed r1 = do
    gr1 <- r1
    TU.assertBool ("parsed unexpectedly:\n" <> show gr1) (not (isParsed gr1))
  
  isParsed :: Either a b -> Bool
  isParsed (Left _) = False
  isParsed (Right _) = True
  
  nodeURI :: Node -> String
  nodeURI (UNode u) = T.unpack u
  nodeURI node = error $ "W3CAssertions: unexpected node in `nodeURI`: " <> show node
  