rdf-n3 0.3.4.1 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
data/spec/spec.opts DELETED
@@ -1 +0,0 @@
1
- --colour
data/spec/spec_helper.rb DELETED
@@ -1,86 +0,0 @@
1
- $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
- $:.unshift File.dirname(__FILE__)
3
-
4
- require 'rubygems'
5
- require 'rspec'
6
- require 'matchers'
7
- require 'bigdecimal' # XXX Remove Me
8
- require 'rdf/n3'
9
- require 'rdf/ntriples'
10
- require 'rdf/spec'
11
- require 'rdf/spec/matchers'
12
- require 'rdf/isomorphic'
13
- require 'yaml' # XXX should be in open-uri/cached
14
- require 'open-uri/cached'
15
-
16
- include Matchers
17
-
18
- # Create and maintain a cache of downloaded URIs
19
- URI_CACHE = File.expand_path(File.join(File.dirname(__FILE__), "uri-cache"))
20
- Dir.mkdir(URI_CACHE) unless File.directory?(URI_CACHE)
21
- OpenURI::Cache.class_eval { @cache_path = URI_CACHE }
22
-
23
- module RDF
24
- module Isomorphic
25
- alias_method :==, :isomorphic_with?
26
- end
27
- class Graph
28
- def to_ntriples
29
- RDF::Writer.for(:ntriples).buffer do |writer|
30
- self.each_statement do |statement|
31
- writer << statement
32
- end
33
- end
34
- end
35
- def dump
36
- b = []
37
- self.each_statement do |statement|
38
- b << statement.to_triple.inspect
39
- end
40
- b.join("\n")
41
- end
42
- end
43
- end
44
-
45
- ::RSpec.configure do |c|
46
- c.filter_run :focus => true
47
- c.run_all_when_everything_filtered = true
48
- c.exclusion_filter = {
49
- :ruby => lambda { |version| !(RUBY_VERSION.to_s =~ /^#{version.to_s}/) },
50
- }
51
- c.include(Matchers)
52
- c.include(RDF::Spec::Matchers)
53
- end
54
-
55
- # Serialize graph and replace bnodes with predictable versions, return as sorted array
56
- def normalize_bnodes(graph, anon = "a")
57
- anon_ctx = {}
58
- # Find and replace all BNodes within graph string
59
- g_str = graph.to_ntriples
60
- anon_entries = g_str.scan(/_:g\d+/).sort.uniq
61
- anon_entries.each do |a|
62
- anon_ctx[a] = "_:#{anon}"
63
- anon = anon.succ
64
- end
65
-
66
- g_str.gsub(/_:g\d+/) { |bn| anon_ctx[bn] }.split("\n").sort
67
- end
68
-
69
- # Heuristically detect the input stream
70
- def detect_format(stream)
71
- # Got to look into the file to see
72
- if stream.is_a?(IO) || stream.is_a?(StringIO)
73
- stream.rewind
74
- string = stream.read(1000)
75
- stream.rewind
76
- else
77
- string = stream.to_s
78
- end
79
- case string
80
- when /<\w+:RDF/ then :rdfxml
81
- when /<RDF/ then :rdfxml
82
- when /<html/i then :rdfa
83
- when /@prefix/i then :n3
84
- else :n3
85
- end
86
- end
data/spec/swap_spec.rb DELETED
@@ -1,78 +0,0 @@
1
- $:.unshift "."
2
- require File.join(File.dirname(__FILE__), 'spec_helper')
3
-
4
- describe RDF::N3::Reader do
5
- # W3C N3 Test suite from http://www.w3.org/2000/10/swap/test/n3parser.tests
6
- describe "w3c swap tests" do
7
- require 'swap_test'
8
-
9
- # Negative parser tests should raise errors.
10
- describe "positive parser tests" do
11
- Fixtures::SWAPTest::PositiveParserTest.each do |t|
12
- #next unless t.subject.to_s =~ /rdfms-rdf-names-use/
13
- #next unless t.name =~ /11/
14
- #puts t.inspect
15
- specify "#{t.name}: #{t.inputDocument} against #{t.outputDocument}" do
16
- begin
17
- t.run_test do
18
- t.name.should_not == "n3_10012" # Too many bnodes makes graph compare unfeasable
19
- t.debug = []
20
- g = RDF::Graph.new
21
- RDF::N3::Reader.new(t.input,
22
- :base_uri => t.inputDocument,
23
- :strict => true,
24
- :debug => t.debug).each do |statement|
25
- g << statement
26
- end
27
- g
28
- end
29
- rescue RSpec::Expectations::ExpectationNotMetError => e
30
- if %w(n3_10012).include?(t.name)
31
- pending("check visually, graph compare times too long")
32
- elsif %w(n3_10010).include?(t.name)
33
- pending("Not supported in Ruby 1.8")
34
- elsif %w(n3_10008 n3_10013).include?(t.name)
35
- pending("Isomorphic compare issue")
36
- elsif %w(n3_10004 n3_10007 n3_10014 n3_10015 n3_10017).include?(t.name)
37
- pending("Formulae inferrence not supported")
38
- elsif %w(n3_10006 n3_10009).include?(t.name)
39
- pending("Verified test results are incorrect")
40
- else
41
- raise
42
- end
43
- end
44
- end
45
- end
46
- end
47
-
48
- describe "negative parser tests" do
49
- Fixtures::SWAPTest::NegativeParserTest.each do |t|
50
- #next unless t.subject.uri.to_s =~ /rdfms-empty-property-elements/
51
- #next unless t.name =~ /1/
52
- #puts t.inspect
53
- specify "#{t.name}: #{t.inputDocument}#{t.outputDocument ? (' against ' + t.outputDocument) : ''}" do
54
- begin
55
- t.run_test do
56
- lambda do
57
- t.debug = []
58
- g = RDF::Graph.new
59
- RDF::N3::Reader.new(t.input,
60
- :base_uri => t.inputDocument,
61
- :strict => true,
62
- :debug => t.debug).each do |statement|
63
- g << statement
64
- end
65
- end.should raise_error(RDF::ReaderError)
66
- end
67
- rescue RSpec::Expectations::ExpectationNotMetError => e
68
- if %w(n3_10019 n3_10020).include?(t.name)
69
- pending("This is still supported")
70
- else
71
- raise
72
- end
73
- end
74
- end
75
- end
76
- end
77
- end
78
- end
data/spec/swap_test.rb DELETED
@@ -1,79 +0,0 @@
1
- # Spira class for manipulating test-manifest style test suites.
2
- # Used for SWAP tests
3
- require 'spira'
4
- require 'rdf/n3'
5
- require 'open-uri'
6
-
7
- module Fixtures
8
- module SWAPTest
9
- class N3T < RDF::Vocabulary("http://www.w3.org/2004/11/n3test#"); end
10
-
11
- class Entry
12
- attr_accessor :debug
13
- attr_accessor :compare
14
- include Spira::Resource
15
-
16
- property :description, :predicate => N3T.description, :type => XSD.string
17
- property :inputDocument, :predicate => N3T.inputDocument
18
- property :outputDocument, :predicate => N3T.outputDocument
19
-
20
- def name
21
- subject.to_s.split("#").last
22
- end
23
-
24
- def input
25
- Kernel.open(self.inputDocument)
26
- end
27
-
28
- def output
29
- self.outputDocument ? Kernel.open(self.outputDocument) : ""
30
- end
31
-
32
- def information; self.description; end
33
-
34
- def inspect
35
- "[#{self.class.to_s} " + %w(
36
- subject
37
- description
38
- inputDocument
39
- outputDocument
40
- ).map {|a| v = self.send(a); "#{a}='#{v}'" if v}.compact.join(", ") +
41
- "]"
42
- end
43
-
44
- # Run test case, yields input for parser to create triples
45
- def run_test(options = {})
46
- # Run
47
- graph = yield
48
-
49
- return unless self.outputDocument
50
-
51
- case self.compare
52
- when :none
53
- # Don't check output, just parse to graph
54
- when :array
55
- @parser.graph.should be_equivalent_graph(self.output, self)
56
- else
57
- #puts "parse #{self.outputDocument} as #{RDF::Reader.for(self.outputDocument)}"
58
- format = detect_format(self.output)
59
- output_graph = RDF::Graph.load(self.outputDocument, :format => format, :base_uri => self.inputDocument)
60
- puts "result: #{CGI.escapeHTML(graph.to_ntriples)}" if ::RDF::N3::debug?
61
- graph.should Matchers::be_equivalent_graph(output_graph, self)
62
- end
63
- end
64
- end
65
-
66
- class PositiveParserTest < Entry
67
- default_source :entries
68
- type N3T.PositiveParserTest
69
- end
70
-
71
- class NegativeParserTest < Entry
72
- default_source :entries
73
- type N3T.NegativeParserTest
74
- end
75
-
76
- repo = RDF::Repository.load("http://www.w3.org/2000/10/swap/test/n3parser.tests", :format => :n3)
77
- Spira.add_repository! :entries, repo
78
- end
79
- end
data/spec/turtle_spec.rb DELETED
@@ -1,66 +0,0 @@
1
- $:.unshift "."
2
- require File.join(File.dirname(__FILE__), 'spec_helper')
3
-
4
- describe RDF::N3::Reader do
5
- # W3C Turtle Test suite from http://www.w3.org/2000/10/swap/test/regression.n3
6
- describe "w3c turtle tests" do
7
- require 'turtle_test'
8
-
9
- describe "positive parser tests" do
10
- Fixtures::TurtleTest::Good.each do |t|
11
- next unless t.comment
12
- #puts t.inspect
13
-
14
- # modified test-10 results to be canonical
15
- # modified test-21&22 results exponent to be E not e
16
- # modified test-28 2.30 => 2.3 representation
17
- specify "#{t.name}: #{t.comment}" do
18
- #puts t.inspect
19
- # Skip tests for very long files, too long
20
- if !defined?(::Encoding) && %w(test-18).include?(t.name)
21
- pending("Not supported in Ruby 1.8")
22
- else
23
- t.run_test do
24
- t.debug = []
25
- g = RDF::Graph.new
26
- RDF::N3::Reader.new(t.input,
27
- :base_uri => t.inputDocument,
28
- :strict => true,
29
- :canonicalize => true,
30
- :debug => t.debug).each do |statement|
31
- g << statement
32
- end
33
- g
34
- end
35
- end
36
- end
37
- end
38
- end
39
-
40
- describe "negative parser tests" do
41
- Fixtures::TurtleTest::Bad.each do |t|
42
- next unless t.comment
43
- #puts t.inspect
44
- specify "#{t.name}: #{t.comment}" do
45
- begin
46
- t.run_test do
47
- lambda do
48
- t.debug = []
49
- g = RDF::Graph.new
50
- RDF::N3::Reader.new(t.input,
51
- :base_uri => t.inputDocument,
52
- :strict => true,
53
- :debug => t.debug).each do |statement|
54
- g << statement
55
- end
56
- end.should raise_error(RDF::ReaderError)
57
- end
58
- rescue RSpec::Expectations::ExpectationNotMetError => e
59
- pending() { raise }
60
- end
61
- end
62
- end
63
- end
64
- end
65
-
66
- end
data/spec/turtle_test.rb DELETED
@@ -1,98 +0,0 @@
1
- # Spira class for manipulating test-manifest style test suites.
2
- # Used for Turtle tests
3
- require 'spira'
4
- require 'rdf/n3'
5
- require 'open-uri'
6
-
7
- module Fixtures
8
- module TurtleTest
9
- class MF < RDF::Vocabulary("http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#"); end
10
-
11
- class Entry
12
- attr_accessor :debug
13
- attr_accessor :compare
14
- include Spira::Resource
15
- type MF["Entry"]
16
-
17
- property :name, :predicate => MF["name"], :type => XSD.string
18
- property :comment, :predicate => RDF::RDFS.comment, :type => XSD.string
19
- property :result, :predicate => MF.result
20
- has_many :action, :predicate => MF["action"]
21
-
22
- def name
23
- inputDocument.to_s.split("/").last
24
- end
25
-
26
- def input
27
- Kernel.open(self.inputDocument)
28
- end
29
-
30
- def output
31
- self.result ? Kernel.open(self.result) : ""
32
- end
33
-
34
- def inputDocument
35
- self.class.repository.first_object(:subject => self.action.first)
36
- end
37
-
38
- def inspect
39
- "[#{self.class.to_s} " + %w(
40
- subject
41
- name
42
- comment
43
- result
44
- inputDocument
45
- ).map {|a| v = self.send(a); "#{a}='#{v}'" if v}.compact.join(", ") +
46
- "]"
47
- end
48
-
49
- # Run test case, yields input for parser to create triples
50
- def run_test(options = {})
51
- # Run
52
- graph = yield
53
-
54
- return unless self.result
55
-
56
- case self.compare
57
- when :none
58
- # Don't check output, just parse to graph
59
- when :array
60
- @parser.graph.should be_equivalent_graph(self.output, self)
61
- else
62
- #puts "parse #{self.outputDocument} as #{RDF::Reader.for(self.outputDocument)}"
63
- format = detect_format(self.output)
64
- output_graph = RDF::Graph.load(self.result, :format => format, :base_uri => self.inputDocument)
65
- puts "result: #{CGI.escapeHTML(graph.to_ntriples)}" if ::RDF::N3::debug?
66
- graph.should Matchers::be_equivalent_graph(output_graph, self)
67
- end
68
- end
69
- end
70
-
71
- class Good < Entry
72
- default_source :turtle
73
- end
74
-
75
- class Bad < Entry
76
- default_source :turtle_bad
77
- end
78
-
79
- turtle = RDF::Repository.load("http://www.w3.org/2001/sw/DataAccess/df1/tests/manifest.ttl")
80
-
81
- # Add types to entries
82
- turtle.subjects(:predicate => MF["name"]).each do |s|
83
- turtle << RDF::Statement.new(s, RDF.type, MF["Entry"])
84
- end
85
-
86
- Spira.add_repository! :turtle, turtle
87
-
88
- turtle_bad = RDF::Repository.load("http://www.w3.org/2001/sw/DataAccess/df1/tests/manifest-bad.ttl")
89
-
90
- # Add types to entries
91
- turtle_bad.subjects(:predicate => MF["name"]).each do |s|
92
- turtle_bad << RDF::Statement.new(s, RDF.type, MF["Entry"])
93
- end
94
-
95
- Spira.add_repository! :turtle_bad, turtle_bad
96
-
97
- end
98
- end
data/spec/writer_spec.rb DELETED
@@ -1,399 +0,0 @@
1
- $:.unshift "."
2
- require File.join(File.dirname(__FILE__), 'spec_helper')
3
-
4
- describe RDF::N3::Writer do
5
- describe "simple tests" do
6
- it "should use full URIs without base" do
7
- input = %(<http://a/b> <http://a/c> <http://a/d> .)
8
- serialize(input, nil, [%r(^<http://a/b> <http://a/c> <http://a/d> \.$)])
9
- end
10
-
11
- it "should use relative URIs with base" do
12
- input = %(<http://a/b> <http://a/c> <http://a/d> .)
13
- serialize(input, "http://a/",
14
- [ %r(^@base <http://a/> \.$),
15
- %r(^<b> <c> <d> \.$)]
16
- )
17
- end
18
-
19
- it "should use qname URIs with prefix" do
20
- input = %(<http://xmlns.com/foaf/0.1/b> <http://xmlns.com/foaf/0.1/c> <http://xmlns.com/foaf/0.1/d> .)
21
- serialize(input, nil,
22
- [%r(^@prefix foaf: <http://xmlns.com/foaf/0.1/> \.$),
23
- %r(^foaf:b foaf:c foaf:d \.$)],
24
- :prefixes => { :foaf => RDF::FOAF}
25
- )
26
- end
27
-
28
- it "should use qname URIs with empty prefix" do
29
- input = %(<http://xmlns.com/foaf/0.1/b> <http://xmlns.com/foaf/0.1/c> <http://xmlns.com/foaf/0.1/d> .)
30
- serialize(input, nil,
31
- [%r(^@prefix : <http://xmlns.com/foaf/0.1/> \.$),
32
- %r(^:b :c :d \.$)],
33
- :prefixes => { "" => RDF::FOAF}
34
- )
35
- end
36
-
37
- # see example-files/arnau-registered-vocab.rb
38
- it "should use qname URIs with empty suffix" do
39
- input = %(<http://xmlns.com/foaf/0.1/> <http://xmlns.com/foaf/0.1/> <http://xmlns.com/foaf/0.1/> .)
40
- serialize(input, nil,
41
- [%r(^@prefix foaf: <http://xmlns.com/foaf/0.1/> \.$),
42
- %r(^foaf: foaf: foaf: \.$)],
43
- :prefixes => { "foaf" => RDF::FOAF}
44
- )
45
- end
46
-
47
- it "should not use qname with illegal local part" do
48
- input = %(
49
- @prefix db: <http://dbpedia.org/resource/> .
50
- @prefix dbo: <http://dbpedia.org/ontology/> .
51
- db:Michael_Jackson dbo:artistOf <http://dbpedia.org/resource/%28I_Can%27t_Make_It%29_Another_Day> .
52
- )
53
-
54
- serialize(input, nil,
55
- [%r(^@prefix db: <http://dbpedia.org/resource/> \.$),
56
- %r(^db:Michael_Jackson dbo:artistOf <http://dbpedia.org/resource/%28I_Can%27t_Make_It%29_Another_Day> \.$)],
57
- :prefixes => {
58
- "db" => RDF::URI("http://dbpedia.org/resource/"),
59
- "dbo" => RDF::URI("http://dbpedia.org/ontology/")}
60
- )
61
- end
62
-
63
- it "should order properties" do
64
- input = %(
65
- @prefix : <http://xmlns.com/foaf/0.1/> .
66
- @prefix dc: <http://purl.org/dc/elements/1.1/> .
67
- @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
68
- :b :c :d .
69
- :b dc:title "title" .
70
- :b a :class .
71
- :b rdfs:label "label" .
72
- )
73
- serialize(input, nil,
74
- [%r(^\s+a :class;$),
75
- %r(^\s+rdfs:label "label"),
76
- %r(^:b dc:title \"title\"),
77
- %r(^\s+:c :d)],
78
- :prefixes => { "" => RDF::FOAF, :dc => "http://purl.org/dc/elements/1.1/", :rdfs => RDF::RDFS}
79
- )
80
- end
81
-
82
- it "should generate object list" do
83
- input = %(@prefix : <http://xmlns.com/foaf/0.1/> . :b :c :d, :e .)
84
- serialize(input, nil,
85
- [%r(^@prefix : <http://xmlns.com/foaf/0.1/> \.$),
86
- %r(^:b :c :d,$),
87
- %r(^\s+:e \.$)],
88
- :prefixes => { "" => RDF::FOAF}
89
- )
90
- end
91
-
92
- it "should generate property list" do
93
- input = %(@prefix : <http://xmlns.com/foaf/0.1/> . :b :c :d; :e :f .)
94
- serialize(input, nil,
95
- [%r(^@prefix : <http://xmlns.com/foaf/0.1/> \.$),
96
- %r(^:b :c :d;$),
97
- %r(^\s+:e :f \.$)],
98
- :prefixes => { "" => RDF::FOAF}
99
- )
100
- end
101
- end
102
-
103
- describe "anons" do
104
- it "should generate bare anon" do
105
- input = %(@prefix : <http://xmlns.com/foaf/0.1/> . [:a :b] .)
106
- serialize(input, nil,
107
- [%r(^\s*\[ :a :b\] \.$)],
108
- :prefixes => { "" => RDF::FOAF}
109
- )
110
- end
111
-
112
- it "should generate anon as subject" do
113
- input = %(@prefix : <http://xmlns.com/foaf/0.1/> . [:a :b] :c :d .)
114
- serialize(input, nil,
115
- [%r(^\s*\[ :a :b;$),
116
- %r(^\s+:c :d\] \.$)],
117
- :prefixes => { "" => RDF::FOAF}
118
- )
119
- end
120
-
121
- it "should generate anon as object" do
122
- input = %(@prefix : <http://xmlns.com/foaf/0.1/> . :a :b [:c :d] .)
123
- serialize(input, nil,
124
- [%r(^\s*\:a :b \[ :c :d\] \.$)],
125
- :prefixes => { "" => RDF::FOAF}
126
- )
127
- end
128
- end
129
-
130
- describe "lists" do
131
- it "should generate bare list" do
132
- input = %(@prefix : <http://xmlns.com/foaf/0.1/> . (:a :b) .)
133
- serialize(input, nil,
134
- [%r(^\(:a :b\) \.$)],
135
- :prefixes => { "" => RDF::FOAF}
136
- )
137
- end
138
-
139
- it "should generate literal list" do
140
- input = %(@prefix : <http://xmlns.com/foaf/0.1/> . :a :b ( "apple" "banana" ) .)
141
- serialize(input, nil,
142
- [%r(^:a :b \("apple" "banana"\) \.$)],
143
- :prefixes => { "" => RDF::FOAF}
144
- )
145
- end
146
-
147
- it "should generate empty list" do
148
- input = %(@prefix : <http://xmlns.com/foaf/0.1/> . :a :b () .)
149
- serialize(input, nil,
150
- [%r(^:a :b \(\) \.$)],
151
- :prefixes => { "" => RDF::FOAF}
152
- )
153
- end
154
-
155
- it "should generate empty list(2)" do
156
- input = %(@prefix : <http://xmlns.com/foaf/0.1/> . :emptyList = () .)
157
- serialize(input, nil,
158
- [%r(^:emptyList (<.*sameAs>|owl:sameAs) \(\) \.$)],
159
- :prefixes => { "" => RDF::FOAF}
160
- )
161
- end
162
-
163
- it "should generate empty list as subject" do
164
- input = %(@prefix : <http://xmlns.com/foaf/0.1/> . () :a :b .)
165
- serialize(input, nil,
166
- [%r(^\(\) :a :b \.$)],
167
- :prefixes => { "" => RDF::FOAF}
168
- )
169
- end
170
-
171
- it "should generate list as subject" do
172
- input = %(@prefix : <http://xmlns.com/foaf/0.1/> . (:a) :b :c .)
173
- serialize(input, nil,
174
- [%r(^\(:a\) :b :c \.$)],
175
- :prefixes => { "" => RDF::FOAF}
176
- )
177
- end
178
-
179
- it "should generate list of empties" do
180
- input = %(@prefix : <http://xmlns.com/foaf/0.1/> . :listOf2Empties = (() ()) .)
181
- serialize(input, nil,
182
- [%r(^:listOf2Empties (<.*sameAs>|owl:sameAs) \(\(\) \(\)\) \.$)],
183
- :prefixes => { "" => RDF::FOAF}
184
- )
185
- end
186
-
187
- it "should generate list anon" do
188
- input = %(@prefix : <http://xmlns.com/foaf/0.1/> . :twoAnons = ([a :mother] [a :father]) .)
189
- serialize(input, nil,
190
- [%r(^:twoAnons (<.*sameAs>|owl:sameAs) \(\[\s*a :mother\] \[\s*a :father\]\) \.$)],
191
- :prefixes => { "" => RDF::FOAF}
192
- )
193
- end
194
-
195
- it "should generate owl:unionOf list" do
196
- input = %(
197
- @prefix : <http://xmlns.com/foaf/0.1/> .
198
- @prefix owl: <http://www.w3.org/2002/07/owl#> .
199
- @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
200
- @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
201
- :a rdfs:domain [
202
- a owl:Class;
203
- owl:unionOf [
204
- a owl:Class;
205
- rdf:first :b;
206
- rdf:rest [
207
- a owl:Class;
208
- rdf:first :c;
209
- rdf:rest rdf:nil
210
- ]
211
- ]
212
- ] .
213
- )
214
- #$verbose = true
215
- serialize(input, nil,
216
- [
217
- %r(:a rdfs:domain \[\s*a owl:Class;\s+owl:unionOf\s+\(:b\s+:c\)\]\s*\.$)m,
218
- %r(@prefix : <http://xmlns.com/foaf/0.1/> \.),
219
- %r(@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> \.),
220
- ],
221
- :prefixes => { "" => RDF::FOAF, :rdfs => RDF::RDFS, :owl => RDF::OWL, :rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#"}
222
- )
223
- #$verbose = false
224
- end
225
- end
226
-
227
- describe "literals" do
228
- describe "plain" do
229
- it "encodes embedded \"\"\"" do
230
- n3 = %(:a :b """testing string parsing in N3.
231
- """ .)
232
- serialize(n3, nil, [/testing string parsing in N3.\n/])
233
- end
234
-
235
- it "encodes embedded \"" do
236
- n3 = %(:a :b """string with " escaped quote marks""" .)
237
- serialize(n3, nil, [/string with \\" escaped quote mark/])
238
- end
239
- end
240
-
241
- describe "with language" do
242
- it "specifies language for literal with language" do
243
- ttl = %q(:a :b "string"@en .)
244
- serialize(ttl, nil, [%r("string"@en)])
245
- end
246
- end
247
-
248
- describe "xsd:anyURI" do
249
- it "uses xsd namespace for datatype" do
250
- ttl = %q(@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . :a :b "http://foo/"^^xsd:anyURI .)
251
- serialize(ttl, nil, [
252
- %r(@prefix xsd: <http://www.w3.org/2001/XMLSchema#> \.),
253
- %r("http://foo/"\^\^xsd:anyURI \.),
254
- ])
255
- end
256
- end
257
-
258
- describe "xsd:boolean" do
259
- [
260
- [%q("true"^^xsd:boolean), /true ./],
261
- [%q("TrUe"^^xsd:boolean), /true ./],
262
- [%q("1"^^xsd:boolean), /true ./],
263
- [%q(true), /true ./],
264
- [%q("false"^^xsd:boolean), /false ./],
265
- [%q("FaLsE"^^xsd:boolean), /false ./],
266
- [%q("0"^^xsd:boolean), /false ./],
267
- [%q(false), /false ./],
268
- ].each do |(l,r)|
269
- it "uses token for #{l.inspect}" do
270
- ttl = %(@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . :a :b #{l} .)
271
- serialize(ttl, nil, [
272
- %r(@prefix xsd: <http://www.w3.org/2001/XMLSchema#> \.),
273
- r,
274
- ], :canonicalize => true)
275
- end
276
- end
277
- end
278
-
279
- describe "xsd:integer" do
280
- [
281
- [%q("1"^^xsd:integer), /1 ./],
282
- [%q(1), /1 ./],
283
- [%q("0"^^xsd:integer), /0 ./],
284
- [%q(0), /0 ./],
285
- [%q("10"^^xsd:integer), /10 ./],
286
- [%q(10), /10 ./],
287
- ].each do |(l,r)|
288
- it "uses token for #{l.inspect}" do
289
- ttl = %(@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . :a :b #{l} .)
290
- serialize(ttl, nil, [
291
- %r(@prefix xsd: <http://www.w3.org/2001/XMLSchema#> \.),
292
- r,
293
- ], :canonicalize => true)
294
- end
295
- end
296
- end
297
-
298
- describe "xsd:int" do
299
- [
300
- [%q("1"^^xsd:int), /"1"\^\^xsd:int ./],
301
- [%q("0"^^xsd:int), /"0"\^\^xsd:int ./],
302
- [%q("10"^^xsd:int), /"10"\^\^xsd:int ./],
303
- ].each do |(l,r)|
304
- it "uses token for #{l.inspect}" do
305
- ttl = %(@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . :a :b #{l} .)
306
- serialize(ttl, nil, [
307
- %r(@prefix xsd: <http://www.w3.org/2001/XMLSchema#> \.),
308
- r,
309
- ], :canonicalize => true)
310
- end
311
- end
312
- end
313
-
314
- describe "xsd:decimal" do
315
- [
316
- [%q("1.0"^^xsd:decimal), /1.0 ./],
317
- [%q(1.0), /1.0 ./],
318
- [%q("0.1"^^xsd:decimal), /0.1 ./],
319
- [%q(0.1), /0.1 ./],
320
- [%q("10.02"^^xsd:decimal), /10.02 ./],
321
- [%q(10.02), /10.02 ./],
322
- ].each do |(l,r)|
323
- it "uses token for #{l.inspect}" do
324
- ttl = %(@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . :a :b #{l} .)
325
- serialize(ttl, nil, [
326
- %r(@prefix xsd: <http://www.w3.org/2001/XMLSchema#> \.),
327
- r,
328
- ], :canonicalize => true)
329
- end
330
- end
331
- end
332
-
333
- describe "xsd:double" do
334
- [
335
- [%q("1.0e1"^^xsd:double), /1.0e1 ./],
336
- [%q(1.0e1), /1.0e1 ./],
337
- [%q("0.1e1"^^xsd:double), /1.0e0 ./],
338
- [%q(0.1e1), /1.0e0 ./],
339
- [%q("10.02e1"^^xsd:double), /1.002e2 ./],
340
- [%q(10.02e1), /1.002e2 ./],
341
- ].each do |(l,r)|
342
- it "uses token for #{l.inspect}" do
343
- ttl = %(@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . :a :b #{l} .)
344
- serialize(ttl, nil, [
345
- %r(@prefix xsd: <http://www.w3.org/2001/XMLSchema#> \.),
346
- r,
347
- ], :canonicalize => true)
348
- end
349
- end
350
- end
351
- end
352
-
353
- # W3C Turtle Test suite from http://www.w3.org/2000/10/swap/test/regression.n3
354
- describe "w3c turtle tests" do
355
- require 'turtle_test'
356
-
357
- Fixtures::TurtleTest::Good.each do |t|
358
- next unless t.comment
359
- #puts t.inspect
360
- #next unless t.name == "test-04"
361
- next if t.name == "test-29" # FIXME
362
-
363
- specify "#{t.name}: #{t.comment}" do
364
- @graph = parse(t.output, :base_uri => t.result, :format => :ntriples)
365
- n3 = serialize(t.output, t.result, [], :format => :n3)
366
- g2 = parse(n3, :base_uri => t.result)
367
- g2.should be_equivalent_graph(@graph, :trace => @debug.join("\n"))
368
- end
369
- end
370
- end
371
-
372
- def parse(input, options = {})
373
- graph = RDF::Graph.new
374
- RDF::N3::Reader.new(input, options).each do |statement|
375
- graph << statement
376
- end
377
- graph
378
- end
379
-
380
- # Serialize ntstr to a string and compare against regexps
381
- def serialize(ntstr, base = nil, regexps = [], options = {})
382
- prefixes = options[:prefixes] || {}
383
- g = parse(ntstr, :base_uri => base, :prefixes => prefixes)
384
- @debug = []
385
- result = RDF::N3::Writer.buffer(options.merge(:debug => @debug, :base_uri => base, :prefixes => prefixes)) do |writer|
386
- writer << g
387
- end
388
- if $verbose
389
- require 'cgi'
390
- #puts CGI.escapeHTML(result)
391
- end
392
-
393
- regexps.each do |re|
394
- result.should match_re(re, :about => base, :trace => @debug, :inputDocument => ntstr)
395
- end
396
-
397
- result
398
- end
399
- end