Updated tests with update_index.rb script to parse test files and update index.
--- a/microdata-rdf/tests/0001.html Thu Mar 01 14:34:57 2012 -0800
+++ b/microdata-rdf/tests/0001.html Fri Mar 02 13:09:04 2012 -0800
@@ -1,14 +1,17 @@
<!DOCTYPE html>
<html>
- <head itemscope itemtype="http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ManifestEntry">
- <title>
+ <head>
+ <title itemscope itemtype="http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ManifestEntry">
<span itemprop="name">Test 0001</span>:
<span itemprop="http://www.w3.org/2000/01/rdf-schema#comment">Item with no itemtype and literal itemprop</span>
+ (
<span itemprop="action" itemscope itemtype="http://www.w3.org/2001/sw/DataAccess/tests/test-query#QueryTest">
- <link itemprop="query" href="0001.rq"/>
- <link itemprop="data" href="0001.html"/>
+ <a itemprop="data" href="0001.html">input</a> |
+ <a itemprop="query" href="0001.rq">query</a>
</span>
+ <a itemprop="registry" href="test-registry.json">registry</a>
<meta itemprop="result" content="true"/>
+ )
</title>
</head>
<body>
--- a/microdata-rdf/tests/index.html Thu Mar 01 14:34:57 2012 -0800
+++ b/microdata-rdf/tests/index.html Fri Mar 02 13:09:04 2012 -0800
@@ -1,29 +1,204 @@
<!DOCTYPE html>
<html>
<head>
- <title>Microdata to RDF Tests</title>
- <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
-</head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Microdata to RDF Tests</title>
+<!--
+ === NOTA BENE ===
+ For the three scripts below, if your spec resides on dev.w3 you can check them
+ out in the same tree and use relative links so that they'll work offline,
+ --><script type="text/javascript" src="http://dev.w3.org/2009/dap/ReSpec.js/js/respec.js" class="remove">
+ </script><script type="text/javascript" class="remove">
+ var preProc = {
+ apply: function(c) {
+ // extend the bibliography entries
+ berjon.biblio["MICRODATA-RDF"] = "<cite><a href=\"http://www.w3.org/TR/microdata-rdf/\">Microdata to RDF</a></cite> Gregg Kellogg Editor. World Wide Web Consortium (work in progress). 12 January 2011. This edition of the Microdata to RDF specification is http://www.w3.org/TR/2012/WD-microdata-rdf-20120112/. The <a href=\"http://www.w3.org/TR/2012/WD-microdata-rdf-20120112/\">latest edition of Microdata to RDF</a> is available at http://www.w3.org/TR/microdata-rdf/";
+ }
+ } ;
+
+ var respecConfig = {
+ // specification status (e.g. WD, LCWD, NOTE, etc.). If in doubt use ED.
+ specStatus: "unofficial",
+ charterDisclosureURI: "http://www.w3.org/2006/07/swig-charter#Ipr",
+ //publishDate: "2012-02-13",
+ //copyrightStart: "2011",
+
+ // the specification's short name, as in http://www.w3.org/TR/short-name/
+ shortName: "microdata-rdf-tests",
+ subtitle: "Test suite for microdata to RDF",
+
+ edDraftURI: "https://dvcs.w3.org/hg/htmldata/raw-file/default/microdata-rdf/tests/index.html",
+
+ // if this is a LCWD, uncomment and set the end of its review period
+ // lcEnd: "2009-08-05",
+
+ // if you want to have extra CSS, append them to this list
+ // it is recommended that the respec.css stylesheet be kept
+ extraCSS: [
+ "http://dev.w3.org/2009/dap/ReSpec.js/css/respec.css"
+ ],
+
+ // editors, add as many as you like
+ // only "name" is required
+ editors: [
+ { name: "Gregg Kellogg", url: "http://greggkellogg.net/",
+ company: "Kellogg Associates" },
+ { name: "Iván Herman", url: "http://www.w3.org/People/Ivan/",
+ company: "W3C", companyURL: "http://www.w3.org" }
+ ],
+
+ // authors, add as many as you like.
+ // This is optional, uncomment if you have authors as well as editors.
+ // only "name" is required. Same format as editors.
+
+ //authors: [],
+
+ // name of the WG
+ wg: "HTML Data Task Force, Semantic Web Interest Group",
+
+ // URI of the public WG page
+ wgURI: "http://www.w3.org/2001/sw/interest/",
+
+ // name (with the @w3c.org) of the public mailing to which comments are due
+ wgPublicList: "public-html-data-tf",
+
+ // URI of the patent status for this WG, for Rec-track documents
+ // !!!! IMPORTANT !!!!
+ // This is important for Rec-track documents, do not copy a patent URI from a random
+ // document unless you know what you're doing. If in doubt ask your friendly neighbourhood
+ // Team Contact.
+ wgPatentURI: "",
+ maxTocLevel: 4,
+ preProcess: [ preProc ]
+ //alternateFormats: [ {uri: "diff-20111118.html", label: "diff to previous version"} ],
+ };
+
+ function updateExample(doc, content) {
+ // perform transformations to make it render and prettier
+ content = content.replace(/<!--/, '');
+ content = content.replace(/-->/, '');
+ content = doc._esc(content);
+ content = content.replace(/\*\*\*\*([^*]*)\*\*\*\*/g, '<span class="diff">$1</span>') ;
+ return content ;
+ }
+
+ function updateDTD(doc, content) {
+ // perform transformations to
+ // make it render and prettier
+ content = '<pre class="dtd">' + doc._esc(content) + '</pre>';
+ content = content.replace(/!ENTITY % ([^ \t\r\n]*)/g, '!ENTITY <span class="entity">% $1</span>');
+ content = content.replace(/!ELEMENT ([^ \t$]*)/mg, '!ELEMENT <span class="element">$1</span>');
+ return content;
+ }
+
+ function updateSchema(doc, content) {
+ // perform transformations to
+ // make it render and prettier
+ content = '<pre class="dtd">' + doc._esc(content) + '</pre>';
+ content = content.replace(/<xs:element\s+name="([^&]*)"/g, '<xs:element name="<span class="element" id="schema_element_$1">$1</span>"') ;
+ return content;
+ }
+
+ function updateTTL(doc, content) {
+ // perform transformations to
+ // make it render and prettier
+ content = '<pre class="sh_sourceCode">' + doc._esc(content) + '</pre>';
+ content = content.replace(/@prefix/g, '<span class="sh_keyword">@prefix</span>');
+ return content;
+ }
+ </script><style type="text/css">
+.diff { font-weight:bold; color:#0a3; }
+ol.algorithm { counter-reset:numsection; list-style-type: none; }
+ol.algorithm li { margin: 0.5em 0; }
+ol.algorithm li:before {
+ font-weight: bold;
+ counter-increment: numsection;
+ content: counters(numsection, ".") ") ";
+}
+dl.triple { padding: 0 0 0 1em; }
+dl.triple dt, dl.triple dd { margin: 0; display: inline }
+dl.triple dt:after { content: ':'; }
+dl.triple dd:after { content: '\A'; white-space: pre; }
+.adef {
+ font-family: monospace;
+ font-weight: bold;
+ color: #ff4500 !important;
+}
+
+.aref {
+ font-family: monospace;
+ font-weight: bold;
+ color: #ff4500 !important;
+}
+
+span.entity { color: red; }
+
+span.element { color: green; }
+span[itemprop=name] { font-weight: bold; }
+</style>
+</head>
<body>
-<section id="abstract">
- <p>This document serves as the manifest describing [[MICRODATA-RDF]] tests to be used by
+<section id="abstract"><p>This document serves as the manifest describing [[MICRODATA-RDF]] tests to be used by
processor implementations claiming conformance.</p>
+</section><section><h2>Running tests</h2>
<p>Tests are described with individual HTML files containing microdata, which when processed,
will either pass or fail a SPARQL ASK query associated with the test. <a href="#positive-tests">Positive processor
tests</a> tests MUST yield a value of <code>true</code> and <a href="#negative-tests">Negative processor tests</a>
MUST yield a value of <code>false</code>.</p>
<p>All tests should be performed with an assumed base of <code>http://www.w3.org/TR/microdata-rdf/tests/</code>
along with the base-name of the specific test document (excluding any format extension).</p>
-</section>
+ <p>This document serves as the test manifest for both positive and negative parser tests using the
+ <a href="http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#">Data Access Test Manifest</a>
+ and <a href="http://www.w3.org/2001/sw/DataAccess/tests/test-query#">Data Access Test Query</a> vocabularies.</p>
+ <p>Properly parsing this document with a conforming Microdata to RDF processor, as well as the individual
+ test cases requires that the processor use the <a href="test-registry.json">Test Registry</a>. Additionally,
+ individual tests may require that the processor use a different registry using the
+ an additional <code>registry</code> property, indicating the URL of a registry to load to run the test,
+ typically a file co-located and numbered along with the test itself.</p>
+ <section><h3>Example Test Entry</h3>
+ <p>An example test entry parsed from this manifest might have the following form:</p>
+<pre class="example" data-transform="updateExample">
+<!--
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix mf: <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> .
+@prefix qt: <http://www.w3.org/2001/sw/DataAccess/tests/test-query#> .
-<section id="positive-tests">
- <h2>Positive processor tests</h2>
+[ rdf:type mf:Manifest ;
+ rdfs:comment "Turtle good syntax test cases (must pass)" ;
+ mf:entries (
+ [ a mf:ManifestEntry;
+ mf:name "Test 0001";
+ rdfs:comment "Item with no itemtype and literal itemprop";
+ mf:action [
+ a qt:QueryTest;
+ qt:data <0001.html>;
+ qt:query <0001.rq>;
+ ];
+ mf:registry <test-registry.json>;
+ mf:result "true"
+ ]
+ )
+] .
+-->
+</pre>
+</section></section><section id="positive-tests" itemscope itemtype="http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#Manifest"><h2 itemprop="http://www.w3.org/2000/01/rdf-schema#comment">Positive processor tests</h2>
+
+
+<div itemscope itemtype="http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ManifestEntry" itemprop="entries" class="test-entry">
+<span itemprop="name">Test 0001</span>:
+ <span itemprop="http://www.w3.org/2000/01/rdf-schema#comment">Item with no itemtype and literal itemprop</span>
+ (
+ <span itemprop="action" itemscope itemtype="http://www.w3.org/2001/sw/DataAccess/tests/test-query#QueryTest">
+ <a itemprop="data" href="0001.html">input</a> |
+ <a itemprop="query" href="0001.rq">query</a>
+ </span>
+ <a itemprop="registry" href="test-registry.json">registry</a>
+ <meta itemprop="result" content="true">
+ )
+ </div></section><section id="negative-tests" itemscope itemtype="http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#Manifest"><h2 itemprop="http://www.w3.org/2000/01/rdf-schema#comment">Negative processor tests</h2>
+
</section>
-
-<section id="negative-tests">
- <h2>Negative processor tests</h2>
-</section>
-
</body>
</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/microdata-rdf/tests/test-registry.json Fri Mar 02 13:09:04 2012 -0800
@@ -0,0 +1,45 @@
+{
+ "@comment": "This registry defines several artificial vocabularies used when running tests in the microdata to RDF test suite",
+ "http://vocabulary.unordered/": {
+ "propertyURI": "vocabulary",
+ "multipleValues": "unordered",
+ "properties": {
+ "list": {"multipleValues": "list"},
+ "ordered": {"multipleValues": "ordered"},
+ "typed": {"daetatype": "http://typed"}
+ }
+ },
+ "http://vocabulary.list/": {
+ "propertyURI": "vocabulary",
+ "multipleValues": "list",
+ "properties": {
+ "list": {"multipleValues": "list"},
+ "ordered": {"multipleValues": "ordered"},
+ "typed": {"daetatype": "http://typed"}
+ }
+ },
+ "http://contextual.unordered/": {
+ "propertyURI": "contextual",
+ "multipleValues": "unordered",
+ "properties": {
+ "list": {"multipleValues": "list"},
+ "ordered": {"multipleValues": "ordered"},
+ "typed": {"daetatype": "http://typed"}
+ }
+ },
+ "http://contextual.list/": {
+ "propertyURI": "contextual",
+ "multipleValues": "list",
+ "properties": {
+ "list": {"multipleValues": "list"},
+ "ordered": {"multipleValues": "ordered"},
+ "typed": {"daetatype": "http://typed"}
+ }
+ },
+ "http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#": {
+ "properties": {
+ "include": {"multipleValues": "list"},
+ "entries": {"multipleValues": "list"}
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/microdata-rdf/tests/update_index.rb Fri Mar 02 13:09:04 2012 -0800
@@ -0,0 +1,60 @@
+#!/usr/bin/env ruby
+# Processing the index file replacing test entries from tests found within this directory.
+
+require 'rubygems'
+require 'nokogiri'
+require 'getoptlong'
+
+def run(file, options)
+ index = Nokogiri::HTML.parse(file)
+
+ # Remove existing tests
+ index.css("div.test-entry").remove
+
+ # Find Positive and Negative insertion points
+ pos_entries = index.at_css("section#positive-tests")
+ neg_entries = index.at_css("section#negative-tests")
+
+ num_pos = num_neg = 0
+
+ Dir.glob("*.html").each do |test_file|
+ next unless test_file =~ /^\d+\.html$/
+ test = Nokogiri::HTML.parse(File.open(test_file))
+
+ # Extract head, replace as div.test-entry
+ test_info = test.at_css('title')
+ test_info.name = "div"
+ test_info['itemprop'] = 'entries'
+ test_info['class'] = 'test-entry'
+ test_info.css("title")
+ result = test_info.at_css("[itemprop=result]")
+ if !result || result['content'].downcase == 'true'
+ # Add entry to index
+ num_pos += 1
+ pos_entries.add_child(test_info)
+ else
+ num_neg += 1
+ neg_entries.add_child(test_info)
+ end
+ end
+ options[:output].puts index.to_s
+end
+
+options = {
+ :output => STDOUT,
+}
+input = nil
+opts = GetoptLong.new(
+ ["--output", "-o", GetoptLong::REQUIRED_ARGUMENT],
+)
+opts.each do |opt, arg|
+ case opt
+ when '--output' then options[:output] = File.open(arg, "w")
+ end
+end
+
+if ARGV.empty?
+ run($stdin, options)
+else
+ run(Kernel.open(ARGV.first), options)
+end