You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildr.apache.org by as...@apache.org on 2008/01/25 21:15:51 UTC

svn commit: r615324 - in /incubator/buildr/trunk: lib/core/ lib/java/ lib/java/org/apache/buildr/ spec/

Author: assaf
Date: Fri Jan 25 12:15:50 2008
New Revision: 615324

URL: http://svn.apache.org/viewvc?rev=615324&view=rev
Log:
Breaking change to test framework to simplify handling of dependencies, tested against ODE

Modified:
    incubator/buildr/trunk/lib/core/common.rb
    incubator/buildr/trunk/lib/core/compile.rb
    incubator/buildr/trunk/lib/core/test.rb
    incubator/buildr/trunk/lib/java/org/apache/buildr/JUnitTestFilter.class
    incubator/buildr/trunk/lib/java/org/apache/buildr/JUnitTestFilter.java
    incubator/buildr/trunk/lib/java/test_frameworks.rb
    incubator/buildr/trunk/spec/java_packaging_spec.rb
    incubator/buildr/trunk/spec/java_test_frameworks.rb
    incubator/buildr/trunk/spec/test_spec.rb

Modified: incubator/buildr/trunk/lib/core/common.rb
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/lib/core/common.rb?rev=615324&r1=615323&r2=615324&view=diff
==============================================================================
--- incubator/buildr/trunk/lib/core/common.rb (original)
+++ incubator/buildr/trunk/lib/core/common.rb Fri Jan 25 12:15:50 2008
@@ -1,8 +1,8 @@
-require "tempfile"
-require "pathname"
-require "core/transports"
-require "open-uri"
-require "uri/open-sftp"
+require 'tempfile'
+require 'pathname'
+require 'core/transports'
+require 'open-uri'
+require 'uri/open-sftp'
 
 
 class Hash
@@ -13,13 +13,13 @@
     #   Hash.from_java_properties(string)
     #
     # Returns a hash from a string in the Java properties file format. For example:
-    #   str = "foo=bar\nbaz=fab"
+    #   str = 'foo=bar\nbaz=fab'
     #   Hash.from_properties(str)
-    #   => { "foo"=>"bar", "baz"=>"fab" }.to_properties
+    #   => { 'foo'=>'bar', 'baz'=>'fab' }.to_properties
     def from_java_properties(string)
