rdf-spec 0.1.10 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -41,6 +41,16 @@ share_as :RDF_Graph do
41
41
  graph.context.should_not be_nil
42
42
  graph.contexts.size.should == 1
43
43
  end
44
+
45
+ it "should be #anonymous? with a Node context" do
46
+ graph = @new.call(RDF::Node.new)
47
+ graph.should be_anonymous
48
+ end
49
+
50
+ it "should not be #anonymous? with a URI context" do
51
+ graph = @new.call("http://rdf.rubyforge.org/")
52
+ graph.should_not be_anonymous
53
+ end
44
54
  end
45
55
 
46
56
  end
@@ -51,6 +51,10 @@ share_as :RDF_Literal do
51
51
  @empty.to_s.should eql('""')
52
52
  @hello.to_s.should eql('"Hello"')
53
53
  end
54
+
55
+ it "should not be #anonymous?" do
56
+ @hello.should_not be_anonymous
57
+ end
54
58
  end
55
59
 
56
60
  context "languaged-tagged literals" do
@@ -17,6 +17,41 @@ module RDF; module Spec
17
17
  end
18
18
  end
19
19
 
20
+ define :be_countable do
21
+ match do |countable|
22
+ countable.should be_a_kind_of(RDF::Countable)
23
+ true
24
+ end
25
+ end
26
+
27
+ define :be_enumerable do
28
+ match do |enumerable|
29
+ enumerable.should be_a_kind_of(RDF::Enumerable)
30
+ true
31
+ end
32
+ end
33
+
34
+ define :be_an_enumerator do
35
+ match do |enumerator|
36
+ enumerator.should be_a_kind_of(RDF::Enumerator)
37
+ true
38
+ end
39
+ end
40
+
41
+ define :be_queryable do
42
+ match do |enumerable|
43
+ enumerable.should be_a_kind_of(RDF::Queryable)
44
+ true
45
+ end
46
+ end
47
+
48
+ define :be_mutable do
49
+ match do |enumerable|
50
+ enumerable.should be_a_kind_of(RDF::Mutable)
51
+ true
52
+ end
53
+ end
54
+
20
55
  define :be_a_statement do
21
56
  match do |statement|
22
57
  statement.should be_instance_of(RDF::Statement)
@@ -90,7 +125,7 @@ module RDF; module Spec
90
125
 
91
126
  define :have_properties do |base_uri, properties|
92
127
  match do |vocabulary|
93
- properties.map(&:to_sym).each do |property|
128
+ properties.map { |p| p.to_sym }.each do |property|
94
129
  vocabulary[property].should be_a_uri
95
130
  vocabulary[property].to_s.should == "#{base_uri}#{property}"
96
131
  #vocabulary.should respond_to(property) # FIXME
@@ -105,7 +140,7 @@ module RDF; module Spec
105
140
 
106
141
  define :have_subclasses do |base_uri, klasses|
107
142
  match do |vocabulary|
108
- klasses.map(&:to_sym).each do |klass|
143
+ klasses.map { |k| k.to_sym }.each do |klass|
109
144
  # TODO
110
145
  end
111
146
  true
@@ -3,61 +3,65 @@ require 'rdf/spec'
3
3
  require 'rdf/ntriples'
4
4
 
5
5
  share_as :RDF_Mutable do
6
-
7
6
  include RDF::Spec::Matchers
8
7
 
9
8
  before :each do
10
- raise '+@filename+ must be defined in a before(:each) block' unless instance_variable_get('@filename')
11
- raise '+@repository+ must be defined in a before(:each) block' unless instance_variable_get('@repository')
12
- raise '+@subject+ must be defined in a before(:each) block' unless instance_variable_get('@subject')
13
- raise '+@context+ must be defined in a before(:each) block' unless instance_variable_get('@context')
9
+ raise '+@mutable+ must be defined in a before(:each) block' unless instance_variable_get('@mutable')
10
+
11
+ @filename = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'etc', 'doap.nt'))
12
+
13
+ @subject = RDF::URI('http://rubygems.org/gems/rdf')
14
+ @context = RDF::URI('http://example.org/context')
15
+
16
+ # Assume contexts are supported unless declared otherwise:
17
+ @supports_context = @mutable.respond_to?(:supports?) ? @mutable.supports?(:context) : true
14
18
  end
15
19
 
16
20
  it "should be empty initially" do
17
- @repository.empty?.should be_true
18
- @repository.count.should be_zero
21
+ @mutable.empty?.should be_true
22
+ @mutable.count.should be_zero
19
23
  end
