test-unit 2.0.2 → 2.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,29 @@
1
+ === 2.0.3 / 2009-07-19
2
+
3
+ * 6 major enhancements
4
+ * add assert_predicate.
5
+ * add assert_not_predicate.
6
+ * [#24210] assert_kind_of supports an array of classes or modules.
7
+ [Daniel Berger]
8
+ * assert_instance_of supports an array of classes or modules.
9
+ * add --default-priority option.
10
+ * [#26627] add --order option. [Daniel Berger]
11
+
12
+ * 4 minor enhancements
13
+ * use yellow foreground + black background for error.
14
+ * don't show diff for long string.
15
+ * accept "*term-color" TERM environment as colorizable terminal.
16
+ (e.g. Apple's Terminal)
17
+ * [#26268] add a workaround for test-spec's after_all. [Angelo Lakra]
18
+
19
+ * 1 bug fix
20
+ * [#23586] re-support ruby 1.9.1. [Diego Pettenò]
21
+
22
+ * Thanks
23
+ * Diego Pettenò
24
+ * Daniel Berger
25
+ * Angelo Lakra
26
+
1
27
  === 2.0.2 / 2008-12-21
2
28
 
3
29
  * 2 major enhancements
data/Manifest.txt CHANGED
@@ -66,10 +66,10 @@ test/test-notification.rb
66
66
  test/test-omission.rb
67
67
  test/test-pending.rb
68
68
  test/test-priority.rb
69
+ test/test-testcase.rb
69
70
  test/test_assertions.rb
70
71
  test/test_error.rb
71
72
  test/test_failure.rb
72
- test/test_testcase.rb
73
73
  test/test_testresult.rb
74
74
  test/test_testsuite.rb
75
75
  test/testunit-test-util.rb
data/README.txt CHANGED
@@ -48,3 +48,5 @@ This software is distributed under the same terms as ruby.
48
48
  * Designing Patterns: Suggestions.
49
49
  * Erik Hollensbe: Suggestions.
50
50
  * Bill Lear: A suggestion.
51
+ * Diego Pettenò: A bug report.
52
+ * Angelo Lakra: A bug report.
data/Rakefile CHANGED
@@ -1,12 +1,17 @@
1
1
  # -*- ruby -*-
2
2
 
3
3
  require 'rubygems'
4
+ gem 'rdoc'
4
5
  require 'hoe'
5
6
  require './lib/test/unit/version.rb'
6
7
 
8
+ ENV["NODOT"] = "yes"
9
+
7
10
  version = Test::Unit::VERSION
8
11
  ENV["VERSION"] = version
9
- Hoe.new('test-unit', version) do |p|
12
+ Hoe.spec('test-unit') do |p|
13
+ Hoe::Test::SUPPORTED_TEST_FRAMEWORKS[:testunit2] = "test/run-test.rb"
14
+ p.version = version
10
15
  p.developer('Kouhei Sutou', 'kou@cozmixng.org')
11
16
  p.developer('Ryan Davis', 'ryand-ruby@zenspider.com')
12
17
 
data/TODO CHANGED
@@ -1,2 +1,5 @@
1
1
  * mock.
2
2
  * data-driven test.
3
+ * port ruby trunk's assert_equal's intelligent inspection
4
+ when inspected expected and actual are same content
5
+ string.
@@ -1,5 +1,6 @@
1
1
  # Author:: Nathaniel Talbott.
2
2
  # Copyright:: Copyright (c) 2000-2003 Nathaniel Talbott. All rights reserved.
3
+ # Copyright (c) 2009 Kouhei Sutou.
3
4
  # License:: Ruby license.
4
5
 
5
6
  require 'test/unit/assertionfailederror'
@@ -153,21 +154,43 @@ EOT
153
154
 
154
155
 
155
156
  ##
156
- # Passes if +object+ .instance_of? +klass+
157
+ # Passes if +object+.instance_of?(+klass+). When +klass+ is
158
+ # an array of classes, it passes if any class
159
+ # satisfies +object.instance_of?(class).
157
160
  #
158
161
  # Example:
159
- # assert_instance_of String, 'foo'
162
+ # assert_instance_of(String, 'foo') # -> pass
163
+ # assert_instance_of([Fixnum, NilClass], 100) # -> pass
164
+ # assert_instance_of([Numeric, NilClass], 100) # -> fail
160
165
 
161
166
  public
162
167
  def assert_instance_of(klass, object, message="")
163
168
  _wrap_assertion do
164
- assert_equal(Class, klass.class, "assert_instance_of takes a Class as its first argument")
165
- full_message = build_message(message, <<EOT, object, klass, object.class)
169
+ klasses = nil
170
+ klasses = klass if klass.is_a?(Array)
171
+ assert_block("The first parameter to assert_instance_of should be " +
172
+ "a Class or an Array of Class.") do
173
+ if klasses
174
+ klasses.all? {|k| k.is_a?(Class)}
175
+ else
176
+ klass.is_a?(Class)
177
+ end
178
+ end
179
+ klass_message = AssertionMessage.maybe_container(klass) do |value|
180
+ "<#{value}>"
181
+ end
182
+ full_message = build_message(message, <<EOT, object, klass_message, object.class)
166
183
  <?> expected to be an instance of
167
- <?> but was
184
+ ? but was
168
185
  <?>.
169
186
  EOT
170
- assert_block(full_message){object.instance_of?(klass)}
187
+ assert_block(full_message) do
188
+ if klasses
189
+ klasses.any? {|k| object.instance_of?(k)}
190
+ else
191
+ object.instance_of?(klass)
192
+ end
193
+ end
171
194
  end
172
195
  end
173
196
 
@@ -186,17 +209,45 @@ EOT
186
209
  end
187
210
 
188
211
  ##
189
- # Passes if +object+ .kind_of? +klass+
212
+ # Passes if +object+.kind_of?(+klass+). When +klass+ is
213
+ # an array of classes or modules, it passes if any
214
+ # class or module satisfies +object.kind_of?(class_or_module).
190
215
  #
191
216
  # Example:
192
- # assert_kind_of Object, 'foo'
217
+ # assert_kind_of(Object, 'foo') # -> pass
218
+ # assert_kind_of([Fixnum, NilClass], 100) # -> pass
219
+ # assert_kind_of([Fixnum, NilClass], "string") # -> fail
193
220
 
194
221
  public
195
222
  def assert_kind_of(klass, object, message="")
196
223
  _wrap_assertion do
197
- assert(klass.kind_of?(Module), "The first parameter to assert_kind_of should be a kind_of Module.")
198
- full_message = build_message(message, "<?>\nexpected to be kind_of\\?\n<?> but was\n<?>.", object, klass, object.class)
199
- assert_block(full_message){object.kind_of?(klass)}
224
+ klasses = nil
225
+ klasses = klass if klass.is_a?(Array)
226
+ assert_block("The first parameter to assert_kind_of should be " +
227
+ "a kind_of Module or an Array of a kind_of Module.") do
228
+ if klasses
229
+ klasses.all? {|k| k.kind_of?(Module)}
230
+ else
231
+ klass.kind_of?(Module)
232
+ end
233
+ end
234
+ klass_message = AssertionMessage.maybe_container(klass) do |value|
235
+ "<#{value}>"
236
+ end
237
+ full_message = build_message(message,
238
+ "<?> expected to be kind_of\\?\n" +
239
+ "? but was\n" +
240
+ "<?>.",
241
+ object,
242
+ klass_message,
243
+ object.class)
244
+ assert_block(full_message) do
245
+ if klasses
246
+ klasses.any? {|k| object.kind_of?(k)}
247
+ else
248
+ object.kind_of?(klass)
249
+ end
250
+ end
200
251
  end
201
252
  end
202
253
 
@@ -209,17 +260,18 @@ EOT
209
260
  public
210
261
  def assert_respond_to(object, method, message="")
211
262
  _wrap_assertion do
212
- full_message = build_message(nil, "<?>\ngiven as the method name argument to #assert_respond_to must be a Symbol or #respond_to\\?(:to_str).", method)
213
-
263
+ full_message = build_message(message,
264
+ "<?>.kind_of\\?(Symbol) or\n" +
265
+ "<?>.respond_to\\?(:to_str) expected",
266
+ method, method)
214
267
  assert_block(full_message) do
215
- method.kind_of?(Symbol) || method.respond_to?(:to_str)
268
+ method.kind_of?(Symbol) or method.respond_to?(:to_str)
216
269
  end
217
- full_message = build_message(message, <<EOT, object, object.class, method)
218
- <?>
219
- of type <?>
220
- expected to respond_to\\?<?>.
221
- EOT
222
- assert_block(full_message) { object.respond_to?(method) }
270
+ full_message = build_message(message,
271
+ "<?>.respond_to\\?(?) expected\n" +
272
+ "(Class: <?>)",
273
+ object, method, object.class)
274
+ assert_block(full_message) {object.respond_to?(method)}
223
275
  end
224
276
  end
225
277
 
@@ -693,6 +745,50 @@ EOT
693
745
  end
694
746
  end
695
747
 
748
+ ##
749
+ # Passes if +object+.+predicate+
750
+ #
751
+ # Example:
752
+ # assert_predicate([], :empty?) # -> pass
753
+ # assert_predicate([1], :empty?) # -> fail
754
+ def assert_predicate(object, predicate, message=nil)
755
+ _wrap_assertion do
756
+ assert_respond_to(object, predicate, message)
757
+ actual = object.send(predicate)
758
+ full_message = build_message(message,
759
+ "<?>.? is true value expected but was\n" +
760
+ "<?>",
761
+ object,
762
+ AssertionMessage.literal(predicate),
763
+ actual)
764
+ assert_block(full_message) do
765
+ actual
766
+ end
767
+ end
768
+ end
769
+
770
+ ##
771
+ # Passes if +object+.+predicate+
772
+ #
773
+ # Example:
774
+ # assert_not_predicate([1], :empty?) # -> pass
775
+ # assert_not_predicate([], :empty?) # -> fail
776
+ def assert_not_predicate(object, predicate, message=nil)
777
+ _wrap_assertion do
778
+ assert_respond_to(object, predicate, message)
779
+ actual = object.send(predicate)
780
+ full_message = build_message(message,
781
+ "<?>.? is false value expected but was\n" +
782
+ "<?>",
783
+ object,
784
+ AssertionMessage.literal(predicate),
785
+ actual)
786
+ assert_block(full_message) do
787
+ not actual
788
+ end
789
+ end
790
+ end
791
+
696
792
  ##
697
793
  # Builds a failure message. +head+ is added before the +template+ and
698
794
  # +arguments+ replaces the '?'s positionally in the template.
@@ -780,6 +876,19 @@ EOT
780
876
  DelayedLiteral.new(block)
781
877
  end
782
878
 
879
+ def maybe_container(value, &formatter)
880
+ MaybeContainer.new(value, &formatter)
881
+ end
882
+
883
+ MAX_DIFF_TARGET_STRING_SIZE = 300
884
+ def diff_target_string?(string)
885
+ if string.respond_to?(:bytesize)
886
+ string.bytesize < MAX_DIFF_TARGET_STRING_SIZE
887
+ else
888
+ string.size < MAX_DIFF_TARGET_STRING_SIZE
889
+ end
890
+ end
891
+
783
892
  def delayed_diff(from, to)
784
893
  delayed_literal do
785
894
  if !from.is_a?(String) or !to.is_a?(String)
@@ -787,7 +896,9 @@ EOT
787
896
  to = convert(to)
788
897
  end
789
898
 
790
- diff = Diff.readable(from, to)
899
+ diff = nil
900
+ diff = "" if !diff_target_string?(from) or !diff_target_string?(to)
901
+ diff ||= Diff.readable(from, to)
791
902
  if /^[-+]/ !~ diff
792
903
  diff = ""
793
904
  elsif /^[ ?]/ =~ diff or /(?:.*\n){2,}/ =~ diff
@@ -833,7 +944,7 @@ EOM
833
944
  def initialize(value)
834
945
  @value = value
835
946
  end
836
-
947
+
837
948
  def inspect
838
949
  @value.to_s
839
950
  end
@@ -843,12 +954,30 @@ EOM
843
954
  def initialize(value)
844
955
  @value = value
845
956
  end
846
-
957
+
847
958
  def inspect
848
959
  @value.call.to_s
849
960
  end
850
961
  end
851
962
 
963
+ class MaybeContainer
964
+ def initialize(value, &formatter)
965
+ @value = value
966
+ @formatter = formatter
967
+ end
968
+
969
+ def inspect
970
+ if @value.is_a?(Array)
971
+ values = @value.collect do |value|
972
+ @formatter.call(AssertionMessage.convert(value))
973
+ end
974
+ "[#{values.join(', ')}]"
975
+ else
976
+ @formatter.call(AssertionMessage.convert(@value))
977
+ end
978
+ end
979
+ end
980
+
852
981
  class Template
853
982
  def self.create(string)
854
983
  parts = (string ? string.scan(/(?=[^\\])\?|(?:\\\?|[^\?])+/m) : [])
@@ -1,4 +1,3 @@
1
- require 'test/unit'
2
1
  require 'test/unit/color-scheme'
3
2
  require 'optparse'
4
3
 
@@ -204,6 +203,13 @@ module Test
204
203
  end
205
204
  end
206
205
 
206
+ o.on("--default-priority=PRIORITY",
207
+ Priority.available_values,
208
+ "Uses PRIORITY as default priority",
209
+ "(#{keyword_display(Priority.available_values)})") do |priority|
210
+ Priority.default = priority
211
+ end
212
+
207
213
  o.on('-I', "--load-path=DIR[#{File::PATH_SEPARATOR}DIR...]",
208
214
  "Appends directory list to $LOAD_PATH.") do |dirs|
209
215
  $LOAD_PATH.concat(dirs.split(File::PATH_SEPARATOR))
@@ -221,6 +227,12 @@ module Test
221
227
  load_config(file)
222
228
  end
223
229
 
230
+ o.on("--order=ORDER", TestCase::AVAILABLE_ORDERS,
231
+ "Run tests in a test case in ORDER order.",
232
+ "(#{keyword_display(TestCase::AVAILABLE_ORDERS)})") do |order|
233
+ TestCase.test_order = order
234
+ end
235
+
224
236
  ADDITIONAL_OPTIONS.each do |option_builder|
225
237
  option_builder.call(self, o)
226
238
  end
@@ -252,10 +264,20 @@ module Test
252
264
  end
253
265
 
254
266
  def keyword_display(keywords)
255
- keywords.collect do |keyword, _|
267
+ keywords = keywords.collect do |keyword, _|
256
268
  keyword.to_s
257
- end.uniq.sort.collect do |keyword|
258
- keyword.sub(/^(.)([A-Za-z]+)(?=\w*$)/, '\\1[\\2]')
269
+ end.uniq.sort
270
+
271
+ i = 0
272
+ keywords.collect do |keyword|
273
+ if (i > 0 and keyword[0] == keywords[i - 1][0]) or
274
+ ((i < keywords.size - 1) and (keyword[0] == keywords[i + 1][0]))
275
+ n = 2
276
+ else
277
+ n = 1
278
+ end
279
+ i += 1
280
+ keyword.sub(/^(.{#{n}})([A-Za-z]+)(?=\w*$)/, '\\1[\\2]')
259
281
  end.join(", ")
260
282
  end
261
283
 
@@ -13,7 +13,8 @@ module Test
13
13
  "pending" => Color.new("magenta", :bold => true),
14
14
  "omission" => Color.new("blue", :bold => true),
15
15
  "notification" => Color.new("cyan", :bold => true),
16
- "error" => Color.new("yellow", :bold => true))
16
+ "error" => Color.new("yellow", :bold => true) +
17
+ Color.new("black", :foreground => false))
17
18
  end
18
19
 
19
20
  @@schemes = {}
@@ -64,7 +65,7 @@ module Test
64
65
 
65
66
  private
66
67
  def make_color(color_spec)
67
- if color_spec.is_a?(Color)
68
+ if color_spec.is_a?(Color) or color_spec.is_a?(MixColor)
68
69
  color_spec
69
70
  else
70
71
  color_name = nil
@@ -26,6 +26,19 @@ module Test
26
26
  def disable
27
27
  @@enabled = false
28
28
  end
29
+
30
+ @@default = :normal
31
+ def default
32
+ @@default || :normal
33
+ end
34
+
35
+ def default=(default)
36
+ @@default = default
37
+ end
38
+
39
+ def available_values
40
+ Checker.available_priorities
41
+ end
29
42
  end
30
43
 
31
44
  class Checker
@@ -36,7 +49,7 @@ module Test
36
49
  end
37
50
 
38
51
  def need_to_run?(test)
39
- priority = test[:priority] || :normal
52
+ priority = test[:priority] || Priority.default
40
53
  if have_priority?(priority)
41
54
  send(priority_check_method_name(priority), test)
42
55
  else
@@ -44,6 +57,13 @@ module Test
44
57
  end
45
58
  end
46
59
 
60
+ def available_priorities
61
+ methods(false).collect do |name|
62
+ /\Arun_priority_(.+)\?\z/ =~ name.to_s
63
+ $1
64
+ end.compact
65
+ end
66
+
47
67
  def run_priority_must?(test)
48
68
  true
49
69
  end
@@ -1,7 +1,9 @@
1
1
  #--
2
2
  #
3
3
  # Author:: Nathaniel Talbott.
4
- # Copyright:: Copyright (c) 2000-2003 Nathaniel Talbott. All rights reserved.
4
+ # Copyright::
5
+ # * Copyright (c) 2000-2003 Nathaniel Talbott. All rights reserved.
6
+ # * Copyright (c) 2008-2009 Kouhei Sutou <tt><kou@clear-code.com></tt>
5
7
  # License:: Ruby license.
6
8
 
7
9
  require 'test/unit/attribute'
@@ -60,14 +62,14 @@ module Test
60
62
  # end
61
63
  #
62
64
  # Here is a call order:
63
- # * startup
64
- # * setup
65
- # * test_my_method1
66
- # * teardown
67
- # * setup
68
- # * test_my_method2
69
- # * teardown
70
- # * shutdown
65
+ # * startup
66
+ # * setup
67
+ # * test_my_method1
68
+ # * teardown
69
+ # * setup
70
+ # * test_my_method2
71
+ # * teardown
72
+ # * shutdown
71
73
  class TestCase
72
74
  include Attribute
73
75
  include Fixture
@@ -81,24 +83,29 @@ module Test
81
83
  include Assertions
82
84
  include Util::BacktraceFilter
83
85
 
84
- STARTED = name + "::STARTED"
85
- FINISHED = name + "::FINISHED"
86
+ STARTED = name + "::STARTED" # :nodoc:
87
+ FINISHED = name + "::FINISHED" # :nodoc:
86
88
 
87
- DESCENDANTS = []
89
+ DESCENDANTS = [] # :nodoc:
90
+ AVAILABLE_ORDERS = [:alphabetic, :random, :defined] # :nodoc:
88
91
 
89
92
  class << self
90
- def inherited(sub_class)
93
+ def inherited(sub_class) # :nodoc:
91
94
  DESCENDANTS << sub_class
92
95
  end
93
96
 
97
+ @@added_methods = []
98
+ def method_added(name) # :nodoc:
99
+ super
100
+ @@added_methods << name.to_s
101
+ end
102
+
94
103
  # Rolls up all of the test* methods in the fixture into
95
104
  # one suite, creating a new instance of the fixture for
96
105
  # each method.
97
106
  def suite
98
- method_names = public_instance_methods(true).collect {|name| name.to_s}
99
- tests = method_names.delete_if {|method_name| method_name !~ /^test./}
100
107
  suite = TestSuite.new(name, self)
101
- tests.sort.each do |test|
108
+ collect_test_names.each do |test|
102
109
  catch(:invalid_test) do
103
110
  suite << new(test)
104
111
  end
@@ -137,11 +144,11 @@ module Test
137
144
  # end
138
145
  #
139
146
  # Here is a call order:
140
- # * startup
141
- # * setup
142
- # * test_my_class1 (or test_my_class2)
143
- # * setup
144
- # * test_my_class2 (or test_my_class1)
147
+ # * startup
148
+ # * setup
149
+ # * test_my_class1 (or test_my_class2)
150
+ # * setup
151
+ # * test_my_class2 (or test_my_class1)
145
152
  #
146
153
  # Note that you should not assume test order. Tests
147
154
  # should be worked in any order.
@@ -173,16 +180,74 @@ module Test
173
180
  # end
174
181
  #
175
182
  # Here is a call order:
176
- # * test_my_class1 (or test_my_class2)
177
- # * teardown
178
- # * test_my_class2 (or test_my_class1)
179
- # * teardown
180
- # * shutdown
183
+ # * test_my_class1 (or test_my_class2)
184
+ # * teardown
185
+ # * test_my_class2 (or test_my_class1)
186
+ # * teardown
187
+ # * shutdown
181
188
  #
182
189
  # Note that you should not assume test order. Tests
183
190
  # should be worked in any order.
184
191
  def shutdown
185
192
  end
193
+
194
+ @@test_order = AVAILABLE_ORDERS.first
195
+
196
+ # Returns the current test order. This returns
197
+ # +:alphabetic+ by default.
198
+ def test_order
199
+ @@test_order
200
+ end
201
+
202
+ # Sets the current test order.
203
+ #
204
+ # Here are the available _order_:
205
+ # [:alphabetic]
206
+ # Default. Tests are sorted in alphabetic order.
207
+ # [:random]
208
+ # Tests are sorted in random order.
209
+ # [:defined]
210
+ # Tests are sorted in defined order.
211
+ def test_order=(order)
212
+ @@test_order = order
213
+ end
214
+
215
+ # :stopdoc:
216
+ private
217
+ def collect_test_names
218
+ method_names = public_instance_methods(true).collect do |name|
219
+ name.to_s
220
+ end
221
+ test_names = method_names.find_all do |method_name|
222
+ method_name =~ /^test./
223
+ end
224
+ send("sort_test_names_in_#{test_order}_order", test_names)
225
+ end
226
+
227
+ def sort_test_names_in_alphabetic_order(test_names)
228
+ test_names.sort
229
+ end
230
+
231
+ def sort_test_names_in_random_order(test_names)
232
+ test_names.sort_by {rand(test_names.size)}
233
+ end
234
+
235
+ def sort_test_names_in_defined_order(test_names)
236
+ test_names.sort do |test1, test2|
237
+ test1_defined_order = @@added_methods.index(test1)
238
+ test2_defined_order = @@added_methods.index(test2)
239
+ if test1_defined_order and test2_defined_order
240
+ test1_defined_order <=> test2_defined_order
241
+ elsif test1_defined_order
242
+ 1
243
+ elsif test2_defined_order
244
+ -1
245
+ else
246
+ test1 <=> test2
247
+ end
248
+ end
249
+ end
250
+ # :startdoc:
186
251
  end
187
252
 
188
253
  attr_reader :method_name
@@ -225,7 +290,7 @@ module Test
225
290
  result.add_run
226
291
  yield(FINISHED, name)
227
292
  ensure
228
- @_result = nil
293
+ # @_result = nil # For test-spec's after_all :<
229
294
  end
230
295
  end
231
296
 
@@ -255,10 +320,10 @@ module Test
255
320
  # end
256
321
  #
257
322
  # Here is a call order:
258
- # * setup
259
- # * my_setup1
260
- # * my_setup2
261
- # * test_my_class
323
+ # * setup
324
+ # * my_setup1
325
+ # * my_setup2
326
+ # * test_my_class
262
327
  def setup
263
328
  end
264
329
 
@@ -288,13 +353,13 @@ module Test
288
353
  # end
289
354
  #
290
355
  # Here is a call order:
291
- # * test_my_class
292
- # * my_teardown2
293
- # * my_teardown1
294
- # * teardown
356
+ # * test_my_class
357
+ # * my_teardown2
358
+ # * my_teardown1
359
+ # * teardown
295
360
  def teardown
296
361
  end
297
-
362
+
298
363
  def default_test
299
364
  flunk("No tests were specified")
300
365
  end
@@ -185,10 +185,13 @@ module Test
185
185
 
186
186
  def guess_color_availability
187
187
  return false unless @output.tty?
188
- term = ENV["TERM"]
189
- return true if term and (/term\z/ =~ term or term == "screen")
190
- return true if ENV["EMACS"] == "t"
191
- false
188
+ case ENV["TERM"]
189
+ when /term(?:-color)?\z/, "screen"
190
+ true
191
+ else
192
+ return true if ENV["EMACS"] == "t"
193
+ false
194
+ end
192
195
  end
193
196
 
194
197
  def guess_progress_row_max
@@ -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.2'
5
+ VERSION = '2.0.3'
6
6
  end
7
7
  end
@@ -6,7 +6,8 @@ class TestUnitColorScheme < Test::Unit::TestCase
6
6
  "pending" => color("magenta", :bold => true),
7
7
  "omission" => color("blue", :bold => true),
8
8
  "notification" => color("cyan", :bold => true),
9
- "error" => color("yellow", :bold => true),
9
+ "error" => color("yellow", :bold => true) +
10
+ color("black", :foreground => false),
10
11
  },
11
12
  Test::Unit::ColorScheme.default.to_hash)
12
13
  end
data/test/test-pending.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'test/unit'
2
2
  require 'testunit-test-util'
3
3
 
4
- class TestUntiPending < Test::Unit::TestCase
4
+ class TestUnitPending < Test::Unit::TestCase
5
5
  include TestUnitTestUtil
6
6
 
7
7
  class TestCase < Test::Unit::TestCase
@@ -6,7 +6,7 @@ require 'test/unit'
6
6
 
7
7
  module Test
8
8
  module Unit
9
- class TC_TestCase < TestCase
9
+ class TestTestCase < TestCase
10
10
  def test_creation
11
11
  tc = Class.new(TestCase) do
12
12
  def test_with_arguments(arg1, arg2)
@@ -267,7 +267,7 @@ module Test
267
267
  def test_re_raise_exception
268
268
  test_case = Class.new(TestCase) do
269
269
  def test_raise_interrupt
270
- raise Interrupt
270
+ raise Interrupt, "from test"
271
271
  end
272
272
  end
273
273
 
@@ -342,7 +342,7 @@ module Test
342
342
  test_case = Class.new(TestCase) do
343
343
  class << self
344
344
  def startup
345
- raise Interrupt
345
+ raise Interrupt, "from startup"
346
346
  end
347
347
  end
348
348
 
@@ -383,7 +383,7 @@ module Test
383
383
  test_case = Class.new(TestCase) do
384
384
  class << self
385
385
  def shutdown
386
- raise Interrupt
386
+ raise Interrupt, "from shutdown"
387
387
  end
388
388
  end
389
389
 
@@ -468,11 +468,40 @@ module Test
468
468
  end
469
469
  end
470
470
 
471
+ def test_defined_order
472
+ keep_test_order do
473
+ test_case = Class.new(Test::Unit::TestCase) do
474
+ def test_z
475
+ end
476
+
477
+ def test_1
478
+ end
479
+
480
+ def test_a
481
+ end
482
+ end
483
+
484
+ assert_equal(["test_1", "test_a", "test_z"],
485
+ test_case.suite.tests.collect {|test| test.method_name})
486
+
487
+ test_case.test_order = :defined
488
+ assert_equal(["test_z", "test_1", "test_a"],
489
+ test_case.suite.tests.collect {|test| test.method_name})
490
+ end
491
+ end
492
+
471
493
  private
472
494
  def check(message, passed)
473
495
  add_assertion
474
496
  raise AssertionFailedError.new(message) unless passed
475
497
  end
498
+
499
+ def keep_test_order
500
+ order = TestCase.test_order
501
+ yield
502
+ ensure
503
+ TestCase.test_order = order
504
+ end
476
505
  end
477
506
  end
478
507
  end
@@ -1,5 +1,6 @@
1
1
  # Author:: Nathaniel Talbott.
2
2
  # Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
3
+ # Copyright (c) 2009 Kouhei Sutou.
3
4
  # License:: Ruby license.
4
5
 
5
6
  require 'test/unit'
@@ -245,6 +246,37 @@ EOM
245
246
  end
246
247
  end
247
248
 
249
+ def test_assert_equal_with_large_string
250
+ message = <<-EOM.chomp
251
+ <#{("a\n" + "x" * 297).inspect}> expected but was
252
+ <#{"x".inspect}>.
253
+
254
+ diff:
255
+ + x
256
+ - a
257
+ - #{"x" * 297}
258
+
259
+ folded diff:
260
+ + x
261
+ - a
262
+ - #{"x" * 78}
263
+ - #{"x" * 78}
264
+ - #{"x" * 78}
265
+ - #{"x" * 63}
266
+ EOM
267
+ check_fails(message) do
268
+ assert_equal("a\n" + "x" * 297, "x")
269
+ end
270
+
271
+ message = <<-EOM.chomp
272
+ <#{("a\n" + "x" * 298).inspect}> expected but was
273
+ <#{"x".inspect}>.
274
+ EOM
275
+ check_fails(message) do
276
+ assert_equal("a\n" + "x" * 298, "x")
277
+ end
278
+ end
279
+
248
280
  def test_assert_raise_success
249
281
  return_value = nil
250
282
  check_nothing_fails(true) do
@@ -396,7 +428,7 @@ EOM
396
428
 
397
429
  different_error_class = Class.new(StandardError)
398
430
  message = <<-EOM
399
- <\#<Class:0x[a-f\\d]+>\\("Error"\\)> exception expected but was
431
+ <\#<Class:[xa-f\\d]+>\\("Error"\\)> exception expected but was
400
432
  Class: <RuntimeError>
401
433
  Message: <"Error">
402
434
  EOM
@@ -446,8 +478,18 @@ EOM
446
478
  check_fails(%Q{failed assert_instance_of.\n<"string"> expected to be an instance of\n<Hash> but was\n<String>.}) {
447
479
  assert_instance_of(Hash, "string", "failed assert_instance_of")
448
480
  }
481
+
482
+ check_nothing_fails do
483
+ assert_instance_of([Fixnum, NilClass], 100)
484
+ end
485
+ check_fails(%Q{<"string"> expected to be an instance of\n[<Fixnum>, <NilClass>] but was\n<String>.}) do
486
+ assert_instance_of([Fixnum, NilClass], "string")
487
+ end
488
+ check_fails(%Q{<100> expected to be an instance of\n[<Numeric>, <NilClass>] but was\n<Fixnum>.}) do
489
+ assert_instance_of([Numeric, NilClass], 100)
490
+ end
449
491
  end
450
-
492
+
451
493
  def test_assert_nil
452
494
  check_nothing_fails {
453
495
  assert_nil(nil)
@@ -486,14 +528,21 @@ EOM
486
528
  check_nothing_fails {
487
529
  assert_kind_of(Comparable, 1)
488
530
  }
489
- check_fails(%Q{<"string">\nexpected to be kind_of?\n<Class> but was\n<String>.}) {
531
+ check_fails(%Q{<"string"> expected to be kind_of?\n<Class> but was\n<String>.}) {
490
532
  assert_kind_of(Class, "string")
491
533
  }
492
- check_fails(%Q{failed assert_kind_of.\n<"string">\nexpected to be kind_of?\n<Class> but was\n<String>.}) {
534
+ check_fails(%Q{failed assert_kind_of.\n<"string"> expected to be kind_of?\n<Class> but was\n<String>.}) {
493
535
  assert_kind_of(Class, "string", "failed assert_kind_of")
494
536
  }
537
+
538
+ check_nothing_fails do
539
+ assert_kind_of([Fixnum, NilClass], 100)
540
+ end
541
+ check_fails(%Q{<"string"> expected to be kind_of?\n[<Fixnum>, <NilClass>] but was\n<String>.}) do
542
+ assert_kind_of([Fixnum, NilClass], "string")
543
+ end
495
544
  end
496
-
545
+
497
546
  def test_assert_match
498
547
  check_nothing_fails {
499
548
  assert_match(/strin./, "string")
@@ -703,10 +752,13 @@ EOM
703
752
  check_nothing_fails {
704
753
  assert_respond_to("thing", "to_s", "message")
705
754
  }
706
- check_fails("<0.15>\ngiven as the method name argument to #assert_respond_to must be a Symbol or #respond_to?(:to_str).") {
755
+ check_fails("<0.15>.kind_of?(Symbol) or\n" +
756
+ "<0.15>.respond_to?(:to_str) expected") {
707
757
  assert_respond_to("thing", 0.15)
708
758
  }
709
- check_fails("message.\n<:symbol>\nof type <Symbol>\nexpected to respond_to?<:non_existent>.") {
759
+ check_fails("message.\n" +
760
+ "<:symbol>.respond_to?(:non_existent) expected\n" +
761
+ "(Class: <Symbol>)") {
710
762
  assert_respond_to(:symbol, :non_existent, "message")
711
763
  }
712
764
  end
@@ -728,10 +780,15 @@ EOM
728
780
  check_fails("message.\n<0.5> and\n<0.4> expected to be within\n<0.05> of each other.") {
729
781
  assert_in_delta(0.5, 0.4, 0.05, "message")
730
782
  }
731
- check_fails(%r{The arguments must respond to to_f; the first float did not\.\n<.+>\nof type <Object>\nexpected to respond_to\?<:to_f>.}) {
732
- assert_in_delta(Object.new, 0.4, 0.1)
733
- }
734
- check_fails("The delta should not be negative.\n<-0.1> expected to be\n>=\n<0.0>.") {
783
+ object = Object.new
784
+ check_fails("The arguments must respond to to_f; " +
785
+ "the first float did not.\n" +
786
+ "<#{object.inspect}>.respond_to?(:to_f) expected\n" +
787
+ "(Class: <Object>)") {
788
+ assert_in_delta(object, 0.4, 0.1)
789
+ }
790
+ check_fails("The delta should not be negative.\n" +
791
+ "<-0.1> expected to be\n>=\n<0.0>.") {
735
792
  assert_in_delta(0.5, 0.4, -0.1, "message")
736
793
  }
737
794
  end
@@ -976,6 +1033,36 @@ EOM
976
1033
  end
977
1034
  end
978
1035
 
1036
+ def test_assert_predicate
1037
+ check_nothing_fails do
1038
+ assert_predicate([], :empty?)
1039
+ end
1040
+
1041
+ check_fails("<[1]>.empty? is true value expected but was\n<false>") do
1042
+ assert_predicate([1], :empty?)
1043
+ end
1044
+
1045
+ check_fails("<[1]>.respond_to?(:nonexistent?) expected\n" +
1046
+ "(Class: <Array>)") do
1047
+ assert_predicate([1], :nonexistent?)
1048
+ end
1049
+ end
1050
+
1051
+ def test_assert_not_predicate
1052
+ check_nothing_fails do
1053
+ assert_not_predicate([1], :empty?)
1054
+ end
1055
+
1056
+ check_fails("<[]>.empty? is false value expected but was\n<true>") do
1057
+ assert_not_predicate([], :empty?)
1058
+ end
1059
+
1060
+ check_fails("<[]>.respond_to?(:nonexistent?) expected\n" +
1061
+ "(Class: <Array>)") do
1062
+ assert_not_predicate([], :nonexistent?)
1063
+ end
1064
+ end
1065
+
979
1066
  private
980
1067
  def add_failure(message, location=caller)
981
1068
  unless @catch_assertions
@@ -993,4 +1080,3 @@ EOM
993
1080
  end
994
1081
  end
995
1082
  end
996
- p
@@ -4,7 +4,7 @@ class TestUnitUIMediator < Test::Unit::TestCase
4
4
  def test_run_suite_with_interrupt_exception
5
5
  test_case = Class.new(Test::Unit::TestCase) do
6
6
  def test_raise_interrupt
7
- raise Interrupt
7
+ raise Interrupt, "from test"
8
8
  end
9
9
  end
10
10
  mediator = Test::Unit::UI::TestRunnerMediator.new(test_case.suite)
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.2
4
+ version: 2.0.3
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-12-21 00:00:00 +09:00
13
+ date: 2009-07-19 00:00:00 +09:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -21,9 +21,15 @@ dependencies:
21
21
  requirements:
22
22
  - - ">="
23
23
  - !ruby/object:Gem::Version
24
- version: 1.8.2
24
+ version: 2.3.2
25
25
  version:
26
- description: Test::Unit 2.x - Improved version of Test::Unit bundled in Ruby 1.8.x. Ruby 1.9.x bundles miniunit not Test::Unit. Test::Unit bundled in Ruby 1.8.x had not been improved but unbundled Test::Unit (Test::Unit 2.x) will be improved actively.
26
+ description: |-
27
+ Test::Unit 2.x - Improved version of Test::Unit bundled in
28
+ Ruby 1.8.x.
29
+
30
+ Ruby 1.9.x bundles miniunit not Test::Unit. Test::Unit
31
+ bundled in Ruby 1.8.x had not been improved but unbundled
32
+ Test::Unit (Test::Unit 2.x) will be improved actively.
27
33
  email:
28
34
  - kou@cozmixng.org
29
35
  - ryand-ruby@zenspider.com
@@ -104,10 +110,10 @@ files:
104
110
  - test/test-omission.rb
105
111
  - test/test-pending.rb
106
112
  - test/test-priority.rb
113
+ - test/test-testcase.rb
107
114
  - test/test_assertions.rb
108
115
  - test/test_error.rb
109
116
  - test/test_failure.rb
110
- - test/test_testcase.rb
111
117
  - test/test_testresult.rb
112
118
  - test/test_testsuite.rb
113
119
  - test/testunit-test-util.rb
@@ -118,6 +124,8 @@ files:
118
124
  - test/util/test_procwrapper.rb
119
125
  has_rdoc: true
120
126
  homepage: http://rubyforge.org/projects/test-unit/
127
+ licenses: []
128
+
121
129
  post_install_message:
122
130
  rdoc_options:
123
131
  - --main
@@ -139,20 +147,19 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
147
  requirements: []
140
148
 
141
149
  rubyforge_project: test-unit
142
- rubygems_version: 1.3.1
150
+ rubygems_version: 1.3.4
143
151
  signing_key:
144
- specification_version: 2
152
+ specification_version: 3
145
153
  summary: Test::Unit 2.x - Improved version of Test::Unit bundled in Ruby 1.8.x
146
154
  test_files:
147
- - test/test_testcase.rb
148
- - test/test_failure.rb
149
- - test/collector/test_objectspace.rb
150
155
  - test/collector/test_dir.rb
151
- - test/test_testsuite.rb
156
+ - test/collector/test_objectspace.rb
157
+ - test/ui/test_testrunmediator.rb
152
158
  - test/test_assertions.rb
153
- - test/util/test_observable.rb
154
159
  - test/util/test_procwrapper.rb
155
160
  - test/util/test_backtracefilter.rb
156
- - test/ui/test_testrunmediator.rb
161
+ - test/util/test_observable.rb
162
+ - test/test_failure.rb
163
+ - test/test_testsuite.rb
157
164
  - test/test_testresult.rb
158
165
  - test/test_error.rb