transaction-simple 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ #--
3
+ # Transaction::Simple
4
+ # Simple object transaction support for Ruby
5
+ # http://rubyforge.org/projects/trans-simple/
6
+ # Version 1.4.0
7
+ #
8
+ # Licensed under a MIT-style licence. See Licence.txt in the main
9
+ # distribution for full licensing information.
10
+ #
11
+ # Copyright (c) 2003 - 2007 Austin Ziegler
12
+ #
13
+ # $Id: test_all.rb 55 2007-02-03 23:29:34Z austin $
14
+ #++
15
+
16
+ $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../lib") if __FILE__ == $0
17
+
18
+ $stderr.puts "Checking for test cases:"
19
+
20
+ Dir[File.join(File.dirname($0), 'test_*.rb')].each do |testcase|
21
+ next if File.basename(testcase) == File.basename(__FILE__)
22
+ $stderr.puts "\t#{testcase}"
23
+ load testcase
24
+ end
25
+ $stderr.puts " "
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env ruby
2
+ #--
3
+ # Transaction::Simple
4
+ # Simple object transaction support for Ruby
5
+ # http://rubyforge.org/projects/trans-simple/
6
+ # Version 1.4.0
7
+ #
8
+ # Licensed under a MIT-style licence. See Licence.txt in the main
9
+ # distribution for full licensing information.
10
+ #
11
+ # Copyright (c) 2003 - 2007 Austin Ziegler
12
+ #
13
+ # $Id: simple.rb,v 1.7 2005/06/12 19:48:17 austin Exp $
14
+ #++
15
+ $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../lib") if __FILE__ == $0
16
+
17
+ require 'transaction/simple'
18
+ require 'test/unit'
19
+
20
+ module Transaction::Simple::Test
21
+ class BrokenGraph < Test::Unit::TestCase #:nodoc:
22
+ class Child
23
+ attr_accessor :parent
24
+ end
25
+
26
+ class BrokenParent
27
+ include Transaction::Simple
28
+
29
+ attr_reader :children
30
+ def initialize
31
+ @children = []
32
+ end
33
+
34
+ def <<(child)
35
+ child.parent = self
36
+ @children << child
37
+ end
38
+ end
39
+
40
+ class FixedParent < BrokenParent
41
+ # Reconnect the restored children to me, instead of to the bogus me
42
+ # that was restored to them by Marshal::load.
43
+ def _post_transaction_rewind
44
+ @children.each { |child| child.parent = self }
45
+ end
46
+ end
47
+
48
+ def test_broken_graph
49
+ parent = BrokenParent.new
50
+ parent << Child.new
51
+ assert_equal(parent.object_id, parent.children[0].parent.object_id)
52
+ parent.start_transaction
53
+ parent << Child.new
54
+ assert_equal(parent.object_id, parent.children[1].parent.object_id)
55
+ parent.abort_transaction
56
+ assert_not_equal(parent.object_id, parent.children[0].parent.object_id)
57
+ end
58
+
59
+ def test_fixed_graph
60
+ parent = FixedParent.new
61
+ parent << Child.new
62
+ assert_equal(parent.object_id, parent.children[0].parent.object_id)
63
+ parent.start_transaction
64
+ parent << Child.new
65
+ assert_equal(parent.object_id, parent.children[1].parent.object_id)
66
+ parent.abort_transaction
67
+ assert_equal(parent.object_id, parent.children[0].parent.object_id)
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,311 @@
1
+ #!/usr/bin/env ruby
2
+ #--
3
+ # Transaction::Simple
4
+ # Simple object transaction support for Ruby
5
+ # http://rubyforge.org/projects/trans-simple/
6
+ # Version 1.4.0
7
+ #
8
+ # Licensed under a MIT-style licence. See Licence.txt in the main
9
+ # distribution for full licensing information.
10
+ #
11
+ # Copyright (c) 2003 - 2007 Austin Ziegler
12
+ #
13
+ # $Id: test_transaction_simple.rb 50 2007-02-03 20:26:19Z austin $
14
+ #++
15
+ $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../lib") if __FILE__ == $0
16
+
17
+ require 'transaction/simple'
18
+ require 'test/unit'
19
+
20
+ module Transaction::Simple::Test
21
+ class TransactionSimple < Test::Unit::TestCase #:nodoc:
22
+ VALUE = "Now is the time for all good men to come to the aid of their country."
23
+
24
+ class Value
25
+ def initialize
26
+ @value = VALUE.dup
27
+ end
28
+
29
+ def method_missing(meth, *args, &block)
30
+ @value.__send__(meth, *args, &block)
31
+ end
32
+
33
+ def ==(other)
34
+ other == @value
35
+ end
36
+
37
+ def to_str
38
+ @value
39
+ end
40
+ end
41
+
42
+ def setup
43
+ @value = Value.new
44
+ @value.extend(Transaction::Simple)
45
+ end
46
+
47
+ def test_extended
48
+ assert_respond_to(@value, :start_transaction)
49
+ end
50
+
51
+ def test_started
52
+ assert_equal(false, @value.transaction_open?)
53
+ assert_nothing_raised { @value.start_transaction }
54
+ assert_equal(true, @value.transaction_open?)
55
+ end
56
+
57
+ def test_rewind
58
+ assert_equal(false, @value.transaction_open?)
59
+ assert_raises(Transaction::TransactionError) { @value.rewind_transaction }
60
+ assert_nothing_raised { @value.start_transaction }
61
+ assert_equal(true, @value.transaction_open?)
62
+ assert_nothing_raised { @value.gsub!(/men/, 'women') }
63
+ assert_not_equal(VALUE, @value)
64
+ assert_nothing_raised { @value.rewind_transaction }
65
+ assert_equal(true, @value.transaction_open?)
66
+ assert_equal(VALUE, @value)
67
+ end
68
+
69
+ def test_abort
70
+ assert_equal(false, @value.transaction_open?)
71
+ assert_raises(Transaction::TransactionError) { @value.abort_transaction }
72
+ assert_nothing_raised { @value.start_transaction }
73
+ assert_equal(true, @value.transaction_open?)
74
+ assert_nothing_raised { @value.gsub!(/men/, 'women') }
75
+ assert_not_equal(VALUE, @value)
76
+ assert_nothing_raised { @value.abort_transaction }
77
+ assert_equal(false, @value.transaction_open?)
78
+ assert_equal(VALUE, @value)
79
+ end
80
+
81
+ def test_commit
82
+ assert_equal(false, @value.transaction_open?)
83
+ assert_raises(Transaction::TransactionError) { @value.commit_transaction }
84
+ assert_nothing_raised { @value.start_transaction }
85
+ assert_equal(true, @value.transaction_open?)
86
+ assert_nothing_raised { @value.gsub!(/men/, 'women') }
87
+ assert_not_equal(VALUE, @value)
88
+ assert_equal(true, @value.transaction_open?)
89
+ assert_nothing_raised { @value.commit_transaction }
90
+ assert_equal(false, @value.transaction_open?)
91
+ assert_not_equal(VALUE, @value)
92
+ end
93
+
94
+ def test_multilevel
95
+ assert_equal(false, @value.transaction_open?)
96
+ assert_nothing_raised { @value.start_transaction }
97
+ assert_equal(true, @value.transaction_open?)
98
+ assert_nothing_raised { @value.gsub!(/men/, 'women') }
99
+ assert_equal(VALUE.gsub(/men/, 'women'), @value)
100
+ assert_equal(true, @value.transaction_open?)
101
+ assert_nothing_raised { @value.start_transaction }
102
+ assert_nothing_raised { @value.gsub!(/country/, 'nation-state') }
103
+ assert_nothing_raised { @value.commit_transaction }
104
+ assert_equal(VALUE.gsub(/men/, 'women').gsub(/country/, 'nation-state'), @value)
105
+ assert_equal(true, @value.transaction_open?)
106
+ assert_nothing_raised { @value.abort_transaction }
107
+ assert_equal(VALUE, @value)
108
+ end
109
+
110
+ def test_multilevel_named
111
+ assert_equal(false, @value.transaction_open?)
112
+ assert_raises(Transaction::TransactionError) { @value.transaction_name }
113
+ assert_nothing_raised { @value.start_transaction(:first) } # 1
114
+ assert_raises(Transaction::TransactionError) { @value.start_transaction(:first) }
115
+ assert_equal(true, @value.transaction_open?)
116
+ assert_equal(true, @value.transaction_open?(:first))
117
+ assert_equal(:first, @value.transaction_name)
118
+ assert_nothing_raised { @value.start_transaction } # 2
119
+ assert_not_equal(:first, @value.transaction_name)
120
+ assert_equal(nil, @value.transaction_name)
121
+ assert_raises(Transaction::TransactionError) { @value.abort_transaction(:second) }
122
+ assert_nothing_raised { @value.abort_transaction(:first) }
123
+ assert_equal(false, @value.transaction_open?)
124
+ assert_nothing_raised do
125
+ @value.start_transaction(:first)
126
+ @value.gsub!(/men/, 'women')
127
+ @value.start_transaction(:second)
128
+ @value.gsub!(/women/, 'people')
129
+ @value.start_transaction
130
+ @value.gsub!(/people/, 'sentients')
131
+ end
132
+ assert_nothing_raised { @value.abort_transaction(:second) }
133
+ assert_equal(true, @value.transaction_open?(:first))
134
+ assert_equal(VALUE.gsub(/men/, 'women'), @value)
135
+ assert_nothing_raised do
136
+ @value.start_transaction(:second)
137
+ @value.gsub!(/women/, 'people')
138
+ @value.start_transaction
139
+ @value.gsub!(/people/, 'sentients')
140
+ end
141
+ assert_raises(Transaction::TransactionError) { @value.rewind_transaction(:foo) }
142
+ assert_nothing_raised { @value.rewind_transaction(:second) }
143
+ assert_equal(VALUE.gsub(/men/, 'women'), @value)
144
+ assert_nothing_raised do
145
+ @value.gsub!(/women/, 'people')
146
+ @value.start_transaction
147
+ @value.gsub!(/people/, 'sentients')
148
+ end
149
+ assert_raises(Transaction::TransactionError) { @value.commit_transaction(:foo) }
150
+ assert_nothing_raised { @value.commit_transaction(:first) }
151
+ assert_equal(VALUE.gsub(/men/, 'sentients'), @value)
152
+ assert_equal(false, @value.transaction_open?)
153
+ end
154
+
155
+ def test_block
156
+ Transaction::Simple.start(@value) do |tv|
157
+ assert_equal(true, tv.transaction_open?)
158
+ assert_nothing_raised { tv.gsub!(/men/, 'women') }
159
+ assert_equal(VALUE.gsub(/men/, 'women'), tv)
160
+ tv.abort_transaction
161
+ flunk("Failed to abort the transaction.")
162
+ end
163
+ assert_equal(false, @value.transaction_open?)
164
+ assert_equal(VALUE, @value)
165
+
166
+ @value = VALUE.dup
167
+ Transaction::Simple.start(@value) do |tv|
168
+ assert_equal(true, tv.transaction_open?)
169
+ assert_nothing_raised { tv.gsub!(/men/, 'women') }
170
+ assert_equal(VALUE.gsub(/men/, 'women'), tv)
171
+ tv.commit_transaction
172
+ flunk("Failed to commit the transaction.")
173
+ end
174
+ assert_equal(false, @value.transaction_open?)
175
+ assert_equal(VALUE.gsub(/men/, 'women'), @value)
176
+ end
177
+
178
+ def test_named_block
179
+ Transaction::Simple.start_named(:first, @value) do |tv|
180
+ assert_equal(true, tv.transaction_open?)
181
+ assert_equal(true, tv.transaction_open?(:first))
182
+ assert_nothing_raised { tv.gsub!(/men/, 'women') }
183
+ assert_equal(VALUE.gsub(/men/, 'women'), tv)
184
+ tv.abort_transaction
185
+ flunk("Failed to abort the transaction.")
186
+ end
187
+ assert_equal(false, @value.transaction_open?)
188
+ assert_equal(false, @value.transaction_open?(:first))
189
+ assert_equal(VALUE, @value)
190
+
191
+ @value = VALUE.dup
192
+ Transaction::Simple.start_named(:first, @value) do |tv|
193
+ assert_equal(true, tv.transaction_open?)
194
+ assert_equal(true, tv.transaction_open?(:first))
195
+ assert_nothing_raised { tv.gsub!(/men/, 'women') }
196
+ assert_equal(VALUE.gsub(/men/, 'women'), tv)
197
+ tv.commit_transaction
198
+ flunk("Failed to commit the transaction.")
199
+ end
200
+ assert_equal(false, @value.transaction_open?)
201
+ assert_equal(false, @value.transaction_open?(:first))
202
+ assert_equal(VALUE.gsub(/men/, 'women'), @value)
203
+ end
204
+
205
+ def test_named_block_error
206
+ @value.start_transaction(:first)
207
+ Transaction::Simple.start_named(:second, @value) do |tv|
208
+ assert_equal(true, tv.transaction_open?)
209
+ assert_equal(true, tv.transaction_open?(:first))
210
+ assert_equal(true, tv.transaction_open?(:second))
211
+ assert_nothing_raised { tv.gsub!(/men/, 'women') }
212
+ assert_equal(VALUE.gsub(/men/, 'women'), tv)
213
+ assert_raises(Transaction::TransactionError) do
214
+ tv.abort_transaction(:first)
215
+ end
216
+ end
217
+ assert_equal(true, @value.transaction_open?)
218
+ assert_equal(true, @value.transaction_open?(:first))
219
+ assert_equal(false, @value.transaction_open?(:second))
220
+ assert_equal(VALUE.gsub(/men/, 'women'), @value)
221
+ assert_nothing_raised { @value.abort_transaction(:first) }
222
+ assert_equal(VALUE, @value)
223
+
224
+ @value.start_transaction(:first)
225
+ Transaction::Simple.start_named(:second, @value) do |tv|
226
+ assert_equal(true, tv.transaction_open?)
227
+ assert_equal(true, tv.transaction_open?(:first))
228
+ assert_equal(true, tv.transaction_open?(:second))
229
+ assert_nothing_raised { tv.gsub!(/men/, 'women') }
230
+ assert_equal(VALUE.gsub(/men/, 'women'), tv)
231
+ assert_raises(Transaction::TransactionError) do
232
+ tv.commit_transaction(:first)
233
+ end
234
+ end
235
+ assert_equal(true, @value.transaction_open?)
236
+ assert_equal(true, @value.transaction_open?(:first))
237
+ assert_equal(false, @value.transaction_open?(:second))
238
+ assert_equal(VALUE.gsub(/men/, 'women'), @value)
239
+ assert_nothing_raised { @value.abort_transaction(:first) }
240
+ assert_equal(VALUE, @value)
241
+ end
242
+
243
+ def test_multivar_block
244
+ a = VALUE.dup
245
+ b = a.dup
246
+
247
+ Transaction::Simple.start(a, b) do |ta, tb|
248
+ assert_equal(true, ta.transaction_open?)
249
+ assert_equal(true, tb.transaction_open?)
250
+ ta.abort_transaction
251
+ flunk("Failed to abort the transaction.")
252
+ end
253
+ assert_equal(false, a.transaction_open?)
254
+ assert_equal(false, b.transaction_open?)
255
+
256
+ Transaction::Simple.start(a, b) do |ta, tb|
257
+ assert_equal(true, ta.transaction_open?)
258
+ assert_equal(true, tb.transaction_open?)
259
+ ta.commit_transaction
260
+ flunk("Failed to commit the transaction.")
261
+ end
262
+ assert_equal(false, a.transaction_open?)
263
+ assert_equal(false, b.transaction_open?)
264
+ end
265
+
266
+ def test_multilevel_block
267
+ Transaction::Simple.start_named(:outer, @value) do |tv0|
268
+ assert_equal(1, tv0.instance_variable_get(:@__transaction_level__))
269
+ assert_equal(true, tv0.transaction_open?(:outer))
270
+ Transaction::Simple.start_named(:inner, tv0) do |tv1|
271
+ assert_equal(2, tv0.instance_variable_get(:@__transaction_level__))
272
+ assert_equal(true, tv1.transaction_open?(:inner))
273
+ tv1.abort_transaction
274
+ flunk("Failed to abort the transaction.")
275
+ end
276
+ assert_equal(false, tv0.transaction_open?(:inner))
277
+ assert_equal(true, tv0.transaction_open?(:outer))
278
+
279
+ tv0.commit_transaction
280
+ flunk("Failed to commit the transaction.")
281
+ end
282
+ assert_equal(false, @value.transaction_open?(:inner))
283
+ assert_equal(false, @value.transaction_open?(:outer))
284
+ end
285
+
286
+ def test_array
287
+ assert_nothing_raised do
288
+ @orig = ["first", "second", "third"]
289
+ @value = ["first", "second", "third"]
290
+ @value.extend(Transaction::Simple)
291
+ end
292
+ assert_equal(@orig, @value)
293
+ assert_nothing_raised { @value.start_transaction }
294
+ assert_equal(true, @value.transaction_open?)
295
+ assert_nothing_raised { @value[1].gsub!(/second/, "fourth") }
296
+ assert_not_equal(@orig, @value)
297
+ assert_nothing_raised { @value.abort_transaction }
298
+ assert_equal(@orig, @value)
299
+ end
300
+
301
+ def test_instance_var
302
+ @value = VALUE.dup
303
+ @value.extend(Transaction::Simple)
304
+ @value.start_transaction
305
+ assert_equal(true, @value.transaction_open?)
306
+ @value.instance_variable_set("@foo", "bar")
307
+ @value.rewind_transaction
308
+ assert_equal(false, @value.instance_variables.include?("@foo"))
309
+ end
310
+ end
311
+ end
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env ruby
2
+ #--
3
+ # Transaction::Simple
4
+ # Simple object transaction support for Ruby
5
+ # http://rubyforge.org/projects/trans-simple/
6
+ # Version 1.4.0
7
+ #
8
+ # Licensed under a MIT-style licence. See Licence.txt in the main
9
+ # distribution for full licensing information.
10
+ #
11
+ # Copyright (c) 2003 - 2007 Austin Ziegler
12
+ #
13
+ # $Id: test_transaction_simple_group.rb 48 2007-02-03 16:00:11Z austin $
14
+ #++
15
+ $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../lib") if __FILE__ == $0
16
+
17
+ require 'transaction/simple/group'
18
+ require 'test/unit'
19
+
20
+ module Transaction::Simple::Test
21
+ class Group < Test::Unit::TestCase #:nodoc:
22
+ VALUE1 = "Hello, you."
23
+ VALUE2 = "And you, too."
24
+
25
+ def setup
26
+ @x = VALUE1.dup
27
+ @y = VALUE2.dup
28
+ end
29
+
30
+ def test_group
31
+ group = Transaction::Simple::Group.new(@x, @y)
32
+
33
+ assert_nothing_raised { group.start_transaction(:first) }
34
+ assert_equal(true, group.transaction_open?(:first))
35
+ assert_equal(true, @x.transaction_open?(:first))
36
+ assert_equal(true, @y.transaction_open?(:first))
37
+
38
+ assert_equal("Hello, world.", @x.gsub!(/you/, "world"))
39
+ assert_equal("And me, too.", @y.gsub!(/you/, "me"))
40
+
41
+ assert_nothing_raised { group.start_transaction(:second) }
42
+ assert_equal("Hello, HAL.", @x.gsub!(/world/, "HAL"))
43
+ assert_equal("And Dave, too.", @y.gsub!(/me/, "Dave"))
44
+
45
+ assert_nothing_raised { group.rewind_transaction(:second) }
46
+ assert_equal("Hello, world.", @x)
47
+ assert_equal("And me, too.", @y)
48
+
49
+ assert_equal("Hello, HAL.", @x.gsub!(/world/, "HAL"))
50
+ assert_equal("And Dave, too.", @y.gsub!(/me/, "Dave"))
51
+
52
+ assert_nothing_raised { group.commit_transaction(:second) }
53
+ assert_equal("Hello, HAL.", @x)
54
+ assert_equal("And Dave, too.", @y)
55
+
56
+ assert_nothing_raised { group.abort_transaction(:first) }
57
+ assert_equal("Hello, you.", @x)
58
+ assert_equal("And you, too.", @y)
59
+ end
60
+ end
61
+ end