Rubernate 0.1.0
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/README +30 -0
- data/db/mysql.sql +35 -0
- data/db/oracle.sql +29 -0
- data/lib/rubernate/callbacks.rb +70 -0
- data/lib/rubernate/entity.rb +85 -0
- data/lib/rubernate/impl/dbigeneric.rb +286 -0
- data/lib/rubernate/impl/dbimysql.rb +28 -0
- data/lib/rubernate/impl/dbioracle.rb +29 -0
- data/lib/rubernate/impl/memory.rb +147 -0
- data/lib/rubernate/mixins.rb +91 -0
- data/lib/rubernate/peer.rb +70 -0
- data/lib/rubernate/queries.rb +444 -0
- data/lib/rubernate/runtime.rb +215 -0
- data/lib/rubernate.rb +127 -0
- data/tests/README +16 -0
- data/tests/all_tests.rb +12 -0
- data/tests/config.rb +34 -0
- data/tests/rubernate/callbacks_test.rb +120 -0
- data/tests/rubernate/fixtures.rb +27 -0
- data/tests/rubernate/impl/dbigeneric_stub.rb +635 -0
- data/tests/rubernate/impl/dbimysql_test.rb +19 -0
- data/tests/rubernate/impl/dbioracle_test.rb +19 -0
- data/tests/rubernate/impl/memory_test.rb +188 -0
- data/tests/rubernate/queries_test.rb +176 -0
- data/tests/rubernate/rubernate_test.rb +326 -0
- data/tests/rubernate/utils_test.rb +42 -0
- metadata +74 -0
@@ -0,0 +1,188 @@
|
|
1
|
+
$:.unshift(File.expand_path('../../..', __FILE__)) unless
|
2
|
+
$:.include?(File.expand_path('../../..', __FILE__))
|
3
|
+
|
4
|
+
require 'rubernate/fixtures'
|
5
|
+
|
6
|
+
class Rubernate::Memory::RuntimeTest < Test::Unit::TestCase
|
7
|
+
include Rubernate
|
8
|
+
include Memory
|
9
|
+
include FixtureClasses
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@factory = RuntimeFactory.new
|
13
|
+
@runtime = @factory.create
|
14
|
+
Rubernate.runtime_factory = @factory
|
15
|
+
end
|
16
|
+
|
17
|
+
# Runtime Interface Tests
|
18
|
+
def test_integration
|
19
|
+
k1, k2 = nil
|
20
|
+
Rubernate.session {|runtime|
|
21
|
+
o1, o2 = C1.new.attach, C2.new.attach
|
22
|
+
o1.p1, o2.p1 = 'o1.p1', o1
|
23
|
+
k1, k2 = o1.primary_key, o2.primary_key
|
24
|
+
}
|
25
|
+
Rubernate.session {|runtime|
|
26
|
+
o1, o2 = runtime.find_by_pk(k1), runtime.find_by_pk(k2)
|
27
|
+
assert_equal C1, o1.class
|
28
|
+
assert_equal 'o1.p1', o1.p1
|
29
|
+
assert_equal 'o1.p1', o2.p1.p1
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
# Interface Tests
|
34
|
+
def test_load_by_pk
|
35
|
+
assert_nil @runtime.load_by_pk(1)
|
36
|
+
o, o.peer = C4.new(1), Peer.new
|
37
|
+
@runtime.save o
|
38
|
+
o = @runtime.load_by_pk(1)
|
39
|
+
assert_equal C4, o.class
|
40
|
+
assert_equal 1, o.primary_key
|
41
|
+
assert_nil @runtime.load_by_pk(2)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_load_by_query_all
|
45
|
+
o1, o1.peer, o1.p1 = C1.new, Peer.new, 'o1.p1'
|
46
|
+
o2, o2.peer, o2.p1, o2.p2 = C2.new, Peer.new, 'o2.p1', o1
|
47
|
+
@runtime.create o1
|
48
|
+
@runtime.create o2
|
49
|
+
result = @runtime.load_by_query "all"
|
50
|
+
assert_equal 2, result.size
|
51
|
+
l1 = result.find {|item| item.class == C1}
|
52
|
+
l2 = result.find {|item| item.class == C2}
|
53
|
+
assert_not_nil l1
|
54
|
+
assert_not_nil l2
|
55
|
+
assert_equal o1.primary_key, l1.primary_key
|
56
|
+
assert_equal o2.primary_key, l2.primary_key
|
57
|
+
assert_equal 'o1.p1', l1.p1
|
58
|
+
assert_equal 'o2.p1', l2.p1
|
59
|
+
assert_equal l1, l2.p2
|
60
|
+
assert_equal 'o1.p1', l2.p2.p1
|
61
|
+
assert l1.equal?(l2.p2)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_create
|
65
|
+
o, o.peer = C2.new, Peer.new
|
66
|
+
assert_nil o.primary_key
|
67
|
+
@runtime.create o
|
68
|
+
assert_not_nil o.primary_key
|
69
|
+
assert_not_nil o.peer
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_create_find
|
73
|
+
o, o.p1 = C2.new, 'o.p1'
|
74
|
+
@runtime.create o
|
75
|
+
o = @runtime.find_by_pk o.primary_key
|
76
|
+
assert_equal 'o.p1', o.p1
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_load_created
|
80
|
+
o, o.peer = C2.new, Peer.new
|
81
|
+
@runtime.create o
|
82
|
+
o = @runtime.load_by_pk o.primary_key
|
83
|
+
assert_not_nil o
|
84
|
+
assert !o.peer.dirty?
|
85
|
+
assert !o.dirty?
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_create_dirty
|
89
|
+
o1, o1.peer = C2.new, Peer.new
|
90
|
+
@runtime.create o1
|
91
|
+
assert_not_nil o1.peer
|
92
|
+
assert !o1.peer.dirty?
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_save
|
96
|
+
o, o.peer = C4.new(1), Peer.new
|
97
|
+
o.p1, o.p2 = C4.new(2), {'k1' => C4.new(3)}
|
98
|
+
@runtime.save o
|
99
|
+
o = @runtime.load_by_pk 1
|
100
|
+
assert_not_nil o
|
101
|
+
assert_not_nil o.peer
|
102
|
+
assert_equal 2, o.peer.size
|
103
|
+
assert_equal 2, o.p1.primary_key
|
104
|
+
assert_equal 3, o.p2['k1'].primary_key
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_delete
|
108
|
+
o, o.peer = C1.new, Peer.new
|
109
|
+
@runtime.create o
|
110
|
+
pk = o.primary_key
|
111
|
+
@runtime.delete o
|
112
|
+
assert_nil @runtime.load_by_pk(pk)
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
# Internal Tests
|
117
|
+
def test_reference_eq
|
118
|
+
r1, r2, r3 = ref(1, C1), ref(1, C1), ref(1, C2)
|
119
|
+
assert_equal r1, r1
|
120
|
+
assert_equal r1, r2
|
121
|
+
assert_not_equal r1, r3
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_save_peer
|
125
|
+
obj, obj.peer = C4.new(1), Peer.new
|
126
|
+
obj.p1, obj.p2 = 2, [C4.new(2)]
|
127
|
+
data = @runtime.save_peer obj.peer
|
128
|
+
assert_equal({:p1 => 2, :p2 => [ref(2, C4)]}, data)
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_save_param_simple
|
132
|
+
p = @runtime.save_param "test"
|
133
|
+
assert_equal "test", p
|
134
|
+
|
135
|
+
p = @runtime.save_param 1
|
136
|
+
assert_equal 1, p
|
137
|
+
|
138
|
+
p = @runtime.save_param C4.new(3)
|
139
|
+
assert_equal Reference, p.class
|
140
|
+
assert_equal 3, p.primary_key
|
141
|
+
assert_equal C4, p.object_class
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_save_param_array
|
145
|
+
p = @runtime.save_param [C4.new(1), C4.new(2)]
|
146
|
+
assert_equal [ref(1, C4), ref(2, C4)], p
|
147
|
+
p = @runtime.save_param []
|
148
|
+
assert_equal [], p
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_save_param_hash
|
152
|
+
p = @runtime.save_param('k1' => C4.new(1), 2 => C4.new(2))
|
153
|
+
assert_equal({'k1' => ref(1, C4), 2 => ref(2, C4)}, p)
|
154
|
+
assert_not_equal({'k1' => ref(2, C4), 2 => ref(2, C4)}, p)
|
155
|
+
p = @runtime.save_param({})
|
156
|
+
assert_equal({}, p)
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_load_peer_simple
|
160
|
+
peer = @runtime.load_peer(:p1 => 2)
|
161
|
+
assert_equal 1, peer.size
|
162
|
+
assert_equal 2, peer[:p1]
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_load_peer_hash
|
166
|
+
peer = @runtime.load_peer(:p1 => 2, :p2 => {'key', ref(3, C1)})
|
167
|
+
assert_equal 1, peer[:p2].size
|
168
|
+
assert_equal C1, peer[:p2]['key'].class
|
169
|
+
assert_equal 3, peer[:p2]['key'].primary_key
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_load_peer_array
|
173
|
+
peer = @runtime.load_peer(:p1 => 2, :p2 => [ref(3, C1)])
|
174
|
+
assert_equal 1, peer[:p2].size
|
175
|
+
assert_equal C1, peer[:p2][0].class
|
176
|
+
assert_equal 3, peer[:p2][0].primary_key
|
177
|
+
end
|
178
|
+
|
179
|
+
def test_find_by_pk_dirty
|
180
|
+
pk = nil
|
181
|
+
Rubernate.session {o = C1.new.attach; o.p1 = 'v'; pk = o.primary_key}
|
182
|
+
Rubernate.session {o = find_by_pk pk; assert !o.dirty?; assert_equal 'v', o.p1}
|
183
|
+
end
|
184
|
+
|
185
|
+
def ref pk, klass
|
186
|
+
Reference.new pk, klass
|
187
|
+
end
|
188
|
+
end
|
@@ -0,0 +1,176 @@
|
|
1
|
+
$:.unshift(File.expand_path('../..', __FILE__)) unless
|
2
|
+
$:.include?(File.expand_path('../..', __FILE__))
|
3
|
+
|
4
|
+
require 'rubernate/fixtures'
|
5
|
+
|
6
|
+
class Rubernate::QueriesGenericTest < Test::Unit::TestCase
|
7
|
+
include Rubernate::Queries
|
8
|
+
include FixtureClasses
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@factory = Factory.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def query *q_text, &q_block
|
15
|
+
if block_given?
|
16
|
+
@factory.query(&q_block)
|
17
|
+
else
|
18
|
+
@factory.query q_text[0]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def once str, substr
|
23
|
+
lidx, ridx = str.index(substr), str.rindex(substr)
|
24
|
+
lidx and lidx == ridx
|
25
|
+
end
|
26
|
+
|
27
|
+
def assert_once string, tokens
|
28
|
+
tokens = [tokens] unless tokens.is_a? Array
|
29
|
+
for token in tokens
|
30
|
+
assert once(string, token), "'#{token}' must occurse only once in \n'#{string}'"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_query_simplest
|
35
|
+
q = query 'Select :o; Where o.p1.int == 1'
|
36
|
+
sql = q.to_sql.downcase
|
37
|
+
assert_once sql, [ 'select o_.* from', 'r_objects o_', 'r_params o_p1',
|
38
|
+
'o_.object_pk = o_p1.object_pk', 'o_p1.name = \'p1\'']
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_query_join_by_int
|
42
|
+
q = query "Select :o, :p; Where(o.p1.int == p.p2.int)"
|
43
|
+
sql = q.to_sql.downcase
|
44
|
+
assert_once sql, [ 'r_objects p_', 'r_params p_p2', 'r_objects o_', 'r_params o_p1',
|
45
|
+
'o_.object_pk = o_p1.object_pk', 'p_.object_pk = p_p2.object_pk',
|
46
|
+
'o_p1.int_value = p_p2.int_value', 'o_p1.name = \'p1\'',
|
47
|
+
'p_p2.name = \'p2\'' ]
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_query_filter_by_int
|
51
|
+
q = query {Select :o; Where(o.p1.int == 1)}
|
52
|
+
sql = q.to_sql.downcase
|
53
|
+
assert_once sql, ['o_p1.int_value = 1', 'o_p1.name = \'p1\'']
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_query_filter_by_nil
|
57
|
+
q = query 'Select :o; Where(o.p1.int.is_nil)'
|
58
|
+
sql = q.to_sql.downcase
|
59
|
+
assert_once sql, ['o_p1.int_value is null', 'o_p1.name = \'p1\'']
|
60
|
+
q = query 'Select :o; Where(o.p1.int.is_not_nil)'
|
61
|
+
sql = q.to_sql.downcase
|
62
|
+
assert_once sql, ['o_p1.int_value is not null']
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_query_and
|
66
|
+
q = query 'Select :o; Where And(o.p1.int == 1, o.p2.int == 2)'
|
67
|
+
sql = q.to_sql.downcase
|
68
|
+
assert_once sql, ['o_p1.int_value = 1', 'o_.object_pk = o_p2.object_pk']
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_query_less_greater
|
72
|
+
q = query 'Select :o; Where And(o.p1.int < 1, o.p2.int > 2)'
|
73
|
+
sql = q.to_sql.downcase
|
74
|
+
assert_once sql, ['o_p1.int_value < 1', 'o_p2.int_value > 2']
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_query_or
|
78
|
+
q = query 'Select :o; Where (Or o.p1.int == 1, o.p2.int == 2)'
|
79
|
+
sql = q.to_sql.downcase
|
80
|
+
assert_once sql, ['o_p1.int_value = 1', 'o_p1.int_value = 1', 'or']
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_query_and_or
|
84
|
+
q = query 'Select :o; Where Or((And o.p1.int == 1, o.p2.int == 2), (o.p1.int == 3))'
|
85
|
+
sql = q.to_sql.downcase
|
86
|
+
assert_once sql, ['o_p1.int_value = 1', 'o_p2.int_value = 2', 'o_p1.int_value = 3', 'or']
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_query_ref_equality
|
90
|
+
q = query 'Select :o, :t; Where Or(o.p1 == t, t.p2.int > 10)'
|
91
|
+
sql = q.to_sql.downcase
|
92
|
+
assert_once sql, 'o_p1.ref_value = t_.object_pk'
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_query_is_int
|
96
|
+
q = query {Select :o; Where o.p1.is_int}
|
97
|
+
sql = q.to_sql.downcase
|
98
|
+
assert_once sql, 'o_p1.flags = 1'
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_array_index
|
102
|
+
q = query {Select :o, :t; Where(o.p[3] == t)}
|
103
|
+
sql = q.to_sql.downcase
|
104
|
+
assert_once sql, ['o_.object_pk = o_p.object_pk', 'o_p.int_value = 3',
|
105
|
+
'o_p.ref_value = t_.object_pk']
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_array_param_index
|
109
|
+
q = query {Select :o, :t; Where(o.p[:index] == t)}
|
110
|
+
sql = q.to_sql.downcase
|
111
|
+
assert_once sql, ['o_.object_pk = o_p.object_pk', 'o_p.int_value = ?',
|
112
|
+
'o_p.ref_value = t_.object_pk']
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_not_expr
|
116
|
+
q = query {Select :o; Where(Not(o.p.int == 1))}
|
117
|
+
sql = q.to_sql.downcase
|
118
|
+
assert_once sql, 'not (o_p.int_value = 1)'
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_markers
|
122
|
+
q = query {Select :o; Where(o.p1.int == :v1, o.p2 == :r2)}
|
123
|
+
sql = q.to_sql.downcase
|
124
|
+
assert_once sql, ['o_p1.int_value = ?', 'o_p2.ref_value = ?']
|
125
|
+
assert_equal [:v1, :r2], q.markers
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_no_markers
|
129
|
+
q = query {Select :o; Where(o.p1.int == 1)}
|
130
|
+
assert_equal [], q.markers
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_class_equal
|
134
|
+
q = query {Select :o; Where(o.klass == C1)}
|
135
|
+
sql = q.to_sql
|
136
|
+
assert_once sql, ['r_objects o', 'o_.object_class = \'FixtureClasses::C1\'']
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_expr_in
|
140
|
+
q = query {Select :o; Where(In(o.p1.int, [1, 2, 3]))}
|
141
|
+
sql = q.to_sql.downcase
|
142
|
+
assert_once sql, 'o_p1.int_value in (1, 2, 3)'
|
143
|
+
end
|
144
|
+
|
145
|
+
def test_order_by
|
146
|
+
q = query {Select :o; Where o.klass == C1; OrderBy o.p1.int}
|
147
|
+
sql = q.to_sql.downcase
|
148
|
+
assert_once sql, 'order by o_p1.int_value'
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_in_subclasses
|
152
|
+
q = query 'Select :o; Where In(o.klass, FixtureClasses::C1.subclasses)'
|
153
|
+
assert_once q.to_sql, %w{o_.object_class FixtureClasses::C2 FixtureClasses::C4}
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_derived
|
157
|
+
q = query 'Select :o; Where o.derived(FixtureClasses::C1)'
|
158
|
+
q.to_sql
|
159
|
+
assert_once q.to_sql, %w{FixtureClasses::C1 FixtureClasses::C2 FixtureClasses::C4}
|
160
|
+
|
161
|
+
q = query 'Select :o; Where o.derived(FixtureClasses::C4)'
|
162
|
+
assert_once q.to_sql, %w{FixtureClasses::C4}
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_param_name
|
166
|
+
q = query {Select :o; Where o.name.str == :name}
|
167
|
+
assert_once q.to_sql, ["o_name.name = 'name'", 'o_name.str_value = ?']
|
168
|
+
end
|
169
|
+
|
170
|
+
def test_eq_equivalence
|
171
|
+
q0 = query {Select :o; Where o.p1 == :ref}
|
172
|
+
q1 = query {Select :o; Where Eq(o.p1, :ref)}
|
173
|
+
assert_equal q0.to_sql, q1.to_sql
|
174
|
+
assert_equal q0.markers, q1.markers
|
175
|
+
end
|
176
|
+
end
|
@@ -0,0 +1,326 @@
|
|
1
|
+
$:.unshift(File.expand_path('../..', __FILE__)) unless
|
2
|
+
$:.include?(File.expand_path('../..', __FILE__))
|
3
|
+
|
4
|
+
require 'rubernate/fixtures'
|
5
|
+
|
6
|
+
# Make methods instantiate and modified visible for test purposes.
|
7
|
+
class Rubernate::Runtime
|
8
|
+
public :instantiate, :modified
|
9
|
+
end
|
10
|
+
|
11
|
+
class Rubernate::RubernateTest < Test::Unit::TestCase
|
12
|
+
include FixtureClasses
|
13
|
+
include Rubernate
|
14
|
+
include Rubernate::DBI
|
15
|
+
|
16
|
+
def setup
|
17
|
+
@factory = Rubernate::Memory::RuntimeFactory.new
|
18
|
+
@runtime = @factory.create
|
19
|
+
Rubernate.runtime_factory = @factory
|
20
|
+
Thread.current[:on_save] = Thread.current[:on_load] = nil
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_include
|
24
|
+
assert !C0.include?(Entity)
|
25
|
+
assert C1.include?(Entity)
|
26
|
+
assert C2.include?(Entity)
|
27
|
+
assert C3.include?(Entity)
|
28
|
+
assert !C0.new.kind_of?(Entity)
|
29
|
+
assert C1.new.kind_of?(Entity)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_properties
|
33
|
+
assert !C1.method_defined?(:p2)
|
34
|
+
assert C1.method_defined?(:p1)
|
35
|
+
assert C1.method_defined?(:p1=)
|
36
|
+
assert C2.method_defined?(:p2)
|
37
|
+
assert C2.method_defined?(:p2=)
|
38
|
+
assert C3.method_defined?(:p0)
|
39
|
+
assert C3.method_defined?(:p0=)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_objects_eq
|
43
|
+
o1, o2, o3, o4 = C4.new(1), C4.new(1), C4.new(2), C1.new
|
44
|
+
assert_equal o1, o1
|
45
|
+
assert_equal o1, o2
|
46
|
+
assert_not_equal o1, o3
|
47
|
+
assert_not_equal o1, o4
|
48
|
+
assert_equal o4, o4
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_session
|
52
|
+
assert !Rubernate.session?
|
53
|
+
Rubernate.session{ assert Rubernate.runtime; assert Rubernate.session? }
|
54
|
+
Rubernate.session{ |runtime|
|
55
|
+
assert runtime
|
56
|
+
def runtime.close
|
57
|
+
Thread.current[:close_test] = 'passed'
|
58
|
+
end
|
59
|
+
}
|
60
|
+
assert_equal 'passed', Thread.current[:close_test]
|
61
|
+
assert_raise(Rubernate::ObjectNotFoundException) {
|
62
|
+
Rubernate.session { |runtime|
|
63
|
+
assert runtime
|
64
|
+
def runtime.close
|
65
|
+
Thread.current[:close_test] = 'not_passed'
|
66
|
+
end
|
67
|
+
def runtime.failed
|
68
|
+
Thread.current[:failed_test] = 'passed'
|
69
|
+
end
|
70
|
+
raise Rubernate::ObjectNotFoundException.new(1)
|
71
|
+
}
|
72
|
+
}
|
73
|
+
assert_equal 'passed', Thread.current[:close_test]
|
74
|
+
assert_equal 'passed', Thread.current[:failed_test]
|
75
|
+
assert_nil Rubernate.runtime
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_find_and_load
|
79
|
+
o1, o1.peer, o1.p1 = C1.new, Peer.new, 'o1.p1'
|
80
|
+
o2, o2.peer, o2.p1 = C2.new, Peer.new, o1
|
81
|
+
|
82
|
+
@runtime.create o1
|
83
|
+
@runtime.create o2
|
84
|
+
|
85
|
+
Rubernate.session { |runtime|
|
86
|
+
o2 = runtime.find_by_pk o2.primary_key
|
87
|
+
o1 = o2.p1
|
88
|
+
assert o1.equal?(runtime.find_by_pk(o1.primary_key))
|
89
|
+
runtime.find_by_pk o1.primary_key, true
|
90
|
+
assert_not_nil o1.peer
|
91
|
+
}
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_ensure_loaded
|
95
|
+
o1, o1.p1 = C1.new, 'o1.p1'
|
96
|
+
o2, o2.p1 = C2.new, o1
|
97
|
+
|
98
|
+
@runtime.create o1
|
99
|
+
@runtime.create o2
|
100
|
+
|
101
|
+
Rubernate.session { |runtime|
|
102
|
+
o2 = runtime.find_by_pk o2.primary_key
|
103
|
+
o1 = o2.p1
|
104
|
+
assert_equal 'o1.p1', o1.p1
|
105
|
+
}
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_attach
|
109
|
+
o1 = C1.new
|
110
|
+
Rubernate.session {|runtime|
|
111
|
+
runtime.attach o1
|
112
|
+
f1 = runtime.find_by_pk(o1.primary_key)
|
113
|
+
assert o1.equal?(f1)
|
114
|
+
}
|
115
|
+
end
|
116
|
+
|
117
|
+
def test_equal
|
118
|
+
o1, o1.primary_key = C1.new, 1
|
119
|
+
o2, o2.primary_key = C1.new, 1
|
120
|
+
assert_equal o1, o2
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_ensure_attach
|
124
|
+
Rubernate.session {|runtime|
|
125
|
+
o1 = C1.new
|
126
|
+
runtime.attach o1
|
127
|
+
o1.p1 = 'o1.p1'
|
128
|
+
assert o1.peer.dirty?
|
129
|
+
}
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_on_load
|
133
|
+
pk = Rubernate.session {o = C3.new.attach; o.primary_key}
|
134
|
+
assert_nil Thread.current[:on_load]
|
135
|
+
Rubernate.session {
|
136
|
+
o = find_by_pk pk
|
137
|
+
assert_not_nil Thread.current[:on_load]
|
138
|
+
}
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_on_load_session
|
142
|
+
pk = nil
|
143
|
+
Rubernate.session{|runtime| o = C3.new.attach; pk = o.primary_key}
|
144
|
+
Rubernate.session{|runtime|
|
145
|
+
o = runtime.find_by_pk pk
|
146
|
+
assert_equal o, Thread.current[:on_load]
|
147
|
+
}
|
148
|
+
end
|
149
|
+
|
150
|
+
def test_on_save
|
151
|
+
o = nil
|
152
|
+
Rubernate.session{|runtime|
|
153
|
+
o = C3.new.attach
|
154
|
+
assert_nil Thread.current[:on_save]
|
155
|
+
o.p0 = 'o.p0'
|
156
|
+
}
|
157
|
+
assert_equal o, Thread.current[:on_save]
|
158
|
+
end
|
159
|
+
|
160
|
+
def test_attach_remove # TODO:...
|
161
|
+
Rubernate.session {
|
162
|
+
o = C1.new.attach
|
163
|
+
o.remove!
|
164
|
+
}
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
class Rubernate::PeerTest < Test::Unit::TestCase
|
169
|
+
include Rubernate
|
170
|
+
include FixtureClasses
|
171
|
+
|
172
|
+
def test_peer_dirty
|
173
|
+
p = Peer.new
|
174
|
+
assert_equal false, p.dirty?
|
175
|
+
|
176
|
+
p[:p1] = 'test'
|
177
|
+
assert p.dirty?
|
178
|
+
|
179
|
+
p.dirty = false
|
180
|
+
assert_equal false, p.dirty?
|
181
|
+
|
182
|
+
p[:p1] = nil
|
183
|
+
assert p.dirty?
|
184
|
+
end
|
185
|
+
|
186
|
+
def test_peer_dirty_array
|
187
|
+
peer = Peer.new
|
188
|
+
assert !peer.dirty?
|
189
|
+
peer[:a] = []
|
190
|
+
assert peer.dirty?
|
191
|
+
peer.dirty = false
|
192
|
+
peer[:a] << C4.new(1)
|
193
|
+
assert peer.dirty?
|
194
|
+
peer.dirty = false
|
195
|
+
assert !peer.dirty?
|
196
|
+
end
|
197
|
+
|
198
|
+
def test_peer_dirty_hash
|
199
|
+
peer = Peer.new
|
200
|
+
peer[:h] = {'key1' => 'value1'}
|
201
|
+
assert peer.dirty?
|
202
|
+
peer.dirty = false
|
203
|
+
assert !peer.dirty?
|
204
|
+
peer[:h]['key2'] = 'value2'
|
205
|
+
assert peer.dirty?
|
206
|
+
peer[:h]['key2'] = 'value2.1'
|
207
|
+
assert peer.dirty?
|
208
|
+
peer.dirty = false
|
209
|
+
peer[:h]['key2'] = nil
|
210
|
+
assert peer.dirty?
|
211
|
+
peer.dirty = false
|
212
|
+
peer[:h].delete 'key2'
|
213
|
+
assert peer.dirty?
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_peer_dirty_hash2
|
217
|
+
peer = Peer.new
|
218
|
+
peer[:h] = {'key1' => C4.new(1)}
|
219
|
+
peer.dirty = false
|
220
|
+
peer[:h]['key1'] = C4.new 1
|
221
|
+
assert !peer.dirty?
|
222
|
+
peer.dirty = false
|
223
|
+
peer[:h] = {'key1' => C4.new(1)}
|
224
|
+
assert !peer.dirty?
|
225
|
+
end
|
226
|
+
|
227
|
+
def test_peer_container
|
228
|
+
a = [1]
|
229
|
+
a.extend Peer::Container
|
230
|
+
a.memorize!
|
231
|
+
assert_nil a.recall
|
232
|
+
a << 2
|
233
|
+
assert_not_nil a.recall
|
234
|
+
a.memorize!
|
235
|
+
assert_nil a.recall
|
236
|
+
a.collect! { |i| i * 2 }
|
237
|
+
assert_not_nil a.recall
|
238
|
+
assert_equal 4, a[1]
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
class Rubernate::BaseRuntimeTest < Test::Unit::TestCase
|
243
|
+
include Rubernate
|
244
|
+
include FixtureClasses
|
245
|
+
|
246
|
+
def setup
|
247
|
+
@factory = Rubernate::Memory::RuntimeFactory.new
|
248
|
+
@runtime = @factory.create
|
249
|
+
Rubernate.runtime_factory = @factory
|
250
|
+
Thread.current[:on_save] = Thread.current[:on_load] = nil
|
251
|
+
end
|
252
|
+
|
253
|
+
def test_instantiate
|
254
|
+
object = @runtime.instantiate 1, C1
|
255
|
+
assert object
|
256
|
+
assert_equal 1, object.primary_key
|
257
|
+
assert_equal C1, object.class
|
258
|
+
end
|
259
|
+
|
260
|
+
def test_instantiate_existing
|
261
|
+
o0 = @runtime.instantiate 1, C1
|
262
|
+
o1 = @runtime.instantiate 1, C1
|
263
|
+
|
264
|
+
assert o0.equal?(o1)
|
265
|
+
assert_equal o0, o1
|
266
|
+
end
|
267
|
+
|
268
|
+
def test_instantiate_by_finder
|
269
|
+
pk = nil
|
270
|
+
Rubernate.session do
|
271
|
+
o = C1.new.attach
|
272
|
+
pk = o.primary_key
|
273
|
+
o_ = find_by_pk pk
|
274
|
+
assert_equal o, o_
|
275
|
+
assert_equal o.object_id, o_.object_id
|
276
|
+
o__ = find_by_query('all')[0]
|
277
|
+
assert_equal o, o__
|
278
|
+
assert_equal o.object_id, o__.object_id
|
279
|
+
end
|
280
|
+
Rubernate.session do
|
281
|
+
o_ = find_by_pk pk
|
282
|
+
o__ = find_by_query('all')[0]
|
283
|
+
assert_equal o_, o__
|
284
|
+
assert_equal o_.object_id, o__.object_id
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
def test_instantiate_invalid_class
|
289
|
+
@runtime.instantiate 1, C1
|
290
|
+
assert_raise(RuntimeError) { @runtime.instantiate 1, C2 }
|
291
|
+
end
|
292
|
+
|
293
|
+
def test_modified
|
294
|
+
Rubernate.session {|runtime|
|
295
|
+
assert_equal 0, runtime.modified.size
|
296
|
+
o, o.p1 = C1.new.attach, 'o.p1'
|
297
|
+
assert_equal [o], runtime.modified
|
298
|
+
}
|
299
|
+
end
|
300
|
+
|
301
|
+
def test_ensure
|
302
|
+
o = C1.new
|
303
|
+
assert_nothing_raised() {o.p1}
|
304
|
+
o, o.peer = C1.new, nil
|
305
|
+
assert_raise(NoMethodError) {o.p1}
|
306
|
+
o, o.peer = C1.new, Peer.new
|
307
|
+
assert_nothing_raised() {o.p1}
|
308
|
+
end
|
309
|
+
|
310
|
+
def test_flush_modified_find
|
311
|
+
Rubernate.session {|runtime|
|
312
|
+
o1, o1.p1 = C1.new.attach, 'o1.p1'
|
313
|
+
assert_equal [o1], runtime.modified
|
314
|
+
runtime.find_by_query "all"
|
315
|
+
assert_equal 0, runtime.modified.size
|
316
|
+
}
|
317
|
+
end
|
318
|
+
|
319
|
+
def test_fluch_modified_close
|
320
|
+
Rubernate.session {|runtime| o, o.p1 = C1.new.attach, 'o.p1' }
|
321
|
+
Rubernate.session {|runtime|
|
322
|
+
o = * runtime.find_by_query("sql: all")
|
323
|
+
assert_equal 'o.p1', o.p1
|
324
|
+
}
|
325
|
+
end
|
326
|
+
end
|