test-unit 2.0.5 → 2.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,29 @@
1
+ === 2.0.6 / 2010-01-09
2
+
3
+ * 3 major enhancements
4
+ * [#27380] Declarative syntax? [Daniel Berger]
5
+ support declarative syntax:
6
+
7
+ test "test description in natural language" do
8
+ ...
9
+ end
10
+ * support test description:
11
+ description "test description in natural language"
12
+ def test_my_test
13
+ ...
14
+ end
15
+ * make max diff target string size customizable by
16
+ TEST_UNIT_MAX_DIFF_TARGET_STRING_SIZE environment variable.
17
+
18
+ * 2 bug fixes
19
+ * [#27374] omit_if unexpected behavior [David MARCHALAND]
20
+ * fix a bug that tests in sub directories aren't load with --basedir.
21
+ [Daniel Berger]
22
+
23
+ * Thanks
24
+ * David MARCHALAND
25
+ * Daniel Berger
26
+
1
27
  === 2.0.5 / 2009-10-18
2
28
 
3
29
  * 1 bug fixes
data/README.txt CHANGED
@@ -51,3 +51,5 @@ This software is distributed under the same terms as ruby.
51
51
  * Diego Pettenò: A bug report.
52
52
  * Angelo Lakra: A bug report.
53
53
  * Mike Pomraning: A bug report.
54
+ * David MARCHALAND: A bug report.
55
+ * Andrew Grimm: A bug report.
@@ -303,12 +303,13 @@ module Test # :nodoc:
303
303
  #
304
304
 
305
305
  module Unit
306
- # If set to false Test::Unit will not automatically run at exit.
306
+ # Set true when Test::Unit has run. If set to true Test::Unit
307
+ # will not automatically run at exit.
307
308
  def self.run=(flag)
308
309
  @run = flag
309
310
  end
310
311
 
311
- # Automatically run tests at exit?
312
+ # Already tests have run?
312
313
  def self.run?
313
314
  @run ||= false
314
315
  end
@@ -798,6 +798,54 @@ EOT
798
798
  end
799
799
  end
800
800
 
801
+ ##
802
+ # Passes if +object+#+alias_name+ is an alias method of
803
+ # +object+#+original_name+.
804
+ #
805
+ # Example:
806
+ # assert_alias_method([], :length, :size) # -> pass
807
+ # assert_alias_method([], :size, :length) # -> pass
808
+ # assert_alias_method([], :each, :size) # -> fail
809
+ def assert_alias_method(object, alias_name, original_name, message=nil)
810
+ _wrap_assertion do
811
+ find_method_failure_message = Proc.new do |method_name|
812
+ build_message(message,
813
+ "<?>.? doesn't exist\n" +
814
+ "(Class: <?>)",
815
+ object,
816
+ AssertionMessage.literal(method_name),
817
+ object.class)
818
+ end
819
+
820
+ alias_method = original_method = nil
821
+ assert_block(find_method_failure_message.call(alias_name)) do
822
+ begin
823
+ alias_method = object.method(alias_name)
824
+ true
825
+ rescue NameError
826
+ false
827
+ end
828
+ end
829
+ assert_block(find_method_failure_message.call(original_name)) do
830
+ begin
831
+ original_method = object.method(original_name)
832
+ true
833
+ rescue NameError
834
+ false
835
+ end
836
+ end
837
+
838
+ full_message = build_message(message,
839
+ "<?> is alias of\n" +
840
+ "<?> expected",
841
+ alias_method,
842
+ original_method)
843
+ assert_block(full_message) do
844
+ alias_method == original_method
845
+ end
846
+ end
847
+ end
848
+
801
849
  ##
802
850
  # Builds a failure message. +head+ is added before the +template+ and
803
851
  # +arguments+ replaces the '?'s positionally in the template.
@@ -890,11 +938,23 @@ EOT
890
938
  end
891
939
 
892
940
  MAX_DIFF_TARGET_STRING_SIZE = 1000
941
+ def max_diff_target_string_size
942
+ size = ENV["TEST_UNIT_MAX_DIFF_TARGET_STRING_SIZE"]
943
+ if size
944
+ begin
945
+ size = Integer(size)
946
+ rescue ArgumentError
947
+ size = nil
948
+ end
949
+ end
950
+ size || MAX_DIFF_TARGET_STRING_SIZE
951
+ end
952
+
893
953
  def diff_target_string?(string)
894
954
  if string.respond_to?(:bytesize)
895
- string.bytesize < MAX_DIFF_TARGET_STRING_SIZE
955
+ string.bytesize < max_diff_target_string_size
896
956
  else
897
- string.size < MAX_DIFF_TARGET_STRING_SIZE
957
+ string.size < max_diff_target_string_size
898
958
  end
899
959
  end
900
960
 
@@ -29,7 +29,7 @@ module Test
29
29
  add_load_path(@base) do
30
30
  froms = ["."] if froms.empty?
31
31
  test_suites = froms.collect do |from|
32
- test_suite = collect_recursive(from, find_test_cases)
32
+ test_suite = collect_recursive(resolve_path(from), find_test_cases)
33
33
  test_suite = nil if test_suite.tests.empty?
34
34
  test_suite
35
35
  end.compact
@@ -56,10 +56,9 @@ module Test
56
56
  end
57
57
 
58
58
  private
59
- def collect_recursive(name, already_gathered)
59
+ def collect_recursive(path, already_gathered)
60
60
  sub_test_suites = []
61
61
 
62
- path = resolve_path(name)
63
62
  if path.directory?
64
63
  directories, files = path.children.partition do |child|
65
64
  child.directory?
@@ -56,7 +56,7 @@ module Test
56
56
  end
57
57
  end
58
58
 
59
- # Omit the test of part of the test.
59
+ # Omit the test or part of the test.
60
60
  #
61
61
  # Example:
62
62
  # def test_omission
@@ -80,12 +80,56 @@ module Test
80
80
  end
81
81
  end
82
82
 
83
+ # Omit the test or part of the test if _condition_ is
84
+ # true.
85
+ #
86
+ # Example:
87
+ # def test_omission
88
+ # omit_if("".empty?)
89
+ # # Not reached here
90
+ # end
91
+ #
92
+ # def test_omission_with_here
93
+ # omit_if(true) do
94
+ # # Not ran here
95
+ # end
96
+ # omit_if(false) do
97
+ # # Reached here
98
+ # end
99
+ # # Reached here too
100
+ # end
83
101
  def omit_if(condition, *args, &block)
84
- omit(*args, &block) if condition
102
+ if condition
103
+ omit(*args, &block)
104
+ else
105
+ block.call if block
106
+ end
85
107
  end
86
108
 
109
+ # Omit the test or part of the test if _condition_ is
110
+ # not true.
111
+ #
112
+ # Example:
113
+ # def test_omission
114
+ # omit_unless("string".empty?)
115
+ # # Not reached here
116
+ # end
117
+ #
118
+ # def test_omission_with_here
119
+ # omit_unless(true) do
120
+ # # Reached here
121
+ # end
122
+ # omit_unless(false) do
123
+ # # Not ran here
124
+ # end
125
+ # # Reached here too
126
+ # end
87
127
  def omit_unless(condition, *args, &block)
88
- omit(*args, &block) unless condition
128
+ if condition
129
+ block.call if block
130
+ else
131
+ omit(*args, &block)
132
+ end
89
133
  end
90
134
 
91
135
  private
@@ -212,6 +212,39 @@ module Test
212
212
  @@test_order = order
213
213
  end
214
214
 
215
+ # Defines a test in declarative syntax.
216
+ #
217
+ # The following two test definitions are the same:
218
+ #
219
+ # description "register user"
220
+ # def test_register_user
221
+ # ...
222
+ # end
223
+ #
224
+ # test "register user" do
225
+ # ...
226
+ # end
227
+ def test(test_description, &block)
228
+ normalized_description = test_description.gsub(/[^a-zA-Z\d_]+/, '_')
229
+ method_name = "test_#{normalized_description}".to_sym
230
+ define_method(method_name, &block)
231
+ description(test_description, method_name)
232
+ end
233
+
234
+ # Describes a test.
235
+ #
236
+ # The following example associates "register a
237
+ # normal user" description with "test_register"
238
+ # test.
239
+ #
240
+ # description "register a normal user"
241
+ # def test_register
242
+ # ...
243
+ # end
244
+ def description(value, target=nil)
245
+ attribute(:description, value, {}, target || [])
246
+ end
247
+
215
248
  # :stopdoc:
216
249
  private
217
250
  def collect_test_names
@@ -374,6 +407,15 @@ module Test
374
407
  "#{@method_name}(#{self.class.name})"
375
408
  end
376
409
 
410
+ # Returns a description for the test. A description
411
+ # will be associated by Test::Unit::TestCase.test or
412
+ # Test::Unit::TestCase.description.
413
+ #
414
+ # Returns a name for the test for no description test.
415
+ def description
416
+ self[:description] || name
417
+ end
418
+
377
419
  # Overridden to return #name.
378
420
  def to_s
379
421
  name
@@ -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.5'
5
+ VERSION = '2.0.6'
6
6
  end
7
7
  end
@@ -68,7 +68,7 @@ class TestUnitOmission < Test::Unit::TestCase
68
68
 
69
69
  def test_omit_with_condition_and_block
70
70
  result = _run_test("test_omit_with_block_and_condition")
71
- assert_equal("1 tests, 1 assertions, 0 failures, 0 errors, 0 pendings, " \
71
+ assert_equal("1 tests, 2 assertions, 0 failures, 0 errors, 0 pendings, " \
72
72
  "1 omissions, 0 notifications",
73
73
  result.to_s)
74
74
  assert_fault_messages(["Should omit."], result.omissions)
@@ -490,6 +490,33 @@ module Test
490
490
  end
491
491
  end
492
492
 
493
+ def test_declarative_style
494
+ keep_test_order do
495
+ test_case = Class.new(Test::Unit::TestCase) do
496
+ test "declarative style test definition" do
497
+ end
498
+
499
+ test "include parenthesis" do
500
+ end
501
+
502
+ test "1 + 2 = 3" do
503
+ end
504
+ end
505
+
506
+ test_case.test_order = :defined
507
+
508
+ assert_equal(["test_declarative_style_test_definition",
509
+ "test_include_parenthesis",
510
+ "test_1_2_3"],
511
+ test_case.suite.tests.collect {|test| test.method_name})
512
+
513
+ assert_equal(["declarative style test definition",
514
+ "include parenthesis",
515
+ "1 + 2 = 3"],
516
+ test_case.suite.tests.collect {|test| test.description})
517
+ end
518
+ end
519
+
493
520
  private
494
521
  def check(message, passed)
495
522
  add_assertion
@@ -275,6 +275,42 @@ EOM
275
275
  end
276
276
  end
277
277
 
278
+ def test_assert_equal_with_max_diff_target_string_size
279
+ key = "TEST_UNIT_MAX_DIFF_TARGET_STRING_SIZE"
280
+ before_value = ENV[key]
281
+ ENV[key] = "100"
282
+ begin
283
+ message = <<-EOM.chomp
284
+ <#{("a\n" + "x" * 97).inspect}> expected but was
285
+ <#{"x".inspect}>.
286
+
287
+ diff:
288
+ + x
289
+ - a
290
+ - #{"x" * 97}
291
+
292
+ folded diff:
293
+ + x
294
+ - a
295
+ #{(["- " + ("x" * 78)]).join("\n")}
296
+ - #{"x" * 19}
297
+ EOM
298
+ check_fails(message) do
299
+ assert_equal("a\n" + "x" * 97, "x")
300
+ end
301
+
302
+ message = <<-EOM.chomp
303
+ <#{("a\n" + "x" * 98).inspect}> expected but was
304
+ <#{"x".inspect}>.
305
+ EOM
306
+ check_fails(message) do
307
+ assert_equal("a\n" + "x" * 98, "x")
308
+ end
309
+ ensure
310
+ ENV[key] = before_value
311
+ end
312
+ end
313
+
278
314
  def test_assert_raise_success
279
315
  return_value = nil
280
316
  check_nothing_fails(true) do
@@ -1061,6 +1097,41 @@ EOM
1061
1097
  end
1062
1098
  end
1063
1099
 
1100
+ def test_assert_alias_method
1101
+ object = Object.new
1102
+ class << object
1103
+ def original_method
1104
+ end
1105
+ alias_method :alias_method, :original_method
1106
+
1107
+ def other
1108
+ end
1109
+ end
1110
+
1111
+ check_nothing_fails do
1112
+ assert_alias_method(object, :alias_method, :original_method)
1113
+ end
1114
+
1115
+ check_nothing_fails do
1116
+ assert_alias_method(object, :original_method, :alias_method)
1117
+ end
1118
+
1119
+ check_fails("<#{object.method(:other).inspect}> is alias of\n" +
1120
+ "<#{object.method(:original_method).inspect}> expected") do
1121
+ assert_alias_method(object, :other, :original_method)
1122
+ end
1123
+
1124
+ check_fails("<#{object.inspect}>.nonexistent doesn't exist\n" +
1125
+ "(Class: <Object>)") do
1126
+ assert_alias_method(object, :nonexistent, :original_method)
1127
+ end
1128
+
1129
+ check_fails("<#{object.inspect}>.nonexistent doesn't exist\n" +
1130
+ "(Class: <Object>)") do
1131
+ assert_alias_method(object, :alias_method, :nonexistent)
1132
+ end
1133
+ end
1134
+
1064
1135
  private
1065
1136
  def add_failure(message, location=caller, options=nil)
1066
1137
  unless @catch_assertions
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.5
4
+ version: 2.0.6
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: 2009-10-18 00:00:00 +09:00
13
+ date: 2010-01-09 00:00:00 +09:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -21,7 +21,7 @@ dependencies:
21
21
  requirements:
22
22
  - - ">="
23
23
  - !ruby/object:Gem::Version
24
- version: 2.3.3
24
+ version: 2.4.0
25
25
  version:
26
26
  description: |-
27
27
  Test::Unit 2.x - Improved version of Test::Unit bundled in