rdf_context 0.4.8 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (248) hide show
  1. data/History.txt +27 -0
  2. data/README.rdoc +22 -9
  3. data/Rakefile +11 -6
  4. data/VERSION +1 -1
  5. data/bin/rdf_context +12 -4
  6. data/lib/rdf_context.rb +3 -1
  7. data/lib/rdf_context/aggregate_graph.rb +86 -0
  8. data/lib/rdf_context/array_hacks.rb +53 -0
  9. data/lib/rdf_context/conjunctive_graph.rb +1 -1
  10. data/lib/rdf_context/exceptions.rb +9 -7
  11. data/lib/rdf_context/graph.rb +174 -15
  12. data/lib/rdf_context/literal.rb +34 -2
  13. data/lib/rdf_context/n3_grammar.treetop +213 -129
  14. data/lib/rdf_context/n3parser.rb +281 -57
  15. data/lib/rdf_context/namespace.rb +23 -12
  16. data/lib/rdf_context/parser.rb +4 -3
  17. data/lib/rdf_context/quoted_graph.rb +38 -0
  18. data/lib/rdf_context/rdfaparser.rb +2 -1
  19. data/lib/rdf_context/rdfxmlparser.rb +4 -3
  20. data/lib/rdf_context/store/abstract_sql_store.rb +4 -4
  21. data/lib/rdf_context/store/abstract_store.rb +5 -1
  22. data/lib/rdf_context/store/sqlite3_store.rb +10 -8
  23. data/lib/rdf_context/string_hacks.rb +44 -21
  24. data/lib/rdf_context/term_utils.rb +73 -4
  25. data/lib/rdf_context/triple.rb +32 -47
  26. data/lib/rdf_context/uriref.rb +33 -26
  27. data/spec/aggregate_graph_spec.rb +59 -0
  28. data/spec/conjunctive_graph_spec.rb +1 -1
  29. data/spec/cwm_spec.rb +32 -0
  30. data/spec/graph_spec.rb +114 -3
  31. data/spec/literal_spec.rb +107 -5
  32. data/spec/matchers.rb +104 -51
  33. data/spec/n3parser_spec.rb +798 -99
  34. data/spec/namespaces_spec.rb +26 -0
  35. data/spec/quoted_graph_spec.rb +0 -0
  36. data/spec/rdf_helper.rb +197 -0
  37. data/spec/rdfa_helper.rb +15 -11
  38. data/spec/rdfa_parser_spec.rb +6 -8
  39. data/spec/rdfxml_spec.rb +21 -28
  40. data/spec/spec_helper.rb +20 -0
  41. data/spec/sqlite3_store_spec.rb +6 -5
  42. data/spec/store_helper.rb +9 -1
  43. data/spec/string_hacks_spec.rb +14 -0
  44. data/spec/{rdfxml_helper.rb → swap_helper.rb} +8 -9
  45. data/spec/swap_spec.rb +77 -0
  46. data/spec/swap_test/animal.rdf +17 -0
  47. data/spec/swap_test/anon-prop.n3 +14 -0
  48. data/spec/swap_test/anonymous_loop.n3 +2 -0
  49. data/spec/swap_test/contexts.n3 +16 -0
  50. data/spec/swap_test/daml-pref.n3 +10 -0
  51. data/spec/swap_test/i18n/hiragana.n3 +22 -0
  52. data/spec/swap_test/i18n/n3string.n3 +4 -0
  53. data/spec/swap_test/list/itemType.rdf +12 -0
  54. data/spec/swap_test/lists-simple.n3 +40 -0
  55. data/spec/swap_test/lists.n3 +35 -0
  56. data/spec/swap_test/n3/n3parser.tests_n3_10001.nt +3 -0
  57. data/spec/swap_test/n3/n3parser.tests_n3_10002.nt +7 -0
  58. data/spec/swap_test/n3/n3parser.tests_n3_10003.nt +3 -0
  59. data/spec/swap_test/n3/n3parser.tests_n3_10004.nt +119 -0
  60. data/spec/swap_test/n3/n3parser.tests_n3_10005.nt +3 -0
  61. data/spec/swap_test/n3/n3parser.tests_n3_10006.nt +225 -0
  62. data/spec/swap_test/n3/n3parser.tests_n3_10007.nt +79 -0
  63. data/spec/swap_test/n3/n3parser.tests_n3_10008.nt +5 -0
  64. data/spec/swap_test/n3/n3parser.tests_n3_10009.nt +13 -0
  65. data/spec/swap_test/n3/n3parser.tests_n3_10010.nt +21 -0
  66. data/spec/swap_test/n3/n3parser.tests_n3_10011.nt +9 -0
  67. data/spec/swap_test/n3/n3parser.tests_n3_10012.nt +53 -0
  68. data/spec/swap_test/n3/n3parser.tests_n3_10013.nt +19 -0
  69. data/spec/swap_test/n3/n3parser.tests_n3_10014.nt +103 -0
  70. data/spec/swap_test/n3/n3parser.tests_n3_10015.nt +103 -0
  71. data/spec/swap_test/n3/n3parser.tests_n3_10016.nt +3 -0
  72. data/spec/swap_test/n3/n3parser.tests_n3_10017.nt +151 -0
  73. data/spec/swap_test/n3/n3parser.tests_n3_10018.nt +9 -0
  74. data/spec/swap_test/n3/n3parser.tests_n3_10019.nt +3 -0
  75. data/spec/swap_test/n3/n3parser.tests_n3_10020.nt +13 -0
  76. data/spec/swap_test/n3parser.tests +160 -0
  77. data/spec/swap_test/nodeID/classes.n3 +9 -0
  78. data/spec/swap_test/nodeID/classes.ref.rdf +15 -0
  79. data/spec/swap_test/nodeID/ex1.rdf +15 -0
  80. data/spec/swap_test/norm/fix.rdf +33 -0
  81. data/spec/swap_test/owl-ex.rdf +150 -0
  82. data/spec/swap_test/ref/animal.n3 +11 -0
  83. data/spec/swap_test/ref/anon-prop-1.n3 +8 -0
  84. data/spec/swap_test/ref/anonymous_loop.ref +7 -0
  85. data/spec/swap_test/ref/bnode.n3 +6 -0
  86. data/spec/swap_test/ref/bnode.rdf +16 -0
  87. data/spec/swap_test/ref/colon-in-uri.n3 +15 -0
  88. data/spec/swap_test/ref/daml-ex.n3 +103 -0
  89. data/spec/swap_test/ref/daml-ont.n3 +289 -0
  90. data/spec/swap_test/ref/djb1a-out.n3 +4 -0
  91. data/spec/swap_test/ref/dot-dash.n3 +8 -0
  92. data/spec/swap_test/ref/in-xml-t.n3 +4 -0
  93. data/spec/swap_test/ref/itemType.n3 +9 -0
  94. data/spec/swap_test/ref/keywords1.n3 +11 -0
  95. data/spec/swap_test/ref/keywords2.n3 +11 -0
  96. data/spec/swap_test/ref/lists-simple-1.rdf +108 -0
  97. data/spec/swap_test/ref/lists.n3 +43 -0
  98. data/spec/swap_test/ref/lstring-out.n3 +20 -0
  99. data/spec/swap_test/ref/n3string.n3 +13 -0
  100. data/spec/swap_test/ref/no-last-nl.n3 +3 -0
  101. data/spec/swap_test/ref/numbers.n3 +18 -0
  102. data/spec/swap_test/ref/path1.n3 +8 -0
  103. data/spec/swap_test/ref/path2.n3 +39 -0
  104. data/spec/swap_test/ref/prefix1.rdf +31 -0
  105. data/spec/swap_test/ref/prefix3.rdf +31 -0
  106. data/spec/swap_test/ref/rdf-redefine.rdf +11 -0
  107. data/spec/swap_test/ref/reluri-1.rdf +18 -0
  108. data/spec/swap_test/ref/strquot.n3 +23 -0
  109. data/spec/swap_test/ref/strquot_a.n3 +23 -0
  110. data/spec/swap_test/ref/xml-base3.n3 +5 -0
  111. data/spec/swap_test/ref/xml-redefine.rdf +20 -0
  112. data/spec/swap_test/ref/xml-redefine2.rdf +23 -0
  113. data/spec/swap_test/ref/xml-syntax-basic-serialization.rdf +10 -0
  114. data/spec/swap_test/ref/xmllit.nt +3 -0
  115. data/spec/swap_test/regression.n3 +231 -0
  116. data/spec/swap_test/reluri-1.n3 +10 -0
  117. data/spec/swap_test/strquot.n3 +23 -0
  118. data/spec/swap_test/syntax/colon-in-uri.rdf +27 -0
  119. data/spec/swap_test/syntax/djb1a.n3 +3 -0
  120. data/spec/swap_test/syntax/dot-dash.n3 +15 -0
  121. data/spec/swap_test/syntax/equals1.n3 +1 -0
  122. data/spec/swap_test/syntax/equals2.n3 +1 -0
  123. data/spec/swap_test/syntax/keywords1.n3 +17 -0
  124. data/spec/swap_test/syntax/keywords2.n3 +18 -0
  125. data/spec/swap_test/syntax/lstring.n3 +26 -0
  126. data/spec/swap_test/syntax/neg-formula-predicate.n3 +1 -0
  127. data/spec/swap_test/syntax/neg-keywords3.n3 +1 -0
  128. data/spec/swap_test/syntax/neg-literal-predicate.n3 +1 -0
  129. data/spec/swap_test/syntax/neg-single-quote.n3 +1 -0
  130. data/spec/swap_test/syntax/neg-thisadoc.n3 +1 -0
  131. data/spec/swap_test/syntax/no-last-nl.n3 +2 -0
  132. data/spec/swap_test/syntax/numbers.n3 +26 -0
  133. data/spec/swap_test/syntax/path1.n3 +23 -0
  134. data/spec/swap_test/syntax/path2.n3 +31 -0
  135. data/spec/swap_test/syntax/qvars1.n3 +19 -0
  136. data/spec/swap_test/syntax/qvars2.n3 +19 -0
  137. data/spec/swap_test/syntax/this-quantifiers.n3 +164 -0
  138. data/spec/swap_test/syntax/this-rules.n3 +43 -0
  139. data/spec/swap_test/syntax/too-nested.n3 +25 -0
  140. data/spec/swap_test/syntax/trailing-semicolon.n3 +12 -0
  141. data/spec/swap_test/syntax/zero-objects.n3 +1 -0
  142. data/spec/swap_test/syntax/zero-predicates.n3 +3 -0
  143. data/spec/swap_test/tests-work.txt +25 -0
  144. data/spec/swap_test/xml-syntax/basic-serialization.n3 +8 -0
  145. data/spec/swap_test/xml-syntax/in-xml.xml +13 -0
  146. data/spec/swap_test/xml-syntax/non-ascii-pred.rdf +14 -0
  147. data/spec/swap_test/xml-syntax/rdf_prefix.n3 +2 -0
  148. data/spec/swap_test/xml-syntax/xml_prefix.n3 +7 -0
  149. data/spec/swap_test/xml-syntax/xml_prefix2.n3 +9 -0
  150. data/spec/swap_test/xml-syntax/xmlbase3.rdf +10 -0
  151. data/spec/swap_test/xml-syntax/xmllit.rdf +33 -0
  152. data/spec/triple_spec.rb +90 -46
  153. data/spec/turtle/README.txt +20 -0
  154. data/spec/turtle/bad-00.ttl +2 -0
  155. data/spec/turtle/bad-01.ttl +3 -0
  156. data/spec/turtle/bad-02.ttl +3 -0
  157. data/spec/turtle/bad-03.ttl +3 -0
  158. data/spec/turtle/bad-04.ttl +3 -0
  159. data/spec/turtle/bad-05.ttl +4 -0
  160. data/spec/turtle/bad-06.ttl +3 -0
  161. data/spec/turtle/bad-07.ttl +4 -0
  162. data/spec/turtle/bad-08.ttl +2 -0
  163. data/spec/turtle/bad-09.ttl +3 -0
  164. data/spec/turtle/bad-10.ttl +3 -0
  165. data/spec/turtle/bad-11.ttl +3 -0
  166. data/spec/turtle/bad-12.ttl +3 -0
  167. data/spec/turtle/bad-13.ttl +3 -0
  168. data/spec/turtle/bad-14.ttl +6 -0
  169. data/spec/turtle/manifest-bad.ttl +88 -0
  170. data/spec/turtle/manifest.ttl +215 -0
  171. data/spec/turtle/rdf-schema.out +126 -0
  172. data/spec/turtle/rdf-schema.ttl +156 -0
  173. data/spec/turtle/rdfq-results.out +36 -0
  174. data/spec/turtle/rdfq-results.ttl +39 -0
  175. data/spec/turtle/rdfs-namespace.out +131 -0
  176. data/spec/turtle/rdfs-namespace.ttl +160 -0
  177. data/spec/turtle/test-00.out +1 -0
  178. data/spec/turtle/test-00.ttl +2 -0
  179. data/spec/turtle/test-01.out +3 -0
  180. data/spec/turtle/test-01.ttl +7 -0
  181. data/spec/turtle/test-02.out +3 -0
  182. data/spec/turtle/test-02.ttl +5 -0
  183. data/spec/turtle/test-03.out +3 -0
  184. data/spec/turtle/test-03.ttl +5 -0
  185. data/spec/turtle/test-04.out +2 -0
  186. data/spec/turtle/test-04.ttl +4 -0
  187. data/spec/turtle/test-05.out +4 -0
  188. data/spec/turtle/test-05.ttl +4 -0
  189. data/spec/turtle/test-06.out +1 -0
  190. data/spec/turtle/test-06.ttl +3 -0
  191. data/spec/turtle/test-07.out +5 -0
  192. data/spec/turtle/test-07.ttl +3 -0
  193. data/spec/turtle/test-08.out +1 -0
  194. data/spec/turtle/test-08.ttl +3 -0
  195. data/spec/turtle/test-09.out +4 -0
  196. data/spec/turtle/test-09.ttl +10 -0
  197. data/spec/turtle/test-10.out +5 -0
  198. data/spec/turtle/test-10.ttl +5 -0
  199. data/spec/turtle/test-11.out +4 -0
  200. data/spec/turtle/test-11.ttl +10 -0
  201. data/spec/turtle/test-12.out +4 -0
  202. data/spec/turtle/test-12.ttl +9 -0
  203. data/spec/turtle/test-13.out +2 -0
  204. data/spec/turtle/test-13.ttl +7 -0
  205. data/spec/turtle/test-14.out +10000 -0
  206. data/spec/turtle/test-14.ttl +10002 -0
  207. data/spec/turtle/test-15.out +10000 -0
  208. data/spec/turtle/test-15.ttl +3 -0
  209. data/spec/turtle/test-16.out +10000 -0
  210. data/spec/turtle/test-16.ttl +10002 -0
  211. data/spec/turtle/test-17.out +1 -0
  212. data/spec/turtle/test-17.ttl +6 -0
  213. data/spec/turtle/test-18.out +2 -0
  214. data/spec/turtle/test-18.ttl +9 -0
  215. data/spec/turtle/test-19.out +1 -0
  216. data/spec/turtle/test-19.ttl +4 -0
  217. data/spec/turtle/test-20.out +2 -0
  218. data/spec/turtle/test-20.ttl +6 -0
  219. data/spec/turtle/test-21.out +3 -0
  220. data/spec/turtle/test-21.ttl +4 -0
  221. data/spec/turtle/test-22.out +3 -0
  222. data/spec/turtle/test-22.ttl +4 -0
  223. data/spec/turtle/test-23.out +1 -0
  224. data/spec/turtle/test-23.ttl +3 -0
  225. data/spec/turtle/test-24.out +2 -0
  226. data/spec/turtle/test-24.ttl +3 -0
  227. data/spec/turtle/test-25.out +7 -0
  228. data/spec/turtle/test-25.ttl +14 -0
  229. data/spec/turtle/test-26.out +1 -0
  230. data/spec/turtle/test-26.ttl +4 -0
  231. data/spec/turtle/test-27.out +1 -0
  232. data/spec/turtle/test-27.ttl +5 -0
  233. data/spec/turtle/test-28-out.ttl +6 -0
  234. data/spec/turtle/test-28.out +22 -0
  235. data/spec/turtle/test-28.ttl +22 -0
  236. data/spec/turtle/test-29.out +1 -0
  237. data/spec/turtle/test-29.ttl +1 -0
  238. data/spec/turtle/test-30.out +5 -0
  239. data/spec/turtle/test-30.ttl +12 -0
  240. data/spec/turtle_spec.rb +64 -0
  241. data/spec/uriref_spec.rb +74 -34
  242. data/test/n3_tests/rdflib/n3-writer-teset-26.n3 +31 -0
  243. data/test/n3_tests/rdflib/n3-writer-teset-26.nt +14 -0
  244. data/test/rdf_tests/xml-literal-mixed.nt +1 -2
  245. metadata +278 -39
  246. data/lib/rdf_context/n3_grammar.rb +0 -2171
  247. data/test/perf_test/test.rb +0 -11
  248. data/test/perf_test/tommorris.rdf +0 -2267
