-------------------------------------------------------------------------------- -- $Id: ReportTest.hs,v 1.6 2004/03/26 21:20:07 graham Exp $ -- -- Copyright (c) 2003, G. KLYNE. All rights reserved. -- See end of this file for licence information. -------------------------------------------------------------------------------- -- | -- Module : ReportTest -- Copyright : (c) 2003, Graham Klyne -- License : GPL V2 -- -- Maintainer : Graham Klyne -- Stability : provisional -- Portability : H98 -- -- This module contains test cases for thje funtion for accessing built-in -- variable binding modifiers. -- -------------------------------------------------------------------------------- module ReportTest where import SwishCommands ( swishOutputDiffs, swishFormatDiffs ) import ReportType ( Named, name, anon , Report , RepSequence, RepCommand(..) , RepPattern, RepMatch(..) , RepString, RepItem(..) -- , RepChan, RepFile, RepVar, RepUri ) import ReportCompileToRDF ( reportCompileToRDF, patternCompileToRDF, stringCompileToRDF -- , namespaceHdr, namespaceRep, namespaceHrep ) import N3Parser ( parseN3fromString ) import RDFGraph ( RDFGraph, RDFLabel(..) , grMatchMap ) import GraphMatch ( LabelMap, GenLabelMap(..) , graphLabels ) import GraphPartition ( PartitionedGraph(..), getPartitions , GraphPartition(..), node, toArcs , partitionGraph, comparePartitions , partitionShowP ) import GraphClass ( Label(..), getArcs ) import Namespace ( Namespace(..) ) import LookupMap ( LookupEntryClass(..), LookupMap(..), makeLookupMap , mapSortByKey, mapSortByVal ) import ErrorM ( ErrorM(Error,Result) ) import TestHelpers ( test, testEq, testLe, testGe, testElem , testJust, testNothing , testEqv, testEqv2, testHasEqv, testMaybeEqv ) import HUnit ( Test(TestCase,TestList,TestLabel) , Assertion , assertBool, assertEqual, assertString, assertFailure , runTestTT, runTestText, putTextToHandle ) import List ( sort ) import IO ( Handle, IOMode(WriteMode) , openFile, hClose, hPutStr, hPutStrLn ) ------------------------------------------------------------ -- Define namespaces ------------------------------------------------------------ nsRdf = Namespace "rdf" "http://www.w3.org/1999/02/22-rdf-syntax-ns#" nsHdr = Namespace "hdr" "http://id.ninebynine.org/wip/2002/IETF/MsgHdr/" nsFoaf = Namespace "foaf" "http://xmlns.com/foaf/0.1/" nsHrep = Namespace "hrep" "http://id.ninebynine.org/wip/2002/IETF/MsgHdr/Report/" ------------------------------------------------------------ -- Define a tiny report ------------------------------------------------------------ tinyReport = name nsHrep "TinyReport" [ OPEN "t" (anon [ TEXT "TinyReport.tmp" ]) , WRITE "t" tinyHead , CLOSE "t" ] tinyHead = name nsHrep "TinyHead" [ TEXT "Tiny head", NL ] ------------------------------------------------------------ -- Notation3 description of the tiny report ------------------------------------------------------------ tinyReportStr = concatMap (++"\n") [ "@prefix rdf: ." , "@prefix rdfs: ." , "@prefix foaf: ." , "@prefix hdr: ." , "@prefix rep: ." , "@prefix hrep: ." , "" , "hrep:TinyReport a rep:Report ; :-" , " ( [ rep:cmd rep:open ; rep:chan \"t\" ;" , " rep:file \"TinyReport.tmp\" ]" , " [ rep:cmd rep:write ; rep:chan \"t\" ; rep:data hrep:TinyHead ]" , " [ rep:cmd rep:close ; rep:chan \"t\" ] ) ." , "" , "hrep:TinyHead :-" , " ( \"Tiny head\" rep:nl ) ." ] ------------------------------------------------------------ -- Define a simple report ------------------------------------------------------------ simpleReport = name nsHrep "SimpleReport" [ OPEN "t" $ anon [ TEXT "SimpleReport.tmp" ] , WRITE "t" simpleHead , FOR simplePattern [ WRITE "t" simpleItem ] Nothing Nothing Nothing Nothing , WRITE "t" simpleFoot , CLOSE "t" ] simpleReportStub = name nsHrep "SimpleReport" [ OPEN "t" $ anon [ TEXT "SimpleReport.tmp" ] , WRITE "t" $ name nsHrep "SimpleHead" [ VALUE "head" ] , FOR (name nsHrep "SimplePattern" [VAR "pattern"]) [ WRITE "t" $ name nsHrep "SimpleItem" [ VALUE "item" ] ] Nothing Nothing Nothing Nothing , WRITE "t" $ name nsHrep "SimpleFoot" [ VALUE "foot" ] , CLOSE "t" ] simpleReportFor = name nsHrep "SimpleReport" [ FOR (name nsHrep "SimplePattern" [VAR "pattern"]) [ WRITE "t" $ name nsHrep "SimpleItem" [ VALUE "item" ] ] Nothing Nothing Nothing Nothing ] simplePattern = name nsHrep "SimplePattern" [ VAR "item" , ALL [ anon [ URI (nsRdf,"type"), URI (nsHdr,"SimpleType") ] , anon [ URI (nsHdr,"name"), VAR "name" ] , anon [ OPT [ anon [ URI (nsHdr,"label"), VAR "label" ] ] ] ] ] simpleHead = name nsHrep "SimpleHead" [ TEXT "Simple head", NL ] simpleItem = name nsHrep "SimpleItem" [ TEXT "", NL , TEXT " ", VALUE "name", TEXT " ", NL , ALLDEF ["label"] (anon [TEXT " ", NL]) Nothing , TEXT "", NL ] simpleFoot = name nsHrep "SimpleFoot" [ TEXT "Simple foot", NL ] ------------------------------------------------------------ -- Notation3 description of the simple report ------------------------------------------------------------ simpleReportStr = concatMap (++"\n") [ "@prefix rdf: ." , "@prefix rdfs: ." , "@prefix foaf: ." , "@prefix hdr: ." , "@prefix rep: ." , "@prefix hrep: ." , "" , "hrep:SimpleReport a rep:Report ; :-" , " ( [ rep:cmd rep:open ; rep:chan \"t\" ;" , " rep:file \"SimpleReport.tmp\" ]" , " [ rep:cmd rep:write ; rep:chan \"t\" ; rep:data hrep:SimpleHead ]" , " [ rep:cmd rep:for ; rep:pattern hrep:SimplePattern ;" , " rep:do" , " ( [ rep:cmd rep:write ; rep:chan \"t\" ; rep:data hrep:SimpleItem ] ) ]" , " [ rep:cmd rep:write ; rep:chan \"t\" ; rep:data hrep:SimpleFoot ]" , " [ rep:cmd rep:close ; rep:chan \"t\" ] ) ." , "" , "hrep:SimplePattern :-" , " ( [ rep:var \"item\" ]" , " [ rep:and" , " ( [ rep:uri rdf:type ] [ rep:uri hdr:SimpleType ] )," , " ( [ rep:uri hdr:name ] [ rep:var \"name\" ] )," , " ( [ rep:opt" , " ( [ rep:uri hdr:label ] [ rep:var \"label\" ] ) ] ) " , " ]" , " ) ." , "" , "hrep:SimpleHead :-" , " ( \"Simple head\" rep:nl ) ." , "hrep:SimpleItem :-" , " ( \"\" rep:nl" , " \" \" [rep:var \"name\"] \" \" rep:nl" , " [ rep:if [rep:defined \"label\"] ;" , " rep:do ( \" \" rep:nl ) ]" , " \"\" rep:nl" , " ) ." , "hrep:SimpleFoot :-" , " ( \"Simple foot\" rep:nl ) ." ] simpleReport_hrepSimpleReport = concatMap (++"\n") [ "@prefix rdf: ." , "@prefix rdfs: ." , "@prefix foaf: ." , "@prefix hdr: ." , "@prefix rep: ." , "@prefix hrep: ." , "" , "hrep:SimpleReport a rep:Report ; :-" , " ( [ rep:cmd rep:open ; rep:chan \"t\" ;" , " rep:file \"SimpleReport.tmp\" ]" , " [ rep:cmd rep:write ; rep:chan \"t\" ; rep:data hrep:SimpleHead ]" , " [ rep:cmd rep:for ; rep:pattern hrep:SimplePattern ;" , " rep:do" , " ( [ rep:cmd rep:write ; rep:chan \"t\" ; rep:data hrep:SimpleItem ] ) ]" , " [ rep:cmd rep:write ; rep:chan \"t\" ; rep:data hrep:SimpleFoot ]" , " [ rep:cmd rep:close ; rep:chan \"t\" ] ) ." , "" , "hrep:SimplePattern :- ( [ rep:var \"pattern\" ] ) ." , "hrep:SimpleHead :- ( [rep:var \"head\"] ) ." , "hrep:SimpleItem :- ( [rep:var \"item\"] ) ." , "hrep:SimpleFoot :- ( [rep:var \"foot\"] ) ." ] simpleReport_hrepSimpleReportFor = concatMap (++"\n") [ "@prefix rdf: ." , "@prefix rdfs: ." , "@prefix foaf: ." , "@prefix hdr: ." , "@prefix rep: ." , "@prefix hrep: ." , "" , "hrep:SimpleReport a rep:Report ; :-" , " ( [ rep:cmd rep:for ; rep:pattern hrep:SimplePattern ;" , " rep:do" , " ( [ rep:cmd rep:write ; rep:chan \"t\" ; rep:data hrep:SimpleItem ] ) ]" , " ) ." , "" , "hrep:SimplePattern :- ( [ rep:var \"pattern\" ] ) ." , "hrep:SimpleItem :- ( [rep:var \"item\"] ) ." ] simpleReport_hrepSimplePattern = concatMap (++"\n") [ "@prefix rdf: ." , "@prefix rdfs: ." , "@prefix foaf: ." , "@prefix hdr: ." , "@prefix rep: ." , "@prefix hrep: ." , "" , "hrep:SimplePattern :-" , " ( [ rep:var \"item\" ]" , " [ rep:and" , " ( [ rep:uri rdf:type ] [ rep:uri hdr:SimpleType ] )," , " ( [ rep:uri hdr:name ] [ rep:var \"name\" ] )," , " ( [ rep:opt" , " ( [ rep:uri hdr:label ] [ rep:var \"label\" ] ) ] ) " , " ]" , " ) ." ] simpleReport_hrepSimpleHead = concatMap (++"\n") [ "@prefix rdf: ." , "@prefix rdfs: ." , "@prefix foaf: ." , "@prefix hdr: ." , "@prefix rep: ." , "@prefix hrep: ." , "" , "hrep:SimpleHead :-" , " ( \"Simple head\" rep:nl ) ." ] simpleReport_hrepSimpleItem = concatMap (++"\n") [ "@prefix rdf: ." , "@prefix rdfs: ." , "@prefix foaf: ." , "@prefix hdr: ." , "@prefix rep: ." , "@prefix hrep: ." , "" , "hrep:SimpleItem :-" , " ( \"\" rep:nl" , " \" \" [rep:var \"name\"] \" \" rep:nl" , " [ rep:if [rep:defined \"label\"] ;" , " rep:do ( \" \" rep:nl ) ]" , " \"\" rep:nl" , " ) ." ] simpleReport_hrepSimpleFoot = concatMap (++"\n") [ "@prefix rdf: ." , "@prefix rdfs: ." , "@prefix foaf: ." , "@prefix hdr: ." , "@prefix rep: ." , "@prefix hrep: ." , "" , "hrep:SimpleFoot :-" , " ( \"Simple foot\" rep:nl ) ." ] simpleReport_hrepXmlEntryAuthor = concatMap (++"\n") [ "@prefix rdf: ." , "@prefix rdfs: ." , "@prefix foaf: ." , "@prefix hdr: ." , "@prefix rep: ." , "@prefix hrep: ." , "" , "hrep:XmlEntryAuthor :-" , " ( rep:nl \"\" [rep:var \"aname\"] " , " [ rep:if [rep:defined \"ambox\"] ;" , " rep:do " , " ( \" (\" [rep:var \"ambox\"] \")\" ) ]" , " [ rep:if [rep:defined \"ahomepage\"] ;" , " rep:do " , " ( \" (\" [rep:var \"ahomepage\"] \")\" ) ]" , " rep:nl \"\"" , " [ rep:if [rep:defined \"orgname\"] ;" , " rep:do ( [rep:var \"orgname\"] rep:trimws" , " [rep:defer (\",\" rep:nl)] ) ]" , " [ rep:if [rep:defined \"wpbuilding\"] ;" , " rep:do ( [rep:var \"wpbuilding\"] rep:trimws" , " [rep:defer (\",\" rep:nl)] ) ]" , " [ rep:if [rep:defined \"wpstreet1\"] ;" , " rep:do ( [rep:var \"wpstreet1\" ] rep:trimws" , " [rep:defer \", \"] ) ]" , " [ rep:if [rep:defined \"wpstreet2\"] ;" , " rep:do ( [rep:var \"wpstreet2\" ] rep:trimws" , " [rep:defer \", \"] ) ]" , " [ rep:if [rep:defined \"wpcity\"] ;" , " rep:do ( [rep:flush (\",\" rep:nl \"\")]" , " [rep:var \"wpcity\"] rep:trimws" , " [rep:defer \", \"] ) ]" , " [ rep:if [rep:defined \"wppostcode\"] ;" , " rep:do ( [rep:var \"wppostcode\"] rep:trimws [rep:defer \", \"] ) ]" , " [ rep:if [rep:defined \"wpcountry\"] ;" , " rep:do ( [rep:var \"wpcountry\" ] rep:trimws [rep:defer \", \"] ) ]" , " [ rep:flush (\".\" rep:nl) ]" , " [ rep:if [rep:defined \"wtel\"] ;" , " rep:do ( \"Tel: \" [rep:var \"wtel\"] \"\" rep:nl ) ]" , " [ rep:if [rep:defined \"wfax\"] ;" , " rep:do ( \"Fax: \" [rep:var \"wfax\"] \"\" rep:nl ) ]" , " [ rep:if [rep:defined \"wurl\"] ;" , " rep:do ( \"URL: \" " , " [rep:var \"wurl\"] \"\" \"\" rep:nl ) ] ) ." ] ------------------------------------------------------------ -- Define a report (based on N3GenMsgRegistry.py) ------------------------------------------------------------ genHeaders = name nsHrep "GenHeaders" [ IF (Just "htmlname") Nothing [CMD htmlReport] Nothing , IF (Just "xmlname") Nothing [CMD xmlReport] Nothing ] htmlReport = name nsHrep "HtmlReport" [ OPEN "t" (anon [ VALUE "path", TEXT "/", VALUE "htmlname" ]) , WRITE "t" tableHead , FOR hdrProtoPattern [ WRITE "t" tableItem , IF (Just "entries") Nothing [ IF Nothing (Just hdrDetailPattern) [ OPEN "e" (anon [ VALUE "path", TEXT "/", VALUE "pname", TEXT "/" , VALUE "name", TEXT ".html" ] ) , DO htmlEntry , CLOSE "e" ] ( Just [ WRITE "t" noDetail ] ) ] Nothing ] Nothing Nothing Nothing ( Just $ [ WRITE "t" tableEmpty ] ) , WRITE "t" tableFoot , CLOSE "t" ] htmlEntry = name nsHrep "HtmlEntry" [ WRITE "e" hdrEntry1 , FOR hdrAuthorPattern [ WRITE "e" hdrEntryAuthor ] Nothing ( Just $ [ WRITE "e" hdrEntryAuthorSep ] ) Nothing Nothing , WRITE "e" hdrEntry3 ] xmlReport = name nsHrep "XmlReport" [ OPEN "x" (anon [ VALUE "path", TEXT "/", VALUE "xmlname" ]) , WRITE "x" xmlTableHead , FOR hdrProtoPattern [ WRITE "x" xmlTableItem ] Nothing Nothing Nothing ( Just $ [ WRITE "x" xmlTableEmpty ] ) , WRITE "x" xmlTableFoot , FOR hdrProtoPattern [ DEBUG (anon [ TEXT "Processing ", VALUE "name" ]) , IF Nothing (Just hdrDetailPattern) [CMD xmlEntry] Nothing ] Nothing Nothing Nothing Nothing , CLOSE "x" ] xmlEntry = name nsHrep "XmlEntry" [ WRITE "x" xmlEntry1 , FOR hdrAuthorPattern [ WRITE "x" xmlEntryAuthor ] Nothing ( Just $ [ WRITE "x" xmlEntryAuthorSep ] ) Nothing Nothing , WRITE "x" xmlEntry3 ] -- query patterns -- General header field info hdrProtoPattern = name nsHrep "HdrProtoPattern" [ VAR "header" , ALL [ anon [ URI (nsRdf,"type"), URI (nsHdr,"HeaderField") ] , anon [ URI (nsHdr,"fieldName"), VAR "name" ] , anon [ OPT [ anon [ URI (nsHdr,"label") , VAR "purpose" ] ] ] , anon [ URI (nsHdr,"protocol"), VAR "p" , ALL [ anon [ URI (nsHdr,"protocolName"), VAR "pname" ] , anon [ URI (nsHdr,"specification"), VAR "ps" , URI (nsHdr,"document"), VAR "psdocument" ] ] ] ] ] -- Detail header field info (augments basic header data) hdrDetailPattern = name nsHrep "HdrDetailPattern" [ VAR "header" , ALL [ anon [ URI (nsHdr,"status"), VAR "status" ] , anon [ URI (nsHdr,"specification"), VAR "hs" , ALL [ anon [ URI (nsHdr,"document"), VAR "hsdocument" ] , anon [ OPT [ anon [ URI (nsHdr,"section"), VAR "hssection" ] ] ] ] ] , anon [ OPT [ anon [ URI (nsHdr,"comment"), VAR "info" ] ] ] ] ] -- Author pattern separate: may be repeated hdrAuthorPattern = name nsHrep "HdrAuthorPattern" [ VAR "header" , URI (nsHdr,"author"), VAR "a" , ALL [ anon [ URI (nsFoaf,"name"), VAR "aname" ] , anon [ ALT [ anon [ URI (nsFoaf,"mbox"), VAR "ambox" ] ] ( anon [ URI (nsFoaf,"homepage"), VAR "ahomepage" ] ) ] , anon [ OPT [ anon [ URI (nsFoaf,"organization"), VAR "orgname" ] ] ] , anon [ OPT [ hdrPostalPattern ] ] , anon [ OPT [ anon [ URI (nsFoaf,"workplaceTel"), VAR "wtel" ] ] ] , anon [ OPT [ anon [ URI (nsFoaf,"workplaceFax"), VAR "wfax" ] ] ] , anon [ OPT [ anon [ URI (nsFoaf,"workplaceHomepage"), VAR "wurl" ] ] ] ] ] hdrPostalPattern = name nsHrep "HdrPostalPattern" [ URI (nsFoaf,"workplacePostal"), VAR "wp" , ALL [ anon [ OPT [ anon [ URI (nsFoaf,"building"), VAR "wpbuilding" ] ] ] , anon [ OPT [ anon [ URI (nsFoaf,"street1" ), VAR "wpstreet1" ] ] ] , anon [ OPT [ anon [ URI (nsFoaf,"street2" ), VAR "wpstreet2" ] ] ] , anon [ OPT [ anon [ URI (nsFoaf,"city" ), VAR "wpcity" ] ] ] , anon [ OPT [ anon [ URI (nsFoaf,"area" ), VAR "wparea" ] ] ] , anon [ OPT [ anon [ URI (nsFoaf,"postcode"), VAR "wppostcode" ] ] ] , anon [ OPT [ anon [ URI (nsFoaf,"country" ), VAR "wpcountry" ] ] ] ] ] -- HTML output templates tableHead = name nsHrep "TableHead" [ TEXT "", NL , TEXT "", NL , TEXT "Table of header field registrations", NL , TEXT "", NL , TEXT "", NL , TEXT "

Table of header field registrations

", NL , TEXT "", NL , TEXT "", NL , TEXT "", NL , TEXT "", NL -- , TEXT "", NL , TEXT "", NL ] tableItem = name nsHrep "TableItem" [ TEXT "", NL , TEXT "", NL , TEXT "", NL , TEXT "", NL , TEXT "", NL ] noDetail = name nsHrep "NoDetail" [ TEXT "", NL ] tableFoot = name nsHrep "TableFoot" [ TEXT "

Header name

Protocol

Purpose

" , VALUE "name" , TEXT "" , VALUE "pname", TEXT "", NL , ALLDEF ["purpose"] (anon [VALUE "purpose", NL]) Nothing , TEXT "
No detail found for header field " , VALUE "name", TEXT "
", NL , TEXT "", NL , TEXT "", NL ] tableEmpty = name nsHrep "TableEmpty" [ TEXT "No header fields found", NL ] hdrEntry1 = name nsHrep "HdrEntry1" [ TEXT "

Header field: ", VALUE "name", TEXT "

", NL , ALLDEF ["purpose"] (anon [ TEXT "

", VALUE "purpose", TEXT "

", NL ]) Nothing , TEXT "
", NL , TEXT "
Applicable protocol:
", VALUE "pname" , TEXT " (" , VALUE "psdocument", TEXT "" , TEXT ")
", NL , TEXT "
Status:
", VALUE "status", TEXT "
", NL , TEXT "
Author/Change controller:
", NL , TEXT "
", NL ] hdrEntryAuthor = name nsHrep "HdrEntryAuthor" [ VALUE "aname" , ALLDEF ["ambox"] (anon [ TEXT " (" , VALUE "ambox", TEXT ")" ] ) Nothing , ALLDEF ["ahomepage"] (anon [ TEXT " (" , VALUE "ahomepage" , TEXT ")" ] ) Nothing , TEXT "
", NL , ALLDEF ["orgname"] (anon [ VALUE "orgname", TRIM, DEFER (anon [ TEXT ",
", NL ]) ]) Nothing , ALLDEF ["wpbuilding"] (anon [ VALUE "wpbuilding", TRIM, DEFER (anon [ TEXT ",
", NL ]) ]) Nothing , ALLDEF ["wpstreet1"] (anon [ VALUE "wpstreet1", TRIM, DEFER (anon [ TEXT ", " ]) ]) Nothing , ALLDEF ["wpstreet2"] (anon [ VALUE "wpstreet2", TRIM, DEFER (anon [ TEXT ", " ]) ]) Nothing , ALLDEF ["wpcity"] (anon [ FLUSH (anon [ TEXT ",
", NL ]) , VALUE "wpcity", TRIM, DEFER (anon [ TEXT ", " ]) ] ) Nothing , ALLDEF ["wparea"] (anon [ VALUE "wparea", TRIM, DEFER (anon [ TEXT ", " ]) ]) Nothing , ALLDEF ["wppostcode"] (anon [ VALUE "wppostcode", TRIM, DEFER (anon [ TEXT ", " ]) ]) Nothing , ALLDEF ["wpcountry"] (anon [ VALUE "wpcountry", TRIM, DEFER (anon [ TEXT ", " ]) ]) Nothing , FLUSH (anon [ TEXT ".
", NL ]) , ALLDEF ["wtel"] (anon [ TEXT "Tel: ", VALUE "wtel", TEXT "
", NL ]) Nothing , ALLDEF ["wfax"] (anon [ TEXT "Fax: ", VALUE "wfax", TEXT "
", NL ]) Nothing , ALLDEF ["wurl"] (anon [ TEXT "URL: " , VALUE "wurl", TEXT "
", NL ] ) Nothing ] hdrEntryAuthorSep = name nsHrep "HdrEntryAuthorSep" [ TEXT "
", NL ] hdrEntry3 = name nsHrep "HdrEntry3" [ TEXT "
", NL , TEXT "
Specification document(s):
", NL , TEXT "
", VALUE "hsdocument", TEXT "" , ALLDEF ["hssection"] (anon [ TEXT " (", VALUE "hssection", TEXT ")" ]) Nothing , TEXT "
", NL , ALLDEF ["info"] (anon [ TEXT "
Related information:
", NL , TEXT "
", VALUE "info", TEXT "
", NL ] ) Nothing , TEXT "
", NL ] -- XML report formatting templates xmlTableHead = name nsHrep "XmlTableHead" [ TEXT "
", NL , TEXT "
", NL , NL ] xmlTableEmpty = name nsHrep "XmlTableEmpty" [ TEXT "(No header fields found)", NL ] xmlEntry1 = name nsHrep "XmlEntry1" [ TEXT "
", NL , TEXT "" , TEXT "", VALUE "name", TEXT "", NL , ALLDEF ["purpose"] (anon [ TEXT "" , VALUE "purpose", TEXT "", NL ] ) Nothing , TEXT "", VALUE "pname" , TEXT " (" , VALUE "psdocument" , TEXT ")" , TEXT "", NL , TEXT "", VALUE "status", TEXT "", NL , TEXT "" ] xmlEntryAuthor = name nsHrep "XmlEntryAuthor" [ NL, TEXT "", VALUE "aname" , ALLDEF ["ambox"] (anon [ TEXT " (", VALUE "ambox", TEXT ")" ]) Nothing , ALLDEF ["ahomepage"] (anon [ TEXT " (", VALUE "ahomepage", TEXT ")" ]) Nothing , NL, TEXT "" , ALLDEF ["orgname"] (anon [ VALUE "orgname", TRIM, DEFER (anon [ TEXT ",", NL ]) ]) Nothing , ALLDEF ["wpbuilding"] (anon [ VALUE "wpbuilding", TRIM, DEFER (anon [ TEXT ",", NL ]) ]) Nothing , ALLDEF ["wpstreet1"] (anon [ VALUE "wpstreet1", TRIM, DEFER (anon [ TEXT ", " ]) ]) Nothing , ALLDEF ["wpstreet2"] (anon [ VALUE "wpstreet2", TRIM, DEFER (anon [ TEXT ", " ]) ]) Nothing , ALLDEF ["wpcity"] (anon [ FLUSH (anon [ TEXT ",", NL, TEXT "" ]) , VALUE "wpcity", TRIM, DEFER (anon [ TEXT ", " ]) ] ) Nothing , ALLDEF ["wppostcode"] (anon [ VALUE "wppostcode", TRIM, DEFER (anon [ TEXT ", " ]) ]) Nothing , ALLDEF ["wpcountry"] (anon [ VALUE "wpcountry" , TRIM, DEFER (anon [ TEXT ", " ]) ]) Nothing , FLUSH (anon [ TEXT ".", NL ]) , ALLDEF ["wtel"] (anon [ TEXT "Tel: ", VALUE "wtel", TEXT "", NL ]) Nothing , ALLDEF ["wfax"] (anon [ TEXT "Fax: ", VALUE "wfax", TEXT "", NL ]) Nothing , ALLDEF ["wurl"] (anon [ TEXT "URL: " , VALUE "wurl", TEXT "", TEXT "", NL ] ) Nothing ] xmlEntryAuthorSep = name nsHrep "XmlEntryAuthorSep" [ TEXT "", NL ] xmlEntry3 = name nsHrep "XmlEntry3" [ TEXT "", NL , TEXT " ", NL , TEXT "" , VALUE "hsdocument" , TEXT "" , ALLDEF ["hssection"] (anon [ TEXT " (", VALUE "hssection", TEXT ")" ]) Nothing , TEXT "", NL , ALLDEF ["info"] (anon [ TEXT "", NL , VALUE "info" , TEXT "", NL ]) Nothing , TEXT "
", NL ] ------------------------------------------------------------ -- Notation3 description of the same report ------------------------------------------------------------ genHeadersStr = concatMap (++"\n") [ "@prefix rdf: ." , "@prefix rdfs: ." , "@prefix foaf: ." , "@prefix hdr: ." , "@prefix rep: ." , "@prefix hrep: ." , "" , "hrep:GenHeaders a rep:Report ; :-" , " ( [ rep:cmd rep:if ; rep:defined \"htmlname\" ; rep:do hrep:HtmlReport ]" , " [ rep:cmd rep:if ; rep:defined \"xmlname\" ; rep:do hrep:XmlReport ] ) ." , "" , "hrep:HtmlReport a rep:Report ; :-" , " ( [ rep:cmd rep:open ; rep:chan \"t\" ;" , " rep:file ( [ rep:var \"path\" ] \"/\" [ rep:var \"htmlname\" ] ) ]" , " [ rep:cmd rep:write ; rep:chan \"t\" ; rep:data hrep:TableHead ]" , " [ rep:cmd rep:for ; rep:pattern hrep:HdrProtoPattern ;" , " rep:do" , " ( [ rep:cmd rep:write ; rep:chan \"t\" ; rep:data hrep:TableItem ]" , " [ rep:cmd rep:if ; rep:defined \"entries\" ;" , " rep:do " , " ( [ rep:cmd rep:if ; rep:pattern hrep:HdrDetailPattern ;" , " rep:do" , " ( [ rep:cmd rep:open ; rep:chan \"e\" ;" , " rep:file ( [rep:var \"path\" ] \"/\" " , " [rep:var \"pname\"] \"/\"" , " [rep:var \"name\"] \".html\" ) ]" , " [ rep:do hrep:HtmlEntry ]" , " [ rep:cmd rep:close ; rep:chan \"e\" ] ) ;" , " rep:else" , " ( [ rep:cmd rep:write ; rep:chan \"t\" ;" , " rep:data hrep:NoDetail ] ) ] ) ] ) ;" , " rep:else" , " ( [ rep:cmd rep:write ; rep:chan \"t\" ; rep:data hrep:TableEmpty ] ) ]" , " [ rep:cmd rep:write ; rep:chan \"t\" ; rep:data hrep:TableFoot ]" , " [ rep:cmd rep:close ; rep:chan \"t\" ] ) ." , "" , "hrep:HtmlEntry a rep:Report ; :-" , " ( [ rep:cmd rep:write ; rep:chan \"e\" ; rep:data hrep:HdrEntry1 ]" , " [ rep:cmd rep:for ; rep:pattern hrep:HdrAuthorPattern ;" , " rep:do" , " ( [ rep:cmd rep:write ; rep:chan \"e\" ;" , " rep:data hrep:HdrEntryAuthor ] ) ;" , " rep:sep" , " ( [ rep:cmd rep:write ; rep:chan \"e\" ;" , " rep:data hrep:HdrEntryAuthorSep ] ) ]" , " [ rep:cmd rep:write ; rep:chan \"e\" ; rep:data hrep:HdrEntry3 ] ) ." , "" , "#### query patterns ####" , "" , "# General header field info" , "hrep:HdrProtoPattern :-" , " ( [ rep:var \"header\" ]" , " [ rep:and" , " ( [ rep:uri rdf:type ] [ rep:uri hdr:HeaderField ] )," , " ( [ rep:uri hdr:fieldName ] [ rep:var \"name\" ] )," , " ( [ rep:opt" , " ( [ rep:uri hdr:label ] [ rep:var \"purpose\" ] ) ] )," , " ( [ rep:uri hdr:protocol ] [ rep:var \"p\" ]" , " [ rep:and" , " ( [ rep:uri hdr:protocolName] [ rep:var \"pname\" ] )," , " ( [ rep:uri hdr:specification] [ rep:var \"ps\" ]" , " [ rep:uri hdr:document ] [ rep:var \"psdocument\" ] ) ] ) ] ) ." , "" , "# Detail header field info (augments basic header data)" , "hrep:HdrDetailPattern :-" , " ( [ rep:var \"header\" ]" , " [ rep:and" , " ( [ rep:uri hdr:status ] [ rep:var \"status\" ] )," , " ( [ rep:uri hdr:specification ] [ rep:var \"hs\" ]" , " [ rep:and" , " ( [ rep:uri hdr:document ] [ rep:var \"hsdocument\" ] )," , " ( [ rep:opt" , " ( [ rep:uri hdr:section ] [ rep:var \"hssection\" ] ) ] )" , " ] )," , " ( [ rep:opt" , " ( [ rep:uri hdr:comment ] [ rep:var \"info\" ] ) ] )" , " ] ) ." , "" , "# Author pattern separate: may be repeated" , "hrep:HdrAuthorPattern :-" , " ( [ rep:var \"header\" ]" , " [ rep:uri hdr:author ] [ rep:var \"a\" ]" , " [ rep:and" , " ( [ rep:uri foaf:name ] [ rep:var \"aname\"] )," , " ( [ rep:and" , " ( [ rep:uri foaf:mbox ] [ rep:var \"ambox\"] ) ;" , " rep:alt" , " ( [ rep:uri foaf:homepage ] [ rep:var \"ahomepage\"] ) ] )," , " ( [ rep:opt" , " ( [rep:uri foaf:organization] [rep:var \"orgname\"] ) ] )," , " ( [ rep:opt hrep:HdrPostalPattern ] )," , " ( [ rep:opt" , " ( [rep:uri foaf:workplaceTel] [rep:var \"wtel\"] ) ] )," , " ( [ rep:opt" , " ( [rep:uri foaf:workplaceFax] [rep:var \"wfax\"] ) ] )," , " ( [ rep:opt" , " ( [rep:uri foaf:workplaceHomepage] [rep:var \"wurl\"] ) ] )" , " ] ) ." , "" , "hrep:HdrPostalPattern :-" , " ( [rep:uri foaf:workplacePostal] [ rep:var \"wp\" ]" , " [ rep:and" , " ( [ rep:opt" , " ( [ rep:uri foaf:building ] [ rep:var \"wpbuilding\" ] ) ] )," , " ( [ rep:opt" , " ( [ rep:uri foaf:street1 ] [ rep:var \"wpstreet1\" ] ) ] )," , " ( [ rep:opt" , " ( [ rep:uri foaf:street2 ] [ rep:var \"wpstreet2\" ] ) ] )," , " ( [ rep:opt" , " ( [ rep:uri foaf:city ] [ rep:var \"wpcity\" ] ) ] )," , " ( [ rep:opt" , " ( [ rep:uri foaf:area ] [ rep:var \"wparea\" ] ) ] )," , " ( [ rep:opt" , " ( [ rep:uri foaf:postcode ] [ rep:var \"wppostcode\" ] ) ] )," , " ( [ rep:opt" , " ( [ rep:uri foaf:country ] [ rep:var \"wpcountry\" ] ) ] )" , " ] ) ." , "" , "#### output templates ####" , "" , "hrep:TableHead :-" , " ( \"\" rep:nl" , " \"\" rep:nl" , " \"Table of header field registrations\" rep:nl" , " \"\" rep:nl" , " \"\" rep:nl" , " \"

Table of header field registrations

\" rep:nl" , " \"\" rep:nl" , " \"\" rep:nl" , " \"\" rep:nl" , " \"\" rep:nl" , " ### \"\" rep:nl" , " \"\" rep:nl" , " ) ." , "hrep:TableItem :-" , " ( \"\" rep:nl" , " \"\" rep:nl" , " \"\" rep:nl" , " \"\" rep:nl" , " \"\" rep:nl" , " ) ." , "hrep:NoDetail :-" , " ( \"\" rep:nl" , " ) ." , "hrep:TableFoot :-" , " ( \"

Header name

Protocol

Purpose

\"" , " [rep:var \"name\"] \"\"" , " [rep:var \"pname\"] \"\" rep:nl" , " [ rep:if [rep:defined \"purpose\"] ;" , " rep:do ( [ rep:var \"purpose\" ] rep:nl ) ]" , " \"
No detail found for header field \"" , " [rep:var \"name\"] \"
\" rep:nl" , " \"\" rep:nl" , " \"\" rep:nl" , " ) ." , "hrep:TableEmpty :-" , " ( \"No header fields found\" rep:nl ) ." , "" , "########" , "" , "hrep:HdrEntry1 :-" , " ( \"

Header field: \" [rep:var \"name\"] \"

\" rep:nl" , " [ rep:if [rep:defined \"purpose\"] ;" , " rep:do ( \"

\" [rep:var \"purpose\"] \"

\" rep:nl ) ]" , " \"
\" rep:nl" , " \"
Applicable protocol:
\" [rep:var \"pname\"]" , " \" (\"" , " [rep:var \"psdocument\"] \"\"" , " \")
\" rep:nl" , " \"
Status:
\" [rep:var \"status\"] \"
\" rep:nl" , " \"
Author/Change controller:
\" rep:nl" , " \"
\" rep:nl ) ." , " " , "hrep:HdrEntryAuthor :-" , " ( [rep:var \"aname\"]" , " [ rep:if [rep:defined \"ambox\"] ;" , " rep:do " , " ( \" (\"" , " [rep:var \"ambox\"] \")\" ) ]" , " [ rep:if [rep:defined \"ahomepage\"] ;" , " rep:do " , " ( \" (\"" , " [rep:var \"ahomepage\"] \")\" ) ]" , " \"
\" rep:nl" , " [ rep:if [rep:defined \"orgname\"] ;" , " rep:do ( [rep:var \"orgname\"] rep:trimws" , " [rep:defer (\",
\" rep:nl)] ) ]" , " [ rep:if [rep:defined \"wpbuilding\"] ;" , " rep:do ( [rep:var \"wpbuilding\"] rep:trimws" , " [rep:defer (\",
\" rep:nl)] ) ]" , " [ rep:if [rep:defined \"wpstreet1\"] ;" , " rep:do ( [rep:var \"wpstreet1\" ] rep:trimws" , " [rep:defer \", \" ] ) ]" , " [ rep:if [rep:defined \"wpstreet2\"] ;" , " rep:do ( [rep:var \"wpstreet2\" ] rep:trimws" , " [rep:defer \", \"] ) ]" , " [ rep:if [rep:defined \"wpcity\"] ;" , " rep:do ( [rep:flush (\",
\" rep:nl)]" , " [rep:var \"wpcity\"] rep:trimws " , " [rep:defer \", \" ] ) ]" , " [ rep:if [rep:defined \"wparea\"] ;" , " rep:do ( [rep:var \"wparea\"] rep:trimws [rep:defer \", \" ] ) ]" , " [ rep:if [rep:defined \"wppostcode\"] ;" , " rep:do ( [rep:var \"wppostcode\"] rep:trimws [rep:defer \", \"] ) ]" , " [ rep:if [rep:defined \"wpcountry\"] ;" , " rep:do ( [rep:var \"wpcountry\"] rep:trimws [rep:defer \", \"] ) ]" , " [ rep:flush ( \".
\" rep:nl ) ]" , " [ rep:if [rep:defined \"wtel\"] ;" , " rep:do ( \"Tel: \" [rep:var \"wtel\"] \"
\" rep:nl ) ]" , " [ rep:if [rep:defined \"wfax\"] ;" , " rep:do ( \"Fax: \" [rep:var \"wfax\"] \"
\" rep:nl ) ]" , " [ rep:if [rep:defined \"wurl\"] ;" , " rep:do ( \"URL: \"" , " [rep:var \"wurl\"] \"
\" rep:nl ) ] ) ." , "" , "hrep:HdrEntryAuthorSep :-" , " ( \"
\" rep:nl ) ." , "" , "hrep:HdrEntry3 :-" , " ( \"
\" rep:nl" , " \"
Specification document(s):
\" rep:nl" , " \"
\"" , " [ rep:var \"hsdocument\" ] \"\"" , " [ rep:if [rep:defined \"hssection\"] ;" , " rep:do ( \" (\" [ rep:var \"hssection\" ] \")\" ) ]" , " \"
\" rep:nl" , " [ rep:if [rep:defined \"info\"] ;" , " rep:do ( \"
Related information:
\" rep:nl" , " \"
\" [ rep:var \"info\" ] \"
\" rep:nl ) ]" , " \"
\" rep:nl ) ." , "" , "#### RFC 2629 report generation ####" , "" , "hrep:XmlReport a rep:Report ; :-" , " ( [ rep:cmd rep:open ; rep:chan \"x\" ;" , " rep:file ( [ rep:var \"path\" ] \"/\" " , " [ rep:var \"xmlname\" ] ) ]" , " [ rep:cmd rep:write ; rep:chan \"x\" ; rep:data hrep:XmlTableHead ]" , " [ rep:cmd rep:for ; rep:pattern hrep:HdrProtoPattern ;" , " rep:do" , " ( [ rep:cmd rep:write ; rep:chan \"x\" ; rep:data hrep:XmlTableItem ] ) ;" , " rep:else" , " ( [ rep:cmd rep:write ; rep:chan \"x\" ; rep:data hrep:XmlTableEmpty ] ) ]" , " [ rep:cmd rep:write ; rep:chan \"x\" ; rep:data hrep:XmlTableFoot ]" , " [ rep:cmd rep:for ; rep:pattern hrep:HdrProtoPattern ;" , " rep:do" , " ( [ rep:cmd rep:debug ; rep:data ( \"Processing \" [rep:var \"name\"] ) ]" , " [ rep:cmd rep:if ; rep:pattern hrep:HdrDetailPattern ;" , " rep:do hrep:XmlEntry ] ) ]" , " [ rep:cmd rep:close ; rep:chan \"x\" ] ) ." , "" , "hrep:XmlEntry a rep:Report ; :-" , " ( [ rep:cmd rep:write ; rep:chan \"x\" ; rep:data hrep:XmlEntry1 ]" , " [ rep:cmd rep:for ; rep:pattern hrep:HdrAuthorPattern ;" , " rep:do" , " ( [ rep:cmd rep:write ; rep:chan \"x\" ;" , " rep:data hrep:XmlEntryAuthor ] ) ;" , " rep:sep" , " ( [ rep:cmd rep:write ; rep:chan \"x\" ;" , " rep:data hrep:XmlEntryAuthorSep ] ) ]" , " [ rep:cmd rep:write ; rep:chan \"x\" ; rep:data hrep:XmlEntry3 ] ) ." , "" , "hrep:XmlTableHead :-" , " ( \"
\" rep:nl" , " \"
\" rep:nl" , " rep:nl ) ." , "" , "hrep:XmlTableEmpty :-" , " ( \"(No header fields found)\" rep:nl ) ." , "" , "hrep:XmlEntry1 :-" , " ( \"
\" rep:nl" , " \"\"" , " \"\" [rep:var \"name\"] \"\" rep:nl" , " [ rep:if [rep:defined \"purpose\"] ;" , " rep:do ( \"\"" , " [rep:var \"purpose\"] \"\" rep:nl ) ]" , " \"\"" , " [rep:var \"pname\"]" , " \" (\"" , " [rep:var \"psdocument\"] \")\"" , " \"\" rep:nl" , " \"\" [rep:var \"status\"] \"\" rep:nl" , " \"\" ) ." , "" , "hrep:XmlEntryAuthor :-" , " ( rep:nl \"\" [rep:var \"aname\"] " , " [ rep:if [rep:defined \"ambox\"] ;" , " rep:do " , " ( \" (\" [rep:var \"ambox\"] \")\" ) ]" , " [ rep:if [rep:defined \"ahomepage\"] ;" , " rep:do " , " ( \" (\" [rep:var \"ahomepage\"] \")\" ) ]" , " rep:nl \"\"" , " [ rep:if [rep:defined \"orgname\"] ;" , " rep:do ( [rep:var \"orgname\"] rep:trimws" , " [rep:defer (\",\" rep:nl)] ) ]" , " [ rep:if [rep:defined \"wpbuilding\"] ;" , " rep:do ( [rep:var \"wpbuilding\"] rep:trimws" , " [rep:defer (\",\" rep:nl)] ) ]" , " [ rep:if [rep:defined \"wpstreet1\"] ;" , " rep:do ( [rep:var \"wpstreet1\" ] rep:trimws" , " [rep:defer \", \"] ) ]" , " [ rep:if [rep:defined \"wpstreet2\"] ;" , " rep:do ( [rep:var \"wpstreet2\" ] rep:trimws" , " [rep:defer \", \"] ) ]" , " [ rep:if [rep:defined \"wpcity\"] ;" , " rep:do ( [rep:flush (\",\" rep:nl \"\")]" , " [rep:var \"wpcity\"] rep:trimws" , " [rep:defer \", \"] ) ]" , " [ rep:if [rep:defined \"wppostcode\"] ;" , " rep:do ( [rep:var \"wppostcode\"] rep:trimws [rep:defer \", \"] ) ]" , " [ rep:if [rep:defined \"wpcountry\"] ;" , " rep:do ( [rep:var \"wpcountry\" ] rep:trimws [rep:defer \", \"] ) ]" , " [ rep:flush (\".\" rep:nl) ]" , " [ rep:if [rep:defined \"wtel\"] ;" , " rep:do ( \"Tel: \" [rep:var \"wtel\"] \"\" rep:nl ) ]" , " [ rep:if [rep:defined \"wfax\"] ;" , " rep:do ( \"Fax: \" [rep:var \"wfax\"] \"\" rep:nl ) ]" , " [ rep:if [rep:defined \"wurl\"] ;" , " rep:do ( \"URL: \" " , " [rep:var \"wurl\"] \"\" \"\" rep:nl ) ] ) ." , "" , "hrep:XmlEntryAuthorSep :-" , " ( \"\" rep:nl ) ." , "" , "hrep:XmlEntry3 :-" , " ( \"\" rep:nl" , " \" \" rep:nl" , " \"\"" , " [rep:var \"hsdocument\"] \"\"" , " [ rep:if [rep:defined \"hssection\"] ;" , " rep:do ( \" (\" [ rep:var \"hssection\" ] \")\" ) ]" , " \"\" rep:nl" , " [ rep:if [rep:defined \"info\"] ;" , " rep:do ( \"\" rep:nl" , " [ rep:var \"info\" ]" , " \"\" rep:nl ) ]" , " \"
\" rep:nl ) ." ] ------------------------------------------------------------ -- Create RDF models for the reports ------------------------------------------------------------ genTinyRDF1 = reportCompileToRDF tinyReport (Result genTinyRDF2) = parseN3fromString tinyReportStr genSimpleRDF1 = reportCompileToRDF simpleReport (Result genSimpleRDF2) = parseN3fromString simpleReportStr genSimpleReportForRDF1 = reportCompileToRDF simpleReportFor (Result genSimpleReportForRDF2) = parseN3fromString simpleReport_hrepSimpleReportFor genSimpleReportStubRDF1 = reportCompileToRDF simpleReportStub (Result genSimpleReportStubRDF2) = parseN3fromString simpleReport_hrepSimpleReport genSimplePatternRDF1 = patternCompileToRDF simplePattern (Result genSimplePatternRDF2) = parseN3fromString simpleReport_hrepSimplePattern genSimpleHeadRDF1 = stringCompileToRDF simpleHead (Result genSimpleHeadRDF2) = parseN3fromString simpleReport_hrepSimpleHead genSimpleItemRDF1 = stringCompileToRDF simpleItem (Result genSimpleItemRDF2) = parseN3fromString simpleReport_hrepSimpleItem genSimpleFootRDF1 = stringCompileToRDF simpleFoot (Result genSimpleFootRDF2) = parseN3fromString simpleReport_hrepSimpleFoot genXmlAuthorRDF1 = stringCompileToRDF xmlEntryAuthor (Result genXmlAuthorRDF2) = parseN3fromString simpleReport_hrepXmlEntryAuthor genHeadersRDF1 = reportCompileToRDF genHeaders (Result genHeadersRDF2) = parseN3fromString genHeadersStr diff11 = showgrdiff genHeadersRDF1 "reportCompileToRDF" genHeadersRDF2 "parseN3fromString" ------------------------------------------------------------ -- Function to read N3 graph from a file, fail if mismatch ------------------------------------------------------------ -- NOTE: the test cases based on this function use externally-generated -- report description files. Use RepToRDFMain.hs to generate the files -- used for these tests. testReadCompareGraph :: String -> String -> RDFGraph -> Test testReadCompareGraph lab fnam gr = TestCase $ do { s <- readFile fnam ; let (Result g) = parseN3fromString s ; assertEqual lab gr g } test01a = testReadCompareGraph "testReadCompareGraph01a" "TinyReport.n3" genTinyRDF1 diff01a = showdiffs "TinyReport.n3" genTinyRDF1 test01 = testReadCompareGraph "testReadCompareGraph01" "TinyReport.n3" genTinyRDF2 diff01 = showdiffs "TinyReport.n3" genTinyRDF2 test03 = testReadCompareGraph "testReadCompareGraph03" "SimpleReport.n3" genSimpleRDF2 diff03 = showdiffs "SimpleReport.n3" genSimpleRDF2 test13 = testReadCompareGraph "testReadCompareGraph13" "GenHeaderRegistry.n3" genHeadersRDF2 diff13 = showdiffs "GenHeaderRegistry.n3" genHeadersRDF2 ------------------------------------------------------------ -- Report compiler test suite ------------------------------------------------------------ testReportCompilerSuite = TestList [ test "testReportCompiler01" (genTinyRDF1==genTinyRDF2) , testEq "testReportCompiler02" genTinyRDF1 genTinyRDF2 , test "testReportCompiler03" (genSimpleReportForRDF1==genSimpleReportForRDF2) , test "testReportCompiler04" (genSimpleReportStubRDF1==genSimpleReportStubRDF2) , test "testReportCompiler05" (genSimplePatternRDF1==genSimplePatternRDF2) , test "testReportCompiler06" (genSimpleHeadRDF1==genSimpleHeadRDF2) , test "testReportCompiler07" (genSimpleItemRDF1==genSimpleItemRDF2) , test "testReportCompiler08" (genSimpleFootRDF1==genSimpleFootRDF2) , test "testReportCompiler09" (genSimpleRDF1==genSimpleRDF2) , test "testReportCompiler10" (genXmlAuthorRDF1==genXmlAuthorRDF2) -- NOTE: this next test may take a long time: , test "testReportCompiler11" (genHeadersRDF1==genHeadersRDF2) -- , testEq "testReportCompiler12" genSimpleRDF1 genSimpleRDF2 -- Test compilation from external report description: , test01 , test03 -- NOTE: this next test may take a long time: , test13 ] ------------------------------------------------------------ -- All tests ------------------------------------------------------------ allTests = TestList [ testReportCompilerSuite ] main = runTestTT allTests runTestFile t = do h <- openFile "a.tmp" WriteMode runTestText (putTextToHandle h False) t hClose h tf = runTestFile tt = runTestTT -- Various functions to locate graph mismatch showdiffs fnam gr = do { s <- readFile fnam ; let (Result g) = parseN3fromString s ; let ds = comparePartitions (parts gr) (parts g) -- ; putStr (concatMap ("\n"++) $ map showds1 ds) -- ; writeFile "a.tmp" (concatMap ("\n"++) $ map showds1 ds) ; writeFile "a.tmp" (swishFormatDiffs "Internal" fnam ds "") } where parts = partitionGraph . getArcs showgrdiff g1 desc1 g2 desc2= do { let ds = comparePartitions (parts g1) (parts g2) ; writeFile "a.tmp" (swishFormatDiffs desc1 desc2 ds "") } where parts = partitionGraph . getArcs gmap g1 g2 = labelMapSortByVal $ snd (grMatchMap g1 g2) -- gmaps = gmap genSimpleReportForRDF1 genSimpleReportForRDF2 gmaps = gmap genHeadersRDF1 genHeadersRDF2 a1 = getArcs genHeadersRDF1 a2 = getArcs genHeadersRDF2 p1 = partitionGraph a1 p2 = partitionGraph a2 p1s = concatMap ("\n"++) $ map (partitionShowP "\n") (getPartitions p1) p2s = concatMap ("\n"++) $ map (partitionShowP "\n") (getPartitions p2) ds = comparePartitions p1 p2 showds = concatMap ("\n"++) $ map showds1 ds showds1 (mp1,mp2) = showds2 mp1 ++ showds2 mp2 showds2 Nothing = "\nNothing" showds2 (Just gp) = "\nJust " ++ partitionShowP "\n" gp l1 = graphLabels a1 l2 = graphLabels a2 tofile :: Show a => a -> IO () tofile a = do h <- openFile "a.tmp" WriteMode hPutStrLn h (show a) hClose h strtofile :: String -> IO () strtofile a = do h <- openFile "a.tmp" WriteMode hPutStrLn h a hClose h tofile2 :: Show a => a -> a -> IO () tofile2 a1 a2 = do h <- openFile "a.tmp" WriteMode hPutStrLn h "\n***** Value 1 *****\n" hPutStrLn h (show a1) hPutStrLn h "\n***** Value 2 *****\n" hPutStrLn h (show a2) hPutStrLn h "\n***** End *****\n" hClose h tofile2s :: (Show a, Ord a) => [a] -> [a] -> IO () tofile2s a1 a2 = do h <- openFile "a.tmp" WriteMode hPutStrLn h "\n***** Value 1 *****\n" hPutStrLn h $ concatMap (("\n"++).show) (sort a1) hPutStrLn h "\n***** Value 2 *****\n" hPutStrLn h $ concatMap (("\n"++).show) (sort a2) hPutStrLn h "\n***** End *****\n" hClose h labelMapSortByVal :: (Label lb) => LabelMap lb -> LabelMap lb labelMapSortByVal (LabelMap gen lmap) = LabelMap gen (mapSortByVal lmap) -------------------------------------------------------------------------------- -- -- Copyright (c) 2003, G. KLYNE. All rights reserved. -- -- This file is part of Swish. -- -- Swish is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; either version 2 of the License, or -- (at your option) any later version. -- -- Swish is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with Swish; if not, write to: -- The Free Software Foundation, Inc., -- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -- -------------------------------------------------------------------------------- -- $Source: /file/cvsdev/CompileRDF/ReportTest.hs,v $ -- $Author: graham $ -- $Revision: 1.6 $ -- $Log: ReportTest.hs,v $ -- Revision 1.6 2004/03/26 21:20:07 graham -- Bug-fixes to support report generation. -- (The old Python code is a bit flakey in places.) -- -- Revision 1.5 2004/03/26 12:19:19 graham -- Add test cases for report description compiler. -- Also, add (more) logic to display graph differences. -- -- Revision 1.4 2004/02/17 23:36:50 graham -- Sync -- -- Revision 1.3 2004/02/10 20:57:32 graham -- Report compiler passes all tests. -- -- Revision 1.2 2004/02/09 22:24:09 graham -- Part tested report compiler logic. -- One test case still fails, can't see why yet until function to -- highlight graph differences is available. -- -- Revision 1.1 2004/01/14 21:34:08 graham -- Work-in-progress on RDF report compiler