-      string.gsub(/\\\n/, "").split("\n").select { |line| line =~ /^[^#].*=.*/ }.
+      string.gsub(/\\\n/, '').split("\n").select { |line| line =~ /^[^#].*=.*/ }.
         map { |line| line.gsub(/\\[trnf\\]/) { |escaped| {?t=>"\t", ?r=>"\r", ?n=>"\n", ?f=>"\f", ?\\=>"\\"}[escaped[1]] } }.
-        map { |line| line.split("=") }.
+        map { |line| line.split('=') }.
         inject({}) { |hash, (name, value)| hash.merge(name=>value) }
     end
 
@@ -51,13 +51,13 @@
   end
 
   # :call-seq:
-  #   to_java_properties() => string
+  #   to_java_properties => string
   #
   # Convert hash to string format used for Java properties file. For example:
-  #   { "foo"=>"bar", "baz"=>"fab" }.to_properties
+  #   { 'foo'=>'bar', 'baz'=>'fab' }.to_properties
   #   => foo=bar
   #      baz=fab
-  def to_java_properties()
+  def to_java_properties
     keys.sort.map { |key|
       value = self[key].gsub(/[\t\r\n\f\\]/) { |escape| "\\" + {"\t"=>"t", "\r"=>"r", "\n"=>"n", "\f"=>"f", "\\"=>"\\"}[escape] }
       "#{key}=#{value}"
@@ -71,7 +71,7 @@
   class FileList
     class << self
       def recursive(*dirs)
-        FileList[dirs.map { |dir| File.join(dir, "/**/{*,.*}") }].reject { |file| File.basename(file) =~ /^[.]{1,2}$/ }
+        FileList[dirs.map { |dir| File.join(dir, '/**/{*,.*}') }].reject { |file| File.basename(file) =~ /^[.]{1,2}$/ }
       end
     end
   end
@@ -112,9 +112,9 @@
   #
   # For example:
   #   COMMONS             = struct(
-  #     :collections      =>"commons-collections:commons-collections:jar:3.1",
-  #     :lang             =>"commons-lang:commons-lang:jar:2.1",
-  #     :logging          =>"commons-logging:commons-logging:jar:1.0.3",
+  #     :collections      =>'commons-collections:commons-collections:jar:3.1',
+  #     :lang             =>'commons-lang:commons-lang:jar:2.1',
+  #     :logging          =>'commons-logging:commons-logging:jar:1.0.3',
   #   )
   #
   #   compile.with COMMONS.logging
@@ -129,16 +129,16 @@
   # Write the contents into a file. The second form calls the block and writes the result.
   #
   # For example:
-  #   write "TIMESTAMP", Time.now
-  #   write("TIMESTAMP") { Time.now }
+  #   write 'TIMESTAMP', Time.now
+  #   write('TIMESTAMP') { Time.now }
   #
   # Yields to the block before writing the file, so you can chain read and write together.
   # For example:
-  #   write("README") { read("README").sub("${build}", Time.now) }
+  #   write('README') { read('README').sub("${build}", Time.now) }
   def write(name, content = nil)
     mkpath File.dirname(name), :verbose=>false
     content = yield if block_given?
-    File.open(name.to_s, "wb") { |file| file.write content.to_s }
+    File.open(name.to_s, 'wb') { |file| file.write content.to_s }
     content.to_s
   end
 
@@ -150,8 +150,8 @@
   # the result of the block.
   #
   # For example:
-  #   puts read("README")
-  #   read("README") { |text| puts text }
+  #   puts read('README')
+  #   read('README') { |text| puts text }
   def read(name)
     contents = File.open(name.to_s) { |f| f.read }
     if block_given?
@@ -175,7 +175,7 @@
   # checksums on the server it will verify the download before saving it.
   #
   # For example:
-  #   download "image.jpg"=>"http://example.com/theme/image.jpg"
+  #   download 'image.jpg'=>'http://example.com/theme/image.jpg'
   def download(args)
     args = URI.parse(args) if String === args
     if URI === args
@@ -184,7 +184,7 @@
       temp = Tempfile.open(File.basename(args.to_s))
       file(temp.path).tap do |task|
         # Since temporary file exists, force a download.
-        class << task ; def needed?() ; true ; end ; end
+        class << task ; def needed? ; true ; end ; end
         task.sources << args
         task.enhance { args.download temp }
       end
@@ -207,7 +207,7 @@
   # You can specify the mapping using a Hash, and it will map ${key} fields found in each source
   # file into the appropriate value in the target file. For example:
   #
-  #   filter.using "version"=>"1.2", "build"=>Time.now
+  #   filter.using 'version'=>'1.2', 'build'=>Time.now
   #
   # will replace all occurrences of <tt>${version}</tt> with <tt>1.2</tt>, and <tt>${build}</tt>
   # with the current date/time.
@@ -221,13 +221,13 @@
   # A filter has one target directory, but you can specify any number of source directories,
   # either when creating the filter or calling #from. Include/exclude patterns are specified
   # relative to the source directories, so:
-  #   filter.include "*.png"
+  #   filter.include '*.png'
   # will only include PNG files from any of the source directories.
   #
   # See Buildr#filter.
   class Filter
 
-    def initialize() #:nodoc:
+    def initialize #:nodoc:
       @include = []
       @exclude = []
       @sources = []
@@ -242,7 +242,7 @@
     # Adds additional directories from which to copy resources.
     #
     # For example:
-    #   filter.from("src").into("target").using("build"=>Time.now)
+    #   filter.from('src').into('target').using('build'=>Time.now)
     def from(*sources)
       @sources |= sources.flatten.map { |dir| file(dir.to_s) }
       self
@@ -257,7 +257,7 @@
     # Sets the target directory into which files are copied and returns self.
     #
     # For example:
-    #   filter.from("src").into("target").using("build"=>Time.now)
+    #   filter.from('src').into('target').using('build'=>Time.now)
     def into(dir)
       @target = file(dir.to_s) { |task| run if target == task && !sources.empty? }
       self
@@ -293,7 +293,7 @@
 
     # :call-seq:
     #   using(mapping) => self
-    #   using() { |file_name, contents| ... } => self
+    #   using { |file_name, contents| ... } => self
     #
     # Specifies the mapping to use and returns self.
     #
@@ -306,9 +306,9 @@
     # * Regexp -- Maps the matched data (e.g. <code>/=(.*?)=/</code>
     #
     # For example:
-    #   filter.using "version"=>"1.2"
+    #   filter.using 'version'=>'1.2'
     # Is the same as:
-    #   filter.using :maven, "version"=>"1.2"
+    #   filter.using :maven, 'version'=>'1.2'
     #
     # You can also pass a proc or method. It will be called with the file name and content,
     # to return the mapped content.
@@ -319,26 +319,26 @@
       when Hash # Maven hash mapping
         using :maven, *args
       when Symbol # Mapping from a method
-        raise ArgumentError, "Expected mapper type followed by mapping hash" unless args.size == 2 && Hash === args[1]
+        raise ArgumentError, 'Expected mapper type followed by mapping hash' unless args.size == 2 && Hash === args[1]
         @mapper, @mapping = *args
       when Regexp # Mapping using a regular expression
-        raise ArgumentError, "Expected regular expression followed by mapping hash" unless args.size == 2 && Hash === args[1]
+        raise ArgumentError, 'Expected regular expression followed by mapping hash' unless args.size == 2 && Hash === args[1]
         @mapper, @mapping = *args
       else
-        raise ArgumentError, "Expected proc, method or a block" if args.size > 1 || (args.first && block)
+        raise ArgumentError, 'Expected proc, method or a block' if args.size > 1 || (args.first && block)
         @mapping = args.first || block
       end
       self
     end
 
     # :call-seq:
-    #    run() => boolean
+    #    run => boolean
     #
     # Runs the filter.
-    def run()
-      raise "No source directory specified, where am I going to find the files to filter?" if sources.empty?
+    def run
+      raise 'No source directory specified, where am I going to find the files to filter?' if sources.empty?
       sources.each { |source| raise "Source directory #{source} doesn't exist" unless File.exist?(source.to_s) }
-      raise "No target directory specified, where am I going to copy the files to?" if target.nil?
+      raise 'No target directory specified, where am I going to copy the files to?' if target.nil?
 
       copy_map = sources.flatten.map(&:to_s).inject({}) do |map, source|
         base = Pathname.new(source)
@@ -365,17 +365,17 @@
             mkpath File.dirname(dest)
             case mapping
             when Proc, Method # Call on input, accept output.
-              mapped = mapping.call(path, File.open(source, "rb") { |file| file.read })
-              File.open(dest, "wb") { |file| file.write mapped }
+              mapped = mapping.call(path, File.open(source, 'rb') { |file| file.read })
+              File.open(dest, 'wb') { |file| file.write mapped }
             when Hash # Map ${key} to value
-              content = File.open(source, "rb") { |file| file.read }
+              content = File.open(source, 'rb') { |file| file.read }
               if Symbol === @mapper
                 mapped = send("#{@mapper}_mapper", content) { |key| mapping[key] }
               else
                 mapped = regexp_mapper(content) { |key| mapping[key] }
               end
                 #gsub(/\$\{[^}]*\}/) { |str| mapping[str[2..-2]] || str }
-              File.open(dest, "wb") { |file| file.write mapped }
+              File.open(dest, 'wb') { |file| file.write mapped }
             when nil # No mapping.
               cp source, dest
               File.chmod(0664, dest)
@@ -390,7 +390,7 @@
     end
 
     # Returns the target directory. 
-    def to_s()
+    def to_s
       @target.to_s
     end
 
@@ -424,10 +424,10 @@
   # A filter is not a task, you must call the Filter#run method to execute it.
   #
   # For example, to copy all files from one directory to another:
-  #   filter("src/files").into("target/classes").run
+  #   filter('src/files').into('target/classes').run
   # To include only the text files, and replace each instance of <tt>${build}</tt> with the current
   # date/time:
-  #   filter("src/files").into("target/classes").include("*.txt").using("build"=>Time.now).run
+  #   filter('src/files').into('target/classes').include('*.txt').using('build'=>Time.now).run
   def filter(*sources)
     Filter.new.from(*sources)
   end
@@ -448,11 +448,11 @@
   #   warn_deprecated(message)
   #
   # Use with deprecated methods and classes. This method automatically adds the file name and line number,
-  # and the text "Deprecated" before the message, and eliminated duplicate warnings. It only warns when
+  # and the text 'Deprecated' before the message, and eliminated duplicate warnings. It only warns when
   # running in verbose mode.
   #
   # For example:
-  #   warn_deprecated "Please use new_foo instead of foo."
+  #   warn_deprecated 'Please use new_foo instead of foo.'
   def warn_deprecated(message) #:nodoc:
     return unless verbose
     "#{caller[1]}: Deprecated: #{message}".tap do |message|

Modified: incubator/buildr/trunk/lib/core/compile.rb
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/lib/core/compile.rb?rev=615324&r1=615323&r2=615324&view=diff
==============================================================================
--- incubator/buildr/trunk/lib/core/compile.rb (original)
+++ incubator/buildr/trunk/lib/core/compile.rb Fri Jan 25 12:15:50 2008
@@ -364,7 +364,10 @@
     def initialize(*args) #:nodoc:
       super
       @filter = Buildr::Filter.new
-      enhance { filter.run unless filter.sources.empty? }
+      enhance do
+        mkpath target.to_s, :verbose=>false
+        filter.run unless filter.sources.empty?
+      end
     end
 
     # :call-seq:

Modified: incubator/buildr/trunk/lib/core/test.rb
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/lib/core/test.rb?rev=615324&r1=615323&r2=615324&view=diff
==============================================================================
--- incubator/buildr/trunk/lib/core/test.rb (original)
+++ incubator/buildr/trunk/lib/core/test.rb Fri Jan 25 12:15:50 2008
@@ -329,24 +329,16 @@
       self
     end
 
-    # :call-seq:
-    #    tests => strings
-    #
-    # List the tests that this task will run.
-    def tests
-      fail "No test framework selected" unless framework
-      @tests ||= @framework.tests(@project).select { |test| include?(test) }.sort
-    end
-
     # *Deprecated*: Use tests instead.
     def classes
       warn_deprecated 'Call tests instead of classes'
       tests
     end
 
+    # After running the task, returns all tests selected to run, based on availability and include/exclude pattern.
+    attr_reader :tests
     # After running the task, returns all the tests that failed, empty array if all tests passed.
     attr_reader :failed_tests
-
     # After running the task, returns all the tests that passed, empty array if no tests passed.
     attr_reader :passed_tests
 
@@ -356,9 +348,11 @@
     # Returns the test framework, e.g. :junit, :testng.
     def framework
       unless @framework
-        frameworks = TestFramework.frameworks.select { |cls| cls.applies_to?(@project) }
-        candidate = @project.parent && frameworks.detect { |framework| framework.to_sym == @project.parent.test.framework } ||
-          frameworks.first
+        # Start with all frameworks that apply (e.g. JUnit and TestNG for Java),
+        # and pick the first (default) one, unless already specified in parent project.
+        candidates = TestFramework.frameworks.select { |cls| cls.applies_to?(@project) }
+        candidate = @project.parent && candidates.detect { |framework| framework.to_sym == @project.parent.test.framework } ||
+          candidates.first
         self.framework = candidate if candidate
       end
       @framework && @framework.class.to_sym
@@ -389,7 +383,7 @@
       #  each { |name| options[name] = @parent_task.options[name] } if @parent_task.respond_to?(:options)
       @framework = cls.new(options)
       # Test framework dependency.
-      with @framework.class.dependencies
+      with @framework.dependencies
     end
 
     # :call-seq:
@@ -404,13 +398,15 @@
 
     # Runs the tests using the selected test framework.
     def run_tests
+      dependencies = Buildr.artifacts(self.dependencies).map(&:to_s).uniq
       rm_rf report_to.to_s
-      if tests.empty?
+      @tests = @framework.tests(self, dependencies).select { |test| include?(test) }.sort
+      if @tests.empty?
         @passed_tests, @failed_tests = [], []
       else
         puts "Running tests in #{@project.name}" if verbose
-        @passed_tests = @framework.run(tests, self, @dependencies.compact.map(&:to_s))
-        @failed_tests = tests - @passed_tests
+        @passed_tests = @framework.run(@tests, self, dependencies)
+        @failed_tests = @tests - @passed_tests
         unless @failed_tests.empty?
           warn "The following tests failed:\n#{@failed_tests.join('\n')}" if verbose
           fail 'Tests failed!'
@@ -424,6 +420,11 @@
       @exclude.clear
     end
 
+    def invoke_prerequisites(args, chain) #:nodoc:
+      @prerequisites |= FileList[@dependencies.uniq]
+      super
+    end
+
   end
 
 
@@ -540,7 +541,7 @@
       test.with Array(project.resources.target)
       # Dependency on compiled tests and resources.  Dependencies added using with.
       test.dependencies.concat Array(test.compile.target) if test.compile.target
-      test.dependencies.concat Array(test.resources.target)
+      test.dependencies.concat Array(test.resources.target) if test.resources.sources
       # Picking up the test frameworks adds further dependencies.
       test.framework
 

Modified: incubator/buildr/trunk/lib/java/org/apache/buildr/JUnitTestFilter.class
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/lib/java/org/apache/buildr/JUnitTestFilter.class?rev=615324&r1=615323&r2=615324&view=diff
==============================================================================
Binary files - no diff available.

Modified: incubator/buildr/trunk/lib/java/org/apache/buildr/JUnitTestFilter.java
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/lib/java/org/apache/buildr/JUnitTestFilter.java?rev=615324&r1=615323&r2=615324&view=diff
==============================================================================
--- incubator/buildr/trunk/lib/java/org/apache/buildr/JUnitTestFilter.java (original)
+++ incubator/buildr/trunk/lib/java/org/apache/buildr/JUnitTestFilter.java Fri Jan 25 12:15:50 2008
@@ -1,5 +1,7 @@
 package org.apache.buildr;
 
+import java.io.File;
+import java.io.IOException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.net.MalformedURLException;
@@ -9,10 +11,15 @@
 
   private ClassLoader _loader;
 
-  public JUnitTestFilter(String[] paths) throws MalformedURLException {
+  public JUnitTestFilter(String[] paths) throws IOException {
     URL[] urls = new URL[paths.length];
-    for (int i = 0 ; i < paths.length ; ++i)
-      urls[i] = new URL("file://" + paths[i]);
+    for (int i = 0 ; i < paths.length ; ++i) {
+      File file = new File(paths[i]).getCanonicalFile();
+      if (file.exists())
+        urls[i] = file.toURL();
+      else
+        throw new IOException("No file or directory with the name " + file);
+    }
     _loader = new URLClassLoader(urls, getClass().getClassLoader());
   }
 

Modified: incubator/buildr/trunk/lib/java/test_frameworks.rb
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/lib/java/test_frameworks.rb?rev=615324&r1=615323&r2=615324&view=diff
==============================================================================
--- incubator/buildr/trunk/lib/java/test_frameworks.rb (original)
+++ incubator/buildr/trunk/lib/java/test_frameworks.rb Fri Jan 25 12:15:50 2008
@@ -107,16 +107,20 @@
 
     end
 
-    def tests(project) #:nodoc:
-      return [] unless project.test.compile.target
-      target = Pathname.new(project.test.compile.target.to_s)
+    def tests(task, dependencies) #:nodoc:
+      return [] unless task.compile.target
+      target = Pathname.new(task.compile.target.to_s)
       candidates = Dir["#{target}/**/*.class"].
         map { |file| Pathname.new(file).relative_path_from(target).to_s.ext('').gsub(File::SEPARATOR, '.') }.
         reject { |name| name =~ /\$/ }
-      classpath = [target.to_s + '/'] + Buildr.artifacts(dependencies).map(&:to_s)
-      Java.load # JRuby necessiated casting.
-      Java.org.apache.buildr.JUnitTestFilter.new(classpath.map(&:to_s).to_java(Java.java.lang.String)).
-        filter(candidates.to_java(Java.java.lang.String)).map(&:to_s)
+      begin
+        Java.load
+        Java.org.apache.buildr.JUnitTestFilter.new(dependencies.to_java(Java.java.lang.String)).
+          filter(candidates.to_java(Java.java.lang.String)).map(&:to_s)
+      rescue =>ex
+        puts "#{ex.class}: #{ex.message}" if verbose
+        raise
+      end
     end
 
     def run(tests, task, dependencies) #:nodoc:
@@ -134,7 +138,7 @@
         end
         mkpath task.report_to.to_s
         ant.junit forking.merge(:clonevm=>options[:clonevm] || false, :dir=>task.send(:project).path_to) do
-          ant.classpath :path=>dependencies.each { |path| file(path).invoke }.join(File::PATH_SEPARATOR)
+          ant.classpath :path=>dependencies.join(File::PATH_SEPARATOR)
           (options[:properties] || []).each { |key, value| ant.sysproperty :key=>key, :value=>value }
           (options[:environment] || []).each { |key, value| ant.env :key=>key, :value=>value }
           ant.formatter :type=>'plain'
@@ -199,9 +203,9 @@
 
     end
 
-    def tests(project) #:nodoc:
-      return [] unless project.test.compile.target
-      target = Pathname.new(project.test.compile.target.to_s)
+    def tests(task, dependencies) #:nodoc:
+      return [] unless task.compile.target
+      target = Pathname.new(task.compile.target.to_s)
       Dir["#{target}/**/*.class"].
         map { |file| Pathname.new(file).relative_path_from(target).to_s.ext('').gsub(File::SEPARATOR, '.') }.
         reject { |name| name =~ /\$/ }.select { |name| cls_name = name.split('.').last
@@ -230,3 +234,9 @@
 
 Buildr::TestFramework << Buildr::JUnit
 Buildr::TestFramework << Buildr::TestNG
+
+# Backward compatibility crap.
+Buildr::JUnit::JUNIT_REQUIRES = Buildr::JUnit::REQUIRES
+Buildr::TestNG::TestNG_REQUIRES = Buildr::TestNG::REQUIRES
+Java::JUnit = Buildr::JUnit
+Java::TestNG = Buildr::TestNG

Modified: incubator/buildr/trunk/spec/java_packaging_spec.rb
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/spec/java_packaging_spec.rb?rev=615324&r1=615323&r2=615324&view=diff
==============================================================================
--- incubator/buildr/trunk/spec/java_packaging_spec.rb (original)
+++ incubator/buildr/trunk/spec/java_packaging_spec.rb Fri Jan 25 12:15:50 2008
@@ -387,11 +387,6 @@
     inspect_war { |files| files.should include('test.html') }
   end
 
-  it 'should ignore webapp directory if missing' do
-    define('foo', :version=>'1.0') { package(:war) }
-    inspect_war { |files| files.should eql(['META-INF/', 'META-INF/MANIFEST.MF']) }
-  end
-
   it 'should accept files from :classes option' do
     write 'src/main/java/Test.java', 'class Test {}'
     write 'classes/test'

Modified: incubator/buildr/trunk/spec/java_test_frameworks.rb
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/spec/java_test_frameworks.rb?rev=615324&r1=615323&r2=615324&view=diff
==============================================================================
--- incubator/buildr/trunk/spec/java_test_frameworks.rb (original)
+++ incubator/buildr/trunk/spec/java_test_frameworks.rb Fri Jan 25 12:15:50 2008
@@ -33,13 +33,17 @@
   it 'should include public classes extending junit.framework.TestCase' do
     write 'src/test/java/com/example/FirstTest.java', <<-JAVA
       package com.example;
-      public class FirstTest extends junit.framework.TestCase { }
+      public class FirstTest extends junit.framework.TestCase {
+        public void testNothing() { }
+      }
     JAVA
     write 'src/test/java/com/example/AnotherOne.java', <<-JAVA
       package com.example;
-      public class AnotherOne extends junit.framework.TestCase { }
+      public class AnotherOne extends junit.framework.TestCase {
+        public void testNothing() { }
+      }
     JAVA
-    define('foo').test.compile.invoke
+    define('foo').test.invoke
     project('foo').test.tests.should include('com.example.FirstTest', 'com.example.AnotherOne')
   end
 
@@ -47,18 +51,21 @@
     write 'src/test/java/NotATest.java', <<-JAVA
       public class NotATest { }
     JAVA
-    define('foo').test.compile.invoke
+    define('foo').test.invoke
     project('foo').test.tests.should be_empty
   end
 
   it 'should ignore inner classes' do
     write 'src/test/java/InnerClassTest.java', <<-JAVA
       public class InnerClassTest extends junit.framework.TestCase {
+        public void testNothing() { }
+
         public class InnerTest extends junit.framework.TestCase {
+          public void testNothing() { }
         }
       }
     JAVA
-    define('foo').test.compile.invoke
+    define('foo').test.invoke
     project('foo').test.tests.should eql(['InnerClassTest'])
   end
 
@@ -263,14 +270,14 @@
     write 'src/test/java/com/example/TestThis.java', 'package com.example; public class TestThis {}'
     write 'src/test/java/com/example/ThisTest.java', 'package com.example; public class ThisTest {}'
     define('foo') { test.using(:testng) }
-    project('foo').test.compile.invoke
+    project('foo').test.invoke
     project('foo').test.tests.should include('com.example.TestThis', 'com.example.ThisTest')
   end
 
   it 'should ignore classes not using Test prefix or suffix' do
     write 'src/test/java/NotATestClass.java', 'public class NotATestClass {}'
     define('foo') { test.using(:testng) }
-    project('foo').test.compile.invoke
+    project('foo').test.invoke
     project('foo').test.tests.should be_empty
   end
 
@@ -282,7 +289,7 @@
       }
     JAVA
     define('foo') { test.using(:testng) }
-    project('foo').test.compile.invoke
+    project('foo').test.invoke
     project('foo').test.tests.should eql(['InnerClassTest'])
   end
 

Modified: incubator/buildr/trunk/spec/test_spec.rb
URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/spec/test_spec.rb?rev=615324&r1=615323&r2=615324&view=diff
==============================================================================
--- incubator/buildr/trunk/spec/test_spec.rb (original)
+++ incubator/buildr/trunk/spec/test_spec.rb Fri Jan 25 12:15:50 2008
@@ -231,17 +231,14 @@
 
 
 describe Buildr::TestTask, 'with passing tests' do
-  def tests
-    @tests ||= ['PassingTest1', 'PassingTest2']
-  end
-
   def test_task
     @test_task ||= begin
-      tests = self.tests
       define 'foo' do
         test.using(:junit)
-        test.stub!(:tests).and_return(tests.clone)
-        test.instance_eval { @framework.stub!(:run).and_return(tests.clone) }
+        test.instance_eval do
+          @framework.stub!(:tests).and_return(['PassingTest1', 'PassingTest2'])
+          @framework.stub!(:run).and_return(['PassingTest1', 'PassingTest2'])
+        end
       end
       project('foo').test
     end
@@ -257,7 +254,7 @@
   
   it 'should return passed tests' do
     test_task.invoke
-    test_task.passed_tests.should == tests
+    test_task.passed_tests.should == ['PassingTest1', 'PassingTest2']
   end
 
   it 'should return no failed tests' do