20
24
 
21
25
  it "should be readable" do
22
- @repository.readable?.should be_true
26
+ @mutable.readable?.should be_true
23
27
  end
24
28
 
25
29
  it "should be writable" do
26
- @repository.writable?.should be_true
30
+ @mutable.writable?.should be_true
27
31
  end
28
32
 
29
33
  it "should be mutable" do
30
- @repository.immutable?.should be_false
31
- @repository.mutable?.should be_true
34
+ @mutable.immutable?.should be_false
35
+ @mutable.mutable?.should be_true
32
36
  end
33
37
 
34
38
  it "should support #load" do
35
- @repository.respond_to?(:load).should be_true
39
+ @mutable.respond_to?(:load).should be_true
36
40
  end
37
41
 
38
42
  context "#load" do
39
43
  it "should require an argument" do
40
- lambda { @repository.load }.should raise_error(ArgumentError)
44
+ lambda { @mutable.load }.should raise_error(ArgumentError)
41
45
  end
42
46
 
43
47
  it "should accept a string filename argument" do
44
- lambda { @repository.load(@filename) }.should_not raise_error(ArgumentError)
48
+ lambda { @mutable.load(@filename) }.should_not raise_error(ArgumentError)
45
49
  end
46
50
 
47
51
  it "should accept an optional hash argument" do
48
- lambda { @repository.load(@filename,{}) }.should_not raise_error(ArgumentError)
52
+ lambda { @mutable.load(@filename,{}) }.should_not raise_error(ArgumentError)
49
53
  end
50
54
 
51
55
  it "should load statements" do
52
- @repository.load @filename
53
- @repository.size.should == File.readlines(@filename).size
54
- @repository.should have_subject @subject
56
+ @mutable.load @filename
57
+ @mutable.size.should == File.readlines(@filename).size
58
+ @mutable.should have_subject @subject
55
59
  end
56
60
 
57
61
  it "should load statements with a context override" do
58
- @repository.load @filename, :context => @context
59
- @repository.should have_context @context
60
- @repository.query(:context => @context).size.should == @repository.size
62
+ @mutable.load @filename, :context => @context
63
+ @mutable.should have_context @context
64
+ @mutable.query(:context => @context).size.should == @mutable.size
61
65
  end
62
66
  end
63
67
 
@@ -67,75 +71,112 @@ share_as :RDF_Mutable do
67
71
  end
68
72
 
69
73
  it "should support #insert" do
70
- @repository.should respond_to(:insert)
74
+ @mutable.should respond_to(:insert)
71
75
  end
72
76
 
73
77
  it "should not raise errors" do
74
- lambda { @repository.insert(@statements.first) }.should_not raise_error
78
+ lambda { @mutable.insert(@statements.first) }.should_not raise_error
75
79
  end
76
80
 
77
81
  it "should support inserting one statement at a time" do
78
- @repository.insert(@statements.first)
79
- @repository.should have_statement(@statements.first)
82
+ @mutable.insert(@statements.first)
83
+ @mutable.should have_statement(@statements.first)
80
84
  end
81
85
 
82
86
  it "should support inserting multiple statements at a time" do
83
- @repository.insert(*@statements)
87
+ @mutable.insert(*@statements)
84
88
  end
85
89
 
86
90
  it "should insert statements successfully" do
87
- @repository.insert(*@statements)
88
- @repository.count.should == @statements.size
91
+ @mutable.insert(*@statements)
92
+ @mutable.count.should == @statements.size
89
93
  end
90
94
 
91
95
  it "should not insert a statement twice" do
92
- @repository.insert(@statements.first)
93
- @repository.insert(@statements.first)
94
- @repository.count.should == 1
96
+ @mutable.insert(@statements.first)
97
+ @mutable.insert(@statements.first)
98
+ @mutable.count.should == 1
95
99
  end
100
+
101
+ it "should treat statements with a different context as distinct" do
102
+ s1 = @statements.first.dup
103
+ s1.context = nil
104
+ s2 = @statements.first.dup
105
+ s2.context = RDF::URI.new("urn:context:1")
106
+ s3 = @statements.first.dup
107
+ s3.context = RDF::URI.new("urn:context:2")
108
+ @mutable.insert(s1)
109
+ @mutable.insert(s2)
110
+ @mutable.insert(s3)
111
+ # If contexts are not suported, all three are redundant
112
+ @mutable.count.should == (@supports_context ? 3 : 1)
113
+ end
114
+
96
115
  end
97
116
 
