test-unit 2.5.1 → 2.5.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.
@@ -80,7 +80,7 @@ module Test
80
80
  end
81
81
 
82
82
  def empty?
83
- tests.empty?
83
+ size.zero?
84
84
  end
85
85
 
86
86
  # Overridden to return the name given the suite at
@@ -8,6 +8,7 @@
8
8
 
9
9
  require 'test/unit/color-scheme'
10
10
  require 'test/unit/code-snippet-fetcher'
11
+ require 'test/unit/fault-location-detector'
11
12
  require 'test/unit/diff'
12
13
  require 'test/unit/ui/testrunner'
13
14
  require 'test/unit/ui/testrunnermediator'
@@ -47,6 +48,7 @@ module Test
47
48
  @current_output_level = NORMAL
48
49
  @faults = []
49
50
  @code_snippet_fetcher = CodeSnippetFetcher.new
51
+ @test_suites = []
50
52
  end
51
53
 
52
54
  private
@@ -202,6 +204,7 @@ module Test
202
204
 
203
205
  def output_fault_backtrace(fault)
204
206
  snippet_is_shown = false
207
+ detector = FaultLocationDetector.new(fault, @code_snippet_fetcher)
205
208
  backtrace = fault.location
206
209
  # workaround for test-spec. :<
207
210
  # see also GitHub:#22
@@ -209,14 +212,14 @@ module Test
209
212
  backtrace.each_with_index do |entry, i|
210
213
  output(entry)
211
214
  next if snippet_is_shown
212
- snippet_is_shown = output_code_snippet(entry, fault_color(fault))
215
+ next unless detector.target?(entry)
216
+ file, line_number, = detector.split_backtrace_entry(entry)
217
+ snippet_is_shown = output_code_snippet(file, line_number,
218
+ fault_color(fault))
213
219
  end
214
220
  end
215
221
 
216
- def output_code_snippet(entry, target_line_color=nil)
217
- return false unless /\A(.*):(\d+)/ =~ entry
218
- file = $1
219
- line_number = $2.to_i
222
+ def output_code_snippet(file, line_number, target_line_color=nil)
220
223
  lines = @code_snippet_fetcher.fetch(file, line_number)
221
224
  return false if lines.empty?
222
225
 
@@ -333,6 +336,8 @@ module Test
333
336
  end
334
337
 
335
338
  def test_suite_started(suite)
339
+ last_test_suite = @test_suites.last
340
+ @test_suites << suite
336
341
  if @top_level
337
342
  @top_level = false
338
343
  return
@@ -344,13 +349,16 @@ module Test
344
349
  else
345
350
  _color = color("case")
346
351
  end
347
- output_single(suite.name, _color, VERBOSE)
352
+ prefix = "#{last_test_suite.name}::"
353
+ suite_name = suite.name.sub(/\A#{Regexp.escape(prefix)}/, "")
354
+ output_single(suite_name, _color, VERBOSE)
348
355
  output(": ", nil, VERBOSE)
349
356
  @indent += 2
350
357
  end
351
358
 
352
359
  def test_suite_finished(suite)
353
360
  @indent -= 2
361
+ @test_suites.pop
354
362
  end
355
363
 
356
364
  def indent
@@ -34,6 +34,7 @@ module Test
34
34
 
35
35
  result = create_result
36
36
 
37
+ Test::Unit.run_at_start_hooks
37
38
  start_time = Time.now
38
39
  begin
39
40
  with_listener(result) do
@@ -46,10 +47,27 @@ module Test
46
47
  elapsed_time = Time.now - start_time
47
48
  notify_listeners(FINISHED, elapsed_time)
48
49
  end
50
+ Test::Unit.run_at_exit_hooks
49
51
 
50
52
  result
51
53
  end
52
54
 
55
+ # Just for backward compatibility for NetBeans.
56
+ # NetBeans should not use monkey patching. NetBeans
57
+ # should use runner change public API.
58
+ #
59
+ # See GitHub#38
60
+ # https://github.com/test-unit/test-unit/issues/38
61
+ def run_suite(result=nil)
62
+ if result.nil?
63
+ run
64
+ else
65
+ @suite.run(result) do |channel, value|
66
+ notify_listeners(channel, value)
67
+ end
68
+ end
69
+ end
70
+
53
71
  private
54
72
  # A factory method to create the result the mediator
55
73
  # should run with. Can be overridden by subclasses if
@@ -88,12 +106,6 @@ module Test
88
106
  pass_assertion_listener)
