rdf-n3 0.3.4.1 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/{History.md → History.markdown} +0 -0
- data/{README → README.markdown} +13 -8
- data/VERSION +1 -1
- data/lib/rdf/n3.rb +1 -1
- data/lib/rdf/n3/format.rb +0 -35
- data/lib/rdf/n3/patches/list.rb +36 -0
- data/lib/rdf/n3/reader.rb +11 -26
- data/lib/rdf/n3/writer.rb +21 -40
- metadata +51 -71
- data/.yardopts +0 -12
- data/README.md +0 -149
- data/Rakefile +0 -45
- data/example-files/arnau-registered-vocab.rb +0 -21
- data/example-files/arnau-stack-overflow.ttl +0 -12
- data/example-files/best-buy.nt +0 -4
- data/example-files/dwbutler-mj.n3 +0 -10
- data/example-files/dwbutler-mj.ttl +0 -8
- data/example-files/lee-reilly-list.rb +0 -40
- data/example-files/recipe.ttl +0 -33
- data/example-files/sp2b.n3 +0 -50177
- data/example.rb +0 -45
- data/lib/rdf/n3/patches/graph_properties.rb +0 -34
- data/lib/rdf/n3/reader/bnf-rules.n3 +0 -134
- data/lib/rdf/n3/reader/n3-selectors.n3 +0 -0
- data/lib/rdf/n3/reader/n3.n3 +0 -261
- data/rdf-n3.gemspec +0 -111
- data/script/build_meta +0 -249
- data/script/console +0 -10
- data/script/parse +0 -103
- data/script/tc +0 -53
- data/script/yard-to-rubyforge +0 -2
- data/spec/.gitignore +0 -1
- data/spec/cwm_spec.rb +0 -44
- data/spec/cwm_test.rb +0 -76
- data/spec/format_spec.rb +0 -41
- data/spec/matchers.rb +0 -130
- data/spec/reader_spec.rb +0 -1243
- data/spec/spec.opts +0 -1
- data/spec/spec_helper.rb +0 -86
- data/spec/swap_spec.rb +0 -78
- data/spec/swap_test.rb +0 -79
- data/spec/turtle_spec.rb +0 -66
- data/spec/turtle_test.rb +0 -98
- data/spec/writer_spec.rb +0 -399
data/script/tc
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby -s
|
2
|
-
require 'rubygems'
|
3
|
-
$:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "..", 'lib')))
|
4
|
-
require 'rdf/n3'
|
5
|
-
require File.expand_path(File.join(File.dirname(__FILE__), "..", 'spec', 'rdfa_helper'))
|
6
|
-
require 'getoptlong'
|
7
|
-
|
8
|
-
def run_tc(tc)
|
9
|
-
puts "run #{tc.name}"
|
10
|
-
puts RDF::Writer.for($output_format.to_sym).buffer { |writer|
|
11
|
-
RDF::N3::Reader.new(tc.input, :base_uri => tc.about, :strict => $strict).each do |statement|
|
12
|
-
writer << statement
|
13
|
-
end
|
14
|
-
}
|
15
|
-
end
|
16
|
-
|
17
|
-
$verbose = false
|
18
|
-
$output_format = :ntriples
|
19
|
-
$strict = false
|
20
|
-
suite = "turtle"
|
21
|
-
opts = GetoptLong.new(
|
22
|
-
["--debug", GetoptLong::NO_ARGUMENT],
|
23
|
-
["--verbose", GetoptLong::NO_ARGUMENT],
|
24
|
-
["--quiet", GetoptLong::NO_ARGUMENT],
|
25
|
-
["--suite", GetoptLong::OPTIONAL_ARGUMENT],
|
26
|
-
["--strict", GetoptLong::NO_ARGUMENT],
|
27
|
-
["--format", GetoptLong::REQUIRED_ARGUMENT]
|
28
|
-
)
|
29
|
-
opts.each do |opt, arg|
|
30
|
-
case opt
|
31
|
-
when '--verbose' then $verbose = true
|
32
|
-
when '--quiet' then $quiet = true
|
33
|
-
when '--debug' then ::RDF::N3::debug = true
|
34
|
-
when '--format' then $output_format = arg
|
35
|
-
when '--suite' then suite = arg
|
36
|
-
when '--strict' then $strict = true
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
# Test URI and directory for different suites
|
41
|
-
TEST_PARAMS = {
|
42
|
-
"rdfxml" => [RDFCORE_TEST, RDFCORE_DIR],
|
43
|
-
"cwm" => [CWM_TEST, SWAP_DIR],
|
44
|
-
"swap" => [SWAP_TEST, SWAP_DIR],
|
45
|
-
"turtle" => [TURTLE_TEST, TURTLE_DIR],
|
46
|
-
"turtlebad" => [TURTLE_BAD_TEST, TURTLE_DIR],
|
47
|
-
}
|
48
|
-
test_cases = RdfHelper::TestCase.test_cases(*TEST_PARAMS[suite])
|
49
|
-
|
50
|
-
test_cases = test_cases.detect do |tc|
|
51
|
-
next unless ARGV.empty? || ARGV.any? {|n| tc.name.match(/#{n}/)}
|
52
|
-
run_tc(tc)
|
53
|
-
end
|
data/script/yard-to-rubyforge
DELETED
data/spec/.gitignore
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
/uri-cache/
|
data/spec/cwm_spec.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
$:.unshift "."
|
2
|
-
require File.join(File.dirname(__FILE__), 'spec_helper')
|
3
|
-
|
4
|
-
describe RDF::N3::Reader do
|
5
|
-
describe "w3c cwm tests" do
|
6
|
-
require 'cwm_test'
|
7
|
-
|
8
|
-
# Negative parser tests should raise errors.
|
9
|
-
Fixtures::Cwm::CwmTest.each do |t|
|
10
|
-
next unless t.inputDocument
|
11
|
-
#next unless t.about.uri.to_s =~ /rdfms-rdf-names-use/
|
12
|
-
#next unless t.name =~ /1018/
|
13
|
-
#puts t.inspect
|
14
|
-
specify "test #{t.name}: #{t.description}: #{t.inputDocument} against #{t.referenceOutput}" do
|
15
|
-
begin
|
16
|
-
if t.name =~ /1018/
|
17
|
-
pending("matcher does not stop")
|
18
|
-
next
|
19
|
-
elsif !t.arguments.to_s.empty?
|
20
|
-
pending("proofs not supported")
|
21
|
-
next
|
22
|
-
end
|
23
|
-
t.run_test do
|
24
|
-
t.debug = []
|
25
|
-
g = RDF::Graph.new
|
26
|
-
RDF::Reader.for(t.inputDocument).new(t.input,
|
27
|
-
:base_uri => t.inputDocument,
|
28
|
-
:strict => true,
|
29
|
-
:debug => t.debug).each do |statement|
|
30
|
-
g << statement
|
31
|
-
end
|
32
|
-
g
|
33
|
-
end
|
34
|
-
rescue RSpec::Expectations::ExpectationNotMetError => e
|
35
|
-
if t.status == "pending"
|
36
|
-
pending("Formulae not supported") { raise }
|
37
|
-
else
|
38
|
-
raise
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
data/spec/cwm_test.rb
DELETED
@@ -1,76 +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 Cwm
|
9
|
-
class SWAP < RDF::Vocabulary("http://www.w3.org/2000/10/swap/test.n3#"); end
|
10
|
-
|
11
|
-
class CwmTest
|
12
|
-
attr_accessor :debug
|
13
|
-
attr_accessor :compare
|
14
|
-
include Spira::Resource
|
15
|
-
|
16
|
-
default_source :cwm
|
17
|
-
|
18
|
-
type SWAP.CwmTest
|
19
|
-
property :description, :predicate => SWAP.description, :type => XSD.string
|
20
|
-
property :referenceOutput, :predicate => SWAP.referenceOutput
|
21
|
-
property :arguments, :predicate => SWAP.arguments, :type => XSD.string
|
22
|
-
|
23
|
-
def inputDocument
|
24
|
-
self.arguments if self.arguments.match(/\w+[^\s]*.n3$/)
|
25
|
-
end
|
26
|
-
|
27
|
-
def name
|
28
|
-
subject.to_s.split("#").last
|
29
|
-
end
|
30
|
-
|
31
|
-
def input
|
32
|
-
Kernel.open(self.inputDocument)
|
33
|
-
end
|
34
|
-
|
35
|
-
def reference
|
36
|
-
self.referenceOutput ? Kernel.open(self.referenceOutput) : ""
|
37
|
-
end
|
38
|
-
|
39
|
-
def information; self.description; end
|
40
|
-
|
41
|
-
def inspect
|
42
|
-
"[#{self.class.to_s} " + %w(
|
43
|
-
subject
|
44
|
-
description
|
45
|
-
inputDocument
|
46
|
-
referenceOutput
|
47
|
-
).map {|a| v = self.send(a); "#{a}='#{v}'" if v}.compact.join(", ") +
|
48
|
-
"]"
|
49
|
-
end
|
50
|
-
|
51
|
-
# Run test case, yields input for parser to create triples
|
52
|
-
def run_test(options = {})
|
53
|
-
# Run
|
54
|
-
graph = yield
|
55
|
-
|
56
|
-
return unless self.outputDocument
|
57
|
-
|
58
|
-
case self.compare
|
59
|
-
when :none
|
60
|
-
# Don't check output, just parse to graph
|
61
|
-
when :array
|
62
|
-
@parser.graph.should be_equivalent_graph(self.output, self)
|
63
|
-
else
|
64
|
-
#puts "parse #{self.outputDocument} as #{RDF::Reader.for(self.outputDocument)}"
|
65
|
-
format = detect_format(self.reference)
|
66
|
-
output_graph = RDF::Graph.load(self.referenceOutput, :format => format, :base_uri => self.subject)
|
67
|
-
puts "result: #{CGI.escapeHTML(graph.to_ntriples)}" if ::RDF::N3::debug?
|
68
|
-
graph.should Matchers::be_equivalent_graph(output_graph, self)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
repo = RDF::Repository.load("http://www.w3.org/2000/10/swap/test/regression.n3", :format => :n3)
|
74
|
-
Spira.add_repository! :cwm, repo
|
75
|
-
end
|
76
|
-
end
|
data/spec/format_spec.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
$:.unshift "."
|
2
|
-
require File.join(File.dirname(__FILE__), 'spec_helper')
|
3
|
-
|
4
|
-
describe RDF::N3::Format do
|
5
|
-
context "discovery" do
|
6
|
-
{
|
7
|
-
"n3" => RDF::Format.for(:n3),
|
8
|
-
"etc/foaf.n3" => RDF::Format.for("etc/foaf.n3"),
|
9
|
-
"etc/foaf.ttl" => RDF::Format.for("etc/foaf.ttl"),
|
10
|
-
"foaf.n3" => RDF::Format.for(:file_name => "foaf.n3"),
|
11
|
-
"foaf.ttl" => RDF::Format.for(:file_name => "foaf.ttl"),
|
12
|
-
".n3" => RDF::Format.for(:file_extension => "n3"),
|
13
|
-
".ttl" => RDF::Format.for(:file_extension => "ttl"),
|
14
|
-
"text/n3" => RDF::Format.for(:content_type => "text/n3"),
|
15
|
-
"text/rdf+n3" => RDF::Format.for(:content_type => "text/rdf+n3"),
|
16
|
-
"application/rdf+n3" => RDF::Format.for(:content_type => "application/rdf+n3"),
|
17
|
-
"text/turtle" => RDF::Format.for(:content_type => "text/turtle"),
|
18
|
-
"application/turtle" => RDF::Format.for(:content_type => "application/turtle"),
|
19
|
-
"application/x-turtle" => RDF::Format.for(:content_type => "application/x-turtle"),
|
20
|
-
}.each_pair do |label, format|
|
21
|
-
it "should discover '#{label}'" do
|
22
|
-
format.should == RDF::N3::Format
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should discover 'notation3'" do
|
27
|
-
RDF::Format.for(:notation3).reader.should == RDF::N3::Reader
|
28
|
-
RDF::Format.for(:notation3).writer.should == RDF::N3::Writer
|
29
|
-
end
|
30
|
-
|
31
|
-
it "should discover 'turtle'" do
|
32
|
-
RDF::Format.for(:turtle).reader.should == RDF::N3::Reader
|
33
|
-
RDF::Format.for(:turtle).writer.should == RDF::N3::Writer
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should discover 'ttl'" do
|
37
|
-
RDF::Format.for(:ttl).reader.should == RDF::N3::Reader
|
38
|
-
RDF::Format.for(:ttl).writer.should == RDF::N3::Writer
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
data/spec/matchers.rb
DELETED
@@ -1,130 +0,0 @@
|
|
1
|
-
require 'rdf/isomorphic'
|
2
|
-
|
3
|
-
module Matchers
|
4
|
-
class BeEquivalentGraph
|
5
|
-
Info = Struct.new(:about, :information, :trace, :compare, :inputDocument, :outputDocument)
|
6
|
-
def normalize(graph)
|
7
|
-
case @info.compare
|
8
|
-
when :array
|
9
|
-
array = case graph
|
10
|
-
when RDF::Graph
|
11
|
-
raise ":compare => :array used with Graph"
|
12
|
-
when Array
|
13
|
-
graph.sort
|
14
|
-
else
|
15
|
-
graph.to_s.split("\n").
|
16
|
-
map {|t| t.gsub(/^\s*(.*)\s*$/, '\1')}.
|
17
|
-
reject {|t2| t2.match(/^\s*$/)}.
|
18
|
-
compact.
|
19
|
-
sort.
|
20
|
-
uniq
|
21
|
-
end
|
22
|
-
|
23
|
-
# Implement to_ntriples on array, to simplify logic later
|
24
|
-
def array.to_ntriples; self.join("\n") + "\n"; end
|
25
|
-
array
|
26
|
-
else
|
27
|
-
case graph
|
28
|
-
when RDF::Graph then graph
|
29
|
-
when IO, StringIO
|
30
|
-
RDF::Graph.new.load(graph, :base_uri => @info.about)
|
31
|
-
else
|
32
|
-
# Figure out which parser to use
|
33
|
-
g = RDF::Graph.new
|
34
|
-
reader_class = RDF::Reader.for(detect_format(graph))
|
35
|
-
reader_class.new(graph, :base_uri => @info.about).each {|s| g << s}
|
36
|
-
g
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def initialize(expected, info)
|
42
|
-
@info = if info.respond_to?(:about)
|
43
|
-
info
|
44
|
-
elsif info.is_a?(Hash)
|
45
|
-
identifier = info[:identifier] || expected.is_a?(RDF::Graph) ? expected.context : info[:about]
|
46
|
-
trace = info[:trace]
|
47
|
-
trace = trace.join("\n") if trace.is_a?(Array)
|
48
|
-
Info.new(identifier, info[:information] || "", trace, info[:compare])
|
49
|
-
else
|
50
|
-
Info.new(expected.is_a?(RDF::Graph) ? expected.context : info, info.to_s)
|
51
|
-
end
|
52
|
-
@expected = normalize(expected)
|
53
|
-
end
|
54
|
-
|
55
|
-
def matches?(actual)
|
56
|
-
@actual = normalize(actual)
|
57
|
-
if @info.compare == :array
|
58
|
-
@actual == @expected
|
59
|
-
else
|
60
|
-
@actual.isomorphic_with?(@expected)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def failure_message_for_should
|
65
|
-
info = @info.respond_to?(:information) ? @info.information : @info.inspect
|
66
|
-
if @expected.is_a?(RDF::Graph) && @actual.size != @expected.size
|
67
|
-
"Graph entry count differs:\nexpected: #{@expected.size}\nactual: #{@actual.size}"
|
68
|
-
elsif @expected.is_a?(Array) && @actual.size != @expected.length
|
69
|
-
"Graph entry count differs:\nexpected: #{@expected.length}\nactual: #{@actual.size}"
|
70
|
-
else
|
71
|
-
"Graph differs"
|
72
|
-
end +
|
73
|
-
"\n#{info + "\n" unless info.empty?}" +
|
74
|
-
(@info.inputDocument ? "Input file: #{@info.inputDocument}\n" : "") +
|
75
|
-
(@info.outputDocument ? "Output file: #{@info.outputDocument}\n" : "") +
|
76
|
-
"Unsorted Expected:\n#{@expected.to_ntriples}" +
|
77
|
-
"Unsorted Results:\n#{@actual.to_ntriples}" +
|
78
|
-
# "Unsorted Expected Dump:\n#{@expected.dump}\n" +
|
79
|
-
# "Unsorted Results Dump:\n#{@actual.dump}" +
|
80
|
-
(@info.trace ? "\nDebug:\n#{@info.trace}" : "")
|
81
|
-
end
|
82
|
-
def negative_failure_message
|
83
|
-
"Graphs do not differ\n"
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def be_equivalent_graph(expected, info = nil)
|
88
|
-
BeEquivalentGraph.new(expected, info)
|
89
|
-
end
|
90
|
-
|
91
|
-
class MatchRE
|
92
|
-
Info = Struct.new(:about, :information, :trace, :inputDocument, :outputDocument)
|
93
|
-
def initialize(expected, info)
|
94
|
-
@info = if info.respond_to?(:about)
|
95
|
-
info
|
96
|
-
elsif info.is_a?(Hash)
|
97
|
-
identifier = info[:identifier] || info[:about]
|
98
|
-
trace = info[:trace]
|
99
|
-
trace = trace.join("\n") if trace.is_a?(Array)
|
100
|
-
Info.new(identifier, info[:information] || "", trace, info[:inputDocument], info[:outputDocument])
|
101
|
-
else
|
102
|
-
Info.new(info, info.to_s)
|
103
|
-
end
|
104
|
-
@expected = expected
|
105
|
-
end
|
106
|
-
|
107
|
-
def matches?(actual)
|
108
|
-
@actual = actual
|
109
|
-
@actual.to_s.match(@expected)
|
110
|
-
end
|
111
|
-
|
112
|
-
def failure_message_for_should
|
113
|
-
info = @info.respond_to?(:information) ? @info.information : @info.inspect
|
114
|
-
"Match failed"
|
115
|
-
"\n#{info + "\n" unless info.empty?}" +
|
116
|
-
(@info.inputDocument ? "Input file: #{@info.inputDocument}\n" : "") +
|
117
|
-
(@info.outputDocument ? "Output file: #{@info.outputDocument}\n" : "") +
|
118
|
-
"Expression: #{@expected}\n" +
|
119
|
-
"Unsorted Results:\n#{@actual}" +
|
120
|
-
(@info.trace ? "\nDebug:\n#{@info.trace}" : "")
|
121
|
-
end
|
122
|
-
def negative_failure_message
|
123
|
-
"Match succeeded\n"
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
def match_re(expected, info = nil)
|
128
|
-
MatchRE.new(expected, info)
|
129
|
-
end
|
130
|
-
end
|
data/spec/reader_spec.rb
DELETED
@@ -1,1243 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
$:.unshift "."
|
3
|
-
require File.join(File.dirname(__FILE__), 'spec_helper')
|
4
|
-
|
5
|
-
describe "RDF::N3::Reader" do
|
6
|
-
context "discovery" do
|
7
|
-
{
|
8
|
-
"n3" => RDF::Reader.for(:n3),
|
9
|
-
"etc/foaf.n3" => RDF::Reader.for("etc/foaf.n3"),
|
10
|
-
"etc/foaf.ttl" => RDF::Reader.for("etc/foaf.ttl"),
|
11
|
-
"foaf.n3" => RDF::Reader.for(:file_name => "foaf.n3"),
|
12
|
-
"foaf.ttl" => RDF::Reader.for(:file_name => "foaf.ttl"),
|
13
|
-
".n3" => RDF::Reader.for(:file_extension => "n3"),
|
14
|
-
".ttl" => RDF::Reader.for(:file_extension => "ttl"),
|
15
|
-
"text/n3" => RDF::Reader.for(:content_type => "text/n3"),
|
16
|
-
"text/turtle" => RDF::Reader.for(:content_type => "text/turtle"),
|
17
|
-
}.each_pair do |label, format|
|
18
|
-
it "should discover '#{label}'" do
|
19
|
-
format.should == RDF::N3::Reader
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
context :interface do
|
25
|
-
before(:each) do
|
26
|
-
@sampledoc = <<-EOF;
|
27
|
-
@prefix dc: <http://purl.org/dc/elements/1.1/>.
|
28
|
-
@prefix po: <http://purl.org/ontology/po/>.
|
29
|
-
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
|
30
|
-
_:broadcast
|
31
|
-
a po:Broadcast;
|
32
|
-
po:schedule_date """2008-06-24T12:00:00Z""";
|
33
|
-
po:broadcast_of _:version;
|
34
|
-
po:broadcast_on <http://www.bbc.co.uk/programmes/service/6music>;
|
35
|
-
.
|
36
|
-
_:version
|
37
|
-
a po:Version;
|
38
|
-
.
|
39
|
-
<http://www.bbc.co.uk/programmes/b0072l93>
|
40
|
-
dc:title """Nemone""";
|
41
|
-
a po:Brand;
|
42
|
-
.
|
43
|
-
<http://www.bbc.co.uk/programmes/b00c735d>
|
44
|
-
a po:Episode;
|
45
|
-
po:episode <http://www.bbc.co.uk/programmes/b0072l93>;
|
46
|
-
po:version _:version;
|
47
|
-
po:long_synopsis """Actor and comedian Rhys Darby chats to Nemone.""";
|
48
|
-
dc:title """Nemone""";
|
49
|
-
po:synopsis """Actor and comedian Rhys Darby chats to Nemone.""";
|
50
|
-
.
|
51
|
-
<http://www.bbc.co.uk/programmes/service/6music>
|
52
|
-
a po:Service;
|
53
|
-
dc:title """BBC 6 Music""";
|
54
|
-
.
|
55
|
-
|
56
|
-
#_:abcd a po:Episode.
|
57
|
-
EOF
|
58
|
-
end
|
59
|
-
|
60
|
-
it "should yield reader" do
|
61
|
-
inner = mock("inner")
|
62
|
-
inner.should_receive(:called).with(RDF::N3::Reader)
|
63
|
-
RDF::N3::Reader.new(@sampledoc) do |reader|
|
64
|
-
inner.called(reader.class)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
it "should return reader" do
|
69
|
-
RDF::N3::Reader.new(@sampledoc).should be_a(RDF::N3::Reader)
|
70
|
-
end
|
71
|
-
|
72
|
-
it "should yield statements" do
|
73
|
-
inner = mock("inner")
|
74
|
-
inner.should_receive(:called).with(RDF::Statement).exactly(15)
|
75
|
-
RDF::N3::Reader.new(@sampledoc).each_statement do |statement|
|
76
|
-
inner.called(statement.class)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
it "should yield triples" do
|
81
|
-
inner = mock("inner")
|
82
|
-
inner.should_receive(:called).exactly(15)
|
83
|
-
RDF::N3::Reader.new(@sampledoc).each_triple do |subject, predicate, object|
|
84
|
-
inner.called(subject.class, predicate.class, object.class)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
describe "with simple ntriples" do
|
90
|
-
context "simple triple" do
|
91
|
-
before(:each) do
|
92
|
-
n3_string = %(<http://example.org/> <http://xmlns.com/foaf/0.1/name> "Gregg Kellogg" .)
|
93
|
-
@graph = parse(n3_string)
|
94
|
-
@statement = @graph.statements.first
|
95
|
-
end
|
96
|
-
|
97
|
-
it "should have a single triple" do
|
98
|
-
@graph.size.should == 1
|
99
|
-
end
|
100
|
-
|
101
|
-
it "should have subject" do
|
102
|
-
@statement.subject.to_s.should == "http://example.org/"
|
103
|
-
end
|
104
|
-
it "should have predicate" do
|
105
|
-
@statement.predicate.to_s.should == "http://xmlns.com/foaf/0.1/name"
|
106
|
-
end
|
107
|
-
it "should have object" do
|
108
|
-
@statement.object.to_s.should == "Gregg Kellogg"
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
# NTriple tests from http://www.w3.org/2000/10/rdf-tests/rdfcore/ntriples/test.nt
|
113
|
-
describe "with blank lines" do
|
114
|
-
{
|
115
|
-
"comment" => "# comment lines",
|
116
|
-
"comment after whitespace" => " # comment after whitespace",
|
117
|
-
"empty line" => "",
|
118
|
-
"line with spaces" => " "
|
119
|
-
}.each_pair do |name, statement|
|
120
|
-
specify "test #{name}" do
|
121
|
-
parse(statement).size.should == 0
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
describe "with literal encodings" do
|
127
|
-
{
|
128
|
-
'Dürst' => ':a :b "D\u00FCrst" .',
|
129
|
-
'simple literal' => ':a :b "simple literal" .',
|
130
|
-
'backslash:\\' => ':a :b "backslash:\\\\" .',
|
131
|
-
'dquote:"' => ':a :b "dquote:\"" .',
|
132
|
-
"newline:\n" => ':a :b "newline:\n" .',
|
133
|
-
"return\r" => ':a :b "return\r" .',
|
134
|
-
"tab:\t" => ':a :b "tab:\t" .',
|
135
|
-
"é" => ':a :b "\u00E9" .',
|
136
|
-
"€" => ':a :b "\u20AC" .',
|
137
|
-
"resumé" => ':a :resume "resum\u00E9" .',
|
138
|
-
}.each_pair do |contents, triple|
|
139
|
-
specify "test #{triple}" do
|
140
|
-
graph = parse(triple, :base_uri => "http://a/b")
|
141
|
-
statement = graph.statements.first
|
142
|
-
graph.size.should == 1
|
143
|
-
statement.object.value.should == contents
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
{
|
148
|
-
'Dürst' => ':a :b "Dürst" .',
|
149
|
-
"é" => ':a :b "é" .',
|
150
|
-
"€" => ':a :b "€" .',
|
151
|
-
"resumé" => ':a :resume "resumé" .',
|
152
|
-
}.each_pair do |contents, triple|
|
153
|
-
specify "test #{triple}" do
|
154
|
-
graph = parse(triple, :base_uri => "http://a/b")
|
155
|
-
statement = graph.statements.first
|
156
|
-
graph.size.should == 1
|
157
|
-
statement.object.value.should == contents
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
it "should parse long literal with escape" do
|
162
|
-
n3 = %(@prefix : <http://example.org/foo#> . :a :b "\\U00015678another" .)
|
163
|
-
if defined?(::Encoding)
|
164
|
-
statement = parse(n3).statements.first
|
165
|
-
statement.object.value.should == "\u{15678}another"
|
166
|
-
else
|
167
|
-
pending("Not supported in Ruby 1.8")
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
context "string3 literals" do
|
172
|
-
{
|
173
|
-
"simple" => %q(foo),
|
174
|
-
"muti-line" => %q(
|
175
|
-
Foo
|
176
|
-
<html:b xmlns:html="http://www.w3.org/1999/xhtml" html:a="b">
|
177
|
-
bar
|
178
|
-
<rdf:Thing xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
179
|
-
<a:b xmlns:a="foo:"></a:b>
|
180
|
-
here
|
181
|
-
<a:c xmlns:a="foo:"></a:c>
|
182
|
-
</rd
|
183
|
-
f:Thing>
|
184
|
-
</html:b>
|
185
|
-
baz
|
186
|
-
<html:i xmlns:html="http://www.w3.org/1999/xhtml">more</html:i>
|
187
|
-
),
|
188
|
-
"trailing escaped double-quote" => %q( "),
|
189
|
-
"regression.n3" => %q(sameDan.n3 sameThing.n3 --think --apply=forgetDups.n3 --purge --n3="/" )
|
190
|
-
}.each do |test, string|
|
191
|
-
it "parses #{test}" do
|
192
|
-
graph = parse(%(:a :b """#{string}"""))
|
193
|
-
graph.size.should == 1
|
194
|
-
graph.statements.first.object.value.should == string
|
195
|
-
end
|
196
|
-
end
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
it "should create named subject bnode" do
|
201
|
-
graph = parse("_:anon <http://example.org/property> <http://example.org/resource2> .")
|
202
|
-
graph.size.should == 1
|
203
|
-
statement = graph.statements.first
|
204
|
-
statement.subject.should be_a(RDF::Node)
|
205
|
-
statement.subject.id.should =~ /anon/
|
206
|
-
statement.predicate.to_s.should == "http://example.org/property"
|
207
|
-
statement.object.to_s.should == "http://example.org/resource2"
|
208
|
-
end
|
209
|
-
|
210
|
-
it "should create named predicate bnode" do
|
211
|
-
graph = parse("<http://example.org/resource2> _:anon <http://example.org/object> .")
|
212
|
-
graph.size.should == 1
|
213
|
-
statement = graph.statements.first
|
214
|
-
statement.subject.to_s.should == "http://example.org/resource2"
|
215
|
-
statement.predicate.should be_a(RDF::Node)
|
216
|
-
statement.predicate.id.should =~ /anon/
|
217
|
-
statement.object.to_s.should == "http://example.org/object"
|
218
|
-
end
|
219
|
-
|
220
|
-
it "should create named object bnode" do
|
221
|
-
graph = parse("<http://example.org/resource2> <http://example.org/property> _:anon .")
|
222
|
-
graph.size.should == 1
|
223
|
-
statement = graph.statements.first
|
224
|
-
statement.subject.to_s.should == "http://example.org/resource2"
|
225
|
-
statement.predicate.to_s.should == "http://example.org/property"
|
226
|
-
statement.object.should be_a(RDF::Node)
|
227
|
-
statement.object.id.should =~ /anon/
|
228
|
-
end
|
229
|
-
|
230
|
-
{
|
231
|
-
"three uris" => "<http://example.org/resource1> <http://example.org/property> <http://example.org/resource2> .",
|
232
|
-
"spaces and tabs throughout" => " <http://example.org/resource3> <http://example.org/property> <http://example.org/resource2> . ",
|
233
|
-
"line ending with CR NL" => "<http://example.org/resource4> <http://example.org/property> <http://example.org/resource2> .\r\n",
|
234
|
-
"literal escapes (1)" => '<http://example.org/resource7> <http://example.org/property> "simple literal" .',
|
235
|
-
"literal escapes (2)" => '<http://example.org/resource8> <http://example.org/property> "backslash:\\\\" .',
|
236
|
-
"literal escapes (3)" => '<http://example.org/resource9> <http://example.org/property> "dquote:\"" .',
|
237
|
-
"literal escapes (4)" => '<http://example.org/resource10> <http://example.org/property> "newline:\n" .',
|
238
|
-
"literal escapes (5)" => '<http://example.org/resource11> <http://example.org/property> "return:\r" .',
|
239
|
-
"literal escapes (6)" => '<http://example.org/resource12> <http://example.org/property> "tab:\t" .',
|
240
|
-
"Space is optional before final . (1)" => ['<http://example.org/resource13> <http://example.org/property> <http://example.org/resource2>.', '<http://example.org/resource13> <http://example.org/property> <http://example.org/resource2> .'],
|
241
|
-
"Space is optional before final . (2)" => ['<http://example.org/resource14> <http://example.org/property> "x".', '<http://example.org/resource14> <http://example.org/property> "x" .'],
|
242
|
-
|
243
|
-
"XML Literals as Datatyped Literals (1)" => '<http://example.org/resource21> <http://example.org/property> ""^^<http://www.w3.org/2000/01/rdf-schema#XMLLiteral> .',
|
244
|
-
"XML Literals as Datatyped Literals (2)" => '<http://example.org/resource22> <http://example.org/property> " "^^<http://www.w3.org/2000/01/rdf-schema#XMLLiteral> .',
|
245
|
-
"XML Literals as Datatyped Literals (3)" => '<http://example.org/resource23> <http://example.org/property> "x"^^<http://www.w3.org/2000/01/rdf-schema#XMLLiteral> .',
|
246
|
-
"XML Literals as Datatyped Literals (4)" => '<http://example.org/resource23> <http://example.org/property> "\""^^<http://www.w3.org/2000/01/rdf-schema#XMLLiteral> .',
|
247
|
-
"XML Literals as Datatyped Literals (5)" => '<http://example.org/resource24> <http://example.org/property> "<a></a>"^^<http://www.w3.org/2000/01/rdf-schema#XMLLiteral> .',
|
248
|
-
"XML Literals as Datatyped Literals (6)" => '<http://example.org/resource25> <http://example.org/property> "a <b></b>"^^<http://www.w3.org/2000/01/rdf-schema#XMLLiteral> .',
|
249
|
-
"XML Literals as Datatyped Literals (7)" => '<http://example.org/resource26> <http://example.org/property> "a <b></b> c"^^<http://www.w3.org/2000/01/rdf-schema#XMLLiteral> .',
|
250
|
-
"XML Literals as Datatyped Literals (8)" => '<http://example.org/resource26> <http://example.org/property> "a\n<b></b>\nc"^^<http://www.w3.org/2000/01/rdf-schema#XMLLiteral> .',
|
251
|
-
"XML Literals as Datatyped Literals (9)" => '<http://example.org/resource27> <http://example.org/property> "chat"^^<http://www.w3.org/2000/01/rdf-schema#XMLLiteral> .',
|
252
|
-
|
253
|
-
"Plain literals with languages (1)" => '<http://example.org/resource30> <http://example.org/property> "chat"@fr .',
|
254
|
-
"Plain literals with languages (2)" => '<http://example.org/resource31> <http://example.org/property> "chat"@en .',
|
255
|
-
|
256
|
-
"Typed Literals" => '<http://example.org/resource32> <http://example.org/property> "abc"^^<http://example.org/datatype1> .',
|
257
|
-
}.each_pair do |name, statement|
|
258
|
-
specify "test #{name}" do
|
259
|
-
graph = parse([statement].flatten.first)
|
260
|
-
graph.size.should == 1
|
261
|
-
graph.to_ntriples.chomp.should == [statement].flatten.last.gsub(/\s+/, " ").strip
|
262
|
-
end
|
263
|
-
end
|
264
|
-
|
265
|
-
it "should allow mixed-case language" do
|
266
|
-
n3doc = %(:x2 :p "xyz"@EN .)
|
267
|
-
statement = parse(n3doc).statements.first
|
268
|
-
statement.object.to_ntriples.should == %("xyz"@EN)
|
269
|
-
end
|
270
|
-
|
271
|
-
it "should create typed literals" do
|
272
|
-
n3doc = "<http://example.org/joe> <http://xmlns.com/foaf/0.1/name> \"Joe\"^^<http://www.w3.org/2001/XMLSchema#string> ."
|
273
|
-
statement = parse(n3doc).statements.first
|
274
|
-
statement.object.class.should == RDF::Literal
|
275
|
-
end
|
276
|
-
|
277
|
-
it "should create BNodes" do
|
278
|
-
n3doc = "_:a a _:c ."
|
279
|
-
statement = parse(n3doc).statements.first
|
280
|
-
statement.subject.class.should == RDF::Node
|
281
|
-
statement.object.class.should == RDF::Node
|
282
|
-
end
|
283
|
-
|
284
|
-
describe "should create URIs" do
|
285
|
-
{
|
286
|
-
%(<http://example.org/joe> <http://xmlns.com/foaf/0.1/knows> <http://example.org/jane> .) => %(<http://example.org/joe> <http://xmlns.com/foaf/0.1/knows> <http://example.org/jane> .),
|
287
|
-
%(<joe> <knows> <jane> .) => %(<http://a/joe> <http://a/knows> <http://a/jane> .),
|
288
|
-
%(:joe :knows :jane .) => %(<http://a/b#joe> <http://a/b#knows> <http://a/b#jane> .),
|
289
|
-
%(<#D%C3%BCrst> a "URI percent ^encoded as C3, BC".) => %(<http://a/b#D%C3%BCrst> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> "URI percent ^encoded as C3, BC" .),
|
290
|
-
}.each_pair do |n3, nt|
|
291
|
-
it "for '#{n3}'" do
|
292
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
293
|
-
end
|
294
|
-
end
|
295
|
-
|
296
|
-
{
|
297
|
-
%(<#Dürst> :knows :jane.) => '<http://a/b#D\u00FCrst> <http://a/b#knows> <http://a/b#jane> .',
|
298
|
-
%(:Dürst :knows :jane.) => '<http://a/b#D\u00FCrst> <http://a/b#knows> <http://a/b#jane> .',
|
299
|
-
%(:bob :resumé "Bob's non-normalized resumé".) => '<http://a/b#bob> <http://a/b#resumé> "Bob\'s non-normalized resumé" .',
|
300
|
-
%(:alice :resumé "Alice's normalized resumé".) => '<http://a/b#alice> <http://a/b#resumé> "Alice\'s normalized resumé" .',
|
301
|
-
}.each_pair do |n3, nt|
|
302
|
-
it "for '#{n3}'" do
|
303
|
-
begin
|
304
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
305
|
-
rescue
|
306
|
-
if defined?(::Encoding)
|
307
|
-
raise
|
308
|
-
else
|
309
|
-
pending("Unicode URIs not supported in Ruby 1.8") { raise }
|
310
|
-
end
|
311
|
-
end
|
312
|
-
end
|
313
|
-
end
|
314
|
-
|
315
|
-
{
|
316
|
-
%(<#Dürst> a "URI straight in UTF8".) => %(<http://a/b#D\\u00FCrst> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> "URI straight in UTF8" .),
|
317
|
-
#%(:a :related :ひらがな .) => %(<http://a/b#a> <http://a/b#related> <http://a/b#\\u3072\\u3089\\u304C\\u306A> .),
|
318
|
-
}.each_pair do |n3, nt|
|
319
|
-
it "for '#{n3}'" do
|
320
|
-
begin
|
321
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
322
|
-
rescue
|
323
|
-
if defined?(::Encoding)
|
324
|
-
raise
|
325
|
-
else
|
326
|
-
pending("Unicode URIs not supported in Ruby 1.8") { raise }
|
327
|
-
end
|
328
|
-
end
|
329
|
-
end
|
330
|
-
end
|
331
|
-
end
|
332
|
-
|
333
|
-
it "should create URIs" do
|
334
|
-
n3doc = "<http://example.org/joe> <http://xmlns.com/foaf/0.1/knows> <http://example.org/jane> ."
|
335
|
-
statement = parse(n3doc).statements.first
|
336
|
-
statement.subject.class.should == RDF::URI
|
337
|
-
statement.object.class.should == RDF::URI
|
338
|
-
end
|
339
|
-
|
340
|
-
it "should create literals" do
|
341
|
-
n3doc = "<http://example.org/joe> <http://xmlns.com/foaf/0.1/name> \"Joe\"."
|
342
|
-
statement = parse(n3doc).statements.first
|
343
|
-
statement.object.class.should == RDF::Literal
|
344
|
-
end
|
345
|
-
end
|
346
|
-
|
347
|
-
describe "with n3 grammar" do
|
348
|
-
describe "syntactic expressions" do
|
349
|
-
it "should create typed literals with qname" do
|
350
|
-
n3doc = %(
|
351
|
-
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
352
|
-
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
|
353
|
-
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
|
354
|
-
<http://example.org/joe> foaf:name \"Joe\"^^xsd:string .
|
355
|
-
)
|
356
|
-
statement = parse(n3doc).statements.first
|
357
|
-
statement.object.class.should == RDF::Literal
|
358
|
-
end
|
359
|
-
|
360
|
-
it "should use <> as a prefix and as a triple node" do
|
361
|
-
n3 = %(@prefix : <> . <> a :a.)
|
362
|
-
nt = %(
|
363
|
-
<http://a/b> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://a/ba> .
|
364
|
-
)
|
365
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
366
|
-
end
|
367
|
-
|
368
|
-
it "should use <#> as a prefix and as a triple node" do
|
369
|
-
n3 = %(@prefix : <#> . <#> a :a.)
|
370
|
-
nt = %(
|
371
|
-
<http://a/b#> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://a/b#a> .
|
372
|
-
)
|
373
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
374
|
-
end
|
375
|
-
|
376
|
-
it "should generate rdf:type for 'a'" do
|
377
|
-
n3 = %(@prefix a: <http://foo/a#> . a:b a <http://www.w3.org/2000/01/rdf-schema#resource> .)
|
378
|
-
nt = %(<http://foo/a#b> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#resource> .)
|
379
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
380
|
-
end
|
381
|
-
|
382
|
-
it "should generate rdf:type for '@a'" do
|
383
|
-
n3 = %(@prefix a: <http://foo/a#> . a:b @a <http://www.w3.org/2000/01/rdf-schema#resource> .)
|
384
|
-
nt = %(<http://foo/a#b> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#resource> .)
|
385
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
386
|
-
end
|
387
|
-
|
388
|
-
it "should generate inverse predicate for 'is xxx of'" do
|
389
|
-
n3 = %("value" is :prop of :b . :b :prop "value" .)
|
390
|
-
nt = %(<http://a/b#b> <http://a/b#prop> "value" .)
|
391
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
392
|
-
end
|
393
|
-
|
394
|
-
it "should generate inverse predicate for '@is xxx @of'" do
|
395
|
-
n3 = %("value" @is :prop @of :b . :b :prop "value" .)
|
396
|
-
nt = %(<http://a/b#b> <http://a/b#prop> "value" .)
|
397
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
398
|
-
end
|
399
|
-
|
400
|
-
it "should generate inverse predicate for 'is xxx of' with object list" do
|
401
|
-
n3 = %("value" is :prop of :b, :c . )
|
402
|
-
nt = %(
|
403
|
-
<http://a/b#b> <http://a/b#prop> "value" .
|
404
|
-
<http://a/b#c> <http://a/b#prop> "value" .
|
405
|
-
)
|
406
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
407
|
-
end
|
408
|
-
|
409
|
-
it "should generate predicate for 'has xxx'" do
|
410
|
-
n3 = %(@prefix a: <http://foo/a#> . a:b has :pred a:c .)
|
411
|
-
nt = %(<http://foo/a#b> <http://a/b#pred> <http://foo/a#c> .)
|
412
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
413
|
-
end
|
414
|
-
|
415
|
-
it "should generate predicate for '@has xxx'" do
|
416
|
-
n3 = %(@prefix a: <http://foo/a#> . a:b @has :pred a:c .)
|
417
|
-
nt = %(<http://foo/a#b> <http://a/b#pred> <http://foo/a#c> .)
|
418
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
419
|
-
end
|
420
|
-
|
421
|
-
it "should create log:implies predicate for '=>'" do
|
422
|
-
n3 = %(@prefix a: <http://foo/a#> . _:a => a:something .)
|
423
|
-
nt = %(_:a <http://www.w3.org/2000/10/swap/log#implies> <http://foo/a#something> .)
|
424
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
425
|
-
end
|
426
|
-
|
427
|
-
it "should create log:implies inverse predicate for '<='" do
|
428
|
-
n3 = %(@prefix a: <http://foo/a#> . _:a <= a:something .)
|
429
|
-
nt = %(<http://foo/a#something> <http://www.w3.org/2000/10/swap/log#implies> _:a .)
|
430
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
431
|
-
end
|
432
|
-
|
433
|
-
it "should create owl:sameAs predicate for '='" do
|
434
|
-
n3 = %(@prefix a: <http://foo/a#> . _:a = a:something .)
|
435
|
-
nt = %(_:a <http://www.w3.org/2002/07/owl#sameAs> <http://foo/a#something> .)
|
436
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
437
|
-
end
|
438
|
-
|
439
|
-
{
|
440
|
-
%(:a :b @true) => %(<http://a/b#a> <http://a/b#b> "true"^^<http://www.w3.org/2001/XMLSchema#boolean> .),
|
441
|
-
%(:a :b @false) => %(<http://a/b#a> <http://a/b#b> "false"^^<http://www.w3.org/2001/XMLSchema#boolean> .),
|
442
|
-
%(:a :b 1) => %(<http://a/b#a> <http://a/b#b> "1"^^<http://www.w3.org/2001/XMLSchema#integer> .),
|
443
|
-
%(:a :b -1) => %(<http://a/b#a> <http://a/b#b> "-1"^^<http://www.w3.org/2001/XMLSchema#integer> .),
|
444
|
-
%(:a :b +1) => %(<http://a/b#a> <http://a/b#b> "+1"^^<http://www.w3.org/2001/XMLSchema#integer> .),
|
445
|
-
%(:a :b 1.0) => %(<http://a/b#a> <http://a/b#b> "1.0"^^<http://www.w3.org/2001/XMLSchema#decimal> .),
|
446
|
-
%(:a :b 1.0e1) => %(<http://a/b#a> <http://a/b#b> "1.0e1"^^<http://www.w3.org/2001/XMLSchema#double> .),
|
447
|
-
%(:a :b 1.0e-1) => %(<http://a/b#a> <http://a/b#b> "1.0e-1"^^<http://www.w3.org/2001/XMLSchema#double> .),
|
448
|
-
%(:a :b 1.0e+1) => %(<http://a/b#a> <http://a/b#b> "1.0e+1"^^<http://www.w3.org/2001/XMLSchema#double> .),
|
449
|
-
%(:a :b 1.0E1) => %(<http://a/b#a> <http://a/b#b> "1.0e1"^^<http://www.w3.org/2001/XMLSchema#double> .),
|
450
|
-
}.each_pair do |n3, nt|
|
451
|
-
it "should create typed literal for '#{n3}'" do
|
452
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
453
|
-
end
|
454
|
-
end
|
455
|
-
|
456
|
-
it "should accept empty localname" do
|
457
|
-
n3 = %(: : : .)
|
458
|
-
nt = %(<http://a/b#> <http://a/b#> <http://a/b#> .)
|
459
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
460
|
-
end
|
461
|
-
|
462
|
-
it "should accept prefix with empty local name" do
|
463
|
-
n3 = %(@prefix foo: <http://foo/bar#> . foo: foo: foo: .)
|
464
|
-
nt = %(<http://foo/bar#> <http://foo/bar#> <http://foo/bar#> .)
|
465
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
466
|
-
end
|
467
|
-
|
468
|
-
it "substitutes variable for URI with @forAll" do
|
469
|
-
n3 = %(@forAll :x . :x :y :z .)
|
470
|
-
g = parse(n3, :base_uri => "http://a/b")
|
471
|
-
statement = g.statements.first
|
472
|
-
statement.subject.should be_a(RDF::Query::Variable)
|
473
|
-
statement.predicate.to_s.should == "http://a/b#y"
|
474
|
-
statement.object.to_s.should == "http://a/b#z"
|
475
|
-
end
|
476
|
-
|
477
|
-
it "substitutes variable for URIs with @forAll" do
|
478
|
-
n3 = %(@forAll :x, :y, :z . :x :y :z .)
|
479
|
-
g = parse(n3, :base_uri => "http://a/b")
|
480
|
-
statement = g.statements.first
|
481
|
-
statement.subject.should be_a(RDF::Query::Variable)
|
482
|
-
statement.predicate.should be_a(RDF::Query::Variable)
|
483
|
-
statement.object.should be_a(RDF::Query::Variable)
|
484
|
-
statement.subject.should_not equal statement.predicate
|
485
|
-
statement.object.should_not equal statement.predicate
|
486
|
-
statement.predicate.should_not equal statement.object
|
487
|
-
end
|
488
|
-
|
489
|
-
it "substitutes node for URI with @forEach" do
|
490
|
-
n3 = %(@forSome :x . :x :y :z .)
|
491
|
-
g = parse(n3, :base_uri => "http://a/b")
|
492
|
-
statement = g.statements.first
|
493
|
-
statement.subject.should be_a(RDF::Node)
|
494
|
-
statement.predicate.to_s.should == "http://a/b#y"
|
495
|
-
statement.object.to_s.should == "http://a/b#z"
|
496
|
-
end
|
497
|
-
|
498
|
-
it "substitutes node for URIs with @forEach" do
|
499
|
-
n3 = %(@forSome :x, :y, :z . :x :y :z .)
|
500
|
-
g = parse(n3, :base_uri => "http://a/b")
|
501
|
-
statement = g.statements.first
|
502
|
-
statement.subject.should be_a(RDF::Node)
|
503
|
-
statement.predicate.should be_a(RDF::Node)
|
504
|
-
statement.object.should be_a(RDF::Node)
|
505
|
-
statement.subject.should_not == statement.predicate
|
506
|
-
statement.object.should_not == statement.predicate
|
507
|
-
statement.predicate.should_not == statement.object
|
508
|
-
end
|
509
|
-
end
|
510
|
-
|
511
|
-
describe "prefixes" do
|
512
|
-
it "should not append # for http://foo/bar" do
|
513
|
-
n3 = %(@prefix : <http://foo/bar> . :a : :b .)
|
514
|
-
nt = %(
|
515
|
-
<http://foo/bara> <http://foo/bar> <http://foo/barb> .
|
516
|
-
)
|
517
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
518
|
-
end
|
519
|
-
|
520
|
-
it "should not append # for http://foo/bar/" do
|
521
|
-
n3 = %(@prefix : <http://foo/bar/> . :a : :b .)
|
522
|
-
nt = %(
|
523
|
-
<http://foo/bar/a> <http://foo/bar/> <http://foo/bar/b> .
|
524
|
-
)
|
525
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
526
|
-
end
|
527
|
-
|
528
|
-
it "should not append # for http://foo/bar#" do
|
529
|
-
n3 = %(@prefix : <http://foo/bar#> . :a : :b .)
|
530
|
-
nt = %(
|
531
|
-
<http://foo/bar#a> <http://foo/bar#> <http://foo/bar#b> .
|
532
|
-
)
|
533
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
534
|
-
end
|
535
|
-
|
536
|
-
it "should set absolute base" do
|
537
|
-
n3 = %(@base <http://foo/bar> . <> :a <b> . <#c> :d </e>.)
|
538
|
-
nt = %(
|
539
|
-
<http://foo/bar> <http://foo/bar#a> <http://foo/b> .
|
540
|
-
<http://foo/bar#c> <http://foo/bar#d> <http://foo/e> .
|
541
|
-
)
|
542
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
543
|
-
end
|
544
|
-
|
545
|
-
it "should set absolute base (trailing /)" do
|
546
|
-
n3 = %(@base <http://foo/bar/> . <> :a <b> . <#c> :d </e>.)
|
547
|
-
nt = %(
|
548
|
-
<http://foo/bar/> <http://foo/bar/a> <http://foo/bar/b> .
|
549
|
-
<http://foo/bar/#c> <http://foo/bar/d> <http://foo/e> .
|
550
|
-
)
|
551
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
552
|
-
end
|
553
|
-
|
554
|
-
it "should set absolute base (trailing #)" do
|
555
|
-
n3 = %(@base <http://foo/bar#> . <> :a <b> . <#c> :d </e>.)
|
556
|
-
nt = %(
|
557
|
-
<http://foo/bar#> <http://foo/bar#a> <http://foo/b> .
|
558
|
-
<http://foo/bar#c> <http://foo/bar#d> <http://foo/e> .
|
559
|
-
)
|
560
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
561
|
-
end
|
562
|
-
|
563
|
-
it "should set relative base" do
|
564
|
-
n3 = %(
|
565
|
-
@base <http://example.org/products/>.
|
566
|
-
<> :a <b>, <#c>.
|
567
|
-
@base <prod123/>.
|
568
|
-
<> :a <b>, <#c>.
|
569
|
-
@base <../>.
|
570
|
-
<> :a <d>, <#e>.
|
571
|
-
)
|
572
|
-
nt = %(
|
573
|
-
<http://example.org/products/> <http://example.org/products/a> <http://example.org/products/b> .
|
574
|
-
<http://example.org/products/> <http://example.org/products/a> <http://example.org/products/#c> .
|
575
|
-
<http://example.org/products/prod123/> <http://example.org/products/prod123/a> <http://example.org/products/prod123/b> .
|
576
|
-
<http://example.org/products/prod123/> <http://example.org/products/prod123/a> <http://example.org/products/prod123/#c> .
|
577
|
-
<http://example.org/products/> <http://example.org/products/a> <http://example.org/products/d> .
|
578
|
-
<http://example.org/products/> <http://example.org/products/a> <http://example.org/products/#e> .
|
579
|
-
)
|
580
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
581
|
-
end
|
582
|
-
|
583
|
-
it "returns defined prefixes" do
|
584
|
-
n3 = %(
|
585
|
-
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
586
|
-
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
587
|
-
@prefix : <http://test/> .
|
588
|
-
:foo a rdfs:Class.
|
589
|
-
:bar :d :c.
|
590
|
-
:a :d :c.
|
591
|
-
)
|
592
|
-
reader = RDF::N3::Reader.new(n3)
|
593
|
-
reader.each {|statement|}
|
594
|
-
reader.prefixes.should == {
|
595
|
-
:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
|
596
|
-
:rdfs => "http://www.w3.org/2000/01/rdf-schema#",
|
597
|
-
nil => "http://test/"}
|
598
|
-
end
|
599
|
-
end
|
600
|
-
|
601
|
-
describe "keywords" do
|
602
|
-
[
|
603
|
-
%(base <>.),
|
604
|
-
%(keywords a.),
|
605
|
-
%(:a is :b of :c.),
|
606
|
-
%(:a @is :b of :c.),
|
607
|
-
%(:a is :b @of :c.),
|
608
|
-
%(:a has :b :c.),
|
609
|
-
].each do |n3|
|
610
|
-
it "should require @ if keywords set to empty for '#{n3}'" do
|
611
|
-
lambda do
|
612
|
-
parse("@keywords . #{n3}", :base_uri => "http://a/b")
|
613
|
-
end.should raise_error(RDF::ReaderError)
|
614
|
-
end
|
615
|
-
end
|
616
|
-
|
617
|
-
[
|
618
|
-
%(prefix :<>.),
|
619
|
-
].each do |n3|
|
620
|
-
it "parses as local name if keywords set to empty for '#{n3}'" do
|
621
|
-
lambda do
|
622
|
-
parse("@keywords . #{n3}", :base_uri => "http://a/b")
|
623
|
-
end.should_not raise_error(RDF::ReaderError)
|
624
|
-
end
|
625
|
-
end
|
626
|
-
{
|
627
|
-
%(:a a :b) => %(<http://a/b#a> <http://a/b#a> <http://a/b#b> .),
|
628
|
-
%(:a :b true) => %(<http://a/b#a> <http://a/b#b> <http://a/b#true> .),
|
629
|
-
%(:a :b false) => %(<http://a/b#a> <http://a/b#b> <http://a/b#false> .),
|
630
|
-
%(c :a :t) => %(<http://a/b#c> <http://a/b#a> <http://a/b#t> .),
|
631
|
-
%(:c a :t) => %(<http://a/b#c> <http://a/b#a> <http://a/b#t> .),
|
632
|
-
%(:c :a t) => %(<http://a/b#c> <http://a/b#a> <http://a/b#t> .),
|
633
|
-
}.each_pair do |n3, nt|
|
634
|
-
it "should use default_ns for '#{n3}'" do
|
635
|
-
parse("@keywords . #{n3}", :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
636
|
-
end
|
637
|
-
end
|
638
|
-
|
639
|
-
{
|
640
|
-
%(@keywords true. :a :b true.) => %(<http://a/b#a> <http://a/b#b> "true"^^<http://www.w3.org/2001/XMLSchema#boolean> .),
|
641
|
-
%(@keywords false. :a :b false.) => %(<http://a/b#a> <http://a/b#b> "false"^^<http://www.w3.org/2001/XMLSchema#boolean> .),
|
642
|
-
%(@keywords a. :a a :b.) => %(<http://a/b#a> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://a/b#b> .),
|
643
|
-
%(@keywords is. :a is :b @of :c.) => %(<http://a/b#c> <http://a/b#b> <http://a/b#a> .),
|
644
|
-
%(@keywords of. :a @is :b of :c.) => %(<http://a/b#c> <http://a/b#b> <http://a/b#a> .),
|
645
|
-
%(@keywords has. :a has :b :c.) => %(<http://a/b#a> <http://a/b#b> <http://a/b#c> .),
|
646
|
-
} .each_pair do |n3, nt|
|
647
|
-
it "should use keyword for '#{n3}'" do
|
648
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
649
|
-
end
|
650
|
-
end
|
651
|
-
|
652
|
-
it "should raise error if unknown keyword set" do
|
653
|
-
n3 = %(@keywords foo.)
|
654
|
-
lambda do
|
655
|
-
parse(n3, :base_uri => "http://a/b")
|
656
|
-
end.should raise_error(RDF::ReaderError, /Undefined keywords used: foo/)
|
657
|
-
end
|
658
|
-
end
|
659
|
-
|
660
|
-
describe "declaration ordering" do
|
661
|
-
it "should process _ namespace binding after an initial use as a BNode" do
|
662
|
-
n3 = %(
|
663
|
-
_:a a :p.
|
664
|
-
@prefix _: <http://underscore/> .
|
665
|
-
_:a a :p.
|
666
|
-
)
|
667
|
-
nt = %(
|
668
|
-
<http://underscore/a> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://a/b#p> .
|
669
|
-
_:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://a/b#p> .
|
670
|
-
)
|
671
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
672
|
-
end
|
673
|
-
|
674
|
-
it "should allow a prefix to be redefined" do
|
675
|
-
n3 = %(
|
676
|
-
@prefix a: <http://host/A#>.
|
677
|
-
a:b a:p a:v .
|
678
|
-
|
679
|
-
@prefix a: <http://host/Z#>.
|
680
|
-
a:b a:p a:v .
|
681
|
-
)
|
682
|
-
nt = %(
|
683
|
-
<http://host/A#b> <http://host/A#p> <http://host/A#v> .
|
684
|
-
<http://host/Z#b> <http://host/Z#p> <http://host/Z#v> .
|
685
|
-
)
|
686
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
687
|
-
end
|
688
|
-
|
689
|
-
it "should process sequential @base declarations (swap base.n3)" do
|
690
|
-
n3 = %(
|
691
|
-
@base <http://example.com/ontolgies>. <a> :b <foo/bar#baz>.
|
692
|
-
@base <path/DFFERENT/>. <a2> :b2 <foo/bar#baz2>.
|
693
|
-
@prefix : <#>. <d3> :b3 <e3>.
|
694
|
-
)
|
695
|
-
nt = %(
|
696
|
-
<http://example.com/a> <http://example.com/ontolgies#b> <http://example.com/foo/bar#baz> .
|
697
|
-
<http://example.com/path/DFFERENT/a2> <http://example.com/path/DFFERENT/b2> <http://example.com/path/DFFERENT/foo/bar#baz2> .
|
698
|
-
<http://example.com/path/DFFERENT/d3> <http://example.com/path/DFFERENT/#b3> <http://example.com/path/DFFERENT/e3> .
|
699
|
-
)
|
700
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
701
|
-
end
|
702
|
-
end
|
703
|
-
|
704
|
-
describe "BNodes" do
|
705
|
-
it "should create BNode for identifier with '_' prefix" do
|
706
|
-
n3 = %(@prefix a: <http://foo/a#> . _:a a:p a:v .)
|
707
|
-
nt = %(_:bnode0 <http://foo/a#p> <http://foo/a#v> .)
|
708
|
-
end
|
709
|
-
|
710
|
-
it "should create BNode for [] as subject" do
|
711
|
-
n3 = %(@prefix a: <http://foo/a#> . [] a:p a:v .)
|
712
|
-
nt = %(_:bnode0 <http://foo/a#p> <http://foo/a#v> .)
|
713
|
-
g = parse(n3, :base_uri => "http://a/b")
|
714
|
-
normalize_bnodes(g, "bnode0").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug, :compare => :array)
|
715
|
-
end
|
716
|
-
|
717
|
-
it "should create BNode for [] as predicate" do
|
718
|
-
n3 = %(@prefix a: <http://foo/a#> . a:s [] a:o .)
|
719
|
-
nt = %(<http://foo/a#s> _:bnode0 <http://foo/a#o> .)
|
720
|
-
g = parse(n3, :base_uri => "http://a/b")
|
721
|
-
normalize_bnodes(g, "bnode0").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug, :compare => :array, :anon => "bnode")
|
722
|
-
end
|
723
|
-
|
724
|
-
it "should create BNode for [] as object" do
|
725
|
-
n3 = %(@prefix a: <http://foo/a#> . a:s a:p [] .)
|
726
|
-
nt = %(<http://foo/a#s> <http://foo/a#p> _:bnode0 .)
|
727
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
728
|
-
end
|
729
|
-
|
730
|
-
it "should create BNode for [] as statement" do
|
731
|
-
n3 = %([:a :b] .)
|
732
|
-
nt = %(_:bnode0 <http://a/b#a> <http://a/b#b> .)
|
733
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
734
|
-
end
|
735
|
-
|
736
|
-
it "should create statements with BNode subjects using [ pref obj]" do
|
737
|
-
n3 = %(@prefix a: <http://foo/a#> . [ a:p a:v ] .)
|
738
|
-
nt = %(_:bnode0 <http://foo/a#p> <http://foo/a#v> .)
|
739
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
740
|
-
end
|
741
|
-
|
742
|
-
it "should create BNode as a single object" do
|
743
|
-
n3 = %(@prefix a: <http://foo/a#> . a:b a:oneRef [ a:pp "1" ; a:qq "2" ] .)
|
744
|
-
nt = %(
|
745
|
-
_:bnode0 <http://foo/a#pp> "1" .
|
746
|
-
_:bnode0 <http://foo/a#qq> "2" .
|
747
|
-
<http://foo/a#b> <http://foo/a#oneRef> _:bnode0 .
|
748
|
-
)
|
749
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
750
|
-
end
|
751
|
-
|
752
|
-
it "should create a shared BNode" do
|
753
|
-
n3 = %(
|
754
|
-
@prefix a: <http://foo/a#> .
|
755
|
-
|
756
|
-
a:b1 a:twoRef _:a .
|
757
|
-
a:b2 a:twoRef _:a .
|
758
|
-
|
759
|
-
_:a :pred [ a:pp "1" ; a:qq "2" ].
|
760
|
-
)
|
761
|
-
nt = %(
|
762
|
-
<http://foo/a#b1> <http://foo/a#twoRef> _:a .
|
763
|
-
<http://foo/a#b2> <http://foo/a#twoRef> _:a .
|
764
|
-
_:bnode0 <http://foo/a#pp> "1" .
|
765
|
-
_:bnode0 <http://foo/a#qq> "2" .
|
766
|
-
_:a :pred _:bnode0 .
|
767
|
-
)
|
768
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
769
|
-
end
|
770
|
-
|
771
|
-
it "should create nested BNodes" do
|
772
|
-
n3 = %(
|
773
|
-
@prefix a: <http://foo/a#> .
|
774
|
-
|
775
|
-
a:a a:p [ a:p2 [ a:p3 "v1" , "v2" ; a:p4 "v3" ] ; a:p5 "v4" ] .
|
776
|
-
)
|
777
|
-
nt = %(
|
778
|
-
_:bnode0 <http://foo/a#p3> "v1" .
|
779
|
-
_:bnode0 <http://foo/a#p3> "v2" .
|
780
|
-
_:bnode0 <http://foo/a#p4> "v3" .
|
781
|
-
_:bnode1 <http://foo/a#p2> _:bnode0 .
|
782
|
-
_:bnode1 <http://foo/a#p5> "v4" .
|
783
|
-
<http://foo/a#a> <http://foo/a#p> _:bnode1 .
|
784
|
-
)
|
785
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
786
|
-
end
|
787
|
-
|
788
|
-
describe "from paths" do
|
789
|
-
it "should create bnode for path x!p" do
|
790
|
-
n3 = %(:x2!:y2 :p2 "3" .)
|
791
|
-
nt = %(:x2 :y2 _:bnode0 . _:bnode0 :p2 "3" .)
|
792
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
793
|
-
end
|
794
|
-
|
795
|
-
it "should create bnode for path x^p" do
|
796
|
-
n3 = %(:x2^:y2 :p2 "3" .)
|
797
|
-
nt = %(_:bnode0 :y2 :x2 . _:bnode0 :p2 "3" .)
|
798
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
799
|
-
end
|
800
|
-
|
801
|
-
it "should decode :joe!fam:mother!loc:office!loc:zip as Joe's mother's office's zipcode" do
|
802
|
-
n3 = %(
|
803
|
-
@prefix fam: <http://foo/fam#> .
|
804
|
-
@prefix loc: <http://foo/loc#> .
|
805
|
-
|
806
|
-
:joe!fam:mother!loc:office!loc:zip .
|
807
|
-
)
|
808
|
-
nt = %(
|
809
|
-
:joe <http://foo/fam#mother> _:bnode0 .
|
810
|
-
_:bnode0 <http://foo/loc#office> _:bnode1 .
|
811
|
-
_:bnode1 <http://foo/loc#zip> _:bnode2 .
|
812
|
-
)
|
813
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
814
|
-
end
|
815
|
-
|
816
|
-
it "should decode :joe!fam:mother^fam:mother Anyone whose mother is Joe's mother." do
|
817
|
-
n3 = %(
|
818
|
-
@prefix fam: <http://foo/fam#> .
|
819
|
-
@prefix loc: <http://foo/loc#> .
|
820
|
-
|
821
|
-
:joe!fam:mother^fam:mother .
|
822
|
-
)
|
823
|
-
nt = %(
|
824
|
-
:joe <http://foo/fam#mother> _:bnode0 .
|
825
|
-
_:bnode1 <http://foo/fam#mother> _:bnode0 .
|
826
|
-
)
|
827
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
828
|
-
end
|
829
|
-
|
830
|
-
it "should decode path with property list." do
|
831
|
-
n3 = %(
|
832
|
-
@prefix a: <http://a/ns#>.
|
833
|
-
:a2!a:b2!a:c2 :q1 "3" ; :q2 "4" , "5" .
|
834
|
-
)
|
835
|
-
nt = %(
|
836
|
-
:a2 <http://a/ns#b2> _:bnode0 .
|
837
|
-
_:bnode0 <http://a/ns#c2> _:bnode1 .
|
838
|
-
_:bnode1 :q1 "3" .
|
839
|
-
_:bnode1 :q2 "4" .
|
840
|
-
_:bnode1 :q2 "5" .
|
841
|
-
)
|
842
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
843
|
-
end
|
844
|
-
|
845
|
-
it "should decode path as object(1)" do
|
846
|
-
n3 = %(:a :b "lit"^:c.)
|
847
|
-
nt = %(
|
848
|
-
:a :b _:bnode .
|
849
|
-
_:bnode :c "lit" .
|
850
|
-
)
|
851
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
852
|
-
end
|
853
|
-
|
854
|
-
it "should decode path as object(2)" do
|
855
|
-
n3 = %(@prefix a: <http://a/ns#>. :r :p :o!a:p1!a:p2 .)
|
856
|
-
nt = %(
|
857
|
-
:o <http://a/ns#p1> _:bnode0 .
|
858
|
-
_:bnode0 <http://a/ns#p2> _:bnode1 .
|
859
|
-
:r :p _:bnode1 .
|
860
|
-
)
|
861
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
862
|
-
end
|
863
|
-
end
|
864
|
-
end
|
865
|
-
|
866
|
-
describe "formulae" do
|
867
|
-
before(:each) { @repo = RDF::Repository.new }
|
868
|
-
|
869
|
-
it "creates an RDF::Graph instance for formula" do
|
870
|
-
n3 = %(:a :b {})
|
871
|
-
parse(n3, :graph => @repo, :base_uri => "http://a/b")
|
872
|
-
statement = @repo.statements.first
|
873
|
-
statement.object.should be_a(RDF::Node)
|
874
|
-
end
|
875
|
-
|
876
|
-
it "adds statements with context" do
|
877
|
-
|
878
|
-
end
|
879
|
-
|
880
|
-
it "creates variables with ?" do
|
881
|
-
|
882
|
-
end
|
883
|
-
|
884
|
-
context "contexts" do
|
885
|
-
before(:each) do
|
886
|
-
n3 = %(
|
887
|
-
# Test data in notation3 http://www.w3.org/DesignIssues/Notation3.html
|
888
|
-
#
|
889
|
-
@prefix u: <http://www.example.org/utilities#> .
|
890
|
-
@prefix : <#> .
|
891
|
-
|
892
|
-
:assumption = { :fred u:knows :john .
|
893
|
-
:john u:knows :mary .} .
|
894
|
-
|
895
|
-
:conclusion = { :fred u:knows :mary . } .
|
896
|
-
|
897
|
-
# The empty context is trivially true.
|
898
|
-
# Check that we can input it and output it!
|
899
|
-
|
900
|
-
:trivialTruth = { }.
|
901
|
-
|
902
|
-
# ENDS
|
903
|
-
)
|
904
|
-
@repo = RDF::Repository.new
|
905
|
-
parse(n3, :graph => @repo, :base_uri => "http://a/b")
|
906
|
-
end
|
907
|
-
|
908
|
-
it "assumption graph has 2 statements" do
|
909
|
-
tt = @repo.first(:subject => RDF::URI.new("http://a/b#assumption"), :predicate => RDF::OWL.sameAs)
|
910
|
-
tt.object.should be_a(RDF::Node)
|
911
|
-
@repo.query(:context => tt.object).to_a.length.should == 2
|
912
|
-
end
|
913
|
-
|
914
|
-
it "conclusion graph has 1 statements" do
|
915
|
-
tt = @repo.first(:subject => RDF::URI.new("http://a/b#conclusion"), :predicate => RDF::OWL.sameAs)
|
916
|
-
tt.object.should be_a(RDF::Node)
|
917
|
-
@repo.query(:context => tt.object).to_a.length.should == 1
|
918
|
-
end
|
919
|
-
|
920
|
-
it "trivialTruth equivalent to empty graph" do
|
921
|
-
tt = @repo.first(:subject => RDF::URI.new("http://a/b#trivialTruth"), :predicate => RDF::OWL.sameAs)
|
922
|
-
tt.object.should be_a(RDF::Node)
|
923
|
-
@repo.query(:context => tt.object) do |s|
|
924
|
-
puts "statement: #{s}"
|
925
|
-
end
|
926
|
-
end
|
927
|
-
|
928
|
-
end
|
929
|
-
end
|
930
|
-
|
931
|
-
describe "object lists" do
|
932
|
-
it "should create 2 statements for simple list" do
|
933
|
-
n3 = %(:a :b :c, :d)
|
934
|
-
nt = %(<http://a/b#a> <http://a/b#b> <http://a/b#c> . <http://a/b#a> <http://a/b#b> <http://a/b#d> .)
|
935
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
936
|
-
end
|
937
|
-
end
|
938
|
-
|
939
|
-
describe "property lists" do
|
940
|
-
it "should parse property list" do
|
941
|
-
n3 = %(
|
942
|
-
@prefix a: <http://foo/a#> .
|
943
|
-
|
944
|
-
a:b a:p1 "123" ; a:p1 "456" .
|
945
|
-
a:b a:p2 a:v1 ; a:p3 a:v2 .
|
946
|
-
)
|
947
|
-
nt = %(
|
948
|
-
<http://foo/a#b> <http://foo/a#p1> "123" .
|
949
|
-
<http://foo/a#b> <http://foo/a#p1> "456" .
|
950
|
-
<http://foo/a#b> <http://foo/a#p2> <http://foo/a#v1> .
|
951
|
-
<http://foo/a#b> <http://foo/a#p3> <http://foo/a#v2> .
|
952
|
-
)
|
953
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
954
|
-
end
|
955
|
-
end
|
956
|
-
|
957
|
-
describe "lists" do
|
958
|
-
it "should parse empty list" do
|
959
|
-
n3 = %(@prefix :<http://example.com/>. :empty :set ().)
|
960
|
-
nt = %(
|
961
|
-
<http://example.com/empty> <http://example.com/set> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .)
|
962
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
963
|
-
end
|
964
|
-
|
965
|
-
it "should parse list with single element" do
|
966
|
-
n3 = %(@prefix :<http://example.com/>. :gregg :wrote ("RdfContext").)
|
967
|
-
nt = %(
|
968
|
-
_:bnode0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "RdfContext" .
|
969
|
-
_:bnode0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
|
970
|
-
<http://example.com/gregg> <http://example.com/wrote> _:bnode0 .
|
971
|
-
)
|
972
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
973
|
-
end
|
974
|
-
|
975
|
-
it "should parse list with multiple elements" do
|
976
|
-
n3 = %(@prefix :<http://example.com/>. :gregg :name ("Gregg" "Barnum" "Kellogg").)
|
977
|
-
nt = %(
|
978
|
-
_:bnode0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "Gregg" .
|
979
|
-
_:bnode0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:bnode1 .
|
980
|
-
_:bnode1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "Barnum" .
|
981
|
-
_:bnode1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:bnode2 .
|
982
|
-
_:bnode2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "Kellogg" .
|
983
|
-
_:bnode2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
|
984
|
-
<http://example.com/gregg> <http://example.com/name> _:bnode0 .
|
985
|
-
)
|
986
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
987
|
-
end
|
988
|
-
|
989
|
-
it "should parse unattached lists" do
|
990
|
-
n3 = %(
|
991
|
-
@prefix a: <http://foo/a#> .
|
992
|
-
|
993
|
-
("1" "2" "3") .
|
994
|
-
# This is not a statement.
|
995
|
-
() .
|
996
|
-
)
|
997
|
-
nt = %(
|
998
|
-
_:bnode0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "1" .
|
999
|
-
_:bnode0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:bnode1 .
|
1000
|
-
_:bnode1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "2" .
|
1001
|
-
_:bnode1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:bnode2 .
|
1002
|
-
_:bnode2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "3" .
|
1003
|
-
_:bnode2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
|
1004
|
-
)
|
1005
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
1006
|
-
end
|
1007
|
-
|
1008
|
-
it "should add property to nil list" do
|
1009
|
-
n3 = %(@prefix a: <http://foo/a#> . () a:prop "nilProp" .)
|
1010
|
-
nt = %(<http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> <http://foo/a#prop> "nilProp" .)
|
1011
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
1012
|
-
end
|
1013
|
-
|
1014
|
-
it "should parse with compound items" do
|
1015
|
-
n3 = %(
|
1016
|
-
@prefix a: <http://foo/a#> .
|
1017
|
-
a:a a:p (
|
1018
|
-
[ a:p2 "v1" ]
|
1019
|
-
<http://resource1>
|
1020
|
-
<http://resource2>
|
1021
|
-
("inner list")
|
1022
|
-
) .
|
1023
|
-
<http://resource1> a:p "value" .
|
1024
|
-
)
|
1025
|
-
nt = %(
|
1026
|
-
<http://foo/a#a> <http://foo/a#p> _:bnode3 .
|
1027
|
-
<http://resource1> <http://foo/a#p> "value" .
|
1028
|
-
_:bnode3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:bnode5 .
|
1029
|
-
_:bnode3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:bnode2 .
|
1030
|
-
_:bnode5 <http://foo/a#p2> "v1" .
|
1031
|
-
_:bnode2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://resource1> .
|
1032
|
-
_:bnode2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:bnode1 .
|
1033
|
-
_:bnode1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://resource2> .
|
1034
|
-
_:bnode1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:bnode0 .
|
1035
|
-
_:bnode0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:bnode4 .
|
1036
|
-
_:bnode0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
|
1037
|
-
_:bnode4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "inner list" .
|
1038
|
-
_:bnode4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
|
1039
|
-
)
|
1040
|
-
g = parse(n3, :base_uri => "http://a/b")
|
1041
|
-
g.subjects.to_a.length.should == 8
|
1042
|
-
n = g.first_object(:subject => RDF::URI.new("http://foo/a#a"), :predicate => RDF::URI.new("http://foo/a#p"))
|
1043
|
-
n.should be_a(RDF::Node)
|
1044
|
-
seq = RDF::List.new(n, g)
|
1045
|
-
seq.to_a.length.should == 4
|
1046
|
-
seq.first.should be_a(RDF::Node)
|
1047
|
-
seq.second.should == RDF::URI.new("http://resource1")
|
1048
|
-
seq.third.should == RDF::URI.new("http://resource2")
|
1049
|
-
seq.fourth.should be_a(RDF::Node)
|
1050
|
-
end
|
1051
|
-
|
1052
|
-
end
|
1053
|
-
|
1054
|
-
# n3p tests taken from http://inamidst.com/n3p/test/
|
1055
|
-
describe "with real data tests" do
|
1056
|
-
dirs = %w(misc lcsh rdflib n3p)
|
1057
|
-
dirs.each do |dir|
|
1058
|
-
dir_name = File.join(File.dirname(__FILE__), '..', 'test', 'n3_tests', dir, '*.n3')
|
1059
|
-
Dir.glob(dir_name).each do |n3|
|
1060
|
-
it "#{dir} #{n3}" do
|
1061
|
-
test_file(n3)
|
1062
|
-
end
|
1063
|
-
end
|
1064
|
-
end
|
1065
|
-
end
|
1066
|
-
|
1067
|
-
describe "with AggregateGraph tests" do
|
1068
|
-
describe "with a type" do
|
1069
|
-
it "should have 3 namespaces" do
|
1070
|
-
n3 = %(
|
1071
|
-
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
1072
|
-
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
1073
|
-
@prefix : <http://test/> .
|
1074
|
-
:foo a rdfs:Class.
|
1075
|
-
:bar :d :c.
|
1076
|
-
:a :d :c.
|
1077
|
-
)
|
1078
|
-
nt = %(
|
1079
|
-
<http://test/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Class> .
|
1080
|
-
<http://test/bar> <http://test/d> <http://test/c> .
|
1081
|
-
<http://test/a> <http://test/d> <http://test/c> .
|
1082
|
-
)
|
1083
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
1084
|
-
end
|
1085
|
-
end
|
1086
|
-
|
1087
|
-
describe "with blank clause" do
|
1088
|
-
it "should have 4 namespaces" do
|
1089
|
-
n3 = %(
|
1090
|
-
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
1091
|
-
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
1092
|
-
@prefix : <http://test/> .
|
1093
|
-
@prefix log: <http://www.w3.org/2000/10/swap/log#>.
|
1094
|
-
:foo a rdfs:Resource.
|
1095
|
-
:bar rdfs:isDefinedBy [ a log:Formula ].
|
1096
|
-
:a :d :e.
|
1097
|
-
)
|
1098
|
-
nt = %(
|
1099
|
-
<http://test/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Resource> .
|
1100
|
-
_:g2160128180 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/10/swap/log#Formula> .
|
1101
|
-
<http://test/bar> <http://www.w3.org/2000/01/rdf-schema#isDefinedBy> _:g2160128180 .
|
1102
|
-
<http://test/a> <http://test/d> <http://test/e> .
|
1103
|
-
)
|
1104
|
-
parse(n3, :base_uri => "http://a/b").should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
1105
|
-
end
|
1106
|
-
end
|
1107
|
-
|
1108
|
-
describe "with empty subject" do
|
1109
|
-
before(:each) do
|
1110
|
-
@graph = parse(%(
|
1111
|
-
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
1112
|
-
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
1113
|
-
@prefix log: <http://www.w3.org/2000/10/swap/log#>.
|
1114
|
-
@prefix : <http://test/> .
|
1115
|
-
<> a log:N3Document.
|
1116
|
-
), :base_uri => "http://test/")
|
1117
|
-
end
|
1118
|
-
|
1119
|
-
it "should have 4 namespaces" do
|
1120
|
-
nt = %(
|
1121
|
-
<http://test/> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/10/swap/log#N3Document> .
|
1122
|
-
)
|
1123
|
-
@graph.should be_equivalent_graph(nt, :about => "http://test/", :trace => @debug)
|
1124
|
-
end
|
1125
|
-
|
1126
|
-
it "should have default subject" do
|
1127
|
-
@graph.size.should == 1
|
1128
|
-
@graph.statements.first.subject.to_s.should == "http://test/"
|
1129
|
-
end
|
1130
|
-
end
|
1131
|
-
end
|
1132
|
-
end
|
1133
|
-
|
1134
|
-
describe "canonicalization" do
|
1135
|
-
# {
|
1136
|
-
# "<http://foo>" => "<http://foo>",
|
1137
|
-
# "<http://foo/a>" => "<http://foo/a>",
|
1138
|
-
# "<http://foo#a>" => "<http://foo#a>",
|
1139
|
-
#
|
1140
|
-
# "<http://foo/>" => "<http://foo/>",
|
1141
|
-
# "<http://foo/#a>" => "<http://foo/#a>",
|
1142
|
-
#
|
1143
|
-
# "<http://foo#>" => "<http://foo#>",
|
1144
|
-
# "<http://foo#a>" => "<http://foo/a>",
|
1145
|
-
# "<http://foo#/a>" => "<http://foo/a>",
|
1146
|
-
# "<http://foo##a>" => "<http://foo#a>",
|
1147
|
-
#
|
1148
|
-
# "<http://foo/bar>" => "<http://foo/bar>",
|
1149
|
-
# "<http://foo/bar>" => "<http://foo/a>",
|
1150
|
-
# "<http://foo/bar/a>" => "<http://foo/a>",
|
1151
|
-
# "<http://foo/bar#a>" => "<http://foo/bar#a>",
|
1152
|
-
#
|
1153
|
-
# "<http://foo/bar/>" => "<http://foo/bar/>",
|
1154
|
-
# "<http://foo/bar/a>" => "<http://foo/bar/a>",
|
1155
|
-
# "<http://foo/bar//a>" => "<http://foo/a>",
|
1156
|
-
# "<http://foo/bar/#a>" => "<http://foo/bar/#a>",
|
1157
|
-
#
|
1158
|
-
# "<http://foo/bar#>" => "<http://foo/bar#>",
|
1159
|
-
# "<http://foo/bar#a>" => "<http://foo/a>",
|
1160
|
-
# "<http://foo/bar#/a>" => "<http://foo/a>",
|
1161
|
-
# "<http://foo/bar##a>" => "<http://foo/bar#a>",
|
1162
|
-
#
|
1163
|
-
# "<http://foo/bar##D%C3%BCrst>" => "<http://foo/bar#D%C3%BCrst>",
|
1164
|
-
# "<http://foo/bar##Dürst>" => "<http://foo/bar#D\\u00FCrst>",
|
1165
|
-
# }.each_pair do |input, result|
|
1166
|
-
# it "returns subject #{result} given #{input}" do
|
1167
|
-
# n3 = %(#{input} a :b)
|
1168
|
-
# nt = %(#{result} <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://a/b#b> .)
|
1169
|
-
# parse(n3, :base_uri => "http://a/b", :canonicalize => true).should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
1170
|
-
# end
|
1171
|
-
# end
|
1172
|
-
|
1173
|
-
{
|
1174
|
-
%("+1"^^xsd:integer) => %("1"^^<http://www.w3.org/2001/XMLSchema#integer>),
|
1175
|
-
%(+1) => %("1"^^<http://www.w3.org/2001/XMLSchema#integer>),
|
1176
|
-
%(true) => %("true"^^<http://www.w3.org/2001/XMLSchema#boolean>),
|
1177
|
-
%("lang"@EN) => %("lang"@en),
|
1178
|
-
}.each_pair do |input, result|
|
1179
|
-
it "returns object #{result} given #{input}" do
|
1180
|
-
n3 = %(@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . :a :b #{input} .)
|
1181
|
-
nt = %(<http://a/b#a> <http://a/b#b> #{result} .)
|
1182
|
-
parse(n3, :base_uri => "http://a/b", :canonicalize => true).should be_equivalent_graph(nt, :about => "http://a/b", :trace => @debug)
|
1183
|
-
end
|
1184
|
-
end
|
1185
|
-
end
|
1186
|
-
|
1187
|
-
describe "validation" do
|
1188
|
-
{
|
1189
|
-
%(:y :p1 "xyz"^^xsd:integer .) => %r("xyz" is not a valid .*),
|
1190
|
-
%(:y :p1 "12xyz"^^xsd:integer .) => %r("12xyz" is not a valid .*),
|
1191
|
-
%(:y :p1 "xy.z"^^xsd:double .) => %r("xy\.z" is not a valid .*),
|
1192
|
-
%(:y :p1 "+1.0z"^^xsd:double .) => %r("\+1.0z" is not a valid .*),
|
1193
|
-
%(:a :b .) =>RDF::ReaderError,
|
1194
|
-
%(:a :b 'single quote' .) => RDF::ReaderError,
|
1195
|
-
%(:a "literal value" :b .) => RDF::ReaderError,
|
1196
|
-
%(@keywords prefix. :e prefix :f .) => RDF::ReaderError
|
1197
|
-
}.each_pair do |n3, error|
|
1198
|
-
it "should raise '#{error}' for '#{n3}'" do
|
1199
|
-
lambda {
|
1200
|
-
parse("@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . #{n3}", :base_uri => "http://a/b", :validate => true)
|
1201
|
-
}.should raise_error(error)
|
1202
|
-
end
|
1203
|
-
end
|
1204
|
-
end
|
1205
|
-
|
1206
|
-
it "should parse rdf_core testcase" do
|
1207
|
-
sampledoc = <<-EOF;
|
1208
|
-
<http://www.w3.org/2000/10/rdf-tests/rdfcore/xmlbase/Manifest.rdf#test001> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/10/rdf-tests/rdfcore/testSchema#PositiveParserTest> .
|
1209
|
-
<http://www.w3.org/2000/10/rdf-tests/rdfcore/xmlbase/Manifest.rdf#test001> <http://www.w3.org/2000/10/rdf-tests/rdfcore/testSchema#approval> <http://lists.w3.org/Archives/Public/w3c-rdfcore-wg/2002Mar/0235.html> .
|
1210
|
-
<http://www.w3.org/2000/10/rdf-tests/rdfcore/xmlbase/Manifest.rdf#test001> <http://www.w3.org/2000/10/rdf-tests/rdfcore/testSchema#inputDocument> <http://www.w3.org/2000/10/rdf-tests/rdfcore/xmlbase/test001.rdf> .
|
1211
|
-
<http://www.w3.org/2000/10/rdf-tests/rdfcore/xmlbase/Manifest.rdf#test001> <http://www.w3.org/2000/10/rdf-tests/rdfcore/testSchema#issue> <http://www.w3.org/2000/03/rdf-tracking/#rdfms-xml-base> .
|
1212
|
-
<http://www.w3.org/2000/10/rdf-tests/rdfcore/xmlbase/Manifest.rdf#test001> <http://www.w3.org/2000/10/rdf-tests/rdfcore/testSchema#outputDocument> <http://www.w3.org/2000/10/rdf-tests/rdfcore/xmlbase/test001.nt> .
|
1213
|
-
<http://www.w3.org/2000/10/rdf-tests/rdfcore/xmlbase/Manifest.rdf#test001> <http://www.w3.org/2000/10/rdf-tests/rdfcore/testSchema#status> "APPROVED" .
|
1214
|
-
<http://www.w3.org/2000/10/rdf-tests/rdfcore/xmlbase/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> .
|
1215
|
-
<http://www.w3.org/2000/10/rdf-tests/rdfcore/xmlbase/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> .
|
1216
|
-
EOF
|
1217
|
-
graph = parse(sampledoc, :base_uri => "http://www.w3.org/2000/10/rdf-tests/rdfcore/amp-in-url/Manifest.rdf")
|
1218
|
-
|
1219
|
-
graph.should be_equivalent_graph(sampledoc,
|
1220
|
-
:about => "http://www.w3.org/2000/10/rdf-tests/rdfcore/amp-in-url/Manifest.rdf",
|
1221
|
-
:trace => @debug
|
1222
|
-
)
|
1223
|
-
end
|
1224
|
-
|
1225
|
-
def parse(input, options = {})
|
1226
|
-
@debug = []
|
1227
|
-
graph = options[:graph] || RDF::Graph.new
|
1228
|
-
RDF::N3::Reader.new(input, {:debug => @debug, :validate => true, :canonicalize => false}.merge(options)).each do |statement|
|
1229
|
-
graph << statement
|
1230
|
-
end
|
1231
|
-
graph
|
1232
|
-
end
|
1233
|
-
|
1234
|
-
def test_file(filepath)
|
1235
|
-
n3_string = File.read(filepath)
|
1236
|
-
@graph = parse(File.open(filepath), :base_uri => "file:#{filepath}")
|
1237
|
-
|
1238
|
-
nt_string = File.read(filepath.sub('.n3', '.nt'))
|
1239
|
-
@graph.should be_equivalent_graph(nt_string,
|
1240
|
-
:about => "file:#{filepath}",
|
1241
|
-
:trace => @debug)
|
1242
|
-
end
|
1243
|
-
end
|