98
117
  context "when deleting statements" do
99
118
  before :each do
100
119
  @statements = RDF::NTriples::Reader.new(File.open(@filename)).to_a
101
- @repository.insert(*@statements)
120
+ @mutable.insert(*@statements)
102
121
  end
103
122
 
104
123
  it "should support #delete" do
105
- @repository.should respond_to(:delete)
124
+ @mutable.should respond_to(:delete)
106
125
  end
107
126
 
108
127
  it "should not raise errors" do
109
- lambda { @repository.delete(@statements.first) }.should_not raise_error
128
+ lambda { @mutable.delete(@statements.first) }.should_not raise_error
110
129
  end
111
130
 
112
131
  it "should support deleting one statement at a time" do
113
- @repository.delete(@statements.first)
114
- @repository.should_not have_statement(@statements.first)
132
+ @mutable.delete(@statements.first)
133
+ @mutable.should_not have_statement(@statements.first)
115
134
  end
116
135
 
117
136
  it "should support deleting multiple statements at a time" do
118
- @repository.delete(*@statements)
119
- @statements.find { |s| @repository.has_statement?(s) }.should be_false
137
+ @mutable.delete(*@statements)
138
+ @statements.find { |s| @mutable.has_statement?(s) }.should be_false
120
139
  end
121
140
 
122
141
  it "should support wildcard deletions" do
123
142
  # nothing deleted
124
143
  require 'digest/sha1'
125
- count = @repository.count
126
- @repository.delete([nil, nil, random = Digest::SHA1.hexdigest(File.read(__FILE__))])
127
- @repository.should_not be_empty
128
- @repository.count.should == count
144
+ count = @mutable.count
145
+ @mutable.delete([nil, nil, random = Digest::SHA1.hexdigest(File.read(__FILE__))])
146
+ @mutable.should_not be_empty
147
+ @mutable.count.should == count
129
148
 
130
149
  # everything deleted
131
- @repository.delete([nil, nil, nil])
132
- @repository.should be_empty
150
+ @mutable.delete([nil, nil, nil])
151
+ @mutable.should be_empty
152
+ end
153
+
154
+ it "should only delete statements when the context matches" do
155
+ # Setup three statements identical except for context
156
+ count = @mutable.count + (@supports_context ? 3 : 1)
157
+ s1 = RDF::Statement.new(@subject, RDF::URI.new("urn:predicate:1"), RDF::URI.new("urn:object:1"))
158
+ s2 = s1.dup
159
+ s2.context = RDF::URI.new("urn:context:1")
160
+ s3 = s1.dup
161
+ s3.context = RDF::URI.new("urn:context:2")
162
+ @mutable.insert(s1)
163
+ @mutable.insert(s2)
164
+ @mutable.insert(s3)
165
+ @mutable.count.should == count
166
+
167
+ # Delete one by one
168
+ @mutable.delete(s1)
169
+ @mutable.count.should == count - (@supports_context ? 1 : 1)
170
+ @mutable.delete(s2)
171
+ @mutable.count.should == count - (@supports_context ? 2 : 1)
172
+ @mutable.delete(s3)
173
+ @mutable.count.should == count - (@supports_context ? 3 : 1)
133
174
  end
134
175
  end
135
176
 
136
177
  context "when clearing all statements" do
137
178
  it "should support #clear" do
138
- @repository.should respond_to(:clear)
179
+ @mutable.should respond_to(:clear)
139
180
  end
140
181
  end
141
182
  end
@@ -5,53 +5,89 @@ share_as :RDF_Queryable do
5
5
  include RDF::Spec::Matchers
6
6
 
7
7
  before :each do
8
- # RDF::Queryable cares about the contents of this file too much to let someone set it
9
- @filename = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'etc', 'doap.nt'))
10
8
  raise '+@queryable+ must be defined in a before(:each) block' unless instance_variable_get('@queryable')
11
- raise '+@subject+ must be defined in a before(:each) block' unless instance_variable_get('@subject')
9
+
10
+ @filename = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'etc', 'doap.nt'))
11
+ @statements = RDF::NTriples::Reader.new(File.open(@filename)).to_a
12
+
12
13
  if @queryable.empty?
13
- if @queryable.respond_to?(:insert)
14
- @queryable.insert(*(RDF::NTriples::Reader.new(File.open(@filename)).to_a))
14
+ if @queryable.respond_to?(:<<)
15
+ @statements.each { |statement| @queryable << statement }
15
16
  else
