test-unit 2.0.1 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,22 @@
1
+ === 2.0.2 / 2008-12-21
2
+
3
+ * 2 major enhancements
4
+
5
+ * re-support ruby 1.8.5.
6
+ * improve exception object comparison.
7
+
8
+ * 3 bug fixes
9
+
10
+ * [#22723]: collector fails on anonymous classes
11
+ * [#22986]: Test names with '?' blow up on Windows
12
+ * [#22988]: don't create .test-result on non-priority mode.
13
+
14
+ * Thanks
15
+
16
+ * Erik Hollensbe
17
+ * Daniel Berger
18
+ * Bill Lear
19
+
1
20
  === 2.0.1 / 2008-11-09
2
21
 
3
22
  * 19 major enhancements
data/Manifest.txt CHANGED
@@ -41,6 +41,7 @@ lib/test/unit/ui/testrunner.rb
41
41
  lib/test/unit/ui/testrunnermediator.rb
42
42
  lib/test/unit/ui/testrunnerutilities.rb
43
43
  lib/test/unit/util/backtracefilter.rb
44
+ lib/test/unit/util/method-owner-finder.rb
44
45
  lib/test/unit/util/observable.rb
45
46
  lib/test/unit/util/procwrapper.rb
46
47
  lib/test/unit/version.rb
@@ -73,6 +74,7 @@ test/test_testresult.rb
73
74
  test/test_testsuite.rb
74
75
  test/testunit-test-util.rb
75
76
  test/ui/test_testrunmediator.rb
77
+ test/util/test-method-owner-finder.rb
76
78
  test/util/test_backtracefilter.rb
77
79
  test/util/test_observable.rb
78
80
  test/util/test_procwrapper.rb
data/README.txt CHANGED
@@ -44,5 +44,7 @@ This software is distributed under the same terms as ruby.
44
44
 
45
45
  == Thanks
46
46
 
47
- * Daniel Berger: suggestions.
47
+ * Daniel Berger: Suggestions and bug reports.
48
48
  * Designing Patterns: Suggestions.
49
+ * Erik Hollensbe: Suggestions.
50
+ * Bill Lear: A suggestion.
data/TODO CHANGED
@@ -1 +1,2 @@
1
1
  * mock.
2
+ * data-driven test.
@@ -4,6 +4,7 @@
4
4
 
5
5
  require 'test/unit/assertionfailederror'
6
6
  require 'test/unit/util/backtracefilter'
7
+ require 'test/unit/util/method-owner-finder'
7
8
  require 'test/unit/diff'
8
9
 
9
10
  module Test
@@ -909,9 +910,7 @@ EOM
909
910
  end
910
911
 
911
912
  def inspect
912
- inspect_method = @exception.method(:inspect)
913
- if inspect_method.respond_to?(:owner) and
914
- inspect_method.owner == Exception
913
+ if default_inspect?
915
914
  "#{@exception.class.inspect}(#{@exception.message.inspect})"
916
915
  else
917
916
  @exception.inspect
@@ -921,6 +920,18 @@ EOM
921
920
  def method_missing(name, *args, &block)
922
921
  @exception.send(name, *args, &block)
923
922
  end
923
+
924
+ private
925
+ def default_inspect?
926
+ inspect_method = @exception.method(:inspect)
927
+ if inspect_method.respond_to?(:owner) and
928
+ inspect_method.owner == Exception
929
+ true
930
+ else
931
+ default_inspect_method = Exception.instance_method(:inspect)
932
+ default_inspect_method.bind(@exception).call == @exception.inspect
933
+ end
934
+ end
924
935
  end
925
936
 
926
937
  def initialize(test_case, expected_exceptions)
@@ -987,15 +998,18 @@ EOM
987
998
 
988
999
  def expected_object?(actual_exception)
989
1000
  @expected_objects.any? do |expected_object|
990
- equal_method = expected_object.method(:==)
991
- if equal_method.respond_to?(:owner) and
992
- (equal_method.owner == Kernel or
993
- equal_method.owner == Exception)
994
- expected_object.class == actual_exception.class and
995
- expected_object.message == actual_exception.message
996
- else
997
- expected_object == actual_exception
998
- end
1001
+ expected_object == actual_exception or
1002
+ fallback_exception_object_equal(expected_object, actual_exception)
1003
+ end
1004
+ end
1005
+
1006
+ def fallback_exception_object_equal(expected_object, actual_exception)
1007
+ owner = Util::MethodOwnerFinder.find(expected_object, :==)
1008
+ if owner == Kernel or owner == Exception
1009
+ expected_object.class == actual_exception.class and
1010
+ expected_object.message == actual_exception.message
1011
+ else
1012
+ false
999
1013
  end
1000
1014
  end
1001
1015
  end
@@ -196,8 +196,10 @@ module Test
196
196
  o.on("--[no-]priority-mode",
197
197
  "Runs some tests based on their priority.") do |priority_mode|
198
198
  if priority_mode
199
+ Priority.enable
199
200
  @filters |= [priority_filter]
200
201
  else
202
+ Priority.disable
201
203
  @filters -= [priority_filter]
202
204
  end
203
205
  end
@@ -36,7 +36,7 @@ module Test
36
36
  end
37
37
 
38
38
  def sort(suites)
39
- suites.sort_by{|s| s.name}
39
+ suites.sort_by {|suite| suite.name || suite.to_s}
40
40
  end
41
41
  end
42
42
  end
@@ -90,17 +90,14 @@ module Test
90
90
  end
91
91
 
92
92
  def add_fixture_method_name(how, variable_name, method_name)
93
- unless self.instance_variable_defined?(variable_name)
94
- self.instance_variable_set(variable_name, [])
95
- end
96
- methods = self.instance_variable_get(variable_name)
93
+ methods = instance_eval("#{variable_name} ||= []")
97
94
 
98
95
  if how == :prepend
99
96
  methods = [method_name] | methods
100
97
  else
101
98
  methods = methods | [method_name]
102
99
  end
103
- self.instance_variable_set(variable_name, methods)
100
+ instance_variable_set(variable_name, methods)
104
101
  end
105
102
 
106
103
  def registered_methods_variable_name(fixture, order)
@@ -144,15 +141,9 @@ module Test
144
141
  interested_ancestors.inject([]) do |result, ancestor|
145
142
  if ancestor.is_a?(Class)
146
143
  ancestor.class_eval do
147
- methods = []
148
- unregistered_methods = []
149
- if instance_variable_defined?(methods_variable)
150
- methods = instance_variable_get(methods_variable)
151
- end
152
- if instance_variable_defined?(unregistered_methods_variable)
153
- unregistered_methods =
154
- instance_variable_get(unregistered_methods_variable)
155
- end
144
+ methods = instance_eval("#{methods_variable} ||= []")
145
+ unregistered_methods =
146
+ instance_eval("#{unregistered_methods_variable} ||= []")
156
147
  (result | methods) - unregistered_methods
157
148
  end
158
149
  else
@@ -13,6 +13,19 @@ module Test
13
13
  teardown :priority_teardown, :after => :append
14
14
  end
15
15
  end
16
+
17
+ @@enabled = false
18
+ def enabled?
19
+ @@enabled
20
+ end
21
+
22
+ def enable
23
+ @@enabled = true
24
+ end
25
+
26
+ def disable
27
+ @@enabled = false
28
+ end
16
29
  end
17
30
 
18
31
  class Checker
@@ -90,7 +103,7 @@ module Test
90
103
  def result_dir
91
104
  components = [".test-result",
92
105
  @test.class.name || "AnonymousTestCase",
93
- @test.method_name.to_s]
106
+ escaped_method_name]
94
107
  parent_directories = [File.dirname($0), Dir.pwd]
95
108
  if Process.respond_to?(:uid)
96
109
  parent_directories << File.join(Dir.tmpdir, Process.uid.to_s)
@@ -112,7 +125,7 @@ module Test
112
125
  end
113
126
 
114
127
  def escaped_method_name
115
- @method_name.to_s.gsub(/[!?=]$/) do |matched|
128
+ @test.method_name.to_s.gsub(/[!?=]$/) do |matched|
116
129
  case matched
117
130
  when "!"
118
131
  ".destructive"
@@ -135,10 +148,12 @@ module Test
135
148
  end
136
149
 
137
150
  def priority_setup
151
+ return unless Priority.enabled?
138
152
  Checker.new(self).setup
139
153
  end
140
154
 
141
155
  def priority_teardown
156
+ return unless Priority.enabled?
142
157
  Checker.new(self).teardown
143
158
  end
144
159
  end
@@ -17,6 +17,7 @@ require 'test/unit/priority'
17
17
  require 'test/unit/testsuite'
18
18
  require 'test/unit/assertionfailederror'
19
19
  require 'test/unit/util/backtracefilter'
20
+ require 'test/unit/util/method-owner-finder'
20
21
 
21
22
  module Test
22
23
  module Unit
@@ -192,11 +193,9 @@ module Test
192
193
  throw :invalid_test unless respond_to?(test_method_name)
193
194
  test_method = method(test_method_name)
194
195
  throw :invalid_test if test_method.arity > 0
195
- if test_method.respond_to?(:owner)
196
- if test_method.owner.class != Module and
197
- self.class != test_method.owner
198
- throw :invalid_test
199
- end
196
+ owner = Util::MethodOwnerFinder.find(self, test_method_name)
197
+ if owner.class != Module and self.class != owner
198
+ throw :invalid_test
200
199
  end
201
200
  @method_name = test_method_name
202
201
  @test_passed = true
@@ -0,0 +1,28 @@
1
+ module Test
2
+ module Unit
3
+ module Util
4
+ module MethodOwnerFinder
5
+ module_function
6
+ def find(object, method_name)
7
+ method = object.method(method_name)
8
+ return method.owner if method.respond_to?(:owner)
9
+
10
+ if /\((.+?)\)\#/ =~ method.to_s
11
+ owner_name = $1
12
+ if /\A#</ =~ owner_name
13
+ ObjectSpace.each_object(Module) do |mod|
14
+ return mod if mod.to_s == owner_name
15
+ end
16
+ else
17
+ owner_name.split(/::/).inject(Object) do |parent, name|
18
+ parent.const_get(name)
19
+ end
20
+ end
21
+ else
22
+ object.class
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -2,6 +2,6 @@
2
2
  # HACK: quick and dirty to get integrated into the new project - ryan
3
3
  module Test
4
4
  module Unit
5
- VERSION = '2.0.1'
5
+ VERSION = '2.0.2'
6
6
  end
7
7
  end
@@ -86,4 +86,34 @@ class TestUnitPriority < Test::Unit::TestCase
86
86
  end
87
87
  assert_in_delta(expected, n_need_to_run.to_f / n, delta)
88
88
  end
89
+
90
+ class SpecialNameTestCase < Test::Unit::TestCase
91
+ class << self
92
+ def suite
93
+ Test::Unit::TestSuite.new(name)
94
+ end
95
+ end
96
+
97
+ def test_question?
98
+ end
99
+
100
+ def test_exclamation!
101
+ end
102
+
103
+ def test_equal=
104
+ end
105
+ end
106
+
107
+ def test_escaped?
108
+ assert_escaped_name("test_question.predicate", "test_question?")
109
+ assert_escaped_name("test_exclamation.destructive", "test_exclamation!")
110
+ assert_escaped_name("test_equal.equal", "test_equal=")
111
+ end
112
+
113
+ def assert_escaped_name(expected, test_method_name)
114
+ checker = Checker.new(SpecialNameTestCase.new(test_method_name))
115
+ passed_file = checker.send(:passed_file)
116
+ method_name_component = File.basename(File.dirname(passed_file))
117
+ assert_equal(expected, method_name_component)
118
+ end
89
119
  end
@@ -0,0 +1,38 @@
1
+ require 'test/unit'
2
+
3
+ require 'test/unit/util/method-owner-finder'
4
+
5
+ class TestUnitMethodOwnerFinder < Test::Unit::TestCase
6
+ def test_find
7
+ assert_equal(Exception, find(RuntimeError.new, :inspect))
8
+ assert_equal(Exception, find(Exception.new, :inspect))
9
+
10
+ anonymous_class = Class.new do
11
+ end
12
+ assert_equal(Kernel, find(anonymous_class.new, :inspect))
13
+
14
+ anonymous_parent_class = Class.new do
15
+ def inspect
16
+ super + " by anonymous parent class"
17
+ end
18
+ end
19
+ anonymous_sub_class = Class.new(anonymous_parent_class) do
20
+ end
21
+ assert_equal(anonymous_parent_class, find(anonymous_sub_class.new, :inspect))
22
+
23
+ anonymous_module = Module.new do
24
+ def inspect
25
+ super + " by anonymous module"
26
+ end
27
+ end
28
+ anonymous_include_class = Class.new do
29
+ include anonymous_module
30
+ end
31
+ assert_equal(anonymous_module, find(anonymous_include_class.new, :inspect))
32
+ end
33
+
34
+ private
35
+ def find(object, method_name)
36
+ Test::Unit::Util::MethodOwnerFinder.find(object, method_name)
37
+ end
38
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test-unit
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kouhei Sutou
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2008-11-09 00:00:00 +09:00
13
+ date: 2008-12-21 00:00:00 +09:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -79,6 +79,7 @@ files:
79
79
  - lib/test/unit/ui/testrunnermediator.rb
80
80
  - lib/test/unit/ui/testrunnerutilities.rb
81
81
  - lib/test/unit/util/backtracefilter.rb
82
+ - lib/test/unit/util/method-owner-finder.rb
82
83
  - lib/test/unit/util/observable.rb
83
84
  - lib/test/unit/util/procwrapper.rb
84
85
  - lib/test/unit/version.rb
@@ -111,6 +112,7 @@ files:
111
112
  - test/test_testsuite.rb
112
113
  - test/testunit-test-util.rb
113
114
  - test/ui/test_testrunmediator.rb
115
+ - test/util/test-method-owner-finder.rb
114
116
  - test/util/test_backtracefilter.rb
115
117
  - test/util/test_observable.rb
116
118
  - test/util/test_procwrapper.rb
@@ -137,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
137
139
  requirements: []
138
140
 
139
141
  rubyforge_project: test-unit
140
- rubygems_version: 1.2.0
142
+ rubygems_version: 1.3.1
141
143
  signing_key:
142
144
  specification_version: 2
143
145
  summary: Test::Unit 2.x - Improved version of Test::Unit bundled in Ruby 1.8.x