rdf-n3 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.yardopts +1 -0
- data/History.txt +9 -0
- data/README.rdoc +4 -2
- data/Rakefile +37 -2
- data/VERSION +1 -1
- data/example.rb +1 -1
- data/lib/rdf/n3.rb +12 -5
- data/lib/rdf/n3/format.rb +0 -1
- data/lib/rdf/n3/patches/array_hacks.rb +46 -124
- data/lib/rdf/n3/patches/graph_properties.rb +34 -0
- data/lib/rdf/n3/patches/literal_hacks.rb +23 -0
- data/lib/rdf/n3/patches/literal_normalization.rb +120 -0
- data/lib/rdf/n3/patches/qname_hacks.rb +57 -0
- data/lib/rdf/n3/patches/rdf_escape.rb +3 -3
- data/lib/rdf/n3/patches/seq.rb +34 -0
- data/lib/rdf/n3/patches/uri_hacks.rb +19 -0
- data/lib/rdf/n3/reader.rb +110 -68
- data/lib/rdf/n3/reader/n3_grammar.rb +3876 -0
- data/lib/rdf/n3/{vocabulary.rb → vocab.rb} +0 -0
- data/lib/rdf/n3/writer.rb +444 -0
- data/rdf-n3.gemspec +38 -15
- data/script/console +8 -0
- data/script/parse +49 -0
- data/spec/cwm_spec.rb +13 -5
- data/spec/format_spec.rb +21 -0
- data/spec/literal_spec.rb +382 -0
- data/spec/matchers.rb +101 -0
- data/spec/n3reader_spec.rb +253 -185
- data/spec/rdf_helper.rb +115 -89
- data/spec/spec_helper.rb +39 -0
- data/spec/swap_spec.rb +24 -10
- data/spec/swap_test/n3parser.yml +193 -0
- data/spec/swap_test/regression.yml +226 -0
- data/spec/turtle_spec.rb +23 -8
- data/spec/writer_spec.rb +250 -0
- metadata +80 -22
- data/spec/swap_helper.rb +0 -136
- data/spec/triple_spec.rb +0 -236
data/script/console
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# File: script/console
|
3
|
+
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
4
|
+
|
5
|
+
libs = " -r irb/completion"
|
6
|
+
libs << " -r #{File.dirname(__FILE__) + '/../lib/rdf/n3.rb'}"
|
7
|
+
puts "Loading rdf-n3 gem"
|
8
|
+
exec "#{irb} #{libs} --simple-prompt"
|
data/script/parse
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
#!/usr/bin/env ruby -s
|
2
|
+
require 'rubygems'
|
3
|
+
$:.unshift(File.join(File.dirname(__FILE__), "..", 'lib'))
|
4
|
+
require 'rdf/n3'
|
5
|
+
require 'getoptlong'
|
6
|
+
|
7
|
+
def parse(input, base)
|
8
|
+
puts RDF::Writer.for($format.to_sym).buffer { |writer|
|
9
|
+
RDF::N3::Reader.new(input, :base_uri => base, :strict => true).each do |statement|
|
10
|
+
writer << statement
|
11
|
+
end
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
mode = ARGV.shift
|
16
|
+
raise "Mode must be one of 'parse'" unless mode == "parse"
|
17
|
+
|
18
|
+
$verbose = false
|
19
|
+
$format = :ntriples
|
20
|
+
base_uri = "http://example.com"
|
21
|
+
input = nil
|
22
|
+
|
23
|
+
opts = GetoptLong.new(
|
24
|
+
["--debug", GetoptLong::NO_ARGUMENT],
|
25
|
+
["--verbose", GetoptLong::NO_ARGUMENT],
|
26
|
+
["--quiet", GetoptLong::NO_ARGUMENT],
|
27
|
+
["--format", GetoptLong::REQUIRED_ARGUMENT],
|
28
|
+
["--execute", "-e", GetoptLong::REQUIRED_ARGUMENT],
|
29
|
+
["--uri", GetoptLong::REQUIRED_ARGUMENT]
|
30
|
+
)
|
31
|
+
opts.each do |opt, arg|
|
32
|
+
case opt
|
33
|
+
when '--verbose' then $verbose = true
|
34
|
+
when '--quiet' then $quiet = true
|
35
|
+
when '--debug' then $DEBUG = true
|
36
|
+
when '--execute' then input = arg
|
37
|
+
when '--format' then $format = arg
|
38
|
+
when '--uri' then base_uri = arg
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
if ARGV.empty?
|
43
|
+
s = input ? input : $stdin.read
|
44
|
+
parse(StringIO.new(s), base_uri)
|
45
|
+
else
|
46
|
+
ARGV.each do |test_file|
|
47
|
+
parse(File.open(test_file), base_uri)
|
48
|
+
end
|
49
|
+
end
|
data/spec/cwm_spec.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
-
|
2
|
+
require 'rdf/rdfxml'
|
3
3
|
|
4
|
-
describe
|
4
|
+
describe RDF::N3::Reader do
|
5
5
|
describe "w3c cwm tests" do
|
6
6
|
require 'rdf_helper'
|
7
7
|
|
8
8
|
def self.test_cases
|
9
|
-
RdfHelper::TestCase.test_cases(CWM_TEST, SWAP_DIR)
|
9
|
+
RdfHelper::TestCase.test_cases(CWM_TEST, SWAP_DIR)
|
10
10
|
end
|
11
11
|
|
12
12
|
# Negative parser tests should raise errors.
|
@@ -16,8 +16,16 @@ describe "RDF::N3::Reader" do
|
|
16
16
|
#puts t.inspect
|
17
17
|
specify "test #{t.name}: " + (t.description || "#{t.inputDocument} against #{t.outputDocument}") do
|
18
18
|
begin
|
19
|
-
t.run_test do |rdf_string
|
20
|
-
|
19
|
+
t.run_test do |rdf_string|
|
20
|
+
t.debug = []
|
21
|
+
g = RDF::Graph.new
|
22
|
+
RDF::Reader.for(t.inputDocument).new(rdf_string,
|
23
|
+
:base_uri => t.about,
|
24
|
+
:strict => true,
|
25
|
+
:debug => t.debug).each do |statement|
|
26
|
+
g << statement
|
27
|
+
end
|
28
|
+
g
|
21
29
|
end
|
22
30
|
rescue #Spec::Expectations::ExpectationNotMetError => e
|
23
31
|
if t.status == "pending"
|
data/spec/format_spec.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
|
3
|
+
describe RDF::N3::Format do
|
4
|
+
context "discovery" do
|
5
|
+
{
|
6
|
+
"n3" => RDF::Format.for(:n3),
|
7
|
+
"etc/foaf.n3" => RDF::Format.for("etc/foaf.n3"),
|
8
|
+
"etc/foaf.ttl" => RDF::Format.for("etc/foaf.ttl"),
|
9
|
+
"foaf.n3" => RDF::Format.for(:file_name => "foaf.n3"),
|
10
|
+
"foaf.ttl" => RDF::Format.for(:file_name => "foaf.ttl"),
|
11
|
+
".n3" => RDF::Format.for(:file_extension => "n3"),
|
12
|
+
".ttl" => RDF::Format.for(:file_extension => "ttl"),
|
13
|
+
"text/n3" => RDF::Format.for(:content_type => "text/n3"),
|
14
|
+
"text/turtle" => RDF::Format.for(:content_type => "text/turtle"),
|
15
|
+
}.each_pair do |label, format|
|
16
|
+
it "should discover '#{label}'" do
|
17
|
+
format.should == RDF::N3::Format
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,382 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
3
|
+
require 'date'
|
4
|
+
require 'time'
|
5
|
+
require 'nokogiri'
|
6
|
+
|
7
|
+
describe RDF::Literal do
|
8
|
+
describe "an untyped string" do
|
9
|
+
subject {RDF::Literal.new("gregg")}
|
10
|
+
it "should be equal if they have the same contents" do should == RDF::Literal.new("gregg") end
|
11
|
+
it "should not be equal if they do not have the same contents" do should_not == RDF::Literal.new("tim") end
|
12
|
+
it "should match a string" do should == "gregg" end
|
13
|
+
it "should return a string using to_s" do subject.to_s.should == %("gregg") end
|
14
|
+
|
15
|
+
describe "should handle specific cases" do
|
16
|
+
{
|
17
|
+
'"Gregg"' => RDF::Literal.new("Gregg"),
|
18
|
+
'"\u677E\u672C \u540E\u5B50"' => RDF::Literal.new("松本 后子"),
|
19
|
+
'"D\u00FCrst"' => RDF::Literal.new("Dürst"),
|
20
|
+
}.each_pair do |encoded, literal|
|
21
|
+
it "should encode '#{literal.value}'" do
|
22
|
+
literal.to_s.should == encoded
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Ruby 1.9 only
|
27
|
+
{
|
28
|
+
'"\U00015678another"' => RDF::Literal.new("\u{15678}another"),
|
29
|
+
}.each_pair do |encoded, literal|
|
30
|
+
it "should encode '#{literal.value}'" do
|
31
|
+
literal.to_s.should == encoded
|
32
|
+
end
|
33
|
+
end if defined?(::Encoding)
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "encodings" do
|
37
|
+
it "should return n3" do subject.to_s.should == "\"gregg\"" end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "with extended characters" do
|
41
|
+
subject { RDF::Literal.new("松本 后子") }
|
42
|
+
|
43
|
+
describe "encodings" do
|
44
|
+
it "should return n3" do subject.to_s.should == '"\u677E\u672C \u540E\u5B50"' end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "with a language" do
|
49
|
+
subject { RDF::Literal.new("gregg", :language => "en") }
|
50
|
+
|
51
|
+
it "should accept a language tag" do
|
52
|
+
subject.language.should == :en
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should be equal if they have the same contents and language" do
|
56
|
+
should == RDF::Literal.new("gregg", :language => "en")
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should not be equal if they do not have the same contents" do
|
60
|
+
should_not == RDF::Literal.new("tim", :language => "en")
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should not be equal if they do not have the same language" do
|
64
|
+
should_not == RDF::Literal.new("gregg", :language => "fr")
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "encodings" do
|
68
|
+
it "should return n3" do subject.to_s.should == "\"gregg\"@en" end
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should normalize language tags to lower case" do
|
72
|
+
f = RDF::Literal.new("gregg", :language => "EN")
|
73
|
+
f.language.should == :en
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "a typed string" do
|
79
|
+
subject { RDF::Literal.new("gregg", :datatype => RDF::XSD.string) }
|
80
|
+
|
81
|
+
it "accepts an encoding" do
|
82
|
+
subject.datatype.to_s.should == RDF::XSD.string.to_s
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should be equal if they have the same contents and datatype" do
|
86
|
+
should == RDF::Literal.new("gregg", :datatype => RDF::XSD.string)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should not be equal if they do not have the same contents" do
|
90
|
+
should_not == RDF::Literal.new("tim", :datatype => RDF::XSD.string)
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should not be equal if they do not have the same datatype" do
|
94
|
+
should_not == RDF::Literal.new("gregg", :datatype => RDF::XSD.token)
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "encodings" do
|
98
|
+
it "should return n3" do subject.to_s.should == "\"gregg\"^^<http://www.w3.org/2001/XMLSchema#string>" end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe "a boolean" do
|
103
|
+
subject { RDF::Literal.new(true, :datatype => RDF::XSD.boolean) }
|
104
|
+
describe "encodings" do
|
105
|
+
it "should return n3" do subject.to_s.should == "\"true\"^^<http://www.w3.org/2001/XMLSchema#boolean>" end
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should infer type" do
|
109
|
+
int = RDF::Literal.new(true)
|
110
|
+
int.datatype.should == RDF::XSD.boolean
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should have string contents" do subject.value.should == "true" end
|
114
|
+
it "should have native contents" do subject.object.should == true end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe "an integer" do
|
118
|
+
subject { RDF::Literal.new(5, :datatype => RDF::XSD.int) }
|
119
|
+
describe "encodings" do
|
120
|
+
it "should return n3" do subject.to_s.should == "\"5\"^^<http://www.w3.org/2001/XMLSchema#int>" end
|
121
|
+
end
|
122
|
+
|
123
|
+
it "should infer type" do
|
124
|
+
int = RDF::Literal.new(15)
|
125
|
+
int.datatype.should == RDF::XSD.integer
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should have string contents" do subject.value.should == "5" end
|
129
|
+
it "should have native contents" do subject.object.should == 5 end
|
130
|
+
end
|
131
|
+
|
132
|
+
describe "a float" do
|
133
|
+
subject { RDF::Literal.new(15.4, :datatype => RDF::XSD.float) }
|
134
|
+
describe "encodings" do
|
135
|
+
it "should return n3" do subject.to_s.should == "\"15.4\"^^<http://www.w3.org/2001/XMLSchema#float>" end
|
136
|
+
end
|
137
|
+
|
138
|
+
it "should infer type" do
|
139
|
+
float = RDF::Literal.new(15.4)
|
140
|
+
float.datatype.should == RDF::XSD.double
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should have string contents" do subject.value.should == "15.4" end
|
144
|
+
it "should have native contents" do subject.object.should == 15.4 end
|
145
|
+
end
|
146
|
+
|
147
|
+
describe "a date" do
|
148
|
+
before(:each) { @value = Date.parse("2010-01-02Z") }
|
149
|
+
subject { RDF::Literal.new(@value, :datatype => RDF::XSD.date) }
|
150
|
+
describe "encodings" do
|
151
|
+
it "should return n3" do subject.to_s.should == "\"2010-01-02Z\"^^<http://www.w3.org/2001/XMLSchema#date>" end
|
152
|
+
end
|
153
|
+
|
154
|
+
it "should infer type" do
|
155
|
+
int = RDF::Literal.new(@value)
|
156
|
+
int.datatype.should == RDF::XSD.date
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should have string contents" do subject.value.should == "2010-01-02Z" end
|
160
|
+
it "should have native contents" do subject.object.should == @value end
|
161
|
+
end
|
162
|
+
|
163
|
+
describe "a dateTime" do
|
164
|
+
before(:each) { @value = DateTime.parse('2010-01-03T01:02:03Z') }
|
165
|
+
subject { RDF::Literal.new(@value, :datatype => RDF::XSD.dateTime) }
|
166
|
+
describe "encodings" do
|
167
|
+
it "should return n3" do subject.to_s.should == "\"2010-01-03T01:02:03Z\"^^<http://www.w3.org/2001/XMLSchema#dateTime>" end
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should infer type" do
|
171
|
+
int = RDF::Literal.new(@value)
|
172
|
+
int.datatype.should == RDF::XSD.dateTime
|
173
|
+
end
|
174
|
+
|
175
|
+
it "should have string contents" do subject.value.should == "2010-01-03T01:02:03Z" end
|
176
|
+
it "should have native contents" do subject.object.should == @value end
|
177
|
+
end
|
178
|
+
|
179
|
+
describe "a time" do
|
180
|
+
before(:each) { @value = Time.parse('01:02:03Z') }
|
181
|
+
subject { RDF::Literal.new(@value, :datatype => RDF::XSD.time) }
|
182
|
+
describe "encodings" do
|
183
|
+
it "should return n3" do subject.to_s.should == "\"01:02:03Z\"^^<http://www.w3.org/2001/XMLSchema#time>" end
|
184
|
+
end
|
185
|
+
|
186
|
+
it "should infer type" do
|
187
|
+
int = RDF::Literal.new(@value)
|
188
|
+
int.datatype.should == RDF::XSD.time
|
189
|
+
end
|
190
|
+
|
191
|
+
it "should have string contents" do subject.value.should == "01:02:03Z" end
|
192
|
+
it "should have native contents" do subject.object.should == @value end
|
193
|
+
end
|
194
|
+
|
195
|
+
describe "XML Literal" do
|
196
|
+
describe "with no namespace" do
|
197
|
+
subject { RDF::Literal.new("foo <sup>bar</sup> baz!", :datatype => RDF.XMLLiteral) }
|
198
|
+
it "should indicate xmlliteral?" do
|
199
|
+
subject.xmlliteral?.should == true
|
200
|
+
end
|
201
|
+
|
202
|
+
describe "encodings" do
|
203
|
+
it "should return n3" do subject.to_s.should == "\"foo <sup>bar</sup> baz!\"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral>" end
|
204
|
+
end
|
205
|
+
|
206
|
+
it "should be equal if they have the same contents" do
|
207
|
+
should == RDF::Literal.new("foo <sup>bar</sup> baz!", :datatype => RDF.XMLLiteral)
|
208
|
+
end
|
209
|
+
|
210
|
+
it "should be a XMLLiteral encoding" do
|
211
|
+
subject.datatype.should == RDF.XMLLiteral
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
describe "with a namespace" do
|
216
|
+
subject {
|
217
|
+
RDF::Literal.new("foo <sup>bar</sup> baz!", :datatype => RDF.XMLLiteral,
|
218
|
+
:namespaces => {"dc" => RDF::DC.to_s})
|
219
|
+
}
|
220
|
+
|
221
|
+
describe "encodings" do
|
222
|
+
it "should return n3" do subject.to_s.should == "\"foo <sup>bar</sup> baz!\"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral>" end
|
223
|
+
end
|
224
|
+
|
225
|
+
describe "and language" do
|
226
|
+
subject {
|
227
|
+
RDF::Literal.new("foo <sup>bar</sup> baz!", :datatype => RDF.XMLLiteral,
|
228
|
+
:namespaces => {"dc" => RDF::DC.to_s},
|
229
|
+
:language => :fr)
|
230
|
+
}
|
231
|
+
|
232
|
+
describe "encodings" do
|
233
|
+
it "should return n3" do subject.to_s.should == "\"foo <sup xml:lang=\\\"fr\\\">bar</sup> baz!\"\^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral>" end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
describe "and language with an existing language embedded" do
|
238
|
+
subject {
|
239
|
+
RDF::Literal.new("foo <sup>bar</sup><sub xml:lang=\"en\">baz</sub>",
|
240
|
+
:datatype => RDF.XMLLiteral,
|
241
|
+
:language => :fr)
|
242
|
+
}
|
243
|
+
|
244
|
+
describe "encodings" do
|
245
|
+
it "should return n3" do subject.to_s.should == "\"foo <sup xml:lang=\\\"fr\\\">bar</sup><sub xml:lang=\\\"en\\\">baz</sub>\"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral>" end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
describe "with a default namespace" do
|
250
|
+
subject {
|
251
|
+
RDF::Literal.new("foo <sup>bar</sup> baz!", :datatype => RDF.XMLLiteral,
|
252
|
+
:namespaces => {"" => RDF::DC.to_s})
|
253
|
+
}
|
254
|
+
|
255
|
+
describe "encodings" do
|
256
|
+
it "should return n3" do subject.to_s.should == "\"foo <sup xmlns=\\\"http://purl.org/dc/terms/\\\">bar</sup> baz!\"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral>" end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
describe "with multiple namespaces" do
|
261
|
+
subject {
|
262
|
+
RDF::Literal.new("foo <sup xmlns:dc=\"http://purl.org/dc/terms/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">bar</sup> baz!", :datatype => RDF.XMLLiteral)
|
263
|
+
}
|
264
|
+
it "should ignore namespace order" do
|
265
|
+
g = RDF::Literal.new("foo <sup xmlns:dc=\"http://purl.org/dc/terms/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">bar</sup> baz!", :datatype => RDF.XMLLiteral)
|
266
|
+
should == g
|
267
|
+
end
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
describe "an n3 literal" do
|
272
|
+
{
|
273
|
+
"Gregg" => 'Gregg',
|
274
|
+
"Dürst" => 'D\u00FCrst',
|
275
|
+
"simple literal" => 'simple literal',
|
276
|
+
"backslash:\\" => 'backslash:\\\\',
|
277
|
+
"dquote:\"" => 'dquote:\\"',
|
278
|
+
"newline:\n" => 'newline:\\n',
|
279
|
+
"return:\r" => 'return:\\r',
|
280
|
+
"tab:\t" => 'tab:\\t',
|
281
|
+
}.each_pair do |name, value|
|
282
|
+
specify "test #{name}" do
|
283
|
+
RDF::Literal.new(value.rdf_unescape).value.should == name
|
284
|
+
end
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
describe "valid content" do
|
289
|
+
{
|
290
|
+
"true" => %("true"^^<http://www.w3.org/2001/XMLSchema#boolean>),
|
291
|
+
"false" => %("false"^^<http://www.w3.org/2001/XMLSchema#boolean>),
|
292
|
+
"tRuE" => %("true"^^<http://www.w3.org/2001/XMLSchema#boolean>),
|
293
|
+
"FaLsE" => %("false"^^<http://www.w3.org/2001/XMLSchema#boolean>),
|
294
|
+
"1" => %("true"^^<http://www.w3.org/2001/XMLSchema#boolean>),
|
295
|
+
"0" => %("false"^^<http://www.w3.org/2001/XMLSchema#boolean>),
|
296
|
+
}.each_pair do |lit, n3|
|
297
|
+
it "should validate boolean '#{lit}'" do
|
298
|
+
RDF::Literal.new(lit, :datatype => RDF::XSD.boolean).valid?.should be_true
|
299
|
+
end
|
300
|
+
|
301
|
+
it "should normalize boolean '#{lit}'" do
|
302
|
+
RDF::Literal.new(lit, :datatype => RDF::XSD.boolean).to_s.should == n3
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
{
|
307
|
+
"01" => %("1"^^<http://www.w3.org/2001/XMLSchema#integer>),
|
308
|
+
"1" => %("1"^^<http://www.w3.org/2001/XMLSchema#integer>),
|
309
|
+
"-1" => %("-1"^^<http://www.w3.org/2001/XMLSchema#integer>),
|
310
|
+
"+1" => %("1"^^<http://www.w3.org/2001/XMLSchema#integer>),
|
311
|
+
}.each_pair do |lit, n3|
|
312
|
+
it "should validate integer '#{lit}'" do
|
313
|
+
RDF::Literal.new(lit, :datatype => RDF::XSD.integer).valid?.should be_true
|
314
|
+
end
|
315
|
+
|
316
|
+
it "should normalize integer '#{lit}'" do
|
317
|
+
RDF::Literal.new(lit, :datatype => RDF::XSD.integer).to_s.should == n3
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
{
|
322
|
+
"1" => %("1.0"^^<http://www.w3.org/2001/XMLSchema#decimal>),
|
323
|
+
"-1" => %("-1.0"^^<http://www.w3.org/2001/XMLSchema#decimal>),
|
324
|
+
"1." => %("1.0"^^<http://www.w3.org/2001/XMLSchema#decimal>),
|
325
|
+
"1.0" => %("1.0"^^<http://www.w3.org/2001/XMLSchema#decimal>),
|
326
|
+
"1.00" => %("1.0"^^<http://www.w3.org/2001/XMLSchema#decimal>),
|
327
|
+
"+001.00" => %("1.0"^^<http://www.w3.org/2001/XMLSchema#decimal>),
|
328
|
+
"123.456" => %("123.456"^^<http://www.w3.org/2001/XMLSchema#decimal>),
|
329
|
+
"2.345" => %("2.345"^^<http://www.w3.org/2001/XMLSchema#decimal>),
|
330
|
+
"1.000000000" => %("1.0"^^<http://www.w3.org/2001/XMLSchema#decimal>),
|
331
|
+
"2.3" => %("2.3"^^<http://www.w3.org/2001/XMLSchema#decimal>),
|
332
|
+
"2.234000005" => %("2.234000005"^^<http://www.w3.org/2001/XMLSchema#decimal>),
|
333
|
+
"2.2340000000000005" => %("2.2340000000000005"^^<http://www.w3.org/2001/XMLSchema#decimal>),
|
334
|
+
"2.23400000000000005" => %("2.234"^^<http://www.w3.org/2001/XMLSchema#decimal>),
|
335
|
+
"2.23400000000000000000005" => %("2.234"^^<http://www.w3.org/2001/XMLSchema#decimal>),
|
336
|
+
"1.2345678901234567890123457890" => %("1.2345678901234567"^^<http://www.w3.org/2001/XMLSchema#decimal>),
|
337
|
+
}.each_pair do |lit, n3|
|
338
|
+
it "should validate decimal '#{lit}'" do
|
339
|
+
RDF::Literal.new(lit, :datatype => RDF::XSD.decimal).valid?.should be_true
|
340
|
+
end
|
341
|
+
|
342
|
+
it "should normalize decimal '#{lit}'" do
|
343
|
+
RDF::Literal.new(lit, :datatype => RDF::XSD.decimal).to_s.should == n3
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
347
|
+
{
|
348
|
+
"1" => %("1.0E0"^^<http://www.w3.org/2001/XMLSchema#double>),
|
349
|
+
"-1" => %("-1.0E0"^^<http://www.w3.org/2001/XMLSchema#double>),
|
350
|
+
"+01.000" => %("1.0E0"^^<http://www.w3.org/2001/XMLSchema#double>),
|
351
|
+
"1." => %("1.0E0"^^<http://www.w3.org/2001/XMLSchema#double>),
|
352
|
+
"1.0" => %("1.0E0"^^<http://www.w3.org/2001/XMLSchema#double>),
|
353
|
+
"123.456" => %("1.23456E2"^^<http://www.w3.org/2001/XMLSchema#double>),
|
354
|
+
"1.0e+1" => %("1.0E1"^^<http://www.w3.org/2001/XMLSchema#double>),
|
355
|
+
"1.0e-10" => %("1.0E-10"^^<http://www.w3.org/2001/XMLSchema#double>),
|
356
|
+
"123.456e4" => %("1.23456E6"^^<http://www.w3.org/2001/XMLSchema#double>),
|
357
|
+
}.each_pair do |lit, n3|
|
358
|
+
it "should validate double '#{lit}'" do
|
359
|
+
RDF::Literal.new(lit, :datatype => RDF::XSD.double).valid?.should be_true
|
360
|
+
end
|
361
|
+
|
362
|
+
it "should normalize double '#{lit}'" do
|
363
|
+
RDF::Literal.new(lit, :datatype => RDF::XSD.double).to_s.should == n3
|
364
|
+
end
|
365
|
+
end
|
366
|
+
end
|
367
|
+
|
368
|
+
describe "invalid content" do
|
369
|
+
[
|
370
|
+
RDF::Literal.new("foo", :datatype => RDF::XSD.boolean),
|
371
|
+
RDF::Literal.new("xyz", :datatype => RDF::XSD.integer),
|
372
|
+
RDF::Literal.new("12xyz", :datatype => RDF::XSD.integer),
|
373
|
+
RDF::Literal.new("12.xyz", :datatype => RDF::XSD.decimal),
|
374
|
+
RDF::Literal.new("xy.z", :datatype => RDF::XSD.double),
|
375
|
+
RDF::Literal.new("+1.0z", :datatype => RDF::XSD.double),
|
376
|
+
].each do |lit|
|
377
|
+
it "should detect invalid encoding for '#{lit.to_s}'" do
|
378
|
+
lit.valid?.should be_false
|
379
|
+
end
|
380
|
+
end
|
381
|
+
end
|
382
|
+
end
|