16
- raise "@queryable must be mutable or pre-populated with the statements in #{@filename} in a before(:each)"
17
+ raise "@queryable must respond to #<< or be pre-populated with the statements in #{@filename} in a before(:each) block"
17
18
  end
18
19
  end
20
+
21
+ @subject = RDF::URI('http://rubygems.org/gems/rdf')
19
22
  end
20
23
 
21
24
  ##
22
25
  # @see RDF::Queryable#query
23
26
 
24
- it "should support #query" do
25
- @queryable.respond_to?(:query).should be_true
27
+ it "should respond to #query" do
28
+ @queryable.should respond_to(:query)
26
29
  end
27
30
 
28
- context "#query" do
31
+ context "#query when called" do
29
32
  it "should require an argument" do
30
33
  lambda { @queryable.query }.should raise_error(ArgumentError)
31
34
  end
32
35
 
36
+ it "should accept 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 "should accept a statement argument" do
42
+ lambda { @queryable.query(RDF::Statement.new(nil, nil, nil)) }.should_not raise_error(ArgumentError)
43
+ end
44
+
33
45
  it "should accept a triple argument" do
34
46
  lambda { @queryable.query([nil, nil, nil]) }.should_not raise_error(ArgumentError)
35
47
  end
36
48
 
49
+ it "should accept a quad argument" do
50
+ lambda { @queryable.query([nil, nil, nil, nil]) }.should_not raise_error(ArgumentError)
51
+ end
52
+
37
53
  it "should accept a hash argument" do
38
54
  lambda { @queryable.query({}) }.should_not raise_error(ArgumentError)
39
55
  end
40
56
 
41
- it "should accept a statement argument" do
42
- lambda { @queryable.query(RDF::Statement.new(nil, nil, nil)) }.should_not raise_error(ArgumentError)
57
+ it "should not alter a given hash argument" do
58
+ query = {:subject => @subject, :predicate => RDF::DOAP.name, :object => RDF::FOAF.Person}
59
+ original_query = query.dup
60
+ @queryable.query(query)
61
+ query.should == original_query
43
62
  end
44
63
 
45
- it "should accept a pattern argument" do
46
- lambda { @queryable.query(RDF::Query::Pattern.new(nil, nil, nil)) }.should_not raise_error(ArgumentError)
47
- lambda { @queryable.query(RDF::Query::Pattern.new(:s, :p, :o)) }.should_not raise_error(ArgumentError)
64
+ it "should reject other kinds of arguments" do
65
+ lambda { @queryable.query(nil) }.should raise_error(ArgumentError)
66
+ end
67
+ end
68
+
69
+ context "#query when called with a block" do
70
+ it "should yield statements" do
71
+ @queryable.query([nil, nil, nil]) do |statement|
72
+ statement.should be_a_statement
73
+ end
48
74
  end
75
+ end
49
76
 
50
- it "should reject other arguments" do
51
- lambda { @queryable.query(nil) }.should raise_error(ArgumentError)
77
+ context "#query when called without a block" do
78
+ it "should return an enumerator" do
79
+ @queryable.query([nil, nil, nil]).should be_a_kind_of(RDF::Enumerator)
80
+ end
81
+
82
+ it "should return an enumerable enumerator" do
83
+ @queryable.query([nil, nil, nil]).should be_a_kind_of(RDF::Enumerable)
84
+ end
85
+
86
+ it "should return a queryable enumerator" do
87
+ @queryable.query([nil, nil, nil]).should be_a_kind_of(RDF::Queryable)
52
88
  end
53
89
 
54
- it "should return RDF statements" do
90
+ it "should return statements" do
55
91
  @queryable.query([nil, nil, nil]).each do |statement|
56
92
  statement.should be_a_statement
57
93
  end
@@ -61,7 +97,7 @@ share_as :RDF_Queryable do
61
97
  @queryable.query([nil, nil, nil]).size.should == File.readlines(@filename).size
62
98
  @queryable.query([@subject, nil, nil]).size.should == File.readlines(@filename).grep(/^<http:\/\/rubygems\.org\/gems\/rdf>/).size
63
99
  @queryable.query([@subject, RDF::DOAP.name, nil]).size.should == 1
64
- @queryable.query([@subject, RDF::DOAP.developer, nil]).size.should == @queryable.query([nil, nil, RDF::FOAF.Person]).size
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
65
101
  @queryable.query([nil, nil, RDF::DOAP.Project]).size.should == 1
66
102
  end
67
103
 