@@ -66,6 +66,32 @@ describe "Namespace" do
66
66
  end
67
67
  end
68
68
 
69
+ describe "normalization" do
70
+ {
71
+ %w(http://foo ) => "http://foo",
72
+ %w(http://foo a) => "http://fooa",
73
+
74
+ %w(http://foo/ ) => "http://foo/",
75
+ %w(http://foo/ a) => "http://foo/a",
76
+
77
+ %w(http://foo# ) => "http://foo#",
78
+ %w(http://foo# a) => "http://foo#a",
79
+
80
+ %w(http://foo/bar ) => "http://foo/bar",
81
+ %w(http://foo/bar a) => "http://foo/bara",
82
+
83
+ %w(http://foo/bar/ ) => "http://foo/bar/",
84
+ %w(http://foo/bar/ a) => "http://foo/bar/a",
85
+
86
+ %w(http://foo/bar# ) => "http://foo/bar#",
87
+ %w(http://foo/bar# a) => "http://foo/bar#a",
88
+ }.each_pair do |input, result|
89
+ it "should create <#{result}> from <#{input[0]}> and '#{input[1]}'" do
90
+ (Namespace.new(input[0], "test") + input[1].to_s).should == result
91
+ end
92
+ end
93
+ end
94
+
69
95
  it "should be be equivalent" do
70
96
  Namespace.new("http://a", "aa").should == Namespace.new("http://a", "aa")
71
97
  end
File without changes
@@ -0,0 +1,197 @@
1
+ module RdfHelper
2
+ # Class representing test cases in format http://www.w3.org/2000/10/rdf-tests/rdfcore/testSchema#
3
+ class TestCase
4
+ include Matchers
5
+ MF_NS = Namespace.new("http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#", "mf")
6
+ QT_NS = Namespace.new("http://www.w3.org/2001/sw/DataAccess/tests/test-query#", "qt")
7
+
8
+ attr_accessor :about
9
+ attr_accessor :approval
10
+ attr_accessor :conclusionDocument
11
+ attr_accessor :data
12
+ attr_accessor :description
13
+ attr_accessor :discussion
14
+ attr_accessor :document
15
+ attr_accessor :entailmentRules
16
+ attr_accessor :inputDocument
17
+ attr_accessor :issue
18
+ attr_accessor :name
19
+ attr_accessor :outputDocument
20
+ attr_accessor :premiseDocument
21
+ attr_accessor :rdf_type
22
+ attr_accessor :status
23
+ attr_accessor :warning
24
+ attr_accessor :parser
25
+ attr_accessor :compare
26
+
27
+ def initialize(triples, uri_prefix, test_dir, options = {})
28
+ case options[:test_type]
29
+ when :mf
30
+ parse_mf(triples, uri_prefix, test_dir, options[:graph])
31
+ else
32
+ parse_w3c(triples, uri_prefix, test_dir)
33
+ end
34
+ end
35
+
36
+ def parse_w3c(triples, uri_prefix, test_dir)
37
+ triples.each do |statement|
38
+ next if statement.subject.is_a?(BNode)
39
+
40
+ if statement.is_type?
41
+ self.rdf_type = statement.object.short_name
42
+ elsif statement.predicate.short_name =~ /Document\Z/i
43
+ puts "#{statement.predicate.short_name}: #{statement.object.inspect}" if $DEBUG
44
+ self.send("#{statement.predicate.short_name}=", statement.object.to_s.sub(uri_prefix, test_dir))
45
+ puts "#{statement.predicate.short_name}: " + self.send("#{statement.predicate.short_name}") if $DEBUG
46
+ if statement.predicate.short_name == "inputDocument"
47
+ self.about ||= statement.object
48
+ self.name ||= statement.subject.short_name
49
+ end
50
+ elsif statement.predicate.short_name == "referenceOutput"
51
+ puts "referenceOutput: #{statement.object.inspect}" if $DEBUG
52
+ outputDocument = statement.object.to_s.sub(uri_prefix, test_dir)
53
+ puts "referenceOutput: " + self.send("#{statement.predicate.short_name}") if $DEBUG
54
+ elsif self.respond_to?("#{statement.predicate.short_name}=")
55
+ self.send("#{statement.predicate.short_name}=", statement.object.to_s)
56
+ end
57
+ end
58
+ end
59
+
60
+ def parse_mf(subject, uri_prefix, test_dir, graph)
61
+ props = graph.properties(subject)
62
+ @name = (props[MF_NS.name.to_s] || []).first.to_s
63
+ @description = (props[RDFS_NS.comment.to_s] || []).first.to_s
64
+ @outputDocument = (props[MF_NS.result.to_s] || []).first
65
+ @outputDocument = @outputDocument.to_s.sub(uri_prefix, test_dir) if @outputDocument
66
+ action = (props[MF_NS.action.to_s] || []).first
67
+ a_props = graph.properties(action)
68
+ @about = (a_props[QT_NS.data.to_s] || []).first
69
+ @inputDocument = @about.to_s.sub(uri_prefix, test_dir)
70
+ end
71
+
72
+ def inspect
73
+ "[Test Case " + %w(
74
+ about
75
+ name
76
+ inputDocument
77
+ outputDocument
78
+ issue
79
+ status
80
+ approval
81
+ description
82
+ discussion
83
+ issue
84
+ warning
85
+ ).map {|a| v = self.send(a); "#{a}='#{v}'" if v}.compact.join(", ") +
86
+ "]"
87
+ end
88
+
89
+ # Read in file, and apply modifications reference either .html or .xhtml
90
+ def input
91
+ @input ||= File.read(inputDocument)
92
+ end
93
+
94
+ def output
95
+ @output ||= outputDocument && File.read(outputDocument)
96
+ end
97
+
98
+ # Run test case, yields input for parser to create triples
99
+ def run_test(options = {})
100
+ rdf_string = input
101
+
102
+ # Run
103
+ @parser = Parser.new
104
+ yield(rdf_string, @parser)
105
+
106
+ return unless output
107
+
108
+ if self.compare == :array
109
+ @parser.graph.should be_equivalent_graph(self.output, self)
110
+ else
111
+ output_parser = Parser.new
112
+ output_fmt = output_parser.detect_format(self.output, self.outputDocument)
113
+ output_parser.parse(self.output, about, :type => output_fmt)
114
+
115
+ @parser.graph.should be_equivalent_graph(output_parser, self)
116
+ end
117
+ end
118
+
119
+ def trace
120
+ @parser.debug.to_a.join("\n")
121
+ end
122
+
123
+ def self.parse_test_cases(test_uri = nil, test_dir = nil)
124
+ raise "Missing test_uri" unless test_uri
125
+ raise "Missing test_dir" unless test_dir
126
+ @test_cases = [] unless test_uri == @test_uri
127
+ return unless @test_cases.empty?
128
+
129
+ test = test_uri.to_s.split('/').last
130
+ test_dir = test_dir + "/" unless test_dir.match(%r(/$))
131
+
132
+ @positive_parser_tests = []
133
+ @negative_parser_tests = []
134
+ @positive_entailment_tests = []
135
+ @negative_entailment_tests = []
136
+
137
+ manifest = File.read(File.join(test_dir, test))
138
+ parser = Parser.new
139
+ begin
140
+ puts "parse <#{test_uri}>" if $DEBUG
141
+ parser.parse(manifest, test_uri)
142
+ rescue
143
+ raise "Parse error: #{$!}\n\t#{parser.debug.join("\t\n")}\n\n"
144
+ end
145
+ graph = parser.graph
146
+
147
+ uri_base = Addressable::URI.join(test_uri, ".").to_s
148
+
149
+ # If this is a turtle test (type mf:Manifest) parse with
150
+ # alternative test case
151
+ case graph.type_of(test_uri).first
152
+ when MF_NS.Manifest
153
+ # Get test entries
154
+ entries = graph.triples(Triple.new(test_uri, MF_NS.entries, nil)) || []
155
+ entries = entries.first
156
+ raise "No entires found for MF Manifest" unless entries.is_a?(Triple)
157
+
158
+ @test_cases = graph.seq(entries.object).map do |subject|
159
+ TestCase.new(subject, uri_base, test_dir, :test_type => :mf, :graph => graph)
160
+ end
161
+ else
162
+ # One of:
163
+ # http://www.w3.org/2000/10/rdf-tests/rdfcore/testSchema
164
+ # http://www.w3.org/2000/10/swap/test.n3#
165
+ # http://www.w3.org/2004/11/n3test#
166
+ # Group by subject
167
+ test_hash = graph.triples.inject({}) do |hash, st|
168
+ a = hash[st.subject] ||= []
169
+ a << st
170
+ hash
171
+ end
172
+
173
+ @test_cases = test_hash.values.map do |statements|
174
+ TestCase.new(statements, uri_base, test_dir)
175
+ end
176
+ end.
177
+ compact.
178
+ sort_by{|t| t.name.to_s}
179
+
180
+
181
+ @test_cases.each do |tc|
182
+ next if tc.status && tc.status != "APPROVED"
183
+ case tc.rdf_type
184
+ when "PositiveParserTest" then @positive_parser_tests << tc
185
+ when "NegativeParserTest" then @negative_parser_tests << tc
186
+ when "PositiveEntailmentTest" then @positive_entailment_tests << tc
187
+ when "NegativeEntailmentTest" then @negative_entailment_tests << tc
188
+ end
189
+ end
190
+ end
191
+ def self.test_cases(test_uri = nil, test_dir = nil); parse_test_cases(test_uri, test_dir); @test_cases; end
192
+ def self.positive_parser_tests(test_uri = nil, test_dir = nil); parse_test_cases(test_uri, test_dir); @positive_parser_tests; end
193
+ def self.negative_parser_tests(test_uri = nil, test_dir = nil); parse_test_cases(test_uri, test_dir); @negative_parser_tests; end
194
+ def self.positive_entailment_tests(test_uri = nil, test_dir = nil); parse_test_cases(test_uri, test_dir); @positive_entailment_tests; end
195
+ def self.negative_entailment_tests(test_uri = nil, test_dir = nil); parse_test_cases(test_uri, test_dir); @negative_entailment_tests; end
196
+ end
197
+ end
@@ -1,5 +1,3 @@
1
- require 'matchers'
2
-
3
1
  module RdfaHelper
4
2
  # Class representing test cases in format http://www.w3.org/2006/03/test-description#
5
3
  class TestCase
@@ -26,7 +24,6 @@ module RdfaHelper
26
24
  attr_accessor :expectedResults
27
25
  attr_accessor :parser
28
26
 
29
- @@test_cases = []
30
27
  @@suite = ""
31
28
 
32
29
  def initialize(statements, suite)
@@ -70,6 +67,8 @@ module RdfaHelper
70
67
  reviewStatus.to_s.split("#").last
71
68
  end
72
69
 
70
+ def compare; :graph; end
71
+
73
72
  def information
74
73
  %w(purpose specificationReference).map {|a| v = self.send(a); "#{a}: #{v}" if v}.compact.join("\n")
75
74
  end
@@ -80,7 +79,7 @@ module RdfaHelper
80
79
 
81
80
  # Read in file, and apply modifications to create a properly formatted HTML
82
81
  def input
83
- f = self.name + ".txt"
82
+ f = self.inputDocument
84
83
  found_head = false
85
84
  namespaces = ""
86
85
  body = File.readlines(File.join(TEST_DIR, "tests", f)).map do |line|
@@ -130,6 +129,9 @@ module RdfaHelper
130
129
  suite == "xhtml" ? body : body.gsub(HTMLRE, '\1.html')
131
130
  end
132
131
 
132
+ def inputDocument; self.name + ".txt"; end
133
+ def outputDocument; self.name + ".sparql"; end
134
+
133
135
  # Run test case, yields input for parser to create triples
134
136
  def run_test
135
137
  rdfa_string = input
@@ -145,9 +147,11 @@ module RdfaHelper
145
147
  if (query_string.match(/UNION|OPTIONAL/) || title.match(/XML/)) && triples
146
148
  # Check triples, as Rasql doesn't implement UNION
147
149
  @parser.graph.should be_equivalent_graph(triples, self)
148
- else
150
+ elsif $redland_enabled
149
151
  # Run SPARQL query
150
152
  @parser.graph.should pass_query(query_string, self)
153
+ else
154
+ #pending("Query skipped, Redland not installed")
151
155
  end
152
156
 
153
157
  @parser.graph.to_rdfxml.should be_valid_xml
@@ -158,17 +162,17 @@ module RdfaHelper
158
162
  end
159
163
 
160
164
  def self.test_cases(suite)
161
- @@test_cases = [] unless @@suite == suite
162
- return @@test_cases unless @@test_cases.empty?
165
+ @test_cases = [] unless @suite == suite
166
+ return @test_cases unless @test_cases.empty?
163
167
 
164
- @@suite = suite # Process the given test suite
165
- @@manifest_url = "#{BASE_MANIFEST_URL}#{suite}-manifest.rdf"
168
+ @suite = suite # Process the given test suite
169
+ @manifest_url = "#{BASE_MANIFEST_URL}#{suite}-manifest.rdf"
166
170
 
167
171
  manifest_str = File.read(File.join(TEST_DIR, "#{suite}-manifest.rdf"))
168
172
  parser = RdfXmlParser.new
169
173
 
170
174
  begin
171
- parser.parse(manifest_str, @@manifest_url)
175
+ parser.parse(manifest_str, @manifest_url)
172
176
  rescue
173
177
  raise "Parse error: #{$!}\n\t#{parser.debug.to_a.join("\t\n")}\n\n"
174
178
  end
@@ -181,7 +185,7 @@ module RdfaHelper
181
185
  hash
182
186
  end
183
187
 
184
- @@test_cases = test_hash.values.map {|statements| TestCase.new(statements, suite)}.
188
+ @test_cases = test_hash.values.map {|statements| TestCase.new(statements, suite)}.
185
189
  compact.
186
190
  sort_by{|t| t.name }
187
191
  end
@@ -114,15 +114,13 @@ describe "RDFa parser" do
114
114
  describe "that are approved" do
115
115
  test_cases(suite).each do |t|
116
116
  next unless t.status == "approved"
117
- #next unless t.name =~ /0115/
117
+ #next unless t.name =~ /0140/
118
118
  #puts t.inspect
119
119
  specify "test #{t.name}: #{t.title}#{", (negative test)" unless t.expectedResults}" do
120
- begin
121
- t.run_test do |rdfa_string, rdfa_parser|
122
- rdfa_parser.parse(rdfa_string, t.informationResourceInput, :debug => [])
123
- end
124
- rescue Spec::Expectations::ExpectationNotMetError => e
125
- raise
120
+ #puts t.input
121
+ #puts t.results
122
+ t.run_test do |rdfa_string, rdfa_parser|
123
+ rdfa_parser.parse(rdfa_string, t.informationResourceInput, :debug => [])
126
124
  end
127
125
  end
128
126
  end
@@ -130,7 +128,7 @@ describe "RDFa parser" do
130
128
  describe "that are unreviewed" do
131
129
  test_cases(suite).each do |t|
132
130
  next unless t.status == "unreviewed"
133
- next unless t.name =~ /017\d/
131
+ #next unless t.name =~ /017\d/
134
132
  #puts t.inspect
135
133
  specify "test #{t.name}: #{t.title}#{", (negative test)" unless t.expectedResults}" do
136
134
  begin
@@ -1,3 +1,4 @@
1
+ # coding: utf-8
1
2
  require File.join(File.dirname(__FILE__), 'spec_helper')
2
3
  include RdfContext
3
4
 
@@ -181,12 +182,9 @@ xmlns:ex="http://www.example.org/" xml:lang="en" xml:base="http://www.example.or
181
182
  <http://example.org/triples/#triple1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#predicate> <http://example.org/stuff/1.0/prop> .
182
183
  <http://example.org/triples/#triple1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#object> \"blah\" .
183
184
  EOF
184
- tc = RdfXMLHelper::TestCase.new([])
185
- tc.about = "http://example.com"
186
- tc.parser = @parser
187
185
 
188
- graph = @parser.parse(sampledoc, tc.about, :strict => true)
189
- graph.should be_equivalent_graph(triples, tc)
186
+ graph = @parser.parse(sampledoc, "http://example.com/", :strict => true)
187
+ graph.should be_equivalent_graph(triples, :about => "http://example.com/", :trace => @parser.debug)
190
188
  end
191
189
 
192
190
  it "should make sure that the value of rdf:ID attributes match the XML Name production (data attribute version)" do
@@ -276,25 +274,21 @@ EOF
276
274
  <http://www.w3.org/2000/10/rdf-tests/rdfcore/amp-in-url/test001.nt> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/10/rdf-tests/rdfcore/testSchema#NT-Document> .
277
275
  <http://www.w3.org/2000/10/rdf-tests/rdfcore/amp-in-url/test001.rdf> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/10/rdf-tests/rdfcore/testSchema#RDF-XML-Document> .
278
276
  EOF
279
- tc = RdfXMLHelper::TestCase.new([])
280
- tc.about = "http://www.w3.org/2000/10/rdf-tests/rdfcore/xmlbase/Manifest.rdf#test001"
281
- tc.parser = @parser
282
- graph = @parser.parse(sampledoc, tc.about, :strict => true)
283
- graph.should be_equivalent_graph(triples, tc)
277
+ uri = "http://www.w3.org/2000/10/rdf-tests/rdfcore/xmlbase/Manifest.rdf#test001"
278
+
279
+ graph = @parser.parse(sampledoc, uri, :strict => true)
280
+ graph.should be_equivalent_graph(triples, :about => uri, :trace => @parser.debug)
284
281
  end
285
282
 
286
283
  describe "parsing rdf files" do
287
- def test_file(filepath, uri = nil)
288
- n3_string = File.read(filepath)
289
- graph = @parser.parse(n3_string, uri, :strict => true)
290
- ntriples = graph.to_ntriples
291
- ntriples.gsub!(/_:bn\d+/, '_:node1')
292
- ntriples = ntriples.split("\n").sort.join("\n")
284
+ def test_file(filepath, uri)
285
+ rdf_string = File.read(filepath)
286
+ graph = @parser.parse(rdf_string, uri, :strict => true)
293
287
 
294
288
  nt_string = File.read(filepath.sub('.rdf', '.nt'))
295
- nt_string = nt_string.split("\n").sort.join("\n")
289
+ nt_graph = N3Parser.parse(nt_string, uri)
296
290
 
297
- ntriples.should == nt_string
291
+ graph.should be_equivalent_graph(nt_graph, :about => uri, :trace => @parser.debug)
298
292
  end
299
293
 
300
294
  before(:all) do
@@ -307,23 +301,22 @@ EOF
307
301
  test_file(file, "http://www.bbc.co.uk/music/artists/#{gid}")
308
302
  end
309
303
 
310
- # it "should parse xml literal test" do
311
- # file = File.join(@rdf_dir, "xml-literal-mixed.rdf")
312
- # test_file(file)
313
- # end
304
+ it "should parse xml literal test" do
305
+ file = File.join(@rdf_dir, "xml-literal-mixed.rdf")
306
+ test_file(file, "http://www.example.com/books#book12345")
307
+ end
314
308
  end
315
309
 
316
310
  # W3C Test suite from http://www.w3.org/2000/10/rdf-tests/rdfcore/
317
311
  describe "w3c rdfcore tests" do
318
- require 'rdfxml_helper'
319
- include RdfXMLHelper
312
+ require 'rdf_helper'
320
313
 
321
314
  def self.positive_tests
322
- RdfXMLHelper::TestCase.positive_parser_tests rescue []
315
+ RdfHelper::TestCase.positive_parser_tests(RDFCORE_TEST, RDFCORE_DIR) rescue []
323
316
  end
324
317
 
325
318
  def self.negative_tests
326
- RdfXMLHelper::TestCase.negative_parser_tests rescue []
319
+ RdfHelper::TestCase.negative_parser_tests(RDFCORE_TEST, RDFCORE_DIR) rescue []
327
320
  end
328
321
 
329
322
  # Negative parser tests should raise errors.
@@ -332,7 +325,7 @@ EOF
332
325
  #next unless t.about.uri.to_s =~ /rdfms-rdf-names-use/
333
326
  #next unless t.name =~ /11/
334
327
  #puts t.inspect
335
- specify "test #{t.about.uri.to_s}" do
328
+ specify "test #{t.name}: " + (t.description || "#{t.inputDocument} against #{t.outputDocument}") do
336
329
  t.run_test do |rdf_string, parser|
337
330
  parser.parse(rdf_string, t.about.uri.to_s, :strict => true, :debug => [])
338
331
  end
@@ -345,7 +338,7 @@ EOF
345
338
  #next unless t.about.uri.to_s =~ /rdfms-empty-property-elements/
346
339
  #next unless t.name =~ /1/
347
340
  #puts t.inspect
348
- specify "test #{t.about.uri.to_s}" do
341
+ specify "test #{t.name}: " + (t.description || t.inputDocument) do
349
342
  t.run_test do |rdf_string, parser|
350
343
  lambda do
351
344
  parser.parse(rdf_string, t.about.uri.to_s, :strict => true, :debug => [])
@@ -1,3 +1,4 @@
1
+ # coding: utf-8
1
2
  begin
2
3
  require 'spec'
3
4
  require 'active_support'
@@ -9,6 +10,12 @@ rescue LoadError
9
10
  require 'active_support'
10
11
  end
11
12
 
13
+ begin
14
+ require 'rdf/redland'
15
+ $redland_enabled = true
16
+ rescue LoadError
17
+ end
18
+
12
19
  ActiveSupport::XmlMini.backend = 'Nokogiri'
13
20
 
14
21
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
@@ -18,6 +25,19 @@ require 'matchers'
18
25
 
19
26
  include RdfContext
20
27
 
28
+ TMP_DIR = File.join(File.dirname(__FILE__), 'tmp')
29
+
30
+ SWAP_DIR = File.join(File.dirname(__FILE__), 'swap_test')
31
+ SWAP_TEST = "http://www.w3.org/2000/10/swap/test/n3parser.tests"
32
+ CWM_TEST = "http://www.w3.org/2000/10/swap/test/regression.n3"
33
+
34
+ TURTLE_DIR = File.join(File.dirname(__FILE__), 'turtle')
35
+ TURTLE_TEST = "http://www.w3.org/2001/sw/DataAccess/df1/tests/manifest.ttl"
36
+ TURTLE_BAD_TEST = "http://www.w3.org/2001/sw/DataAccess/df1/tests/manifest-bad.ttl"
37
+
38
+ RDFCORE_DIR = File.join(File.dirname(__FILE__), 'rdfcore')
39
+ RDFCORE_TEST = "http://www.w3.org/2000/10/rdf-tests/rdfcore/Manifest.rdf"
40
+
21
41
  Spec::Runner.configure do |config|
22
42
  config.include(Matchers)
23
43
  end