rdf-spec 0.3.8 → 0.3.9
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/VERSION +1 -1
- data/lib/rdf/spec.rb +2 -2
- data/lib/rdf/spec/countable.rb +3 -2
- data/lib/rdf/spec/durable.rb +20 -18
- data/lib/rdf/spec/enumerable.rb +337 -314
- data/lib/rdf/spec/format.rb +31 -28
- data/lib/rdf/spec/indexable.rb +19 -16
- data/lib/rdf/spec/inferable.rb +5 -2
- data/lib/rdf/spec/matchers.rb +6 -6
- data/lib/rdf/spec/mutable.rb +110 -107
- data/lib/rdf/spec/queryable.rb +331 -330
- data/lib/rdf/spec/readable.rb +10 -7
- data/lib/rdf/spec/reader.rb +119 -116
- data/lib/rdf/spec/repository.rb +39 -36
- data/lib/rdf/spec/transaction.rb +44 -40
- data/lib/rdf/spec/writable.rb +86 -57
- data/lib/rdf/spec/writer.rb +126 -123
- metadata +4 -6
- data/lib/rdf/spec/query.rb +0 -7
- data/lib/rdf/spec/vocab.rb +0 -7
data/lib/rdf/spec/queryable.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'rdf/spec'
|
2
2
|
|
3
|
-
|
3
|
+
module RDF_Queryable
|
4
|
+
extend RSpec::SharedContext
|
4
5
|
include RDF::Spec::Matchers
|
5
6
|
|
6
7
|
before :each do
|
@@ -21,449 +22,449 @@ share_as :RDF_Queryable do
|
|
21
22
|
@subject = RDF::URI('http://rubygems.org/gems/rdf')
|
22
23
|
end
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
context "when called" do
|
32
|
-
it "requires an argument" do
|
33
|
-
lambda { @queryable.query }.should raise_error(ArgumentError)
|
34
|
-
end
|
35
|
-
|
36
|
-
it "accepts a pattern argument" do
|
37
|
-
lambda { @queryable.query(RDF::Query::Pattern.new(nil, nil, nil)) }.should_not raise_error(ArgumentError)
|
38
|
-
lambda { @queryable.query(RDF::Query::Pattern.new(:s, :p, :o)) }.should_not raise_error(ArgumentError)
|
39
|
-
end
|
40
|
-
|
41
|
-
it "accepts a statement argument" do
|
42
|
-
lambda { @queryable.query(RDF::Statement.new(nil, nil, nil)) }.should_not raise_error(ArgumentError)
|
43
|
-
end
|
44
|
-
|
45
|
-
it "accepts a triple argument" do
|
46
|
-
lambda { @queryable.query([nil, nil, nil]) }.should_not raise_error(ArgumentError)
|
47
|
-
end
|
48
|
-
|
49
|
-
it "accepts a quad argument" do
|
50
|
-
lambda { @queryable.query([nil, nil, nil, nil]) }.should_not raise_error(ArgumentError)
|
51
|
-
end
|
52
|
-
|
53
|
-
it "accepts a hash argument" do
|
54
|
-
lambda { @queryable.query({}) }.should_not raise_error(ArgumentError)
|
25
|
+
describe RDF::Queryable do
|
26
|
+
##
|
27
|
+
# @see RDF::Queryable#query
|
28
|
+
describe "#query" do
|
29
|
+
it "should respond to #query" do
|
30
|
+
@queryable.should respond_to(:query)
|
55
31
|
end
|
56
32
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
query.should == original_query
|
62
|
-
end
|
33
|
+
context "when called" do
|
34
|
+
it "requires an argument" do
|
35
|
+
lambda { @queryable.query }.should raise_error(ArgumentError)
|
36
|
+
end
|
63
37
|
|
64
|
-
|
65
|
-
|
66
|
-
|
38
|
+
it "accepts a pattern argument" do
|
39
|
+
lambda { @queryable.query(RDF::Query::Pattern.new(nil, nil, nil)) }.should_not raise_error(ArgumentError)
|
40
|
+
lambda { @queryable.query(RDF::Query::Pattern.new(:s, :p, :o)) }.should_not raise_error(ArgumentError)
|
41
|
+
end
|
67
42
|
|
68
|
-
|
69
|
-
|
70
|
-
@queryable.query([nil, nil, nil]) do |statement|
|
71
|
-
statement.should be_a_statement
|
72
|
-
end
|
43
|
+
it "accepts a statement argument" do
|
44
|
+
lambda { @queryable.query(RDF::Statement.new(nil, nil, nil)) }.should_not raise_error(ArgumentError)
|
73
45
|
end
|
74
|
-
end
|
75
46
|
|
76
|
-
|
77
|
-
|
78
|
-
@queryable.query([nil, nil, nil]).should be_an_enumerator
|
47
|
+
it "accepts a triple argument" do
|
48
|
+
lambda { @queryable.query([nil, nil, nil]) }.should_not raise_error(ArgumentError)
|
79
49
|
end
|
80
50
|
|
81
|
-
it "
|
82
|
-
@queryable.query([nil, nil, nil]).
|
51
|
+
it "accepts a quad argument" do
|
52
|
+
lambda { @queryable.query([nil, nil, nil, nil]) }.should_not raise_error(ArgumentError)
|
83
53
|
end
|
84
54
|
|
85
|
-
it "
|
86
|
-
@queryable.query(
|
55
|
+
it "accepts a hash argument" do
|
56
|
+
lambda { @queryable.query({}) }.should_not raise_error(ArgumentError)
|
87
57
|
end
|
88
58
|
|
89
|
-
it "
|
90
|
-
|
91
|
-
|
92
|
-
|
59
|
+
it "does not alter a given hash argument" do
|
60
|
+
query = {:subject => @subject, :predicate => RDF::DOAP.name, :object => RDF::FOAF.Person}
|
61
|
+
original_query = query.dup
|
62
|
+
@queryable.query(query)
|
63
|
+
query.should == original_query
|
93
64
|
end
|
94
65
|
|
95
|
-
it "
|
96
|
-
@queryable.query(
|
97
|
-
@queryable.query([@subject, nil, nil]).size.should == File.readlines(@doap).grep(/^<http:\/\/rubygems\.org\/gems\/rdf>/).size
|
98
|
-
@queryable.query([RDF::URI("http://ar.to/#self"), nil, nil]).size.should == File.readlines(@doap).grep(/^<http:\/\/ar.to\/\#self>/).size
|
99
|
-
@queryable.query([@subject, RDF::DOAP.name, nil]).size.should == 1
|
100
|
-
#@queryable.query([@subject, RDF::DOAP.developer, nil]).size.should == @queryable.query([nil, nil, RDF::FOAF.Person]).size # FIXME: assumes too much about the doap.nt data
|
101
|
-
@queryable.query([nil, nil, RDF::DOAP.Project]).size.should == 1
|
66
|
+
it "rejects other kinds of arguments" do
|
67
|
+
lambda { @queryable.query(nil) }.should raise_error(ArgumentError)
|
102
68
|
end
|
103
69
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
70
|
+
context "with a block" do
|
71
|
+
it "yields statements" do
|
72
|
+
@queryable.query([nil, nil, nil]) do |statement|
|
73
|
+
statement.should be_a_statement
|
74
|
+
end
|
75
|
+
end
|
110
76
|
end
|
111
|
-
end
|
112
77
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
@queryable.query(:predicate => RDF::URI("http://example.org/p"), :object => RDF::Literal.new(1)).to_a.should ==
|
117
|
-
[RDF::Statement.new(RDF::URI("http://example.org/xi1"), RDF::URI("http://example.org/p"), 1), RDF::Statement.new(RDF::URI("http://example.org/xi2"), RDF::URI("http://example.org/p"), 1)]
|
78
|
+
context "without a block" do
|
79
|
+
it "returns an enumerator" do
|
80
|
+
@queryable.query([nil, nil, nil]).should be_an_enumerator
|
118
81
|
end
|
119
82
|
|
120
|
-
it "
|
121
|
-
@queryable.query(
|
122
|
-
[RDF::Statement.new(RDF::URI("http://example.org/xi2"), RDF::URI("http://example.org/p"), 1)]
|
83
|
+
it "returns an enumerable enumerator" do
|
84
|
+
@queryable.query([nil, nil, nil]).should be_enumerable
|
123
85
|
end
|
124
|
-
end
|
125
86
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
before(:each) do
|
130
|
-
@solutions = @queryable.query(:predicate => RDF::URI("http://example.org/p"), :object => RDF::Literal::Integer.new(1)).to_a
|
131
|
-
end
|
87
|
+
it "returns a queryable enumerator" do
|
88
|
+
@queryable.query([nil, nil, nil]).should be_queryable
|
89
|
+
end
|
132
90
|
|
133
|
-
|
134
|
-
|
91
|
+
it "returns statements" do
|
92
|
+
@queryable.query([nil, nil, nil]).each do |statement|
|
93
|
+
statement.should be_a_statement
|
135
94
|
end
|
95
|
+
end
|
96
|
+
|
97
|
+
it "returns the correct number of results for array queries" do
|
98
|
+
@queryable.query([nil, nil, nil]).size.should == @statements.size
|
99
|
+
@queryable.query([@subject, nil, nil]).size.should == File.readlines(@doap).grep(/^<http:\/\/rubygems\.org\/gems\/rdf>/).size
|
100
|
+
@queryable.query([RDF::URI("http://ar.to/#self"), nil, nil]).size.should == File.readlines(@doap).grep(/^<http:\/\/ar.to\/\#self>/).size
|
101
|
+
@queryable.query([@subject, RDF::DOAP.name, nil]).size.should == 1
|
102
|
+
@queryable.query([nil, nil, RDF::DOAP.Project]).size.should == 1
|
103
|
+
end
|
136
104
|
|
137
|
-
|
138
|
-
|
105
|
+
it "returns the correct number of results for hash queries" do
|
106
|
+
@queryable.query({}).size.should == @statements.size
|
107
|
+
@queryable.query(:subject => @subject) .size.should == File.readlines(@doap).grep(/^<http:\/\/rubygems\.org\/gems\/rdf>/).size
|
108
|
+
@queryable.query(:subject => @subject, :predicate => RDF::DOAP.name).size.should == 1
|
109
|
+
@queryable.query(:object => RDF::DOAP.Project).size.should == 1
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
context "with specific patterns from SPARQL" do
|
114
|
+
context "triple pattern combinations" do
|
115
|
+
it "?s p o" do
|
116
|
+
@queryable.query(:predicate => RDF::URI("http://example.org/p"), :object => RDF::Literal.new(1)).to_a.should ==
|
117
|
+
[RDF::Statement.new(RDF::URI("http://example.org/xi1"), RDF::URI("http://example.org/p"), 1), RDF::Statement.new(RDF::URI("http://example.org/xi2"), RDF::URI("http://example.org/p"), 1)]
|
139
118
|
end
|
140
119
|
|
141
|
-
it "
|
142
|
-
@
|
120
|
+
it "s ?p o" do
|
121
|
+
@queryable.query(:subject => RDF::URI("http://example.org/xi2"), :object => RDF::Literal.new(1)).to_a.should ==
|
122
|
+
[RDF::Statement.new(RDF::URI("http://example.org/xi2"), RDF::URI("http://example.org/p"), 1)]
|
143
123
|
end
|
144
124
|
end
|
145
125
|
|
126
|
+
# From data-r2/expr-equals
|
127
|
+
context "data/r2/expr-equals" do
|
128
|
+
context "graph-1" do
|
129
|
+
before(:each) do
|
130
|
+
@solutions = @queryable.query(:predicate => RDF::URI("http://example.org/p"), :object => RDF::Literal::Integer.new(1)).to_a
|
131
|
+
end
|
146
132
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
end
|
133
|
+
it "has two solutions" do
|
134
|
+
@solutions.count.should == 2
|
135
|
+
end
|
151
136
|
|
152
|
-
|
153
|
-
|
137
|
+
it "has xi1 as a solution" do
|
138
|
+
@solutions.any? {|s| s.subject == RDF::URI("http://example.org/xi1")}.should be_true
|
139
|
+
end
|
140
|
+
|
141
|
+
it "has xi2 as a solution" do
|
142
|
+
@solutions.any? {|s| s.subject == RDF::URI("http://example.org/xi2")}.should be_true
|
143
|
+
end
|
154
144
|
end
|
155
145
|
|
156
|
-
|
157
|
-
|
146
|
+
|
147
|
+
context "graph-2" do
|
148
|
+
before(:each) do
|
149
|
+
@solutions = @queryable.query(:predicate => RDF::URI("http://example.org/p"), :object => RDF::Literal::Double.new("1.0e0")).to_a
|
150
|
+
end
|
151
|
+
|
152
|
+
it "has one solution" do
|
153
|
+
@solutions.count.should == 1
|
154
|
+
end
|
155
|
+
|
156
|
+
it "has xd1 as a solution" do
|
157
|
+
@solutions.any? {|s| s.subject == RDF::URI("http://example.org/xd1")}.should be_true
|
158
|
+
end
|
158
159
|
end
|
159
160
|
end
|
160
161
|
end
|
161
162
|
end
|
162
163
|
end
|
163
|
-
end
|
164
164
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
end
|
171
|
-
|
172
|
-
context "when called" do
|
173
|
-
it "requires an argument" do
|
174
|
-
lambda { @queryable.send(:query_pattern) }.should raise_error(ArgumentError)
|
165
|
+
##
|
166
|
+
# @see RDF::Queryable#query_pattern
|
167
|
+
describe "#query_pattern" do
|
168
|
+
it "responds to #query_pattern" do
|
169
|
+
@queryable.should respond_to(:query_pattern)
|
175
170
|
end
|
176
171
|
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
called = true
|
181
|
-
break
|
172
|
+
context "when called" do
|
173
|
+
it "requires an argument" do
|
174
|
+
lambda { @queryable.send(:query_pattern) }.should raise_error(ArgumentError)
|
182
175
|
end
|
183
|
-
called.should be_true
|
184
|
-
end
|
185
176
|
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
context "with specific patterns" do
|
193
|
-
# Note that "01" should not match 1, per data-r2/expr-equal/sameTerm
|
194
|
-
{
|
195
|
-
[RDF::URI("http://example.org/xi1"), RDF::URI("http://example.org/p"), 1] => [RDF::Statement.from([RDF::URI("http://example.org/xi1"), RDF::URI("http://example.org/p"), 1])],
|
196
|
-
[RDF::URI("http://example.org/xi1"), RDF::URI("http://example.org/p"), nil] => [RDF::Statement.from([RDF::URI("http://example.org/xi1"), RDF::URI("http://example.org/p"), 1])],
|
197
|
-
[RDF::URI("http://example.org/xi1"), nil, 1] => [RDF::Statement.from([RDF::URI("http://example.org/xi1"), RDF::URI("http://example.org/p"), 1])],
|
198
|
-
[nil, RDF::URI("http://example.org/p"), 1] => [RDF::Statement.from([RDF::URI("http://example.org/xi1"), RDF::URI("http://example.org/p"), 1]), RDF::Statement.from([RDF::URI("http://example.org/xi2"), RDF::URI("http://example.org/p"), 1])],
|
199
|
-
[nil, nil, 1] => [RDF::Statement.from([RDF::URI("http://example.org/xi1"), RDF::URI("http://example.org/p"), 1]), RDF::Statement.from([RDF::URI("http://example.org/xi2"), RDF::URI("http://example.org/p"), 1])],
|
200
|
-
[nil, RDF::URI("http://example.org/p"), RDF::Literal::Double.new("1.0e0")] => [RDF::Statement.from([RDF::URI("http://example.org/xd1"), RDF::URI("http://example.org/p"), RDF::Literal::Double.new("1.0e0")])],
|
201
|
-
}.each do |pattern, result|
|
202
|
-
pattern = RDF::Query::Pattern.from(pattern)
|
203
|
-
it "returns #{result.inspect} given #{pattern.inspect}" do
|
204
|
-
solutions = []
|
205
|
-
@queryable.send(:query_pattern, pattern) {|s| solutions << s}
|
206
|
-
solutions.should == result
|
177
|
+
it "yields to the given block" do
|
178
|
+
called = false
|
179
|
+
@queryable.send(:query_pattern, RDF::Query::Pattern.new) do |statement|
|
180
|
+
called = true
|
181
|
+
break
|
207
182
|
end
|
183
|
+
called.should be_true
|
208
184
|
end
|
209
|
-
end
|
210
185
|
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
@queryable.send(:query_pattern, pattern) {|s| solutions << s}
|
216
|
-
solutions.size.should == @statements.size
|
186
|
+
it "yields statements" do
|
187
|
+
@queryable.send(:query_pattern, RDF::Query::Pattern.new) do |statement|
|
188
|
+
statement.should be_a_statement
|
189
|
+
end
|
217
190
|
end
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
191
|
+
|
192
|
+
context "with specific patterns" do
|
193
|
+
# Note that "01" should not match 1, per data-r2/expr-equal/sameTerm
|
194
|
+
{
|
195
|
+
[RDF::URI("http://example.org/xi1"), RDF::URI("http://example.org/p"), 1] => [RDF::Statement.from([RDF::URI("http://example.org/xi1"), RDF::URI("http://example.org/p"), 1])],
|
196
|
+
[RDF::URI("http://example.org/xi1"), RDF::URI("http://example.org/p"), nil] => [RDF::Statement.from([RDF::URI("http://example.org/xi1"), RDF::URI("http://example.org/p"), 1])],
|
197
|
+
[RDF::URI("http://example.org/xi1"), nil, 1] => [RDF::Statement.from([RDF::URI("http://example.org/xi1"), RDF::URI("http://example.org/p"), 1])],
|
198
|
+
[nil, RDF::URI("http://example.org/p"), 1] => [RDF::Statement.from([RDF::URI("http://example.org/xi1"), RDF::URI("http://example.org/p"), 1]), RDF::Statement.from([RDF::URI("http://example.org/xi2"), RDF::URI("http://example.org/p"), 1])],
|
199
|
+
[nil, nil, 1] => [RDF::Statement.from([RDF::URI("http://example.org/xi1"), RDF::URI("http://example.org/p"), 1]), RDF::Statement.from([RDF::URI("http://example.org/xi2"), RDF::URI("http://example.org/p"), 1])],
|
200
|
+
[nil, RDF::URI("http://example.org/p"), RDF::Literal::Double.new("1.0e0")] => [RDF::Statement.from([RDF::URI("http://example.org/xd1"), RDF::URI("http://example.org/p"), RDF::Literal::Double.new("1.0e0")])],
|
201
|
+
}.each do |pattern, result|
|
202
|
+
pattern = RDF::Query::Pattern.from(pattern)
|
203
|
+
it "returns #{result.inspect} given #{pattern.inspect}" do
|
204
|
+
solutions = []
|
205
|
+
@queryable.send(:query_pattern, pattern) {|s| solutions << s}
|
206
|
+
solutions.should == result
|
207
|
+
end
|
208
|
+
end
|
225
209
|
end
|
226
210
|
|
227
|
-
|
228
|
-
|
229
|
-
pattern = RDF::Query::Pattern.new(nil, nil, nil, :context =>
|
211
|
+
context "with context" do
|
212
|
+
it "returns statements from all contexts with no context" do
|
213
|
+
pattern = RDF::Query::Pattern.new(nil, nil, nil, :context => nil)
|
230
214
|
solutions = []
|
231
215
|
@queryable.send(:query_pattern, pattern) {|s| solutions << s}
|
232
|
-
|
233
|
-
solutions.size.should == context_statements
|
216
|
+
solutions.size.should == @statements.size
|
234
217
|
end
|
235
|
-
end
|
236
218
|
|
237
|
-
|
238
|
-
|
239
|
-
pattern = RDF::Query::Pattern.new(nil, nil, nil, :context => RDF::URI("http://ar.to/#self"))
|
219
|
+
it "returns statements from unnamed contexts with false context" do
|
220
|
+
pattern = RDF::Query::Pattern.new(nil, nil, nil, :context => false)
|
240
221
|
solutions = []
|
241
222
|
@queryable.send(:query_pattern, pattern) {|s| solutions << s}
|
242
|
-
|
223
|
+
context_statements = @queryable.statements.reject {|st| st.has_context?}.length
|
224
|
+
solutions.size.should == context_statements
|
225
|
+
end
|
226
|
+
|
227
|
+
it "returns statements from named contexts with variable context" do
|
228
|
+
unless @queryable.contexts.to_a.empty?
|
229
|
+
pattern = RDF::Query::Pattern.new(nil, nil, nil, :context => :c)
|
230
|
+
solutions = []
|
231
|
+
@queryable.send(:query_pattern, pattern) {|s| solutions << s}
|
232
|
+
context_statements = @queryable.statements.select {|st| st.has_context?}.length
|
233
|
+
solutions.size.should == context_statements
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
it "returns statements from specific context with URI context" do
|
238
|
+
unless @queryable.contexts.to_a.empty?
|
239
|
+
pattern = RDF::Query::Pattern.new(nil, nil, nil, :context => RDF::URI("http://ar.to/#self"))
|
240
|
+
solutions = []
|
241
|
+
@queryable.send(:query_pattern, pattern) {|s| solutions << s}
|
242
|
+
solutions.size.should == File.readlines(@doap).grep(/^<http:\/\/ar.to\/\#self>/).size
|
243
|
+
end
|
243
244
|
end
|
244
245
|
end
|
245
246
|
end
|
246
247
|
end
|
247
|
-
end
|
248
248
|
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
249
|
+
##
|
250
|
+
# @see RDF::Queryable#first
|
251
|
+
describe "#first" do
|
252
|
+
before :all do
|
253
|
+
@failing_pattern = [RDF::Node.new] * 3
|
254
|
+
end
|
255
255
|
|
256
|
-
|
257
|
-
|
258
|
-
|
256
|
+
it "should respond to #first" do
|
257
|
+
@queryable.should respond_to(:first)
|
258
|
+
end
|
259
259
|
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
260
|
+
it "returns enumerator without a pattern" do
|
261
|
+
lambda { @queryable.first }.should_not raise_error(ArgumentError)
|
262
|
+
@queryable.first.should == @queryable.each.first # uses an Enumerator
|
263
|
+
end
|
264
264
|
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
265
|
+
it "returns the correct value when the pattern matches" do
|
266
|
+
matching_patterns = [[nil, nil, nil], @queryable.each.first]
|
267
|
+
matching_patterns.each do |matching_pattern|
|
268
|
+
@queryable.first(matching_pattern).should == @queryable.query(matching_pattern).each.first
|
269
|
+
end
|
269
270
|
end
|
270
|
-
end
|
271
271
|
|
272
|
-
|
273
|
-
|
274
|
-
|
272
|
+
it "returns nil when the pattern fails to match anything" do
|
273
|
+
@queryable.first(@failing_pattern).should be_nil
|
274
|
+
end
|
275
275
|
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
276
|
+
it "returns nil when self is empty" do
|
277
|
+
queryable = [].extend(RDF::Queryable)
|
278
|
+
queryable.first.should be_nil
|
279
|
+
queryable.first(@failing_pattern).should be_nil
|
280
|
+
end
|
280
281
|
end
|
281
|
-
end
|
282
282
|
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
283
|
+
##
|
284
|
+
# @see RDF::Queryable#first_subject
|
285
|
+
describe "#first_subject" do
|
286
|
+
before :all do
|
287
|
+
@failing_pattern = [RDF::Node.new, nil, nil]
|
288
|
+
end
|
289
289
|
|
290
|
-
|
291
|
-
|
292
|
-
|
290
|
+
it "should respond to #first_subject" do
|
291
|
+
@queryable.should respond_to(:first_subject)
|
292
|
+
end
|
293
293
|
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
294
|
+
it "returns enumerator without a pattern" do
|
295
|
+
lambda { @queryable.first_subject }.should_not raise_error(ArgumentError)
|
296
|
+
@queryable.first_subject.should == @queryable.first.subject
|
297
|
+
end
|
298
298
|
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
299
|
+
it "returns the correct value when the pattern matches" do
|
300
|
+
matching_patterns = [[nil, nil, nil], [@queryable.first.subject, nil, nil]]
|
301
|
+
matching_patterns.each do |matching_pattern|
|
302
|
+
@queryable.first_subject(matching_pattern).should == @queryable.query(matching_pattern).first.subject
|
303
|
+
end
|
303
304
|
end
|
304
|
-
end
|
305
305
|
|
306
|
-
|
307
|
-
|
308
|
-
|
306
|
+
it "returns nil when the pattern fails to match anything" do
|
307
|
+
@queryable.first_subject(@failing_pattern).should be_nil
|
308
|
+
end
|
309
309
|
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
310
|
+
it "returns nil when self is empty" do
|
311
|
+
queryable = [].extend(RDF::Queryable)
|
312
|
+
queryable.first_subject.should be_nil
|
313
|
+
queryable.first_subject(@failing_pattern).should be_nil
|
314
|
+
end
|
314
315
|
end
|
315
|
-
end
|
316
316
|
|
317
|
-
|
318
|
-
|
317
|
+
##
|
318
|
+
# @see RDF::Queryable#first_predicate
|
319
319
|
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
320
|
+
describe "#first_predicate" do
|
321
|
+
before :all do
|
322
|
+
@failing_pattern = [nil, RDF::Node.new, nil]
|
323
|
+
end
|
324
324
|
|
325
|
-
|
326
|
-
|
327
|
-
|
325
|
+
it "should respond to #first_predicate" do
|
326
|
+
@queryable.should respond_to(:first_predicate)
|
327
|
+
end
|
328
328
|
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
329
|
+
it "returns enumerator without a pattern" do
|
330
|
+
lambda { @queryable.first_predicate }.should_not raise_error(ArgumentError)
|
331
|
+
@queryable.first_predicate.should == @queryable.first.predicate
|
332
|
+
end
|
333
333
|
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
334
|
+
it "returns the correct value when the pattern matches" do
|
335
|
+
matching_patterns = [[nil, nil, nil], [nil, @queryable.first.predicate, nil]]
|
336
|
+
matching_patterns.each do |matching_pattern|
|
337
|
+
@queryable.first_predicate(matching_pattern).should == @queryable.query(matching_pattern).first.predicate
|
338
|
+
end
|
338
339
|
end
|
339
|
-
end
|
340
340
|
|
341
|
-
|
342
|
-
|
343
|
-
|
341
|
+
it "returns nil when the pattern fails to match anything" do
|
342
|
+
@queryable.first_predicate(@failing_pattern).should be_nil
|
343
|
+
end
|
344
344
|
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
345
|
+
it "returns nil when self is empty" do
|
346
|
+
queryable = [].extend(RDF::Queryable)
|
347
|
+
queryable.first_predicate.should be_nil
|
348
|
+
queryable.first_predicate(@failing_pattern).should be_nil
|
349
|
+
end
|
349
350
|
end
|
350
|
-
end
|
351
351
|
|
352
|
-
|
353
|
-
|
352
|
+
##
|
353
|
+
# @see RDF::Queryable#first_object
|
354
354
|
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
355
|
+
describe "#first_object" do
|
356
|
+
before :all do
|
357
|
+
@failing_pattern = [nil, nil, RDF::Node.new]
|
358
|
+
end
|
359
359
|
|
360
|
-
|
361
|
-
|
362
|
-
|
360
|
+
it "should respond to #first_object" do
|
361
|
+
@queryable.should respond_to(:first_object)
|
362
|
+
end
|
363
363
|
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
364
|
+
it "returns enurator without a pattern" do
|
365
|
+
lambda { @queryable.first_object }.should_not raise_error(ArgumentError)
|
366
|
+
@queryable.first_object.should == @queryable.first.object
|
367
|
+
end
|
368
368
|
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
369
|
+
it "returns the correct value when the pattern matches" do
|
370
|
+
matching_patterns = [[nil, nil, nil], [nil, nil, @queryable.first.object]]
|
371
|
+
matching_patterns.each do |matching_pattern|
|
372
|
+
@queryable.first_object(matching_pattern).should == @queryable.query(matching_pattern).first.object
|
373
|
+
end
|
373
374
|
end
|
374
|
-
end
|
375
375
|
|
376
|
-
|
377
|
-
|
378
|
-
|
376
|
+
it "returns nil when the pattern fails to match anything" do
|
377
|
+
@queryable.first_object(@failing_pattern).should be_nil
|
378
|
+
end
|
379
379
|
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
380
|
+
it "returns nil when self is empty" do
|
381
|
+
queryable = [].extend(RDF::Queryable)
|
382
|
+
queryable.first_object.should be_nil
|
383
|
+
queryable.first_object(@failing_pattern).should be_nil
|
384
|
+
end
|
384
385
|
end
|
385
|
-
end
|
386
386
|
|
387
|
-
|
388
|
-
|
387
|
+
##
|
388
|
+
# @see RDF::Queryable#first_literal
|
389
389
|
|
390
|
-
|
391
|
-
|
392
|
-
|
390
|
+
it "returns to #first_literal" do
|
391
|
+
@queryable.should respond_to(:first_literal)
|
392
|
+
end
|
393
393
|
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
394
|
+
describe "#first_literal" do
|
395
|
+
before :each do
|
396
|
+
# FIXME: these tests should be using the provided @queryable, if possible.
|
397
|
+
@queryable = RDF::Graph.new do |graph|
|
398
|
+
@subject = RDF::Node.new
|
399
|
+
graph << [@subject, RDF.type, RDF::DOAP.Project]
|
400
|
+
graph << [@subject, RDF::DC.creator, RDF::URI.new('http://example.org/#jhacker')]
|
401
|
+
graph << [@subject, RDF::DC.creator, @literal = RDF::Literal.new('J. Random Hacker')]
|
402
|
+
end
|
403
|
+
@failing_pattern = [nil, nil, RDF::Node.new]
|
402
404
|
end
|
403
|
-
@failing_pattern = [nil, nil, RDF::Node.new]
|
404
|
-
end
|
405
405
|
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
406
|
+
it "returns a literal without a pattern" do
|
407
|
+
lambda { @queryable.first_literal }.should_not raise_error(ArgumentError)
|
408
|
+
@queryable.first_literal.should == @literal
|
409
|
+
end
|
410
410
|
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
411
|
+
it "returns the correct value when the pattern matches" do
|
412
|
+
matching_patterns = [[nil, nil, nil], [@subject, nil, nil], [nil, RDF::DC.creator, nil], [nil, nil, @literal]]
|
413
|
+
matching_patterns.each do |matching_pattern|
|
414
|
+
@queryable.first_literal(matching_pattern).should == @literal
|
415
|
+
end
|
415
416
|
end
|
416
|
-
end
|
417
417
|
|
418
|
-
|
419
|
-
|
420
|
-
|
418
|
+
it "returns nil when the pattern fails to match anything" do
|
419
|
+
@queryable.first_literal(@failing_pattern).should be_nil
|
420
|
+
end
|
421
421
|
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
422
|
+
it "returns nil when self is empty" do
|
423
|
+
queryable = [].extend(RDF::Queryable)
|
424
|
+
queryable.first_literal.should be_nil
|
425
|
+
queryable.first_literal(@failing_pattern).should be_nil
|
426
|
+
end
|
426
427
|
end
|
427
|
-
end
|
428
428
|
|
429
|
-
|
430
|
-
|
429
|
+
##
|
430
|
+
# @see RDF::Queryable#first_value
|
431
431
|
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
432
|
+
describe "#first_value" do
|
433
|
+
before :all do
|
434
|
+
@failing_pattern = [nil, nil, RDF::Node.new]
|
435
|
+
end
|
436
436
|
|
437
|
-
|
438
|
-
|
439
|
-
|
437
|
+
it "should respond to #first_value" do
|
438
|
+
@queryable.should respond_to(:first_value)
|
439
|
+
end
|
440
440
|
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
441
|
+
it "returns first literal without a pattern" do
|
442
|
+
lambda { @queryable.first_value }.should_not raise_error(ArgumentError)
|
443
|
+
@queryable.first_value.should == @queryable.first_literal.value
|
444
|
+
end
|
445
445
|
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
446
|
+
it "returns the correct value when the pattern matches" do
|
447
|
+
matching_patterns = []
|
448
|
+
@queryable.each do |statement|
|
449
|
+
if statement.object.is_a?(RDF::Literal)
|
450
|
+
matching_pattern = [statement.subject, statement.predicate, nil]
|
451
|
+
unless matching_patterns.include?(matching_pattern)
|
452
|
+
matching_patterns << matching_pattern
|
453
|
+
@queryable.first_value(matching_pattern).should == @queryable.first_literal(matching_pattern).value
|
454
|
+
end
|
454
455
|
end
|
455
456
|
end
|
456
457
|
end
|
457
|
-
end
|
458
458
|
|
459
|
-
|
460
|
-
|
461
|
-
|
459
|
+
it "returns nil when the pattern fails to match anything" do
|
460
|
+
@queryable.first_value(@failing_pattern).should be_nil
|
461
|
+
end
|
462
462
|
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
463
|
+
it "returns nil when self is empty" do
|
464
|
+
queryable = [].extend(RDF::Queryable)
|
465
|
+
queryable.first_value.should be_nil
|
466
|
+
queryable.first_value(@failing_pattern).should be_nil
|
467
|
+
end
|
467
468
|
end
|
468
469
|
end
|
469
470
|
end
|