@@ -69,23 +105,44 @@ share_as :RDF_Queryable do
69
105
  @queryable.query({}).size.should == File.readlines(@filename).size
70
106
  @queryable.query(:subject => @subject) .size.should == File.readlines(@filename).grep(/^<http:\/\/rubygems\.org\/gems\/rdf>/).size
71
107
  @queryable.query(:subject => @subject, :predicate => RDF::DOAP.name).size.should == 1
72
- @queryable.query(:subject => @subject, :predicate => RDF::DOAP.developer).size.should == @queryable.query(:object => RDF::FOAF.Person).size
108
+ #@queryable.query(:subject => @subject, :predicate => RDF::DOAP.developer).size.should == @queryable.query(:object => RDF::FOAF.Person).size # FIXME: assumes too much about the doap.nt data
73
109
  @queryable.query(:object => RDF::DOAP.Project).size.should == 1
74
110
  end
111
+ end
75
112
 
76
- it "should not alter a given hash argument" do
77
- query = {:subject => @subject, :predicate => RDF::DOAP.name, :object => RDF::FOAF.Person}
78
- original_query = query.dup
79
- result = @queryable.query(query)
80
- query.should == original_query
113
+ ##
114
+ # @see RDF::Queryable#query_pattern
115
+
116
+ it "should respond to #query_pattern" do
117
+ @queryable.should respond_to(:query_pattern)
118
+ end
119
+
120
+ context "#query_pattern when called" do
121
+ it "should require an argument" do
122
+ lambda { @queryable.send(:query_pattern) }.should raise_error(ArgumentError)
123
+ end
124
+
125
+ it "should call the given block" do
126
+ called = false
127
+ @queryable.send(:query_pattern, RDF::Query::Pattern.new) do |statement|
128
+ called = true
129
+ break
130
+ end
131
+ called.should be_true
132
+ end
133
+
134
+ it "should yield statements" do
135
+ @queryable.send(:query_pattern, RDF::Query::Pattern.new) do |statement|
136
+ statement.should be_a_statement
137
+ end
81
138
  end
82
139
  end
83
140
 
84
141
  ##
85
142
  # @see RDF::Queryable#first
86
143
 
87
- it "should support #first" do
88
- @queryable.respond_to?(:first).should be_true
144
+ it "should respond to #first" do
145
+ @queryable.should respond_to(:first)
89
146
  end
90
147
 
91
148
  context "#first" do
@@ -119,8 +176,8 @@ share_as :RDF_Queryable do
119
176
  ##
120
177
  # @see RDF::Queryable#first_subject
121
178
 
122
- it "should support #first_subject" do
123
- @queryable.respond_to?(:first_subject).should be_true
179
+ it "should respond to #first_subject" do
180
+ @queryable.should respond_to(:first_subject)
124
181
  end
125
182
 
126
183
  context "#first_subject" do
@@ -154,8 +211,8 @@ share_as :RDF_Queryable do
154
211
  ##
155
212
  # @see RDF::Queryable#first_predicate
156
213
 
157
- it "should support #first_predicate" do
158
- @queryable.respond_to?(:first_predicate).should be_true
214
+ it "should respond to #first_predicate" do
215
+ @queryable.should respond_to(:first_predicate)
159
216
  end
160
217
 
161
218
  context "#first_predicate" do
@@ -189,8 +246,8 @@ share_as :RDF_Queryable do
189
246
  ##
190
247
  # @see RDF::Queryable#first_object
191
248
 
192
- it "should support #first_object" do
193
- @queryable.respond_to?(:first_object).should be_true
249
+ it "should respond to #first_object" do
250
+ @queryable.should respond_to(:first_object)
194
251
  end
195
252
 
196
253
  context "#first_object" do
@@ -224,8 +281,8 @@ share_as :RDF_Queryable do
224
281
  ##
225
282
  # @see RDF::Queryable#first_literal
226
283
 
227
- it "should support #first_literal" do
228
- @queryable.respond_to?(:first_literal).should be_true
284
+ it "should respond to #first_literal" do
285
+ @queryable.should respond_to(:first_literal)
229
286
  end
230
287
 
231
288
  context "#first_literal" do
@@ -266,8 +323,8 @@ share_as :RDF_Queryable do
266
323
  ##
267
324
  # @see RDF::Queryable#first_value
268
325
 
269
- it "should support #first_value" do
270
- @queryable.respond_to?(:first_value).should be_true
326
+ it "should respond to #first_value" do
327
+ @queryable.should respond_to(:first_value)
271
328
  end
272
329
 
273
330
  context "#first_value" do