ZenTest 3.8.0 → 3.9.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/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
         |