rod 0.6.2 → 0.6.3
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/.travis.yml +1 -0
- data/README.rdoc +10 -9
- data/Rakefile +15 -5
- data/changelog.txt +18 -0
- data/features/append.feature +0 -2
- data/features/basic.feature +7 -7
- data/features/collection_proxy.feature +140 -0
- data/features/flat_indexing.feature +9 -8
- data/features/{fred.feature → persistence.feature} +5 -8
- data/features/{assoc_indexing.feature → relationship_indexing.feature} +36 -0
- data/features/segmented_indexing.feature +6 -6
- data/features/steps/collection_proxy.rb +89 -0
- data/features/steps/model.rb +15 -3
- data/features/steps/rod.rb +1 -1
- data/features/support/mocha.rb +16 -0
- data/features/update.feature +263 -0
- data/lib/rod.rb +10 -2
- data/lib/rod/abstract_database.rb +49 -111
- data/lib/rod/abstract_model.rb +26 -6
- data/lib/rod/collection_proxy.rb +235 -34
- data/lib/rod/constants.rb +1 -1
- data/lib/rod/database.rb +5 -6
- data/lib/rod/exception.rb +1 -1
- data/lib/rod/index/base.rb +97 -0
- data/lib/rod/index/flat_index.rb +72 -0
- data/lib/rod/index/segmented_index.rb +100 -0
- data/lib/rod/model.rb +172 -185
- data/lib/rod/reference_updater.rb +85 -0
- data/lib/rod/utils.rb +29 -0
- data/rod.gemspec +4 -1
- data/tests/migration_create.rb +33 -12
- data/tests/migration_migrate.rb +24 -7
- data/tests/migration_model1.rb +5 -0
- data/tests/migration_model2.rb +36 -0
- data/tests/migration_verify.rb +49 -42
- data/tests/missing_class_create.rb +21 -0
- data/tests/missing_class_verify.rb +20 -0
- data/tests/properties_order_create.rb +16 -0
- data/tests/properties_order_verify.rb +17 -0
- data/tests/unit/abstract_database.rb +13 -0
- data/tests/unit/model_tests.rb +3 -3
- data/utils/convert_index.rb +1 -1
- metadata +62 -18
- data/lib/rod/segmented_index.rb +0 -85
@@ -18,19 +18,19 @@ Feature: Access to objects with segmented indices.
|
|
18
18
|
And I create a Caveman
|
19
19
|
And his name is 'Fred'
|
20
20
|
And his age is '25'
|
21
|
-
And his identifier is '
|
21
|
+
And his identifier is '111222333'
|
22
22
|
And his height is '1.86'
|
23
23
|
And I store him in the database
|
24
24
|
And I create another Caveman
|
25
25
|
And his name is 'Barney'
|
26
26
|
And his age is '26'
|
27
|
-
And his identifier is '
|
27
|
+
And his identifier is '111222444'
|
28
28
|
And his height is '1.67'
|
29
29
|
And I store him in the database
|
30
30
|
And I create another Caveman
|
31
31
|
And his name is 'Wilma'
|
32
32
|
And his age is '25'
|
33
|
-
And his identifier is '
|
33
|
+
And his identifier is '111222555'
|
34
34
|
And his height is '1.67'
|
35
35
|
And I store her in the database
|
36
36
|
And I reopen database for reading
|
@@ -40,9 +40,9 @@ Feature: Access to objects with segmented indices.
|
|
40
40
|
And there should be 1 Caveman with 'Barney' name
|
41
41
|
And there should be 2 Caveman(s) with '25' age
|
42
42
|
And there should be 1 Caveman with '26' age
|
43
|
-
And there should be 1 Caveman with '
|
44
|
-
And there should be 1 Caveman with '
|
45
|
-
And there should be 1 Caveman with '
|
43
|
+
And there should be 1 Caveman with '111222333' identifier
|
44
|
+
And there should be 1 Caveman with '111222444' identifier
|
45
|
+
And there should be 1 Caveman with '111222555' identifier
|
46
46
|
And there should be 2 Caveman(s) with '1.67' height
|
47
47
|
And there should be 1 Caveman with '1.86' height
|
48
48
|
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'mocha'
|
2
|
+
|
3
|
+
def create_item(index)
|
4
|
+
rod_id = index + 1
|
5
|
+
element = Rod::Model.new
|
6
|
+
element.expects(:rod_id).returns(rod_id).at_least(0)
|
7
|
+
Rod::Model.expects(:find_by_rod_id).with(rod_id).returns(element).at_least(0)
|
8
|
+
element
|
9
|
+
end
|
10
|
+
|
11
|
+
def create_collection(size,offset=0)
|
12
|
+
offset.upto(size-1).map do |index|
|
13
|
+
create_item(index)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# Given the initial size of the collection proxy is 10
|
18
|
+
Given /^the initial size of the collection proxy is (\d+)$/ do |size|
|
19
|
+
@offset = 0
|
20
|
+
size = size.to_i
|
21
|
+
@array = create_collection(size,@offset)
|
22
|
+
db = Object.new
|
23
|
+
@array.each.with_index do |element,index|
|
24
|
+
db.expects(:join_index).with(0,index).returns(element).at_least(0)
|
25
|
+
end
|
26
|
+
@proxy = Rod::CollectionProxy.new(@array.size,db,@offset,Rod::Model)
|
27
|
+
@offset += size
|
28
|
+
end
|
29
|
+
|
30
|
+
#When I append a new item 10 times
|
31
|
+
When /^I append a new item(?: (\d+) times)?$/ do |count|
|
32
|
+
count = count && count.to_i || 1
|
33
|
+
count.times do |index|
|
34
|
+
item = create_item(@offset)
|
35
|
+
@proxy << item
|
36
|
+
@array << item
|
37
|
+
@offset += 1
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
#When I insert a new item at position 1
|
42
|
+
When /^I insert a new item at position (\d+)(?: (\d+) times)?$/ do |position,count|
|
43
|
+
(count && count.to_i || 1).times do
|
44
|
+
item = create_item(@offset)
|
45
|
+
@proxy.insert(position.to_i,item)
|
46
|
+
@array.insert(position.to_i,item)
|
47
|
+
@offset += 1
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
#When I insert an item with rod_id = 1 at position 1
|
52
|
+
When /^I insert an item with rod_id = (\d+) at position (\d+)(?: (\d+) times)?$/ do |rod_id,position,count|
|
53
|
+
(count && count.to_i || 1).times do
|
54
|
+
item = Rod::Model.find_by_rod_id(rod_id.to_i)
|
55
|
+
@proxy.insert(position.to_i,item)
|
56
|
+
@array.insert(position.to_i,item)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
#When I delete an item at position 1
|
61
|
+
When /^I delete an item at position (\d+)(?: (\d+) times)?$/ do |position,count|
|
62
|
+
(count && count.to_i || 1).times do
|
63
|
+
@proxy.delete_at(position.to_i)
|
64
|
+
@array.delete_at(position.to_i)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
#When I delete an item with rod_id = 1
|
69
|
+
When /^I delete an item with rod_id = (\d+)$/ do |rod_id|
|
70
|
+
item = Rod::Model.find_by_rod_id(rod_id.to_i)
|
71
|
+
@proxy.delete(item)
|
72
|
+
@array.delete(item)
|
73
|
+
end
|
74
|
+
|
75
|
+
#Then the size of the collection proxy should be 20
|
76
|
+
Then /^the size of the collection proxy should be (\d+)$/ do |size|
|
77
|
+
@proxy.size.should == size.to_i
|
78
|
+
end
|
79
|
+
|
80
|
+
#Then the collection proxy should be valid
|
81
|
+
Then /^the collection proxy should behave like an array$/ do
|
82
|
+
@proxy.to_a.should == @array
|
83
|
+
end
|
84
|
+
|
85
|
+
#Then the collection proxy should be empty
|
86
|
+
Then /^the collection proxy should be empty$/ do
|
87
|
+
@proxy.to_a.should be_empty
|
88
|
+
end
|
89
|
+
|
data/features/steps/model.rb
CHANGED
@@ -63,6 +63,10 @@ def get_position(position)
|
|
63
63
|
1
|
64
64
|
when "third"
|
65
65
|
2
|
66
|
+
when "fourth"
|
67
|
+
3
|
68
|
+
when "fifth"
|
69
|
+
4
|
66
70
|
when "last"
|
67
71
|
-1
|
68
72
|
when Fixnum
|
@@ -176,7 +180,7 @@ When /^I create and store the following (\w+)\(s\):$/ do |class_name,table|
|
|
176
180
|
end
|
177
181
|
|
178
182
|
# When his name is 'Fred' (multiplied 300 times)
|
179
|
-
When /^(?:his|her|its) (\w+) is '([^']*)'(?: multiplied (\d+) times)?$/ do |field,value,multiplier|
|
183
|
+
When /^(?:his|her|its) (\w+) is '([^']*)'(?: multiplied (\d+) times)?(?: now)?$/ do |field,value,multiplier|
|
180
184
|
value = get_value(value)
|
181
185
|
if multiplier
|
182
186
|
value *= multiplier.to_i
|
@@ -201,6 +205,7 @@ When /^(his|her|its) (\w+) contain nil$/ do |ignore,field|
|
|
201
205
|
@instance.send("#{field}".to_sym) << nil
|
202
206
|
end
|
203
207
|
|
208
|
+
# When I store him in the database 10000 times
|
204
209
|
When /^I store (him|her|it) in the database( (\d+) times)?$/ do |ignore,times,count|
|
205
210
|
if times
|
206
211
|
count.to_i.times do |index|
|
@@ -224,13 +229,20 @@ When /^I remember the (\w+) (\w+)$/ do |position,class_name|
|
|
224
229
|
@remembered = get_instance(class_name,position)
|
225
230
|
end
|
226
231
|
|
232
|
+
# When I remove the first of his books
|
233
|
+
When /^I remove the (\w+) of (?:his|her|its) (\w+)$/ do |position,property|
|
234
|
+
@instance.send(property).delete_at(get_position(position))
|
235
|
+
end
|
236
|
+
|
227
237
|
################################################################
|
228
238
|
# Then
|
229
239
|
################################################################
|
230
|
-
Then
|
240
|
+
# Then there should be 5 User(s)
|
241
|
+
Then /^there should be (\d+) (\w+)(?:\([^)]*\))?$/ do |count,class_name|
|
231
242
|
get_class(class_name).count.should == count.to_i
|
232
243
|
end
|
233
244
|
|
245
|
+
# Then the name of the first User should be 'John'
|
234
246
|
Then /^the (\w+) of the (\w+) ([A-Z]\w+) should be '([^']*)'$/ do |field, position, class_name,value|
|
235
247
|
get_instance(class_name,position).send(field.to_sym).should == get_value(value)
|
236
248
|
end
|
@@ -347,7 +359,7 @@ Then /^there should exist a(?:n)? (\w+) with '([^']*)' (\w+)$/ do |class_name,va
|
|
347
359
|
end
|
348
360
|
|
349
361
|
# Then there should be 5 User(s) with the first Dog as dog
|
350
|
-
Then /^there should be (\d+) (\w+)(?:\([^)]*\))? with the (\w+) (\w+) as (\w+)$/ do |count,class1,position,class2,assoc|
|
362
|
+
Then /^there should be (\d+) (\w+)(?:\([^)]*\))? with the (\w+) (\w+) (?:as|(?:in their)) (\w+)$/ do |count,class1,position,class2,assoc|
|
351
363
|
get_class(class1).send("find_all_by_#{assoc}",get_instance(class2,position)).count.should == count.to_i
|
352
364
|
end
|
353
365
|
|
data/features/steps/rod.rb
CHANGED
@@ -42,7 +42,7 @@ Given /^the class space is cleared$/ do
|
|
42
42
|
end
|
43
43
|
|
44
44
|
# Should be split
|
45
|
-
When /^I reopen (\w+)( for reading)?( in (\w+))?$/ do |db_name,reading,location,location_name|
|
45
|
+
When /^I reopen (?:the )?(\w+)( for reading)?( in (\w+))?$/ do |db_name,reading,location,location_name|
|
46
46
|
if location
|
47
47
|
db_location = location_name
|
48
48
|
else
|
@@ -0,0 +1,263 @@
|
|
1
|
+
Feature: Update of the database
|
2
|
+
This feature defines the update model of ROD.
|
3
|
+
Background:
|
4
|
+
Given the library works in development mode
|
5
|
+
And the class space is cleared
|
6
|
+
And the model is connected with the default database
|
7
|
+
And a class Book has a title field of type string with flat index
|
8
|
+
And a class Automobile has a name field of type string
|
9
|
+
And a class User has a name field of type string with flat index
|
10
|
+
And a class User has a surname field of type string with flat index
|
11
|
+
And a class User has a login field of type string with flat index
|
12
|
+
And a class User has an age field of type integer with flat index
|
13
|
+
And a class User has an height field of type float with flat index
|
14
|
+
And a class User has a sex field of type object with flat index
|
15
|
+
And a class User has one automobile with flat index
|
16
|
+
And a class User has many books with flat index
|
17
|
+
And a class User has one polymorphic item with flat index
|
18
|
+
And a class User has many polymorphic tools with flat index
|
19
|
+
|
20
|
+
Scenario: update of fields
|
21
|
+
When database is created
|
22
|
+
And I create and store the following User(s):
|
23
|
+
| name | surname | login | age | sex | height |
|
24
|
+
| John | Smith | john | 12 | :male | 1.30 |
|
25
|
+
| Lara | Croft | lara | 23 | :female | 2.00 |
|
26
|
+
| Adam | Parker | adam | 17 | :male | -1.00 |
|
27
|
+
| Adam | | noob1 | 33 | :male | 1.50 |
|
28
|
+
| | | noob2 | -1 | | 0 |
|
29
|
+
And I reopen database
|
30
|
+
And I fetch the first User
|
31
|
+
And his name is 'Jonhy' now
|
32
|
+
And his name is 'Johnny' now
|
33
|
+
And his login is 'johnny' now
|
34
|
+
And his age is '13' now
|
35
|
+
And his height is '1.50' now
|
36
|
+
And I store him in the database
|
37
|
+
And I fetch the third User
|
38
|
+
And his name is 'Alen' now
|
39
|
+
And his login is 'alen' now
|
40
|
+
And his height is '1.51' now
|
41
|
+
And I store him in the database
|
42
|
+
And I fetch the fourth User
|
43
|
+
And her name is 'Anna' now
|
44
|
+
And her name is 'Nina' now
|
45
|
+
And her login is 'nina' now
|
46
|
+
And her age is '34' now
|
47
|
+
And her sex is ':female' now
|
48
|
+
And I store her in the database
|
49
|
+
And I fetch the fifth User
|
50
|
+
And her name is 'Anna' now
|
51
|
+
And her login is 'anna' now
|
52
|
+
And her age is '1' now
|
53
|
+
And her sex is ':female' now
|
54
|
+
And her height is '-1.51' now
|
55
|
+
And I store her in the database
|
56
|
+
And I reopen the database for reading
|
57
|
+
Then there should be 5 User(s)
|
58
|
+
And the name of the first User should be 'Johnny'
|
59
|
+
And the surname of the first User should be 'Smith'
|
60
|
+
And the login of the first User should be 'johnny'
|
61
|
+
And the age of the first User should be '13'
|
62
|
+
And the sex of the first User should be ':male'
|
63
|
+
And the height of the first User should be '1.50'
|
64
|
+
And the name of the second User should be 'Lara'
|
65
|
+
And the surname of the second User should be 'Croft'
|
66
|
+
And the login of the second User should be 'lara'
|
67
|
+
And the age of the second User should be '23'
|
68
|
+
And the sex of the second User should be ':female'
|
69
|
+
And the height of the second User should be '2.00'
|
70
|
+
And the name of the third User should be 'Alen'
|
71
|
+
And the login of the third User should be 'alen'
|
72
|
+
And the age of the third User should be '17'
|
73
|
+
And the sex of the third User should be ':male'
|
74
|
+
And the height of the third User should be '1.51'
|
75
|
+
And the name of the fourth User should be 'Nina'
|
76
|
+
And the surname of the fourth User should be ''
|
77
|
+
And the login of the fourth User should be 'nina'
|
78
|
+
And the age of the fourth User should be '34'
|
79
|
+
And the sex of the fourth User should be ':female'
|
80
|
+
And the height of the fourth User should be '1.50'
|
81
|
+
And the name of the fifth User should be 'Anna'
|
82
|
+
And the surname of the fifth User should be ''
|
83
|
+
And the login of the fifth User should be 'anna'
|
84
|
+
And the age of the fifth User should be '1'
|
85
|
+
And the sex of the fifth User should be ':female'
|
86
|
+
And the height of the fifth User should be '-1.51'
|
87
|
+
|
88
|
+
Scenario: update of has one relatinships
|
89
|
+
When database is created
|
90
|
+
And I create a Book
|
91
|
+
And its title is 'Gonne with the wind'
|
92
|
+
And I store it in the database
|
93
|
+
And I create another Book
|
94
|
+
And its title is 'Thus Spoke Zarathustra'
|
95
|
+
And I store it in the database
|
96
|
+
And I create another Book
|
97
|
+
And its title is 'Encyclopedia'
|
98
|
+
And I store it in the database
|
99
|
+
And I create an Automobile
|
100
|
+
And its name is 'BMW 330'
|
101
|
+
And I store it in the database
|
102
|
+
And I create another Automobile
|
103
|
+
And its name is 'Daewoo Tico'
|
104
|
+
And I store it in the database
|
105
|
+
And I create a User
|
106
|
+
And his automobile is the first Automobile created
|
107
|
+
And his item is the second Book created
|
108
|
+
And I store him in the database
|
109
|
+
And I create another User
|
110
|
+
And his automobile is the second Automobile created
|
111
|
+
And his item is the first Book created
|
112
|
+
And I store him in the database
|
113
|
+
# reopen
|
114
|
+
And I reopen the database
|
115
|
+
And I fetch the first User
|
116
|
+
And his automobile is the second Automobile created
|
117
|
+
And his item is the first Book created
|
118
|
+
And his item is the third Book created
|
119
|
+
And I store him in the database
|
120
|
+
And I fetch the second User
|
121
|
+
And his item is the second Book created
|
122
|
+
And his item is the first Book created
|
123
|
+
And I store him in the database
|
124
|
+
And I reopen the database for reading
|
125
|
+
Then there should be 2 User(s)
|
126
|
+
And the automobile of the first User should be equal to the second Automobile
|
127
|
+
And the item of the first User should be equal to the third Book
|
128
|
+
And the automobile of the second User should be equal to the second Automobile
|
129
|
+
And the item of the second User should be equal to the first Book
|
130
|
+
|
131
|
+
Scenario: update of has many relatinships
|
132
|
+
When database is created
|
133
|
+
And I create a Book
|
134
|
+
And its title is 'Gonne with the wind'
|
135
|
+
And I store it in the database
|
136
|
+
And I create another Book
|
137
|
+
And its title is 'Thus Spoke Zarathustra'
|
138
|
+
And I store it in the database
|
139
|
+
And I create another Book
|
140
|
+
And its title is 'Encyclopedia'
|
141
|
+
And I store it in the database
|
142
|
+
And I create an Automobile
|
143
|
+
And its name is 'BMW 330'
|
144
|
+
And I store it in the database
|
145
|
+
And I create another Automobile
|
146
|
+
And its name is 'Daewoo Tico'
|
147
|
+
And I store it in the database
|
148
|
+
And I create a User
|
149
|
+
And his books contain the first Book created
|
150
|
+
And his books contain the second Book created
|
151
|
+
And his books contain the third Book created
|
152
|
+
And his tools contain the third Book created
|
153
|
+
And his tools contain the first Automobile created
|
154
|
+
And I store him in the database
|
155
|
+
And I create another User
|
156
|
+
And I store him in the database
|
157
|
+
# reopen
|
158
|
+
And I reopen the database
|
159
|
+
And I fetch the first User
|
160
|
+
And I remove the first of his books
|
161
|
+
And I remove the second of his books
|
162
|
+
And I remove the second of his tools
|
163
|
+
And I store him in the database
|
164
|
+
And I fetch the second User
|
165
|
+
And his books contain the first Book created
|
166
|
+
And his tools contain the second Automobile created
|
167
|
+
And his tools contain the first Automobile created
|
168
|
+
And I remove the second of his tools
|
169
|
+
And I store him in the database
|
170
|
+
And I reopen the database for reading
|
171
|
+
Then there should be 2 User(s)
|
172
|
+
And the first User should have 1 books
|
173
|
+
And the first of books of the first User should be equal to the second Book
|
174
|
+
And the first User should have 1 tools
|
175
|
+
And the first of tools of the first User should be equal to the third Book
|
176
|
+
And the second User should have 1 books
|
177
|
+
And the first of books of the second User should be equal to the first Book
|
178
|
+
And the second User should have 1 tools
|
179
|
+
And the first of tools of the second User should be equal to the second Automobile
|
180
|
+
|
181
|
+
Scenario: update with indexing
|
182
|
+
When database is created
|
183
|
+
And I create a Book
|
184
|
+
And its title is 'Gonne with the wind'
|
185
|
+
And I store it in the database
|
186
|
+
And I create another Book
|
187
|
+
And its title is 'Thus Spoke Zarathustra'
|
188
|
+
And I store it in the database
|
189
|
+
And I create another Book
|
190
|
+
And its title is 'Encyclopedia'
|
191
|
+
And I store it in the database
|
192
|
+
And I create an Automobile
|
193
|
+
And its name is 'BMW 330'
|
194
|
+
And I store it in the database
|
195
|
+
And I create another Automobile
|
196
|
+
And its name is 'Daewoo Tico'
|
197
|
+
And I store it in the database
|
198
|
+
And I create a User
|
199
|
+
And his name is 'Johnny'
|
200
|
+
And his login is 'johnny'
|
201
|
+
And his age is '13'
|
202
|
+
And his height is '1.50'
|
203
|
+
And his sex is ':male'
|
204
|
+
And his automobile is the first Automobile created
|
205
|
+
And his item is the first Book created
|
206
|
+
And his books contain the first Book created
|
207
|
+
And his tools contain the first Automobile created
|
208
|
+
And I store him in the database
|
209
|
+
And I create another User
|
210
|
+
And her name is 'Anna'
|
211
|
+
And her login is 'anna'
|
212
|
+
And her age is '23'
|
213
|
+
And her height is '1.70'
|
214
|
+
And her sex is ':female'
|
215
|
+
And her automobile is the second Automobile created
|
216
|
+
And her item is the second Book created
|
217
|
+
And her books contain the second Book created
|
218
|
+
And her books contain the third Book created
|
219
|
+
And her tools contain the second Automobile created
|
220
|
+
And I store her in the database
|
221
|
+
# reopen
|
222
|
+
And I reopen the database
|
223
|
+
And I fetch the first User
|
224
|
+
And her sex is ':female' now
|
225
|
+
And her name is 'Joanna' now
|
226
|
+
And her login is 'joanna' now
|
227
|
+
And her age is '23' now
|
228
|
+
And her height is '1.80' now
|
229
|
+
And her automobile is the second Automobile created
|
230
|
+
And her item is the second Book created
|
231
|
+
And I remove the first of her books
|
232
|
+
And I remove the first of her tools
|
233
|
+
And her books contain the second Book created
|
234
|
+
And her tools contain the second Automobile created
|
235
|
+
And I store her in the database
|
236
|
+
And I fetch the second User
|
237
|
+
And her automobile is the first Automobile created
|
238
|
+
And I remove the first of her books
|
239
|
+
And I store her in the database
|
240
|
+
And I reopen the database for reading
|
241
|
+
Then there should be 2 User(s)
|
242
|
+
And there should be 1 User(s) with 'Joanna' name
|
243
|
+
And there should be 0 User(s) with 'Johnny' name
|
244
|
+
And there should be 1 User(s) with 'Anna' name
|
245
|
+
And there should be 1 User(s) with 'joanna' login
|
246
|
+
And there should be 0 User(s) with 'johnny' login
|
247
|
+
And there should be 1 User(s) with 'anna' login
|
248
|
+
And there should be 2 User(s) with '23' age
|
249
|
+
And there should be 0 User(s) with '13' age
|
250
|
+
And there should be 1 User(s) with '1.80' height
|
251
|
+
And there should be 0 User(s) with '1.50' height
|
252
|
+
And there should be 1 User(s) with '1.70' height
|
253
|
+
And there should be 2 User(s) with ':female' sex
|
254
|
+
And there should be 0 User(s) with ':male' sex
|
255
|
+
And there should be 1 User with the first Automobile as automobile
|
256
|
+
And there should be 1 User with the second Automobile as automobile
|
257
|
+
And there should be 0 User(s) with the first Book as item
|
258
|
+
And there should be 2 User(s) with the second Book as item
|
259
|
+
And there should be 0 User(s) with the first Automobile in their tools
|
260
|
+
And there should be 2 User(s) with the second Automobile in their tools
|
261
|
+
And there should be 0 User with the first Book in their books
|
262
|
+
And there should be 1 User with the second Book in their books
|
263
|
+
And there should be 1 User with the third Book in their books
|