89
107
  end
90
108
  end
91
-
92
- def run_suite(result)
93
- @suite.run(result) do |channel, value|
94
- notify_listeners(channel, value)
95
- end
96
- end
97
109
  end
98
110
  end
99
111
  end
@@ -24,7 +24,7 @@ module Test
24
24
  end
25
25
 
26
26
  jruby_internal_p = lambda do |entry|
27
- (/\Aorg\/jruby\// =~ entry) ? true : false
27
+ entry.start_with?("org/jruby/")
28
28
  end
29
29
 
30
30
  found_prefix = false
@@ -1,5 +1,5 @@
1
1
  module Test
2
2
  module Unit
3
- VERSION = '2.5.1'
3
+ VERSION = '2.5.2'
4
4
  end
5
5
  end
@@ -54,28 +54,35 @@ class TestUnitColorScheme < Test::Unit::TestCase
54
54
  end
55
55
 
56
56
  def test_default
57
- assert_equal({
58
- "pass" => color("green", :foreground => false) +
59
- color("white", :bold => true),
60
- "failure" => color("red", :foreground => false) +
61
- color("white", :bold => true),
62
- "pending" => color("magenta", :bold => true),
63
- "omission" => color("blue", :bold => true),
64
- "notification" => color("cyan", :bold => true),
65
- "error" => color("yellow", :bold => true) +
66
- color("black", :foreground => false),
67
- "case" => color("white", :bold => true) +
68
- color("blue", :foreground => false),
69
- "suite" => color("white", :bold => true) +
70
- color("green", :foreground => false),
71
- "diff-inserted-tag" => color("red", :bold => true),
72
- "diff-deleted-tag" => color("green", :bold => true),
73
- "diff-difference-tag" => color("cyan", :bold => true),
74
- "diff-inserted" => color("red", :foreground => false) +
75
- color("white", :bold => true),
76
- "diff-deleted" => color("green", :foreground => false) +
77
- color("white", :bold => true),
78
- },
57
+ expected_schema = {
58
+ "pass" => color("green", :background => true) +
59
+ color("white", :bold => true),
60
+ "failure" => color("red", :background => true) +
61
+ color("white", :bold => true),
62
+ "pending" => color("magenta", :background => true) +
63
+ color("white", :bold => true),
64
+ "omission" => color("blue", :background => true) +
65
+ color("white", :bold => true),
66
+ "notification" => color("cyan", :background => true) +
67
+ color("white", :bold => true),
68
+ "error" => color("black", :background => true) +
69
+ color("yellow", :bold => true),
70
+ "case" => color("blue", :background => true) +
71
+ color("white", :bold => true),
72
+ "suite" => color("green", :background => true) +
73
+ color("white", :bold => true),
74
+ "diff-inserted-tag" => color("red", :background => true) +
75
+ color("black", :bold => true),
76
+ "diff-deleted-tag" => color("green", :background => true) +
77
+ color("black", :bold => true),
78
+ "diff-difference-tag" => color("cyan", :background => true) +
79
+ color("white", :bold => true),
80
+ "diff-inserted" => color("red", :background => true) +
81
+ color("white", :bold => true),
82
+ "diff-deleted" => color("green", :background => true) +
83
+ color("white", :bold => true),
84
+ }
85
+ assert_equal(expected_schema,
79
86
  Test::Unit::ColorScheme.default.to_hash)
80
87
  end
81
88
  end
@@ -3,7 +3,7 @@ class TestUnitColor < Test::Unit::TestCase
3
3
  assert_escape_sequence(["31"], color("red"))
4
4
  assert_escape_sequence(["32", "1"], color("green", :bold => true))
5
5
  assert_escape_sequence(["0"], color("reset"))
6
- assert_escape_sequence(["45"], color("magenta", :foreground => false))
6
+ assert_escape_sequence(["45"], color("magenta", :background => true))
7
7
  end
8
8
 
9
9
  def test_mix_color_escape_sequence
@@ -0,0 +1,125 @@
1
+ # Copyright (C) 2012 Kouhei Sutou <kou@clear-code.com>
2
+ #
3
+ # License: Ruby's
4
+
5
+ require "test-unit"
6
+ require "test/unit/fault-location-detector"
7
+ require "testunit-test-util"
8
+
9
+ class TestFaultLocationDetector < Test::Unit::TestCase
10
+ include TestUnitTestUtil
11
+
12
+ def setup
13
+ @fetcher = Test::Unit::CodeSnippetFetcher.new
14
+ end
15
+
16
+ private
17
+ def run_test_case(test_case)
18
+ suite = test_case.suite
19
+ result = Test::Unit::TestResult.new
20
+ suite.run(result) {}
21
+ result.faults[0]
22
+ end
23
+
24
+ def assert_detect(fault, target_line_number)
25
+ detector = Test::Unit::FaultLocationDetector.new(fault, @fetcher)
26
+
27
+ expected = fault.location.collect do |backtrace_entry|
28
+ _, line_number, = detector.split_backtrace_entry(backtrace_entry)
29
+ [backtrace_entry, target_line_number == line_number]
30
+ end
31
+ actual = fault.location.collect do |backtrace_entry|
32
+ [backtrace_entry, detector.target?(backtrace_entry)]
33
+ end
34
+ assert_equal(expected, actual)
35
+ end
36
+
37
+ module AlwaysFailAssertion
38
+ private
39
+ def assert_always_failed
40
+ assert_true(false)
41
+ end
42
+ end
43
+
44
+ class TestSourceLocation < self
45
+ setup
46
+ def setup_check_source_location
47
+ unless lambda {}.respond_to?(:source_location)
48
+ omit("Need Proc#source_location")
49
+ end
50
+ end
51
+
52
+ def test_detected
53
+ target_line_number = nil
54
+ test_case = Class.new(Test::Unit::TestCase) do
55
+ include AlwaysFailAssertion
56
+
57
+ test "failed" do
58
+ target_line_number = __LINE__; assert_always_failed
59
+ end
60
+ end
61
+
62
+ fault = run_test_case(test_case)
63
+ assert_detect(fault, target_line_number)
64
+ end
65
+
66
+ class TestOneLine < self
67
+ def test_brace
68
+ target_line_number = nil
69
+ test_case = Class.new(Test::Unit::TestCase) do
70
+ include AlwaysFailAssertion
71
+
72
+ test("failed") {target_line_number = __LINE__; assert_always_failed}
73
+
74
+ def other_method
75
+ # body
76
+ end
77
+ end
78
+
79
+ fault = run_test_case(test_case)
80
+ assert_detect(fault, target_line_number)
81
+ end
82
+
83
+ def test_do_end
84
+ target_line_number = nil
85
+ test_case = Class.new(Test::Unit::TestCase) do
86
+ include AlwaysFailAssertion
87
+
88
+ test "failed" do target_line_number = __LINE__; assert_always_failed; end
89
+
90
+ def other_method
91
+ # body
92
+ end
93
+ end
94
+
95
+ fault = run_test_case(test_case)
96
+ assert_detect(fault, target_line_number)
97
+ end
98
+ end
99
+ end
100
+
101
+ class TestMethodName < self
102
+ def test_detected
103
+ test_case = Class.new(Test::Unit::TestCase) do
104
+ include AlwaysFailAssertion
105
+
106
+ class << self
107
+ def target_line_number
108
+ @@target_line_number
109
+ end
110
+
111
+ def target_line_number=(line_number)
112
+ @@target_line_number = line_number
113
+ end
114
+ end
115
+
116
+ def test_failed
117
+ self.class.target_line_number = __LINE__; assert_always_failed
118
+ end
119
+ end
120
+
121
+ fault = run_test_case(test_case)
122
+ assert_detect(fault, test_case.target_line_number)
123
+ end
124
+ end
125
+ end
@@ -1,5 +1,7 @@
1
1
  # Author:: Nathaniel Talbott.
2
- # Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
2
+ # Copyright:: Copyright (c) 2008-2012 Kouhei Sutou <kou@clear-code.com>
3
+ # Copyright:: Copyright (c) 2011 Haruka Yoshihara <yoshihara@clear-code.com>
4
+ # Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott
3
5
  # License:: Ruby license.
4
6
 
5
7
  require 'test/unit'
@@ -46,7 +48,7 @@ module Test
46
48
  "TC_FailureError"
47
49
  end
48
50
  end
49
-
51
+
50
52
  def test_add_failed_assertion
51
53
  test_case = @tc_failure_error.new(:test_failure)
52
54
  check("passed? should start out true", test_case.return_passed?)
@@ -585,6 +587,158 @@ module Test
585
587
  add_assertion
586
588
  raise AssertionFailedError.new(message) unless passed
587
589
  end
590
+
591
+ class TestTestDefined < self
592
+ class TestNoQuery < self
593
+ def test_have_test
594
+ test_case = Class.new(TestCase) do
595
+ def test_nothing
596
+ end
597
+ end
598
+ assert_true(test_case.test_defined?({}))
599
+ end
600
+
601
+ def test_no_test
602
+ test_case = Class.new(TestCase) do
603
+ end
604
+ assert_false(test_case.test_defined?({}))
605
+ end
606
+ end
607
+
608
+ class TestPath < self
609
+ def test_base_name
610
+ test_case = Class.new(TestCase) do
611
+ def test_nothing
612
+ end
613
+ end
614
+ base_name = File.basename(__FILE__)
615
+ assert_true(test_case.test_defined?(:path => base_name))
616
+ end
617
+
618
+ def test_absolute_path
619
+ test_case = Class.new(TestCase) do
620
+ def test_nothing
621
+ end
622
+ end
623
+ assert_true(test_case.test_defined?(:path => __FILE__))
624
+ end
625
+
626
+ def test_not_match
627
+ test_case = Class.new(TestCase) do
628
+ def test_nothing
629
+ end
630
+ end
631
+ assert_false(test_case.test_defined?(:path => "nonexistent.rb"))
632
+ end
633
+ end
634
+
635
+ class TestLine < self
636
+ def test_before
637
+ line_before = nil
638
+ test_case = Class.new(TestCase) do
639
+ line_before = __LINE__
640
+ def test_nothing
641
+ end
642
+ end
643
+ assert_false(test_case.test_defined?(:line => line_before))
644
+ end
645
+
646
+ def test_def
647
+ line_def = nil
648
+ test_case = Class.new(TestCase) do
649
+ line_def = __LINE__; def test_nothing
650
+ end
651
+ end
652
+ assert_true(test_case.test_defined?(:line => line_def))
653
+ end
654
+
655
+ def test_after
656
+ line_after = nil
657
+ test_case = Class.new(TestCase) do
658
+ def test_nothing
659
+ end
660
+ line_after = __LINE__
661
+ end
662
+ assert_true(test_case.test_defined?(:line => line_after))
663
+ end
664
+ end
665
+
666
+ class TestMethodName < self
667
+ def test_match
668
+ test_case = Class.new(TestCase) do
669
+ def test_nothing
670
+ end
671
+ end
672
+ assert_true(test_case.test_defined?(:method_name => "test_nothing"))
673
+ end
674
+
675
+ def test_not_match
676
+ test_case = Class.new(TestCase) do
677
+ def test_nothing
678
+ end
679
+ end
680
+ query = {:method_name => "test_nonexistent"}
681
+ assert_false(test_case.test_defined?(query))
682
+ end
683
+ end
684
+
685
+ class TestCombine < self
686
+ def test_line_middle
687
+ line_middle = nil
688
+ test_case = Class.new(TestCase) do
689
+ def test_before
690
+ end
691
+ line_middle = __LINE__
692
+ def test_after
693
+ end
694
+ end
695
+ query = {
696
+ :path => __FILE__,
697
+ :line => line_middle,
698
+ :method_name => "test_before",
699
+ }
700
+ assert_true(test_case.test_defined?(query))
701
+ end
702
+
703
+ def test_line_after_def
704
+ line_after_def = nil
705
+ test_case = Class.new(TestCase) do
706
+ def test_before
707
+ end
708
+
709
+ line_after_def = __LINE__; def test_after
710
+ end
711
+ end
712
+ query = {
713
+ :path => __FILE__,
714
+ :line => line_after_def,
715
+ :method_name => "test_before",
716
+ }
717
+ assert_false(test_case.test_defined?(query))
718
+ end
719
+ end
720
+ end
721
+
722
+ class TestSubTestCase < self
723
+ def test_name
724
+ test_case = Class.new(TestCase)
725
+ sub_test_case = test_case.sub_test_case("sub test case") do
726
+ end
727
+ assert_equal("sub test case", sub_test_case.name)
728
+ end
729
+
730
+ def test_suite
731
+ test_case = Class.new(TestCase)
732
+ sub_test_case = test_case.sub_test_case("sub test case") do
733
+ def test_nothing
734
+ end
735
+ end
736
+ test_method_names = sub_test_case.suite.tests.collect do |test|
737
+ test.method_name
738
+ end
739
+ assert_equal(["test_nothing"], test_method_names)
740
+ end
741
+ end
588
742
  end
589
743
  end
590
744
  end