test-unit 2.0.1 → 2.0.2

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 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