ZenTest 3.8.0 → 3.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +21 -0
- data/Rakefile +3 -10
- data/bin/autotest +7 -0
- data/lib/autotest.rb +124 -64
- data/lib/autotest/rails.rb +7 -6
- data/lib/autotest/timestamp.rb +2 -2
- data/lib/unit_diff.rb +35 -15
- data/lib/zentest.rb +1 -1
- data/test/test_autotest.rb +85 -36
- data/test/test_rails_autotest.rb +77 -45
- data/test/test_unit_diff.rb +114 -7
- metadata +7 -5
data/History.txt
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
+
=== 3.9.0 / 2008-01-30
|
2
|
+
|
3
|
+
* 15 minor enhancements:
|
4
|
+
|
5
|
+
* Added Wilson's patch to allow unit_diff to work with mspec. Adding rspec next.
|
6
|
+
* Minor overhaul for autotest:
|
7
|
+
* Added -f flag to start up without testing.
|
8
|
+
* Added -q flag to autotest to make it extra quiet. Patch by Aaron Patterson.
|
9
|
+
* Added ability to set test execution order, defaults to :random. EVIL!
|
10
|
+
* Added completed_re and failed_results_re to help subclasses like rspec.
|
11
|
+
* Added deprecation warnings for hooks. Deprecated :run.
|
12
|
+
* Added find_directories accessor, defaults to ['.']
|
13
|
+
* Added sleep accessor, defaults to 1 second.
|
14
|
+
* Changed find_files to order files in the same order as find_directories.
|
15
|
+
* Changed how autodiscover works with $:, added lib to the front.
|
16
|
+
* Cleaned out nearly every @ and use accessor methods instead. You should too.
|
17
|
+
* Made test_mappings ordered.
|
18
|
+
* Removed @files, adding @find_order and @known_files.
|
19
|
+
* Renamed tests_for_file to test_files_for.
|
20
|
+
* test_files_for now only returns known files.
|
21
|
+
|
1
22
|
=== 3.8.0 / 2008-01-12
|
2
23
|
|
3
24
|
* 10 minor enhancements:
|
data/Rakefile
CHANGED
@@ -6,16 +6,9 @@ require 'rubygems'
|
|
6
6
|
require 'hoe'
|
7
7
|
require './lib/zentest.rb'
|
8
8
|
|
9
|
-
Hoe.new("ZenTest", ZenTest::VERSION) do |
|
10
|
-
|
11
|
-
|
12
|
-
changes = p.paragraphs_of("History.txt", 0..4).join("\n\n")
|
13
|
-
urls, summary, *description = p.paragraphs_of("README.txt", 1, 3, 3..8)
|
14
|
-
|
15
|
-
p.url = urls.gsub(/^\* /, '').split(/\n/)
|
16
|
-
p.changes = changes
|
17
|
-
p.summary = summary
|
18
|
-
p.description = description.join("\n\n")
|
9
|
+
Hoe.new("ZenTest", ZenTest::VERSION) do |zentest|
|
10
|
+
zentest.developer('Ryan Davis', 'ryand-ruby@zenspider.com')
|
11
|
+
zentest.developer('Eric Hodel', 'drbrain@segment7.net')
|
19
12
|
end
|
20
13
|
|
21
14
|
task :autotest do
|
data/bin/autotest
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
$v ||= false
|
4
4
|
$h ||= false
|
5
|
+
$f ||= false
|
6
|
+
$q ||= false
|
5
7
|
$help ||= false
|
6
8
|
|
7
9
|
if $h or $help then
|
@@ -15,6 +17,11 @@ if $h or $help then
|
|
15
17
|
"\t-v\t\tBe verbose.",
|
16
18
|
"\t\t\tPrints files that autotest doesn't know how to map to",
|
17
19
|
"\t\t\ttests.",
|
20
|
+
nil,
|
21
|
+
"\t-q\t\tBe more quiet.",
|
22
|
+
nil,
|
23
|
+
"\t-f\t\tFast start.",
|
24
|
+
"\t\t\tDoesn't initially run tests at start.",
|
18
25
|
]
|
19
26
|
STDERR.puts help.join("\n")
|
20
27
|
exit 1
|
data/lib/autotest.rb
CHANGED
@@ -57,6 +57,8 @@ $TESTING = false unless defined? $TESTING
|
|
57
57
|
|
58
58
|
class Autotest
|
59
59
|
|
60
|
+
T0 = Time.at 0
|
61
|
+
|
60
62
|
HOOKS = Hash.new { |h,k| h[k] = [] }
|
61
63
|
unless defined? WINDOZE then
|
62
64
|
WINDOZE = /win32/ =~ RUBY_PLATFORM
|
@@ -101,8 +103,9 @@ class Autotest
|
|
101
103
|
def self.autodiscover
|
102
104
|
style = []
|
103
105
|
|
104
|
-
$:.push(*Dir["vendor/plugins/*/lib"])
|
105
106
|
paths = $:.dup
|
107
|
+
paths.push 'lib'
|
108
|
+
paths.push(*Dir["vendor/plugins/*/lib"])
|
106
109
|
|
107
110
|
begin
|
108
111
|
require 'rubygems'
|
@@ -112,8 +115,12 @@ class Autotest
|
|
112
115
|
end
|
113
116
|
|
114
117
|
paths.each do |d|
|
118
|
+
next unless File.directory? d
|
115
119
|
f = File.join(d, 'autotest', 'discover.rb')
|
116
|
-
|
120
|
+
if File.exist? f then
|
121
|
+
$: << d unless $:.include? d
|
122
|
+
load f
|
123
|
+
end
|
117
124
|
end
|
118
125
|
|
119
126
|
@@discoveries.map { |proc| proc.call }.flatten.compact.sort.uniq
|
@@ -126,16 +133,22 @@ class Autotest
|
|
126
133
|
new.run
|
127
134
|
end
|
128
135
|
|
129
|
-
|
136
|
+
attr_writer :known_files
|
137
|
+
attr_accessor(:completed_re,
|
138
|
+
:extra_class_map,
|
130
139
|
:extra_files,
|
131
|
-
:
|
140
|
+
:failed_results_re,
|
132
141
|
:files_to_test,
|
142
|
+
:find_order,
|
133
143
|
:interrupted,
|
134
144
|
:last_mtime,
|
135
145
|
:libs,
|
146
|
+
:order,
|
136
147
|
:output,
|
137
148
|
:results,
|
149
|
+
:sleep,
|
138
150
|
:tainted,
|
151
|
+
:find_directories,
|
139
152
|
:unit_diff,
|
140
153
|
:wants_to_quit)
|
141
154
|
|
@@ -143,16 +156,24 @@ class Autotest
|
|
143
156
|
# Initialize the instance and then load the user's .autotest file, if any.
|
144
157
|
|
145
158
|
def initialize
|
159
|
+
# these two are set directly because they're wrapped with
|
160
|
+
# add/remove/clear accessor methods
|
146
161
|
@exception_list = []
|
147
|
-
@
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
162
|
+
@test_mappings = []
|
163
|
+
|
164
|
+
self.completed_re = /\d+ tests, \d+ assertions, \d+ failures, \d+ errors/
|
165
|
+
self.extra_class_map = {}
|
166
|
+
self.extra_files = []
|
167
|
+
self.failed_results_re = /^\s+\d+\) (?:Failure|Error):\n(.*?)\((.*?)\)/
|
168
|
+
self.files_to_test = new_hash_of_arrays
|
169
|
+
self.find_order = []
|
170
|
+
self.known_files = nil
|
171
|
+
self.libs = %w[. lib test].join(File::PATH_SEPARATOR)
|
172
|
+
self.order = :random
|
173
|
+
self.output = $stderr
|
174
|
+
self.sleep = 1
|
175
|
+
self.find_directories = ['.']
|
176
|
+
self.unit_diff = "unit_diff -u"
|
156
177
|
|
157
178
|
self.add_mapping(/^lib\/.*\.rb$/) do |filename, _|
|
158
179
|
possible = File.basename(filename).gsub '_', '_?'
|
@@ -178,6 +199,8 @@ class Autotest
|
|
178
199
|
reset
|
179
200
|
add_sigint_handler
|
180
201
|
|
202
|
+
self.last_mtime = Time.now if $f
|
203
|
+
|
181
204
|
loop do # ^c handler
|
182
205
|
begin
|
183
206
|
get_to_green
|
@@ -214,10 +237,10 @@ class Autotest
|
|
214
237
|
def run_tests
|
215
238
|
hook :run_command
|
216
239
|
|
217
|
-
self.find_files_to_test
|
240
|
+
self.find_files_to_test
|
218
241
|
cmd = self.make_test_cmd self.files_to_test
|
219
242
|
|
220
|
-
puts cmd
|
243
|
+
puts cmd unless $q
|
221
244
|
|
222
245
|
old_sync = $stdout.sync
|
223
246
|
$stdout.sync = true
|
@@ -262,7 +285,7 @@ class Autotest
|
|
262
285
|
unless hook :interrupt then
|
263
286
|
puts "Interrupt a second time to quit"
|
264
287
|
self.interrupted = true
|
265
|
-
sleep 1.5
|
288
|
+
Kernel.sleep 1.5
|
266
289
|
end
|
267
290
|
raise Interrupt, nil # let the run loop catch it
|
268
291
|
end
|
@@ -294,9 +317,9 @@ class Autotest
|
|
294
317
|
# file.
|
295
318
|
|
296
319
|
def consolidate_failures(failed)
|
297
|
-
filters =
|
320
|
+
filters = new_hash_of_arrays
|
298
321
|
|
299
|
-
class_map = Hash[*self.
|
322
|
+
class_map = Hash[*self.find_order.grep(/^test/).map { |f| # TODO: ugly
|
300
323
|
[path_to_classname(f), f]
|
301
324
|
}.flatten]
|
302
325
|
class_map.merge!(self.extra_class_map)
|
@@ -319,18 +342,23 @@ class Autotest
|
|
319
342
|
|
320
343
|
def find_files
|
321
344
|
result = {}
|
322
|
-
targets =
|
345
|
+
targets = self.find_directories + self.extra_files
|
323
346
|
|
324
|
-
|
325
|
-
|
347
|
+
targets.each do |target|
|
348
|
+
order = []
|
349
|
+
Find.find(target) do |f|
|
350
|
+
Find.prune if f =~ self.exceptions
|
326
351
|
|
327
|
-
|
328
|
-
|
329
|
-
|
352
|
+
next if test ?d, f
|
353
|
+
next if f =~ /(swp|~|rej|orig)$/ # temporary/patch files
|
354
|
+
next if f =~ /\/\.?#/ # Emacs autosave/cvs merge files
|
330
355
|
|
331
|
-
|
356
|
+
filename = f.sub(/^\.\//, '')
|
332
357
|
|
333
|
-
|
358
|
+
result[filename] = File.stat(filename).mtime rescue next
|
359
|
+
order << filename
|
360
|
+
end
|
361
|
+
self.find_order.push(*order.sort)
|
334
362
|
end
|
335
363
|
|
336
364
|
return result
|
@@ -343,26 +371,16 @@ class Autotest
|
|
343
371
|
# file.
|
344
372
|
|
345
373
|
def find_files_to_test(files=find_files)
|
346
|
-
updated = files.select { |filename, mtime|
|
347
|
-
self.files[filename] < mtime
|
348
|
-
}
|
374
|
+
updated = files.select { |filename, mtime| self.last_mtime < mtime }
|
349
375
|
|
350
376
|
p updated if $v unless updated.empty? or self.last_mtime.to_i == 0
|
351
377
|
|
352
|
-
|
353
|
-
|
354
|
-
self.files[filename] = mtime
|
378
|
+
updated.map { |f,m| test_files_for(f) }.flatten.uniq.each do |filename|
|
379
|
+
self.files_to_test[filename] # creates key with default value
|
355
380
|
end
|
356
381
|
|
357
|
-
|
358
|
-
|
359
|
-
self.files_to_test[f] # creates key with default value
|
360
|
-
end
|
361
|
-
end
|
362
|
-
|
363
|
-
previous = self.last_mtime
|
364
|
-
self.last_mtime = self.files.values.max
|
365
|
-
self.last_mtime > previous
|
382
|
+
self.last_mtime = files.values.max
|
383
|
+
not updated.empty?
|
366
384
|
end
|
367
385
|
|
368
386
|
##
|
@@ -370,25 +388,36 @@ class Autotest
|
|
370
388
|
# there are failures record this.
|
371
389
|
|
372
390
|
def handle_results(results)
|
373
|
-
failed = results.scan(
|
374
|
-
completed = results =~
|
391
|
+
failed = results.scan(self.failed_results_re)
|
392
|
+
completed = results =~ self.completed_re
|
375
393
|
|
376
394
|
self.files_to_test = consolidate_failures failed if completed
|
377
395
|
|
378
|
-
|
396
|
+
color = completed && self.files_to_test.empty? ? :green : :red
|
397
|
+
hook color unless $TESTING
|
379
398
|
|
380
399
|
self.tainted = true unless self.files_to_test.empty?
|
381
400
|
end
|
382
401
|
|
402
|
+
##
|
403
|
+
# Lazy accessor for the known_files hash.
|
404
|
+
|
405
|
+
def known_files
|
406
|
+
unless @known_files then
|
407
|
+
@known_files = Hash[*find_order.map { |f| [f, true] }.flatten]
|
408
|
+
end
|
409
|
+
@known_files
|
410
|
+
end
|
411
|
+
|
383
412
|
##
|
384
413
|
# Generate the commands to test the supplied files
|
385
414
|
|
386
415
|
def make_test_cmd files_to_test
|
387
416
|
cmds = []
|
388
|
-
full, partial = files_to_test.partition { |k,v| v.empty? }
|
417
|
+
full, partial = reorder(files_to_test).partition { |k,v| v.empty? }
|
389
418
|
|
390
419
|
unless full.empty? then
|
391
|
-
classes = full.map {|k,v| k}.flatten.uniq.
|
420
|
+
classes = full.map {|k,v| k}.flatten.uniq.join(' ')
|
392
421
|
cmds << "#{ruby} -I#{libs} -rtest/unit -e \"%w[#{classes}].each { |f| require f }\" | #{unit_diff}"
|
393
422
|
end
|
394
423
|
|
@@ -400,12 +429,32 @@ class Autotest
|
|
400
429
|
return cmds.join("#{SEP} ")
|
401
430
|
end
|
402
431
|
|
432
|
+
def new_hash_of_arrays
|
433
|
+
Hash.new { |h,k| h[k] = [] }
|
434
|
+
end
|
435
|
+
|
436
|
+
def reorder files_to_test
|
437
|
+
case self.order
|
438
|
+
when :alpha then
|
439
|
+
files_to_test.sort_by { |k,v| k }
|
440
|
+
when :reverse then
|
441
|
+
files_to_test.sort_by { |k,v| k }.reverse
|
442
|
+
when :random then
|
443
|
+
files_to_test.sort_by { |k,v| rand }
|
444
|
+
when :natural then
|
445
|
+
(self.find_order & files_to_test.keys).map { |f| [f, files_to_test[f]] }
|
446
|
+
else
|
447
|
+
raise "unknown order type: #{self.order.inspect}"
|
448
|
+
end
|
449
|
+
end
|
450
|
+
|
403
451
|
##
|
404
452
|
# Rerun the tests from cold (reset state)
|
405
453
|
|
406
454
|
def rerun_all_tests
|
407
455
|
reset
|
408
456
|
run_tests
|
457
|
+
|
409
458
|
hook :all_good if all_good
|
410
459
|
end
|
411
460
|
|
@@ -414,12 +463,14 @@ class Autotest
|
|
414
463
|
# interrupts will kill autotest.
|
415
464
|
|
416
465
|
def reset
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
466
|
+
self.files_to_test.clear
|
467
|
+
self.find_order.clear
|
468
|
+
self.interrupted = false
|
469
|
+
self.known_files = nil
|
470
|
+
self.last_mtime = T0
|
471
|
+
self.tainted = false
|
472
|
+
self.wants_to_quit = false
|
473
|
+
|
423
474
|
hook :reset
|
424
475
|
end
|
425
476
|
|
@@ -430,9 +481,7 @@ class Autotest
|
|
430
481
|
ruby = File.join(Config::CONFIG['bindir'],
|
431
482
|
Config::CONFIG['ruby_install_name'])
|
432
483
|
|
433
|
-
|
434
|
-
ruby.gsub! File::SEPARATOR, File::ALT_SEPARATOR
|
435
|
-
end
|
484
|
+
ruby.gsub! File::SEPARATOR, File::ALT_SEPARATOR if File::ALT_SEPARATOR
|
436
485
|
|
437
486
|
return ruby
|
438
487
|
end
|
@@ -442,13 +491,16 @@ class Autotest
|
|
442
491
|
# a +test_mapping+ that matches the file and executing the mapping's
|
443
492
|
# proc.
|
444
493
|
|
445
|
-
def
|
494
|
+
def test_files_for(filename)
|
446
495
|
result = @test_mappings.find { |file_re, ignored| filename =~ file_re }
|
496
|
+
|
497
|
+
p :test_file_for => [filename, result.first] if result and $DEBUG
|
498
|
+
|
447
499
|
result = result.nil? ? [] : Array(result.last.call(filename, $~))
|
448
500
|
|
449
501
|
output.puts "Dunno! #{filename}" if ($v or $TESTING) and result.empty?
|
450
502
|
|
451
|
-
result.sort.uniq
|
503
|
+
result.sort.uniq.select { |f| known_files[f] }
|
452
504
|
end
|
453
505
|
|
454
506
|
##
|
@@ -457,7 +509,7 @@ class Autotest
|
|
457
509
|
def wait_for_changes
|
458
510
|
hook :waiting
|
459
511
|
begin
|
460
|
-
sleep
|
512
|
+
Kernel.sleep self.sleep
|
461
513
|
end until find_files_to_test
|
462
514
|
end
|
463
515
|
|
@@ -468,9 +520,7 @@ class Autotest
|
|
468
520
|
# Returns all known files in the codebase matching +regexp+.
|
469
521
|
|
470
522
|
def files_matching regexp
|
471
|
-
|
472
|
-
k =~ regexp
|
473
|
-
}
|
523
|
+
self.find_order.select { |k| k =~ regexp }
|
474
524
|
end
|
475
525
|
|
476
526
|
##
|
@@ -485,14 +535,16 @@ class Autotest
|
|
485
535
|
# end
|
486
536
|
|
487
537
|
def add_mapping(regexp, &proc)
|
488
|
-
@test_mappings[regexp
|
538
|
+
@test_mappings << [regexp, proc]
|
489
539
|
end
|
490
540
|
|
491
541
|
##
|
492
542
|
# Removed a file mapping matching +regexp+.
|
493
543
|
|
494
544
|
def remove_mapping regexp
|
495
|
-
@test_mappings.
|
545
|
+
@test_mappings.delete_if do |k,v|
|
546
|
+
k == regexp
|
547
|
+
end
|
496
548
|
end
|
497
549
|
|
498
550
|
##
|
@@ -537,7 +589,7 @@ class Autotest
|
|
537
589
|
##
|
538
590
|
# Return a compiled regexp of exceptions for find_files or nil if no
|
539
591
|
# filtering should take place. This regexp is generated from
|
540
|
-
#
|
592
|
+
# +exception_list+.
|
541
593
|
|
542
594
|
def exceptions
|
543
595
|
unless defined? @exceptions then
|
@@ -560,6 +612,14 @@ class Autotest
|
|
560
612
|
# event.
|
561
613
|
|
562
614
|
def hook(name)
|
615
|
+
deprecated = {
|
616
|
+
:run => :initialize, # TODO: remove 2008-03-14 (pi day!)
|
617
|
+
}
|
618
|
+
|
619
|
+
if deprecated[name] and not HOOKS[name].empty? then
|
620
|
+
warn "hook #{name} has been deprecated, use #{deprecated[name]}"
|
621
|
+
end
|
622
|
+
|
563
623
|
HOOKS[name].inject(false) do |handled,plugin|
|
564
624
|
plugin[self] || handled
|
565
625
|
end
|
data/lib/autotest/rails.rb
CHANGED
@@ -7,6 +7,13 @@ class Autotest::Rails < Autotest
|
|
7
7
|
|
8
8
|
add_exception %r%^\./(?:db|doc|log|public|script|tmp|vendor)%
|
9
9
|
|
10
|
+
clear_mappings
|
11
|
+
|
12
|
+
self.add_mapping(/^lib\/.*\.rb$/) do |filename, _|
|
13
|
+
impl = File.basename(filename, '.rb')
|
14
|
+
files_matching %r%^test/unit/#{impl}_test.rb$%
|
15
|
+
end
|
16
|
+
|
10
17
|
add_mapping %r%^test/fixtures/(.*)s.yml% do |_, m|
|
11
18
|
["test/unit/#{m[1]}_test.rb",
|
12
19
|
"test/controllers/#{m[1]}_controller_test.rb",
|
@@ -62,12 +69,6 @@ class Autotest::Rails < Autotest
|
|
62
69
|
end
|
63
70
|
end
|
64
71
|
|
65
|
-
# Given the string filename as the path, determine
|
66
|
-
# the corresponding tests for it, in an array.
|
67
|
-
def tests_for_file(filename)
|
68
|
-
super.select { |f| @files.has_key? f }
|
69
|
-
end
|
70
|
-
|
71
72
|
# Convert the pathname s to the name of class.
|
72
73
|
def path_to_classname(s)
|
73
74
|
sep = File::SEPARATOR
|
data/lib/autotest/timestamp.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# -*- ruby -*-
|
2
2
|
|
3
3
|
module Autotest::Timestamp
|
4
|
-
Autotest.add_hook :waiting do
|
4
|
+
Autotest.add_hook :waiting do
|
5
5
|
puts
|
6
|
-
puts "# Waiting
|
6
|
+
puts "# Waiting since #{Time.now.strftime "%Y-%m-%d %H:%M:%S"}"
|
7
7
|
puts
|
8
8
|
end
|
9
9
|
end
|
data/lib/unit_diff.rb
CHANGED
@@ -82,14 +82,8 @@ class UnitDiff
|
|
82
82
|
output.puts input.gets # the rest of "Finished in..."
|
83
83
|
output.puts
|
84
84
|
next
|
85
|
-
when /^\s
|
85
|
+
when /^\s*$/, /^\(?\s*\d+\) (Failure|Error):/, /^\d+\)/ then
|
86
86
|
print_lines = false
|
87
|
-
type = nil
|
88
|
-
current = []
|
89
|
-
data << current
|
90
|
-
when /^\(?\s*\d+\) (Failure|Error):/ then
|
91
|
-
print_lines = false # if line =~ /Failure|Error/
|
92
|
-
type = $1
|
93
87
|
current = []
|
94
88
|
data << current
|
95
89
|
when /^Finished in \d/ then
|
@@ -111,6 +105,7 @@ class UnitDiff
|
|
111
105
|
header = []
|
112
106
|
expect = []
|
113
107
|
butwas = []
|
108
|
+
footer = []
|
114
109
|
found = false
|
115
110
|
state = :header
|
116
111
|
|
@@ -118,19 +113,43 @@ class UnitDiff
|
|
118
113
|
case state
|
119
114
|
when :header then
|
120
115
|
header << result.shift
|
121
|
-
state = :expect if result.first =~
|
116
|
+
state = :expect if result.first =~ /^<|^Expected/
|
122
117
|
when :expect then
|
123
|
-
|
124
|
-
|
118
|
+
if result.first =~ /^Expected (.*?) to equal (.*?):$/ then
|
119
|
+
expect << $1
|
120
|
+
butwas << $2
|
121
|
+
state = :footer
|
122
|
+
result.shift
|
123
|
+
elsif result.first =~ /^Expected (.*?)$/ then
|
124
|
+
expect << "#{$1}\n"
|
125
|
+
result.shift
|
126
|
+
elsif result.first =~ /^to equal / then
|
127
|
+
state = :spec_butwas
|
128
|
+
bw = result.shift.sub(/^to equal (.*):?$/, '\1')
|
129
|
+
butwas << bw
|
130
|
+
else
|
131
|
+
state = :butwas if result.first.sub!(/ expected but was/, '')
|
132
|
+
expect << result.shift
|
133
|
+
end
|
125
134
|
when :butwas then
|
126
135
|
butwas = result[0..-1]
|
127
136
|
result.clear
|
137
|
+
when :spec_butwas then
|
138
|
+
if result.first =~ /^\s+\S+ at |^:\s*$/
|
139
|
+
state = :footer
|
140
|
+
else
|
141
|
+
butwas << result.shift
|
142
|
+
end
|
143
|
+
when :footer then
|
144
|
+
butwas.last.sub!(/:$/, '')
|
145
|
+
footer = result.map {|l| l.chomp }
|
146
|
+
result.clear
|
128
147
|
else
|
129
148
|
raise "unknown state #{state}"
|
130
149
|
end
|
131
150
|
end
|
132
151
|
|
133
|
-
return header, expect, nil if butwas.empty?
|
152
|
+
return header, expect, nil, footer if butwas.empty?
|
134
153
|
|
135
154
|
expect.last.chomp!
|
136
155
|
expect.first.sub!(/^<\"/, '')
|
@@ -141,7 +160,7 @@ class UnitDiff
|
|
141
160
|
butwas.first.sub!( /^<\"/, '')
|
142
161
|
butwas.last.sub!(/\">$/, '')
|
143
162
|
|
144
|
-
return header, expect, butwas
|
163
|
+
return header, expect, butwas, footer
|
145
164
|
end
|
146
165
|
|
147
166
|
##
|
@@ -164,12 +183,12 @@ class UnitDiff
|
|
164
183
|
first = []
|
165
184
|
second = []
|
166
185
|
|
167
|
-
if result.first
|
186
|
+
if result.first =~ /Error/ then
|
168
187
|
output.push result.join('')
|
169
188
|
next
|
170
189
|
end
|
171
190
|
|
172
|
-
prefix, expect, butwas = parse_diff(result)
|
191
|
+
prefix, expect, butwas, result_footer = parse_diff(result)
|
173
192
|
|
174
193
|
output.push prefix.compact.map {|line| line.strip}.join("\n")
|
175
194
|
|
@@ -188,7 +207,7 @@ class UnitDiff
|
|
188
207
|
if result.empty? then
|
189
208
|
output.push "[no difference--suspect ==]"
|
190
209
|
else
|
191
|
-
output.push result.
|
210
|
+
output.push result.map { |line| line.chomp }
|
192
211
|
end
|
193
212
|
|
194
213
|
if $k then
|
@@ -200,6 +219,7 @@ class UnitDiff
|
|
200
219
|
end
|
201
220
|
end
|
202
221
|
|
222
|
+
output.push result_footer
|
203
223
|
output.push ''
|
204
224
|
else
|
205
225
|
output.push expect.join('')
|
data/lib/zentest.rb
CHANGED
data/test/test_autotest.rb
CHANGED
@@ -27,6 +27,10 @@ end
|
|
27
27
|
|
28
28
|
class TestAutotest < Test::Unit::TestCase
|
29
29
|
|
30
|
+
def deny test
|
31
|
+
assert ! test
|
32
|
+
end
|
33
|
+
|
30
34
|
RUBY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name']) unless defined? RUBY
|
31
35
|
|
32
36
|
def setup
|
@@ -42,10 +46,13 @@ class TestAutotest < Test::Unit::TestCase
|
|
42
46
|
klassname.sub!(/^(\w+)(Autotest)$/, '\2::\1') unless klassname == "Autotest"
|
43
47
|
@a = klassname.split(/::/).inject(Object) { |k,n| k.const_get(n) }.new
|
44
48
|
@a.output = StringIO.new
|
45
|
-
@a.files.clear
|
46
|
-
@a.files[@impl] = Time.at(1)
|
47
|
-
@a.files[@test] = Time.at(2)
|
48
49
|
@a.last_mtime = Time.at(2)
|
50
|
+
|
51
|
+
@files = {}
|
52
|
+
@files[@impl] = Time.at(1)
|
53
|
+
@files[@test] = Time.at(2)
|
54
|
+
|
55
|
+
@a.find_order = @files.keys.sort
|
49
56
|
end
|
50
57
|
|
51
58
|
def test_add_exception
|
@@ -88,9 +95,11 @@ class TestAutotest < Test::Unit::TestCase
|
|
88
95
|
end
|
89
96
|
|
90
97
|
def test_consolidate_failures_experiment
|
91
|
-
@
|
92
|
-
@
|
93
|
-
@
|
98
|
+
@files.clear
|
99
|
+
@files[@impl] = Time.at(1)
|
100
|
+
@files[@test] = Time.at(2)
|
101
|
+
|
102
|
+
@a.find_order = @files.keys.sort
|
94
103
|
|
95
104
|
input = [['test_fail1', @test_class], ['test_fail2', @test_class], ['test_error1', @test_class], ['test_error2', @test_class]]
|
96
105
|
result = @a.consolidate_failures input
|
@@ -105,7 +114,7 @@ class TestAutotest < Test::Unit::TestCase
|
|
105
114
|
end
|
106
115
|
|
107
116
|
def test_consolidate_failures_multiple_possibilities
|
108
|
-
|
117
|
+
@files[@other_test] = Time.at(42)
|
109
118
|
result = @a.consolidate_failures([['test_unmatched', @test_class]])
|
110
119
|
expected = { @test => ['test_unmatched']}
|
111
120
|
assert_equal expected, result
|
@@ -114,11 +123,14 @@ class TestAutotest < Test::Unit::TestCase
|
|
114
123
|
end
|
115
124
|
|
116
125
|
def test_consolidate_failures_nested_classes
|
117
|
-
@
|
118
|
-
@
|
119
|
-
@
|
120
|
-
@
|
121
|
-
@
|
126
|
+
@files.clear
|
127
|
+
@files['lib/outer.rb'] = Time.at(5)
|
128
|
+
@files['lib/outer/inner.rb'] = Time.at(5)
|
129
|
+
@files[@inner_test] = Time.at(5)
|
130
|
+
@files[@outer_test] = Time.at(5)
|
131
|
+
|
132
|
+
@a.find_order = @files.keys.sort
|
133
|
+
|
122
134
|
result = @a.consolidate_failures([['test_blah1', @inner_test_class]])
|
123
135
|
expected = { @inner_test => ['test_blah1'] }
|
124
136
|
assert_equal expected, result
|
@@ -154,10 +166,10 @@ class TestAutotest < Test::Unit::TestCase
|
|
154
166
|
# TODO: lots of filename edgecases for find_files_to_test
|
155
167
|
def test_find_files_to_test
|
156
168
|
@a.last_mtime = Time.at(0)
|
157
|
-
assert @a.find_files_to_test(@
|
169
|
+
assert @a.find_files_to_test(@files)
|
158
170
|
|
159
|
-
@a.last_mtime = @
|
160
|
-
|
171
|
+
@a.last_mtime = @files.values.sort.last + 1
|
172
|
+
deny @a.find_files_to_test(@files)
|
161
173
|
end
|
162
174
|
|
163
175
|
def test_find_files_to_test_dunno
|
@@ -181,12 +193,12 @@ class TestAutotest < Test::Unit::TestCase
|
|
181
193
|
assert_equal empty, @a.files_to_test
|
182
194
|
|
183
195
|
# ensure we do nothing when nothing changes...
|
184
|
-
files = { @impl => @
|
185
|
-
|
196
|
+
files = { @impl => @files[@impl] } # same time
|
197
|
+
deny @a.find_files_to_test(files)
|
186
198
|
assert_equal empty, @a.files_to_test
|
187
199
|
assert_equal "", @a.output.string
|
188
200
|
|
189
|
-
files = { @impl => @
|
201
|
+
files = { @impl => @files[@impl] } # same time
|
190
202
|
assert(! @a.find_files_to_test(files))
|
191
203
|
assert_equal empty, @a.files_to_test
|
192
204
|
assert_equal "", @a.output.string
|
@@ -197,11 +209,48 @@ class TestAutotest < Test::Unit::TestCase
|
|
197
209
|
util_find_files_to_test(@test, @test => [])
|
198
210
|
end
|
199
211
|
|
212
|
+
def test_reorder_alpha
|
213
|
+
@a.order = :alpha
|
214
|
+
expected = @files.sort
|
215
|
+
|
216
|
+
assert_equal expected, @a.reorder(@files)
|
217
|
+
end
|
218
|
+
|
219
|
+
def test_reorder_reverse
|
220
|
+
@a.order = :reverse
|
221
|
+
expected = @files.sort.reverse
|
222
|
+
|
223
|
+
assert_equal expected, @a.reorder(@files)
|
224
|
+
end
|
225
|
+
|
226
|
+
def test_reorder_random
|
227
|
+
srand 42
|
228
|
+
@a.order = :random
|
229
|
+
expected = ["test/test_blah.rb", "lib/blah.rb"].map { |f| [f, @files[f]] }
|
230
|
+
|
231
|
+
assert_equal expected, @a.reorder(@files)
|
232
|
+
end
|
233
|
+
|
234
|
+
def test_reorder_natural
|
235
|
+
srand 42
|
236
|
+
|
237
|
+
@files['lib/untested_blah.rb'] = Time.at(2)
|
238
|
+
@a.find_order = @files.keys.sort_by { rand }
|
239
|
+
|
240
|
+
@a.order = :natural
|
241
|
+
expected = @a.find_order.map { |f| [f, @files[f]] }
|
242
|
+
|
243
|
+
assert_equal expected, @a.reorder(@files)
|
244
|
+
end
|
245
|
+
|
200
246
|
def test_handle_results
|
201
247
|
@a.files_to_test.clear
|
202
|
-
@
|
203
|
-
@
|
204
|
-
@
|
248
|
+
@files.clear
|
249
|
+
@files[@impl] = Time.at(1)
|
250
|
+
@files[@test] = Time.at(2)
|
251
|
+
|
252
|
+
@a.find_order = @files.keys.sort
|
253
|
+
|
205
254
|
empty = {}
|
206
255
|
assert_equal empty, @a.files_to_test, "must start empty"
|
207
256
|
|
@@ -246,7 +295,7 @@ test_error2(#{@test_class}):
|
|
246
295
|
from -e:1
|
247
296
|
'
|
248
297
|
@a.files_to_test[@test] = Time.at(42)
|
249
|
-
@
|
298
|
+
@files[@test] = []
|
250
299
|
expected = { @test => Time.at(42) }
|
251
300
|
assert_equal expected, @a.files_to_test
|
252
301
|
@a.handle_results(s3)
|
@@ -256,7 +305,7 @@ test_error2(#{@test_class}):
|
|
256
305
|
|
257
306
|
@a.handle_results(s1)
|
258
307
|
assert_equal empty, @a.files_to_test
|
259
|
-
|
308
|
+
deny @a.tainted
|
260
309
|
end
|
261
310
|
|
262
311
|
def test_hook_overlap
|
@@ -287,14 +336,14 @@ test_error2(#{@test_class}):
|
|
287
336
|
|
288
337
|
def test_hook_response
|
289
338
|
Autotest.clear_hooks
|
290
|
-
|
339
|
+
deny @a.hook(:blah)
|
291
340
|
|
292
341
|
Autotest.add_hook(:blah) { false }
|
293
|
-
|
342
|
+
deny @a.hook(:blah)
|
294
343
|
|
295
344
|
Autotest.add_hook(:blah) { false }
|
296
|
-
|
297
|
-
|
345
|
+
deny @a.hook(:blah)
|
346
|
+
|
298
347
|
Autotest.add_hook(:blah) { true }
|
299
348
|
assert @a.hook(:blah)
|
300
349
|
end
|
@@ -340,14 +389,14 @@ test_error2(#{@test_class}):
|
|
340
389
|
assert_equal expect, actual
|
341
390
|
end
|
342
391
|
|
343
|
-
def
|
344
|
-
assert_equal [@test], @a.
|
345
|
-
assert_equal [@test], @a.
|
392
|
+
def test_test_files_for
|
393
|
+
assert_equal [@test], @a.test_files_for(@impl)
|
394
|
+
assert_equal [@test], @a.test_files_for(@test)
|
346
395
|
|
347
|
-
assert_equal [
|
348
|
-
assert_equal [], @a.
|
349
|
-
assert_equal [], @a.
|
350
|
-
assert_equal [], @a.
|
396
|
+
assert_equal [], @a.test_files_for('test/test_unknown.rb')
|
397
|
+
assert_equal [], @a.test_files_for('lib/unknown.rb')
|
398
|
+
assert_equal [], @a.test_files_for('unknown.rb')
|
399
|
+
assert_equal [], @a.test_files_for('test_unknown.rb')
|
351
400
|
end
|
352
401
|
|
353
402
|
def util_exceptions
|
@@ -360,12 +409,12 @@ test_error2(#{@test_class}):
|
|
360
409
|
|
361
410
|
assert @a.find_files_to_test(files)
|
362
411
|
assert_equal expected, @a.files_to_test
|
363
|
-
assert_equal t, @a.
|
412
|
+
assert_equal t, @a.last_mtime
|
364
413
|
assert_equal "", @a.output.string
|
365
414
|
end
|
366
415
|
|
367
416
|
def util_mappings
|
368
|
-
@a.test_mappings.
|
417
|
+
@a.test_mappings.map { |k,v| k }.sort_by { |x| x.to_s }
|
369
418
|
end
|
370
419
|
|
371
420
|
def util_path_to_classname(e,i)
|
data/test/test_rails_autotest.rb
CHANGED
@@ -42,152 +42,183 @@ class TestRailsAutotest < TestAutotest
|
|
42
42
|
test/views/articles_view_test.rb
|
43
43
|
test/views/layouts_view_test.rb)
|
44
44
|
|
45
|
-
@
|
45
|
+
@files.clear
|
46
46
|
|
47
47
|
(@rails_unit_tests +
|
48
48
|
@rails_controller_tests +
|
49
49
|
@rails_view_tests +
|
50
50
|
@rails_functional_tests +
|
51
|
-
@extra_files
|
52
|
-
|
51
|
+
@extra_files +
|
52
|
+
[@impl]).flatten.each_with_index do |path, t|
|
53
|
+
@files[path] = Time.at(t+1)
|
53
54
|
end
|
54
|
-
|
55
|
+
|
56
|
+
@a.find_order = @files.keys
|
57
|
+
@a.last_mtime = @files.values.sort.last
|
55
58
|
end
|
56
59
|
|
57
60
|
# Overridden from superclass... the scenario just doesn't happen the same way.
|
58
61
|
def test_consolidate_failures_multiple_matches
|
59
62
|
@test2 = 'test/unit/route_again_test.rb'
|
60
|
-
@
|
61
|
-
@
|
62
|
-
@
|
63
|
+
@files[@test2] = Time.at(42)
|
64
|
+
@files['app/views/routes/edit.rhtml'] = Time.at(42)
|
65
|
+
@files['app/views/routes/list.rhtml'] = Time.at(42)
|
66
|
+
|
67
|
+
@a.find_order = @files.keys
|
68
|
+
|
63
69
|
result = @a.consolidate_failures([['test_unmatched', @test_class]])
|
64
70
|
expected = {"test/unit/route_test.rb"=>["test_unmatched"]}
|
65
71
|
assert_equal expected, result
|
66
72
|
assert_equal '', @a.output.string
|
67
73
|
end
|
68
74
|
|
69
|
-
def
|
75
|
+
def test_reorder_random
|
76
|
+
srand 42
|
77
|
+
@a.order = :random
|
78
|
+
expected = ["test/views/admin/themes_view_test.rb",
|
79
|
+
"test/functional/articles_controller_test.rb",
|
80
|
+
"app/models/route.rb",
|
81
|
+
"test/views/articles_view_test.rb",
|
82
|
+
"test/views/route_view_test.rb",
|
83
|
+
"test/controllers/articles_controller_test.rb",
|
84
|
+
"test/functional/admin/themes_controller_test.rb",
|
85
|
+
"test/functional/route_controller_test.rb",
|
86
|
+
"test/unit/route_test.rb",
|
87
|
+
"test/functional/dummy_controller_test.rb",
|
88
|
+
"test/controllers/admin/themes_controller_test.rb",
|
89
|
+
"test/views/layouts_view_test.rb",
|
90
|
+
"test/controllers/dummy_controller_test.rb",
|
91
|
+
"test/controllers/route_controller_test.rb"]
|
92
|
+
expected.map! { |f| [f, @files[f]] }
|
93
|
+
|
94
|
+
assert_equal expected, @a.reorder(@files)
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_test_files_for
|
70
98
|
empty = []
|
71
|
-
assert_equal empty, @a.
|
72
|
-
assert_equal empty, @a.
|
99
|
+
assert_equal empty, @a.test_files_for('blah.rb')
|
100
|
+
assert_equal empty, @a.test_files_for('test_blah.rb')
|
73
101
|
|
74
102
|
# controllers
|
75
|
-
|
103
|
+
util_test_files_for('app/controllers/admin/themes_controller.rb',
|
76
104
|
'test/controllers/admin/themes_controller_test.rb',
|
77
105
|
'test/functional/admin/themes_controller_test.rb')
|
78
106
|
|
79
|
-
|
107
|
+
util_test_files_for('app/controllers/application.rb',
|
80
108
|
@rails_controller_tests,
|
81
109
|
@rails_view_tests,
|
82
110
|
@rails_functional_tests)
|
83
111
|
|
84
|
-
|
112
|
+
util_test_files_for('app/controllers/route_controller.rb',
|
85
113
|
'test/controllers/route_controller_test.rb',
|
86
114
|
'test/functional/route_controller_test.rb')
|
87
115
|
|
88
|
-
|
116
|
+
util_test_files_for('app/controllers/notest_controller.rb')
|
89
117
|
|
90
118
|
# helpers
|
91
|
-
|
119
|
+
util_test_files_for('app/helpers/application_helper.rb',
|
92
120
|
@rails_view_tests,
|
93
121
|
@rails_functional_tests)
|
94
122
|
|
95
|
-
|
123
|
+
util_test_files_for('app/helpers/route_helper.rb',
|
96
124
|
'test/views/route_view_test.rb',
|
97
125
|
'test/functional/route_controller_test.rb')
|
98
126
|
|
99
127
|
# model
|
100
|
-
|
128
|
+
util_test_files_for('app/models/route.rb',
|
101
129
|
@test)
|
102
130
|
|
103
|
-
|
131
|
+
util_test_files_for('app/models/notest.rb')
|
104
132
|
|
105
133
|
# views
|
106
|
-
|
134
|
+
util_test_files_for('app/views/layouts/default.rhtml',
|
107
135
|
'test/views/layouts_view_test.rb')
|
108
136
|
|
109
|
-
|
137
|
+
util_test_files_for('app/views/route/index.rhtml',
|
110
138
|
'test/views/route_view_test.rb',
|
111
139
|
'test/functional/route_controller_test.rb')
|
112
140
|
|
113
|
-
|
141
|
+
util_test_files_for('app/views/route/xml.rxml',
|
114
142
|
'test/views/route_view_test.rb',
|
115
143
|
'test/functional/route_controller_test.rb')
|
116
144
|
|
117
|
-
|
145
|
+
util_test_files_for('app/views/shared/notest.rhtml')
|
118
146
|
|
119
|
-
|
147
|
+
util_test_files_for('app/views/articles/flag.rhtml',
|
120
148
|
'test/views/articles_view_test.rb',
|
121
149
|
'test/functional/articles_controller_test.rb')
|
122
150
|
|
123
151
|
# tests
|
124
|
-
|
152
|
+
util_test_files_for('test/fixtures/routes.yml',
|
125
153
|
@test,
|
126
154
|
'test/controllers/route_controller_test.rb',
|
127
155
|
'test/views/route_view_test.rb',
|
128
156
|
'test/functional/route_controller_test.rb')
|
129
157
|
|
130
|
-
|
158
|
+
util_test_files_for('test/test_helper.rb',
|
131
159
|
@rails_unit_tests, @rails_controller_tests,
|
132
160
|
@rails_view_tests, @rails_functional_tests)
|
133
161
|
|
134
|
-
|
162
|
+
util_test_files_for(@test, @test)
|
135
163
|
|
136
|
-
|
164
|
+
util_test_files_for('test/controllers/route_controller_test.rb',
|
137
165
|
'test/controllers/route_controller_test.rb')
|
138
166
|
|
139
|
-
|
167
|
+
util_test_files_for('test/views/route_view_test.rb',
|
140
168
|
'test/views/route_view_test.rb')
|
141
169
|
|
142
|
-
|
170
|
+
util_test_files_for('test/functional/route_controller_test.rb',
|
143
171
|
'test/functional/route_controller_test.rb')
|
144
172
|
|
145
|
-
|
173
|
+
util_test_files_for('test/functional/admin/themes_controller_test.rb',
|
146
174
|
'test/functional/admin/themes_controller_test.rb')
|
147
175
|
|
148
176
|
# global conf thingies
|
149
|
-
|
177
|
+
util_test_files_for('config/boot.rb',
|
150
178
|
@rails_unit_tests, @rails_controller_tests,
|
151
179
|
@rails_view_tests, @rails_functional_tests)
|
152
180
|
|
153
|
-
|
181
|
+
util_test_files_for('config/database.yml',
|
154
182
|
@rails_unit_tests, @rails_controller_tests,
|
155
183
|
@rails_view_tests, @rails_functional_tests)
|
156
184
|
|
157
|
-
|
185
|
+
util_test_files_for('config/environment.rb',
|
158
186
|
@rails_unit_tests, @rails_controller_tests,
|
159
187
|
@rails_view_tests, @rails_functional_tests)
|
160
188
|
|
161
|
-
|
189
|
+
util_test_files_for('config/environments/test.rb',
|
162
190
|
@rails_unit_tests, @rails_controller_tests,
|
163
191
|
@rails_view_tests, @rails_functional_tests)
|
164
192
|
|
165
|
-
|
193
|
+
util_test_files_for('config/routes.rb',
|
166
194
|
@rails_controller_tests,
|
167
195
|
@rails_view_tests, @rails_functional_tests)
|
168
196
|
|
169
197
|
# ignored crap
|
170
|
-
|
198
|
+
util_test_files_for('vendor/plugins/cartographer/lib/keys.rb')
|
171
199
|
|
172
|
-
|
200
|
+
util_test_files_for('Rakefile')
|
173
201
|
end
|
174
202
|
|
175
203
|
def test_consolidate_failures_multiple_matches_before
|
176
204
|
@test_class = 'BlahTest'
|
177
|
-
@
|
178
|
-
@
|
179
|
-
@
|
180
|
-
@
|
181
|
-
@
|
205
|
+
@files.clear
|
206
|
+
@files['app/model/blah.rb'] = Time.at(42)
|
207
|
+
@files['app/model/different_blah.rb'] = Time.at(42)
|
208
|
+
@files['test/unit/blah_test.rb'] = Time.at(42)
|
209
|
+
@files['test/unit/different_blah_test.rb'] = Time.at(42)
|
210
|
+
|
211
|
+
@a.find_order = @files.keys
|
212
|
+
|
182
213
|
result = @a.consolidate_failures([['test_matched', @test_class]])
|
183
214
|
expected = { 'test/unit/blah_test.rb' => [ 'test_matched' ] }
|
184
215
|
assert_equal expected, result
|
185
216
|
assert_equal "", @a.output.string
|
186
217
|
end
|
187
218
|
|
188
|
-
def
|
219
|
+
def util_test_files_for(file, *expected)
|
189
220
|
assert_equal(expected.flatten.sort.uniq,
|
190
|
-
@a.
|
221
|
+
@a.test_files_for(file).sort.uniq, "tests for #{file}")
|
191
222
|
end
|
192
223
|
|
193
224
|
def test_path_to_classname
|
@@ -200,7 +231,8 @@ class TestRailsAutotest < TestAutotest
|
|
200
231
|
util_path_to_classname 'BlahTest', 'test/controllers/blah_test.rb'
|
201
232
|
util_path_to_classname 'BlahTest', 'test/helpers/blah_test.rb'
|
202
233
|
|
203
|
-
util_path_to_classname
|
234
|
+
util_path_to_classname('OuterTest::InnerTest',
|
235
|
+
'test/controllers/outer/inner_test.rb')
|
204
236
|
end
|
205
237
|
end
|
206
238
|
|
data/test/test_unit_diff.rb
CHANGED
@@ -25,6 +25,85 @@ class TestUnitDiff < Test::Unit::TestCase
|
|
25
25
|
util_unit_diff(header, input, expected, :parse_input)
|
26
26
|
end
|
27
27
|
|
28
|
+
def test_input_mini_rspec
|
29
|
+
header = <<-HEADER
|
30
|
+
Started
|
31
|
+
.......F
|
32
|
+
Finished in 0.1 seconds
|
33
|
+
|
34
|
+
HEADER
|
35
|
+
|
36
|
+
failure = <<-FAILURE
|
37
|
+
1)
|
38
|
+
The unless expression should fail FAILED
|
39
|
+
Expected nil to equal "baz":
|
40
|
+
FAILURE
|
41
|
+
|
42
|
+
backtrace = <<-BACKTRACE
|
43
|
+
PositiveExpectation#== at spec/mini_rspec.rb:217
|
44
|
+
main.__script__ {} at spec/language/unless_spec.rb:49
|
45
|
+
Proc#call at kernel/core/proc.rb:127
|
46
|
+
SpecRunner#it at spec/mini_rspec.rb:368
|
47
|
+
main.it at spec/mini_rspec.rb:412
|
48
|
+
main.__script__ {} at spec/language/unless_spec.rb:48
|
49
|
+
Proc#call at kernel/core/proc.rb:127
|
50
|
+
SpecRunner#describe at spec/mini_rspec.rb:378
|
51
|
+
main.describe at spec/mini_rspec.rb:408
|
52
|
+
main.__script__ at spec/language/unless_spec.rb:3
|
53
|
+
CompiledMethod#as_script at kernel/bootstrap/primitives.rb:41
|
54
|
+
main.load at kernel/core/compile.rb:150
|
55
|
+
main.__script__ {} at last_mspec.rb:11
|
56
|
+
Array#each {} at kernel/core/array.rb:545
|
57
|
+
Integer(Fixnum)#times at kernel/core/integer.rb:15
|
58
|
+
Array#each at kernel/core/array.rb:545
|
59
|
+
main.__script__ at last_mspec.rb:16
|
60
|
+
CompiledMethod#as_script at kernel/bootstrap/primitives.rb:41
|
61
|
+
main.load at kernel/core/compile.rb:150
|
62
|
+
main.__script__ at kernel/loader.rb:145
|
63
|
+
BACKTRACE
|
64
|
+
|
65
|
+
footer = "\n8 examples, 1 failures\n"
|
66
|
+
input = header + failure + backtrace + footer
|
67
|
+
|
68
|
+
expected_backtrace = backtrace.split("\n").map {|l| "#{l}\n"}
|
69
|
+
expected = [[["1)\n", "The unless expression should fail FAILED\n",
|
70
|
+
"Expected nil to equal \"baz\":\n",
|
71
|
+
*expected_backtrace]],
|
72
|
+
["\n", "8 examples, 1 failures\n"]]
|
73
|
+
util_unit_diff(header, input, expected, :parse_input)
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_input_mini_rspec_multiline
|
77
|
+
header = <<-HEADER
|
78
|
+
Started
|
79
|
+
.......F
|
80
|
+
Finished in 0.1 seconds
|
81
|
+
|
82
|
+
HEADER
|
83
|
+
|
84
|
+
failure = <<-FAILURE
|
85
|
+
1)
|
86
|
+
Compiler compiles a case without an argument FAILED
|
87
|
+
Expected #<TestGenerator [[:push, :false], [:gif, #<Label 5>], [:push_literal, "foo"], [:string_dup], [:goto, #<Label 19>], [:set_label, #<Label 5>], [:push, :nil], [:gif, #<Label 10>], [:push_literal, "foo"], [:string_dup], [:goto, #<Label 19>], [:set_label, #<Label 10>], [:push, 2], [:push, 1], [:send, :==, 1, false], [:gif, #<Label 17>], [:push_literal, "bar"], [:string_dup], [:goto, #<Label 19>], [:set_label, #<Label 17>], [:push_literal, "baz"], [:string_dup], [:set_label, #<Label 19>]]
|
88
|
+
to equal #<TestGenerator [[:push, false], [:gif, #<Label 5>], [:push, "foo"], [:string_dup], [:goto, #<Label 6>], [:set_label, #<Label 5>], [:push, nil], [:set_label, #<Label 6>], [:pop], [:push, nil], [:gif, #<Label 12>], [:push, "foo"], [:string_dup], [:goto, #<Label 13>], [:set_label, #<Label 12>], [:push, nil], [:set_label, #<Label 13>], [:pop], [:push, 2], [:push, 1], [:send, :==, 1], [:gif, #<Label 21>], [:push, "bar"], [:string_dup], [:goto, #<Label 23>], [:set_label, #<Label 21>], [:push_literal, "baz"], [:string_dup], [:set_label, #<Label 23>], [:sret]]:
|
89
|
+
FAILURE
|
90
|
+
|
91
|
+
backtrace = <<-BACKTRACE
|
92
|
+
PositiveExpectation#== at spec/mini_rspec.rb:216
|
93
|
+
main.gen at ./compiler2/spec/helper.rb:125
|
94
|
+
main.__script__ {} at compiler2/spec/control_spec.rb:448
|
95
|
+
BACKTRACE
|
96
|
+
|
97
|
+
footer = "\n8 examples, 1 failures\n"
|
98
|
+
input = header + failure + backtrace + footer
|
99
|
+
|
100
|
+
expected_backtrace = backtrace.split("\n").map {|l| "#{l}\n"}
|
101
|
+
expected_failure = failure.split("\n").map {|l| "#{l}\n"}
|
102
|
+
expected = [[[*(expected_failure + expected_backtrace)]],
|
103
|
+
["\n", "8 examples, 1 failures\n"]]
|
104
|
+
util_unit_diff(header, input, expected, :parse_input)
|
105
|
+
end
|
106
|
+
|
28
107
|
def test_unit_diff_empty # simulates broken pipe at the least
|
29
108
|
input = ""
|
30
109
|
expected = ""
|
@@ -38,7 +117,7 @@ class TestUnitDiff < Test::Unit::TestCase
|
|
38
117
|
"<\"<body>\">.\n"
|
39
118
|
]
|
40
119
|
|
41
|
-
expected = [[" 1) Failure:\n", "test_test1(TestBlah) [./blah.rb:25]:\n"], ["<html>"], ["<body>"]]
|
120
|
+
expected = [[" 1) Failure:\n", "test_test1(TestBlah) [./blah.rb:25]:\n"], ["<html>"], ["<body>"], []]
|
42
121
|
|
43
122
|
assert_equal expected, @diff.parse_diff(input)
|
44
123
|
end
|
@@ -50,7 +129,7 @@ class TestUnitDiff < Test::Unit::TestCase
|
|
50
129
|
"<\"line4\\nline5\\nline6\\n\">.\n"
|
51
130
|
]
|
52
131
|
|
53
|
-
expected = [[" 1) Failure:\n", "test_test1(TestBlah) [./blah.rb:25]:\n"], ["line1\\nline2\\nline3\\n"], ["line4\\nline5\\nline6\\n"]]
|
132
|
+
expected = [[" 1) Failure:\n", "test_test1(TestBlah) [./blah.rb:25]:\n"], ["line1\\nline2\\nline3\\n"], ["line4\\nline5\\nline6\\n"], []]
|
54
133
|
|
55
134
|
assert_equal expected, @diff.parse_diff(input)
|
56
135
|
end
|
@@ -65,7 +144,8 @@ class TestUnitDiff < Test::Unit::TestCase
|
|
65
144
|
expected = [[" 2) Failure:\n",
|
66
145
|
"test_test2(TestBlah) [./blah.rb:29]:\n"],
|
67
146
|
["line1"],
|
68
|
-
["line2\\nline3\\n\\n"]
|
147
|
+
["line2\\nline3\\n\\n"],
|
148
|
+
[]
|
69
149
|
]
|
70
150
|
|
71
151
|
assert_equal expected, @diff.parse_diff(input)
|
@@ -77,7 +157,7 @@ class TestUnitDiff < Test::Unit::TestCase
|
|
77
157
|
"Unknown expected data.\n",
|
78
158
|
"<false> is not true.\n"]
|
79
159
|
|
80
|
-
expected = [[" 13) Failure:\n", "test_case_stmt(TestRubyToRubyC) [./r2ctestcase.rb:1198]:\n", "Unknown expected data.\n"], ["<false> is not true.\n"], nil]
|
160
|
+
expected = [[" 13) Failure:\n", "test_case_stmt(TestRubyToRubyC) [./r2ctestcase.rb:1198]:\n", "Unknown expected data.\n"], ["<false> is not true.\n"], nil, []]
|
81
161
|
|
82
162
|
assert_equal expected, @diff.parse_diff(input)
|
83
163
|
end
|
@@ -90,7 +170,7 @@ class TestUnitDiff < Test::Unit::TestCase
|
|
90
170
|
expected = [["1) Failure:\n",
|
91
171
|
"test_util_capture(AssertionsTest) [test/test_zentest_assertions.rb:53]:\n"],
|
92
172
|
["out"],
|
93
|
-
["out"]]
|
173
|
+
["out"], []]
|
94
174
|
|
95
175
|
assert_equal expected, @diff.parse_diff(input)
|
96
176
|
end
|
@@ -103,7 +183,34 @@ class TestUnitDiff < Test::Unit::TestCase
|
|
103
183
|
expected = [["1) Failure:\n",
|
104
184
|
"test_util_capture(AssertionsTest) [test/test_zentest_assertions.rb:53]:\n"],
|
105
185
|
["out"],
|
106
|
-
["out\\n"]]
|
186
|
+
["out\\n"], []]
|
187
|
+
|
188
|
+
assert_equal expected, @diff.parse_diff(input)
|
189
|
+
end
|
190
|
+
|
191
|
+
def test_parse_diff_mini_rspec
|
192
|
+
input = ["1)\n", "The unless expression should fail FAILED\n",
|
193
|
+
"Expected nil to equal \"baz\":\n",
|
194
|
+
" PositiveExpectation#== at spec/mini_rspec.rb:217\n"]
|
195
|
+
|
196
|
+
expected = [["1)\n", "The unless expression should fail FAILED\n"],
|
197
|
+
["nil"],
|
198
|
+
["\"baz\""],
|
199
|
+
[" PositiveExpectation#== at spec/mini_rspec.rb:217"]]
|
200
|
+
|
201
|
+
assert_equal expected, @diff.parse_diff(input)
|
202
|
+
end
|
203
|
+
|
204
|
+
def test_parse_diff_mini_rspec_multiline
|
205
|
+
input = ["1)\n", "The unless expression should fail FAILED\n",
|
206
|
+
"Expected #<TestGenerator [[:push, :true],\n", " [:dup]\n", "]\n",
|
207
|
+
"to equal #<TestGenerator [[:pop],\n", " [:dup]\n", "]:\n",
|
208
|
+
" PositiveExpectation#== at spec/mini_rspec.rb:217\n"]
|
209
|
+
|
210
|
+
expected = [["1)\n", "The unless expression should fail FAILED\n"],
|
211
|
+
["#<TestGenerator [[:push, :true],\n", " [:dup]\n", "]"],
|
212
|
+
["#<TestGenerator [[:pop],\n", " [:dup]\n", "]"],
|
213
|
+
[" PositiveExpectation#== at spec/mini_rspec.rb:217"]]
|
107
214
|
|
108
215
|
assert_equal expected, @diff.parse_diff(input)
|
109
216
|
end
|
@@ -160,7 +267,7 @@ class TestUnitDiff < Test::Unit::TestCase
|
|
160
267
|
def util_unit_diff(header, input, expected, msg=:unit_diff)
|
161
268
|
output = StringIO.new("")
|
162
269
|
actual = @diff.send(msg, StringIO.new(input), output)
|
163
|
-
assert_equal header, output.string
|
270
|
+
assert_equal header, output.string, "header output"
|
164
271
|
assert_equal expected, actual
|
165
272
|
end
|
166
273
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ZenTest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Davis
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2008-01-
|
13
|
+
date: 2008-01-31 00:00:00 -08:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -20,10 +20,12 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 1.
|
23
|
+
version: 1.5.0
|
24
24
|
version:
|
25
25
|
description: "ZenTest provides 4 different tools and 1 library: zentest, unit_diff, autotest, multiruby, and Test::Rails. ZenTest scans your target and unit-test code and writes your missing code based on simple naming rules, enabling XP at a much quicker pace. ZenTest only works with Ruby and Test::Unit. unit_diff is a command-line filter to diff expected results from actual results and allow you to quickly see exactly what is wrong. autotest is a continous testing facility meant to be used during development. As soon as you save a file, autotest will run the corresponding dependent tests. multiruby runs anything you want on multiple versions of ruby. Great for compatibility checking! Test::Rails helps you build industrial-strength Rails code."
|
26
|
-
email:
|
26
|
+
email:
|
27
|
+
- ryand-ruby@zenspider.com
|
28
|
+
- drbrain@segment7.net
|
27
29
|
executables:
|
28
30
|
- autotest
|
29
31
|
- multiruby
|
@@ -127,7 +129,7 @@ rubyforge_project: zentest
|
|
127
129
|
rubygems_version: 1.0.1
|
128
130
|
signing_key:
|
129
131
|
specification_version: 2
|
130
|
-
summary: "ZenTest provides 4 different tools and 1 library: zentest, unit_diff, autotest, multiruby, and Test::Rails
|
132
|
+
summary: "ZenTest provides 4 different tools and 1 library: zentest, unit_diff, autotest, multiruby, and Test::Rails"
|
131
133
|
test_files:
|
132
134
|
- test/test_autotest.rb
|
133
135
|
- test/test_help.rb
|