sequence 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +58 -0
- data/GPL +340 -0
- data/Manifest.txt +36 -0
- data/README.txt +320 -0
- data/Rakefile +32 -0
- data/lib/assert.rb +16 -0
- data/lib/sequence/arraylike.rb +57 -0
- data/lib/sequence/buffered.rb +188 -0
- data/lib/sequence/circular.rb +272 -0
- data/lib/sequence/enum.rb +260 -0
- data/lib/sequence/file.rb +172 -0
- data/lib/sequence/functional.rb +152 -0
- data/lib/sequence/generator.rb +290 -0
- data/lib/sequence/indexed.rb +234 -0
- data/lib/sequence/io.rb +102 -0
- data/lib/sequence/list.rb +292 -0
- data/lib/sequence/ofhash.rb +38 -0
- data/lib/sequence/ofobjectivars.rb +29 -0
- data/lib/sequence/ofobjectmethods.rb +87 -0
- data/lib/sequence/position.rb +100 -0
- data/lib/sequence/reversed.rb +180 -0
- data/lib/sequence/shifting.rb +190 -0
- data/lib/sequence/singleitem.rb +50 -0
- data/lib/sequence/stringlike.rb +482 -0
- data/lib/sequence/subseq.rb +90 -0
- data/lib/sequence/usedata.rb +35 -0
- data/lib/sequence/version.rb +5 -0
- data/lib/sequence.rb +721 -0
- data/lib/weakrefset.rb +254 -0
- data/test/test.rb +609 -0
- data/test/test_all.rb +6 -0
- data/test/test_changes.rb +44 -0
- data/test/test_circulars.rb +89 -0
- data/test/test_rexscan.rb +899 -0
- data/test/test_seqrex.rb +204 -0
- data/test/test_sequences.rb +106 -0
- metadata +90 -0
data/test/test.rb
ADDED
@@ -0,0 +1,609 @@
|
|
1
|
+
#eric's original test code; I can't say I understand it
|
2
|
+
BEGIN{exit}
|
3
|
+
# $Id$
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'sequence'
|
7
|
+
require 'sequence/usedeleteinsert'
|
8
|
+
|
9
|
+
# :stopdoc:
|
10
|
+
|
11
|
+
module Test
|
12
|
+
module Unit
|
13
|
+
class TestSuite
|
14
|
+
def run(result, &progress_block)
|
15
|
+
yield(STARTED, name)
|
16
|
+
if @tests.size>0 and @tests[0].class.respond_to?:random
|
17
|
+
catch(:stop_suite) {
|
18
|
+
(@tests[0].class.random*@tests.size).to_i.times do
|
19
|
+
test = @tests[rand(@tests.size)]
|
20
|
+
catch(:invalid_test) {
|
21
|
+
test.run(result, &progress_block)
|
22
|
+
}
|
23
|
+
end
|
24
|
+
}
|
25
|
+
else
|
26
|
+
@tests.each do |test|
|
27
|
+
test.run(result, &progress_block)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
yield(FINISHED, name)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
ArgArray = Class.new(Array)
|
37
|
+
|
38
|
+
class Sequence
|
39
|
+
class Test < ::Test::Unit::TestCase
|
40
|
+
def self.suite(random_iterations=8,random_seed=0,klass='',methods='',flags=0)
|
41
|
+
return(::Test::Unit::TestSuite.new()) if !self.respond_to?:seed
|
42
|
+
if !(@@output_level||=nil)
|
43
|
+
@@output_level = ::Test::Unit::UI::SILENT
|
44
|
+
ObjectSpace.each_object(::Test::Unit::AutoRunner) { |runner|
|
45
|
+
@@output_level = runner.instance_eval { @output_level }
|
46
|
+
}
|
47
|
+
end
|
48
|
+
if !(@@random_iterations||=nil)
|
49
|
+
@@random_iterations = random_iterations.to_f
|
50
|
+
end
|
51
|
+
if !(@@random_seed||=nil)
|
52
|
+
@@random_seed = random_seed.to_i.nonzero? || (srand;srand)
|
53
|
+
puts("random_seed: #{@@random_seed}") if @@output_level>=::Test::Unit::UI::NORMAL
|
54
|
+
srand(@@random_seed)
|
55
|
+
end
|
56
|
+
@klass = Regexp.new(klass)
|
57
|
+
methods = Regexp.new(methods)
|
58
|
+
@reject ||= nil
|
59
|
+
public_instance_methods(true).each { |m|
|
60
|
+
if matchdata = /^test_\d*(.*)/.match(m.to_s)
|
61
|
+
undef_method(m) if @reject&&@reject=~matchdata[1] ||
|
62
|
+
!(methods=~matchdata[1])
|
63
|
+
end
|
64
|
+
}
|
65
|
+
@flags = flags.to_i
|
66
|
+
@use_positions = @flags[0].zero?
|
67
|
+
@use_branches = true
|
68
|
+
@allow_pruning = false
|
69
|
+
self.plant
|
70
|
+
super()
|
71
|
+
end
|
72
|
+
def self.plant
|
73
|
+
before = sequence(0,1.5)
|
74
|
+
after = sequence(0,1.5,before.class.new)
|
75
|
+
seqs = seed(before,after)
|
76
|
+
if @klass
|
77
|
+
seqs.reject! { |seq| !(@klass===seq.class.to_s) }
|
78
|
+
end
|
79
|
+
return(self.plant) if seqs.empty?
|
80
|
+
if @@output_level>=::Test::Unit::UI::NORMAL
|
81
|
+
puts("\nnew(#{before.inspect}+#{after.inspect}) -> self")
|
82
|
+
end
|
83
|
+
@seqs_root = {
|
84
|
+
:trunk => seqs,
|
85
|
+
:positions => [],
|
86
|
+
:branches => [],
|
87
|
+
}
|
88
|
+
end
|
89
|
+
def self.element(offset=0,weight=1)
|
90
|
+
elements[rand((weight*(elements.size+offset)).to_i)]
|
91
|
+
end
|
92
|
+
def self.sequence(offset=0,weight=2,value=empty)
|
93
|
+
until (v = element(offset,weight)).nil?
|
94
|
+
value << v
|
95
|
+
end
|
96
|
+
value
|
97
|
+
end
|
98
|
+
def self.random
|
99
|
+
@@random_iterations
|
100
|
+
end
|
101
|
+
def self.reject(name,*args,&block)
|
102
|
+
false
|
103
|
+
end
|
104
|
+
def setup
|
105
|
+
seqs_tree = self.class.instance_eval{@seqs_root}
|
106
|
+
level = 0
|
107
|
+
@prune = proc{}
|
108
|
+
while (branches = seqs_tree[:branches]).size.nonzero? and
|
109
|
+
self.class.instance_eval{@use_branches}&&rand(3).zero?
|
110
|
+
i = rand(branches.size)
|
111
|
+
|
112
|
+
if _closed?(branches[i][:trunk])
|
113
|
+
branches.slice!(i)
|
114
|
+
break
|
115
|
+
else
|
116
|
+
@prune = proc { branches.slice!(i) }
|
117
|
+
seqs_tree = branches[i]
|
118
|
+
level += 1
|
119
|
+
end
|
120
|
+
end
|
121
|
+
if (positions = seqs_tree[:positions]).size.nonzero? and
|
122
|
+
self.class.instance_eval{@use_positions}&&rand(3).zero?
|
123
|
+
i = rand(positions.size)
|
124
|
+
if _closed?(positions[i])
|
125
|
+
positions.slice!(i)
|
126
|
+
else
|
127
|
+
@prune = proc { positions.slice!(i) }
|
128
|
+
seqs_tree = {
|
129
|
+
:trunk => positions[i],
|
130
|
+
:positions => seqs_tree[:positions],
|
131
|
+
:branches => seqs_tree[:branches],
|
132
|
+
}
|
133
|
+
level += 1
|
134
|
+
end
|
135
|
+
end
|
136
|
+
@seqs_tree = seqs_tree
|
137
|
+
@seqs = seqs_tree[:trunk]
|
138
|
+
@positions = seqs_tree[:positions]
|
139
|
+
@branches = seqs_tree[:branches]
|
140
|
+
@level = level
|
141
|
+
@state = ""
|
142
|
+
@exec = nil
|
143
|
+
end
|
144
|
+
def teardown
|
145
|
+
if not passed?
|
146
|
+
if @@output_level>=::Test::Unit::UI::PROGRESS_ONLY
|
147
|
+
puts("\n#{self}")
|
148
|
+
puts("random_seed: #{@@random_seed}")
|
149
|
+
puts(@call)
|
150
|
+
end
|
151
|
+
throw(:stop_suite)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
private
|
156
|
+
def _closed?(seqs)
|
157
|
+
ret0 = nil
|
158
|
+
seqs.each_with_index { |seq,i|
|
159
|
+
i==0 ? ret0 = seq.closed? : assert_equal(ret0,seq.closed?)
|
160
|
+
}
|
161
|
+
ret0
|
162
|
+
end
|
163
|
+
def _inspect_short(obj,_self=nil)
|
164
|
+
if _self and _self.equal?(obj)
|
165
|
+
"self"
|
166
|
+
else
|
167
|
+
obj.inspect.sub(/\A\#\<([\w\:]+?\:0x[\da-f]+).*\>\Z/,'#<\\1>')
|
168
|
+
end
|
169
|
+
end
|
170
|
+
def _inspect_self(obj,_self=nil)
|
171
|
+
if _self and _self.equal?(obj)
|
172
|
+
"self"
|
173
|
+
else
|
174
|
+
obj.inspect
|
175
|
+
end
|
176
|
+
end
|
177
|
+
def _inspect_merge(objects,selves=nil)
|
178
|
+
_inspect_short(objects[0],selves&&selves[0])
|
179
|
+
end
|
180
|
+
def _multi_test(name,*args0,&assertion)
|
181
|
+
block = args0.pop
|
182
|
+
throw(:invalid_test) if self.class.reject(name,*args0,&block)
|
183
|
+
seqs = @seqs
|
184
|
+
call = @level.zero? ? "self." : "#{_inspect_merge(@seqs)}."
|
185
|
+
call += "{" if @exec
|
186
|
+
call += name.to_s
|
187
|
+
args = args0.collect { |arg|
|
188
|
+
ArgArray===arg ? _inspect_merge(arg) : _inspect_short(arg)
|
189
|
+
}
|
190
|
+
call += "(#{args.join(',')})" if not args.empty?
|
191
|
+
call += " {#{block.inspect.sub(/\A\#<Proc\:0x[\da-f]+\@(.*?)\>\Z/,'\\1')}}" if block
|
192
|
+
call += "}" if @exec
|
193
|
+
@call = call
|
194
|
+
print("\n#{call} ") if @@output_level==::Test::Unit::UI::NORMAL
|
195
|
+
state = @state
|
196
|
+
ret = ArgArray.new
|
197
|
+
puts if @@output_level>=::Test::Unit::UI::VERBOSE
|
198
|
+
@seqs.each_with_index do |seq,i|
|
199
|
+
@state = state.clone
|
200
|
+
initial = seq.inspect
|
201
|
+
args = args0.collect { |arg|
|
202
|
+
ArgArray===arg ? arg[i] :
|
203
|
+
begin
|
204
|
+
arg.clone
|
205
|
+
rescue TypeError
|
206
|
+
arg
|
207
|
+
end
|
208
|
+
}
|
209
|
+
call = ""
|
210
|
+
call += "{" if @exec
|
211
|
+
call += name.to_s
|
212
|
+
call += "(#{args.inspect[1..-2]})" if not args.empty?
|
213
|
+
call += " #{block.inspect}" if block
|
214
|
+
call += "}" if @exec
|
215
|
+
if @@output_level>=::Test::Unit::UI::VERBOSE
|
216
|
+
puts(initial)
|
217
|
+
print("#{call} ")
|
218
|
+
end
|
219
|
+
@seq = seq
|
220
|
+
if @exec
|
221
|
+
ret << @exec.call(seq,name,*args,&block)
|
222
|
+
else
|
223
|
+
ret << seq.__send__(name,*args,&block)
|
224
|
+
end
|
225
|
+
message = [initial,call,seq.inspect].join("\n")
|
226
|
+
puts("-> #{_inspect_self(ret[-1],seq)}") if @@output_level>=::Test::Unit::UI::VERBOSE
|
227
|
+
#puts(seq.inspect) if @@output_level>=::Test::Unit::UI::VERBOSE
|
228
|
+
assertion[i,ret[-1],seq,message]
|
229
|
+
end
|
230
|
+
@call += "-> #{_inspect_merge(ret,@seqs)}"
|
231
|
+
print("-> #{_inspect_merge(ret,@seqs)}") if @@output_level==::Test::Unit::UI::NORMAL
|
232
|
+
@prune[] if self.class.instance_eval{@allow_pruning}&&rand(2).zero?
|
233
|
+
ret
|
234
|
+
end
|
235
|
+
def _test_equal(name,*args,&block)
|
236
|
+
ret0 = nil
|
237
|
+
_multi_test(name,*(args << block)) {
|
238
|
+
|i,ret,seq,message|
|
239
|
+
i==0 ? ret0 = ret : assert_equal(ret0,ret,message)
|
240
|
+
}
|
241
|
+
end
|
242
|
+
def _test_matchdata(name,*args,&block)
|
243
|
+
ret0 = nil
|
244
|
+
_multi_test(name,*(args << block)) {
|
245
|
+
|i,ret,seq,message|
|
246
|
+
if i==0
|
247
|
+
ret0 = ret
|
248
|
+
elsif ret0.nil?
|
249
|
+
assert_nil(ret)
|
250
|
+
else
|
251
|
+
assert_equal(ret0.to_a,ret.to_a)
|
252
|
+
end
|
253
|
+
}
|
254
|
+
end
|
255
|
+
def _test_match(name,*args,&block)
|
256
|
+
ret0 = nil
|
257
|
+
_multi_test(name,*(args << block)) {
|
258
|
+
|i,ret,seq,message|
|
259
|
+
if i==0
|
260
|
+
ret0 = ret
|
261
|
+
elsif ret0.nil?
|
262
|
+
assert_nil(ret)
|
263
|
+
else
|
264
|
+
assert_equal(ret0[0,ret0.size-1],ret[0,ret.size-1])
|
265
|
+
end
|
266
|
+
}
|
267
|
+
end
|
268
|
+
def _exec_position?(seq,name,*args,&block)
|
269
|
+
seq.position? { seq.__send__(name,*args,&block) }
|
270
|
+
end
|
271
|
+
def _test_position?(name,*args,&block)
|
272
|
+
ret0 = nil
|
273
|
+
@exec = method(:_exec_position?)
|
274
|
+
_multi_test(name,*(args << block)) {
|
275
|
+
|i,ret,seq,message|
|
276
|
+
i==0 ? ret0 = ret : assert_equal(ret0,ret,message)
|
277
|
+
}
|
278
|
+
end
|
279
|
+
def _test_self(name,*args,&block)
|
280
|
+
ret0 = nil
|
281
|
+
_multi_test(name,*(args << block)) {
|
282
|
+
|i,ret,seq,message|
|
283
|
+
ret0 = ret||nil if i==0
|
284
|
+
assert_same(ret0&&seq,ret,message)
|
285
|
+
}
|
286
|
+
end
|
287
|
+
def _test_position(name,*args,&block)
|
288
|
+
new_seqs = ArgArray.new
|
289
|
+
ret0 = nil
|
290
|
+
_multi_test(name,*(args << block)) {
|
291
|
+
|i,ret,seq,message|
|
292
|
+
ret0 = ret if i==0
|
293
|
+
if not ret0
|
294
|
+
assert_nil(ret,message)
|
295
|
+
else
|
296
|
+
assert_not_nil(ret,message)
|
297
|
+
new_seqs << ret
|
298
|
+
end
|
299
|
+
}
|
300
|
+
@positions << new_seqs if ret0
|
301
|
+
end
|
302
|
+
def _test_branch(name,*args,&block)
|
303
|
+
new_seqs = ArgArray.new
|
304
|
+
ret0 = nil
|
305
|
+
_multi_test(name,*(args << block)) {
|
306
|
+
|i,ret,seq,message|
|
307
|
+
ret0 = ret if i==0
|
308
|
+
if not ret0
|
309
|
+
assert_nil(ret,message)
|
310
|
+
else
|
311
|
+
assert_not_nil(ret,message)
|
312
|
+
new_seqs << ret
|
313
|
+
end
|
314
|
+
}
|
315
|
+
@branches << {
|
316
|
+
:trunk => new_seqs,
|
317
|
+
:positions => [],
|
318
|
+
:branches => [],
|
319
|
+
} if ret0
|
320
|
+
end
|
321
|
+
def _test_close(name,*args,&block)
|
322
|
+
ret0 = nil
|
323
|
+
_multi_test(name,*(args << block)) {
|
324
|
+
|i,ret,seq,message|
|
325
|
+
i==0 ? ret0 = ret : assert_equal(ret0,ret,message)
|
326
|
+
}
|
327
|
+
assert_same(true,_closed?(@seqs))
|
328
|
+
if @level==0
|
329
|
+
self.class.plant
|
330
|
+
end
|
331
|
+
ret0
|
332
|
+
end
|
333
|
+
|
334
|
+
|
335
|
+
def _opt(*args,&block)
|
336
|
+
args = args[0,rand(args.size+1)]
|
337
|
+
block and rand(2).zero? and args << block[]
|
338
|
+
args
|
339
|
+
end
|
340
|
+
def _ornil(arg)
|
341
|
+
rand(2).zero? ? arg : nil
|
342
|
+
end
|
343
|
+
# responds to ==element
|
344
|
+
def _element
|
345
|
+
self.class.element
|
346
|
+
end
|
347
|
+
# responds to ==element
|
348
|
+
def _scan_element
|
349
|
+
self.class.element
|
350
|
+
end
|
351
|
+
# responds to [element]
|
352
|
+
def _replacer
|
353
|
+
lookup = {}
|
354
|
+
self.class.elements.each { |e|
|
355
|
+
lookup[e] = self.class.element(1)
|
356
|
+
}
|
357
|
+
lookup
|
358
|
+
end
|
359
|
+
# responds to <(int), abs (which responds to >(int))
|
360
|
+
def _len
|
361
|
+
rand(5)-2
|
362
|
+
end
|
363
|
+
# responds to if and the like (everything)
|
364
|
+
def _boolean
|
365
|
+
rand(2).zero?
|
366
|
+
end
|
367
|
+
def _booleannil
|
368
|
+
case rand(3)
|
369
|
+
when 0 then false
|
370
|
+
when 1 then true
|
371
|
+
when 2 then nil
|
372
|
+
end
|
373
|
+
end
|
374
|
+
# responds to [int]
|
375
|
+
def _read_sequence
|
376
|
+
self.class.sequence(0,3)
|
377
|
+
end
|
378
|
+
# responds to <<element
|
379
|
+
def _write_sequence
|
380
|
+
self.class.sequence
|
381
|
+
end
|
382
|
+
# responds to [Integer] returning ==element responder
|
383
|
+
def _scan_sequence
|
384
|
+
self.class.sequence
|
385
|
+
end
|
386
|
+
# responds to [Integer] returning ==element responder
|
387
|
+
def _scan_sequence
|
388
|
+
self.class.sequence
|
389
|
+
end
|
390
|
+
# responds to [Integer] returning ==element responder
|
391
|
+
def _each_sequence
|
392
|
+
value = self.class.empty
|
393
|
+
value << self.class.element
|
394
|
+
while v = self.class.element(0,2)
|
395
|
+
value << v
|
396
|
+
end
|
397
|
+
value
|
398
|
+
end
|
399
|
+
# responds to [int]
|
400
|
+
def _read_pattern_sequence
|
401
|
+
self.class.sequence(0,3,"")
|
402
|
+
rescue TypeError
|
403
|
+
throw(:invalid_test)
|
404
|
+
end
|
405
|
+
def _pattern(variable)
|
406
|
+
n = 0
|
407
|
+
seq1 = self.class.sequence(0,2,"")
|
408
|
+
n = seq1.size
|
409
|
+
seq1 = Regexp.escape(seq1)
|
410
|
+
if n>=1 and rand(2).zero?
|
411
|
+
seq1 = "[#{seq1}]"
|
412
|
+
n = 1
|
413
|
+
end
|
414
|
+
alt1 = self.class.sequence(0,2,"")
|
415
|
+
alt2 = self.class.sequence(0,2,"")
|
416
|
+
n += alt1.size>alt2.size ? alt1.size : alt2.size
|
417
|
+
alt1 = Regexp.escape(alt1)
|
418
|
+
alt2 = Regexp.escape(alt2)
|
419
|
+
if alt1.empty?
|
420
|
+
if alt2.empty?
|
421
|
+
seq2 = ""
|
422
|
+
else
|
423
|
+
seq2 = "(#{alt2})?"
|
424
|
+
end
|
425
|
+
else
|
426
|
+
if alt2.empty?
|
427
|
+
seq2 = "(#{alt1})?"
|
428
|
+
else
|
429
|
+
if alt1[0]==alt2[0]
|
430
|
+
seq2 = alt1
|
431
|
+
else
|
432
|
+
seq2 = "(#{alt1}|#{alt2})"
|
433
|
+
end
|
434
|
+
end
|
435
|
+
end
|
436
|
+
if rand(2).zero?
|
437
|
+
pat = seq1+seq2
|
438
|
+
else
|
439
|
+
pat = seq2+seq1
|
440
|
+
end
|
441
|
+
pat = "(?:#{pat})*" if variable
|
442
|
+
pat = '\A'+pat if false==variable && rand(2).zero?
|
443
|
+
pat = Regexp.new(pat)
|
444
|
+
n += rand(2)
|
445
|
+
n = -n if rand(2).zero?
|
446
|
+
[pat,n]
|
447
|
+
rescue TypeError
|
448
|
+
throw(:invalid_test)
|
449
|
+
end
|
450
|
+
def _pos
|
451
|
+
pos = rand(
|
452
|
+
self.class.instance_eval{@seqs_root}[:trunk][0].size.abs.to_i+1
|
453
|
+
)
|
454
|
+
rand(2).zero? ? -(pos.nonzero?||0.0) : pos
|
455
|
+
end
|
456
|
+
def _prop_name
|
457
|
+
rand(2).zero? ? :first : :last
|
458
|
+
end
|
459
|
+
def _prop_value
|
460
|
+
rand(2).zero? ? "john" : "henry"
|
461
|
+
end
|
462
|
+
def _indexedwrite
|
463
|
+
args = [_ornil(_pos)]
|
464
|
+
args << _len if rand(2).zero?
|
465
|
+
args << (args[1] ? _write_sequence : _element)
|
466
|
+
end
|
467
|
+
def _anyposition
|
468
|
+
i = rand(@positions.size.nonzero?||throw(:invalid_test))
|
469
|
+
@positions[i]
|
470
|
+
end
|
471
|
+
def _position
|
472
|
+
i = rand(@positions.size.nonzero?||throw(:invalid_test))
|
473
|
+
if _closed?(@positions[i])
|
474
|
+
@positions.slice!(i)
|
475
|
+
throw(:invalid_test)
|
476
|
+
end
|
477
|
+
@positions[i]
|
478
|
+
end
|
479
|
+
def _deleteposition
|
480
|
+
i = rand(@positions.size.nonzero?||throw(:invalid_test))
|
481
|
+
if _closed?(@positions[i])
|
482
|
+
@positions.slice!(i)
|
483
|
+
throw(:invalid_test)
|
484
|
+
end
|
485
|
+
@positions.slice!(i)
|
486
|
+
end
|
487
|
+
def _each_code
|
488
|
+
proc { |v0| nil } # what to do?
|
489
|
+
end
|
490
|
+
def _each2_code
|
491
|
+
proc { |v0| nil } # what to do?
|
492
|
+
end
|
493
|
+
def _collect_code
|
494
|
+
lookup = {}
|
495
|
+
elements = self.class.elements
|
496
|
+
elements.each_with_index { |e,i|
|
497
|
+
lookup[e] = elements[i+1]
|
498
|
+
}
|
499
|
+
proc { |v0| lookup[v0] }
|
500
|
+
end
|
501
|
+
def _collect2_code
|
502
|
+
proc { |v0| v0.slice!(0);v0 }
|
503
|
+
end
|
504
|
+
def _position_code
|
505
|
+
elements = self.class.elements
|
506
|
+
proc {
|
507
|
+
@seq.scan1next(elements[0]) ||
|
508
|
+
@seq.position? { @seq.read1next==elements[1] }
|
509
|
+
}
|
510
|
+
end
|
511
|
+
def _pos_code
|
512
|
+
elements = self.class.elements
|
513
|
+
proc {
|
514
|
+
@seq.scan1next(elements[0]) ||
|
515
|
+
@seq.position? { @seq.read1next==elements[1] }
|
516
|
+
}
|
517
|
+
end
|
518
|
+
|
519
|
+
|
520
|
+
public
|
521
|
+
define_method("test_delete1after?" ){_test_equal(:delete1after?)}
|
522
|
+
define_method("test_delete1before?"){_test_equal(:delete1before?)}
|
523
|
+
define_method("test_insert1before" ){_test_equal(:insert1before,_element)}
|
524
|
+
define_method("test_insert1after" ){_test_equal(:insert1after,_element)}
|
525
|
+
define_method("test_read1next" ){_test_equal(:read1next)}
|
526
|
+
define_method("test_read1prev" ){_test_equal(:read1prev)}
|
527
|
+
define_method("test_write1next!" ){_test_equal(:write1next!,_element)}
|
528
|
+
define_method("test_write1prev!" ){_test_equal(:write1prev!,_element)}
|
529
|
+
define_method("test_write1next" ){_test_equal(:write1next,_element)}
|
530
|
+
define_method("test_write1prev" ){_test_equal(:write1prev,_element)}
|
531
|
+
define_method("test_skip1next" ){_test_equal(:skip1next)}
|
532
|
+
define_method("test_skip1prev" ){_test_equal(:skip1prev)}
|
533
|
+
define_method("test_delete1after" ){_test_equal(:delete1after)}
|
534
|
+
define_method("test_delete1before" ){_test_equal(:delete1before)}
|
535
|
+
define_method("test_read1after" ){_test_equal(:read1after)}
|
536
|
+
define_method("test_read1before" ){_test_equal(:read1before)}
|
537
|
+
define_method("test_write1next?" ){_test_equal(:write1next?,_element)}
|
538
|
+
define_method("test_write1prev?" ){_test_equal(:write1prev?,_element)}
|
539
|
+
define_method("test_write1after!" ){_test_equal(:write1after!,_element)}
|
540
|
+
define_method("test_write1before!" ){_test_equal(:write1before!,_element)}
|
541
|
+
define_method("test_write1after" ){_test_equal(:write1after,_element)}
|
542
|
+
define_method("test_write1before" ){_test_equal(:write1before,_element)}
|
543
|
+
define_method("test_skip1after" ){_test_equal(:skip1after)}
|
544
|
+
define_method("test_skip1before" ){_test_equal(:skip1before)}
|
545
|
+
define_method("test_write1after?" ){_test_equal(:write1after?,_element)}
|
546
|
+
define_method("test_write1before?" ){_test_equal(:write1before?,_element)}
|
547
|
+
define_method("test_scan1next" ){_test_equal(:scan1next,_scan_element)}
|
548
|
+
define_method("test_scan1prev" ){_test_equal(:scan1prev,_scan_element)}
|
549
|
+
define_method("test_modify1next" ){_test_equal(:modify1next,_replacer)}
|
550
|
+
define_method("test_modify1prev" ){_test_equal(:modify1prev,_replacer)}
|
551
|
+
define_method("test_read" ){_test_equal(:read,_len,*_opt(_booleannil,_read_sequence))}
|
552
|
+
define_method("test_read!" ){_test_equal(:read!,*_opt(_boolean,_booleannil,_read_sequence))}
|
553
|
+
define_method("test_skip" ){_test_equal(:skip,_len,*_opt(_booleannil))}
|
554
|
+
define_method("test_skip!" ){_test_equal(:skip!,*_opt(_boolean,_booleannil))}
|
555
|
+
define_method("test_write" ){_test_equal(:write,_write_sequence,*_opt(_boolean,_booleannil,_boolean))}
|
556
|
+
define_method("test_write?" ){_test_equal(:write?,_write_sequence,*_opt(_boolean,_boolean,_read_sequence))}
|
557
|
+
define_method("test_scan" ){_test_equal(:scan,_scan_sequence,*_opt(_boolean,_booleannil,_read_sequence))}
|
558
|
+
define_method("test_scan_until" ){_test_equal(:scan_until,_scan_sequence,*_opt(_boolean,_booleannil,_read_sequence))}
|
559
|
+
define_method("test_1scan_pattern"){_test_equal(:scan_pattern,*(_pattern(false)+_opt(_boolean)))}
|
560
|
+
define_method("test_2scan_pattern"){_test_matchdata(:scan_pattern,*(_pattern(false) << _boolean << _read_pattern_sequence))}
|
561
|
+
define_method("test_1scan_pattern_until"){_test_equal(:scan_pattern_until,*(_pattern(nil)+_opt(_boolean)))}
|
562
|
+
define_method("test_2scan_pattern_until"){_test_match(:scan_pattern_until,*(_pattern(nil)+[_boolean]+[_read_pattern_sequence]+_opt(rand(2))))}
|
563
|
+
define_method("test_scan_pattern_while"){_test_equal(:scan_pattern_while,*(_pattern(true)+_opt(_boolean,_read_pattern_sequence,rand(2))))}
|
564
|
+
define_method("test_1pos" ){_test_equal(:pos,*_opt(_boolean))}
|
565
|
+
define_method("test_2pos" ){_test_equal(:pos,*_opt(_boolean),&_pos_code)}
|
566
|
+
define_method("test_pos=" ){_test_equal(:pos=,_pos)}
|
567
|
+
define_method("test_1pos?" ){_test_equal(:pos?,_pos+rand(5)-2)}
|
568
|
+
define_method("test_2pos?" ){_test_equal(:pos?,*_opt(_boolean),&_pos_code)}
|
569
|
+
define_method("test_to_i" ){_test_equal(:to_i)}
|
570
|
+
define_method("test_to_s" ){_test_equal(:to_s)}
|
571
|
+
define_method("test_prop" ){_test_equal(:prop,_prop_name,*_opt(_prop_value))}
|
572
|
+
define_method("test_closed?" ){_test_equal(:closed?)}
|
573
|
+
define_method("test_close" ){_test_close(:close)}
|
574
|
+
define_method("test_1position" ){_test_position(:position,*_opt(_boolean))}
|
575
|
+
define_method("test_2position" ){_test_equal(:position,*_opt{_boolean},&_position_code)}
|
576
|
+
define_method("test_position=" ){_test_equal(:position=,_position)}
|
577
|
+
define_method("test_1position?" ){_test_equal(:position?,_anyposition)}
|
578
|
+
define_method("test_2position?" ){_test_equal(:position?,*_opt{_boolean},&_position_code)}
|
579
|
+
define_method("test_<=>" ){_test_equal(:<=>,_position)}
|
580
|
+
define_method("test_-" ){_test_equal(:-,_position)}
|
581
|
+
define_method("test_+" ){_test_position(:+,_len)}
|
582
|
+
define_method("test_succ" ){_test_position(:succ)}
|
583
|
+
define_method("test_pred" ){_test_position(:pred)}
|
584
|
+
define_method("test_begin" ){_test_position(:begin)}
|
585
|
+
define_method("test_end" ){_test_position(:end)}
|
586
|
+
define_method("test_size" ){_test_equal(:size)}
|
587
|
+
define_method("test_length" ){_test_equal(:length)}
|
588
|
+
define_method("test_empty?" ){_test_equal(:empty?)}
|
589
|
+
define_method("test_clear" ){_test_equal(:clear)}
|
590
|
+
define_method("test_replace" ){_test_self(:replace,_write_sequence)}
|
591
|
+
define_method("test_data" ){_test_equal(:data)}
|
592
|
+
define_method("test_<<" ){_test_self(:<< ,_element)}
|
593
|
+
define_method("test_>>" ){_test_self(:>> ,_element)}
|
594
|
+
define_method("test_slice" ){_test_equal(:slice,*_opt(_ornil(_pos),_len))}
|
595
|
+
define_method("test_[]" ){_test_equal(:[],*_opt(_ornil(_pos),_len))}
|
596
|
+
define_method("test_slice!" ){_test_equal(:slice!,*_opt(_ornil(_pos),_len))}
|
597
|
+
define_method("test_1[]=" ){_test_equal(:[]=,*(_opt(_pos) << _element))}
|
598
|
+
define_method("test_2[]=" ){_test_equal(:[]=,_ornil(_pos),_len,_write_sequence)}
|
599
|
+
define_method("test_1each" ){_test_equal(:each,_ornil(_pos),_boolean,&_each_code)}
|
600
|
+
define_method("test_2each" ){_test_equal(:each,_ornil(_pos),_boolean,_each_sequence,&_each2_code)}
|
601
|
+
define_method("test_1collect!" ){_test_self(:collect!,_ornil(_pos),_boolean,&_collect_code)}
|
602
|
+
define_method("test_2collect!" ){_test_self(:collect!,_ornil(_pos),_boolean,_each_sequence,&_collect2_code)}
|
603
|
+
define_method("test_1map!" ){_test_self(:map!,_ornil(_pos),_boolean,&_collect_code)}
|
604
|
+
define_method("test_2map!" ){_test_self(:map!,_ornil(_pos),_boolean,_each_sequence,&_collect2_code)}
|
605
|
+
end
|
606
|
+
end
|
607
|
+
|
608
|
+
# :startdoc:
|
609
|
+
|
data/test/test_all.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# Copyright (C) 2006 Caleb Clausen
|
2
|
+
# Distributed under the terms of Ruby's license.
|
3
|
+
$VERBOSE=1
|
4
|
+
require 'test/unit'
|
5
|
+
# require 'rubygems'
|
6
|
+
require 'sequence'
|
7
|
+
require 'sequence/indexed'
|
8
|
+
|
9
|
+
class TC_NilContentsTest < Test::Unit::TestCase
|
10
|
+
def setup
|
11
|
+
@c=Sequence::Indexed.new([1,2,3,nil,4,5,6])
|
12
|
+
end
|
13
|
+
|
14
|
+
# def teardown
|
15
|
+
# end
|
16
|
+
|
17
|
+
def test_nilcontents
|
18
|
+
@c.pos=0
|
19
|
+
assert_equal(7,@c.size)
|
20
|
+
assert_equal([1,2,3],@c.read(3))
|
21
|
+
assert(!@c.eof?)
|
22
|
+
assert_equal([nil],@c.read(1))
|
23
|
+
assert_equal([4,5,6],@c.read(3))
|
24
|
+
assert(@c.eof?)
|
25
|
+
assert_equal([],@c.read(3))
|
26
|
+
assert(@c.eof?)
|
27
|
+
assert_equal(7,@c.pos)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
class TC_ChangeListTest #< Test::Unit::TestCase
|
33
|
+
def setup
|
34
|
+
@c= Sequence::Indexed.new([1,2,3,nil,4,5,6])
|
35
|
+
@chgs= [0...0,[0], 1..2,[20,25,30], 3,[3.5], 4,[], 5..6,[50], 7,[70,80]]
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
def test_changelist
|
40
|
+
@c.changelist(*@chgs)
|
41
|
+
assert_equal @c.data!, [0,1,20,25,30,3.5,50,70,80]
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|