petitest 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -1
  3. data/README.md +196 -45
  4. data/images/demo.png +0 -0
  5. data/lib/petitest.rb +9 -7
  6. data/lib/petitest/assertion_skip_error.rb +4 -0
  7. data/lib/petitest/autorun.rb +4 -2
  8. data/lib/petitest/dsl.rb +27 -0
  9. data/lib/petitest/subscriber_concerns/time_concern.rb +2 -2
  10. data/lib/petitest/subscribers/base_subscriber.rb +12 -12
  11. data/lib/petitest/subscribers/document_report_subscriber.rb +7 -7
  12. data/lib/petitest/subscribers/json_report_subscriber.rb +13 -13
  13. data/lib/petitest/subscribers/progress_report_subscriber.rb +5 -5
  14. data/lib/petitest/test.rb +142 -0
  15. data/lib/petitest/test_group.rb +35 -125
  16. data/lib/petitest/test_plan.rb +102 -0
  17. data/lib/petitest/{test_case.rb → test_runner.rb} +38 -21
  18. data/lib/petitest/texts/error_message_text.rb +7 -7
  19. data/lib/petitest/texts/failures_element_text.rb +9 -14
  20. data/lib/petitest/texts/failures_text.rb +7 -7
  21. data/lib/petitest/texts/filtered_backtrace_text.rb +6 -6
  22. data/lib/petitest/texts/raised_code_text.rb +7 -7
  23. data/lib/petitest/texts/test_counts_text.rb +26 -26
  24. data/lib/petitest/texts/test_result_character_text.rb +27 -0
  25. data/lib/petitest/texts/test_result_line_text.rb +37 -0
  26. data/lib/petitest/texts/tests_result_margin_top_text.rb +24 -0
  27. data/lib/petitest/texts/{test_cases_result_text.rb → tests_result_text.rb} +14 -12
  28. data/lib/petitest/version.rb +1 -1
  29. metadata +12 -8
  30. data/lib/petitest/test_cases_runner.rb +0 -90
  31. data/lib/petitest/texts/test_case_result_character_text.rb +0 -27
  32. data/lib/petitest/texts/test_case_result_line_text.rb +0 -37
  33. data/lib/petitest/texts/test_cases_result_margin_top_text.rb +0 -24
@@ -1,5 +1,5 @@
1
1
  module Petitest
2
- class TestCase
2
+ class TestRunner
3
3
  # @return [StandardError, nil]
4
4
  attr_accessor :error
5
5
 
@@ -9,22 +9,28 @@ module Petitest
9
9
  # @return [Time, nil]
10
10
  attr_accessor :started_at
11
11
 
12
- # @return [Class]
13
- attr_reader :test_group_class
12
+ # @return [Petitest::Test]
13
+ attr_reader :test
14
14
 
15
- # @return [Petitest::TestMethod]
16
- attr_reader :test_method
15
+ # @return [Petitest::TestGroup]
16
+ attr_reader :test_group
17
+
18
+ # @return [Symbol]
19
+ attr_reader :test_method_name
17
20
 
18
- # @param test_group_class [Class]
19
- # @param test_method [Petitest::TestMethod]
21
+ # @param test [Petitest::Test]
22
+ # @param test_group [Petitest::TestGroup]
23
+ # @param test_method_name [Symbol]
20
24
  def initialize(
21
- test_group_class:,
22
- test_method:
25
+ test:,
26
+ test_group:,
27
+ test_method_name:
23
28
  )
24
29
  @duration = nil
25
30
  @processed = false
26
- @test_group_class = test_group_class
27
- @test_method = test_method
31
+ @test = test
32
+ @test_group = test_group
33
+ @test_method_name = test_method_name
28
34
  end
29
35
 
30
36
  # @return [Array<String>, nil]
@@ -36,13 +42,13 @@ module Petitest
36
42
 
37
43
  # @return [String]
38
44
  def description
39
- @description ||= "##{method_name}"
45
+ test.class.description_by_method_name[test_method_name] || "##{test_method_name}"
40
46
  end
41
47
 
42
48
  # @return [String]
43
49
  def full_description
44
50
  [
45
- test_group_class.full_description,
51
+ test_group.full_description,
46
52
  description,
47
53
  ].join(" ")
48
54
  end
@@ -63,7 +69,7 @@ module Petitest
63
69
 
64
70
  # @return [Boolean]
65
71
  def failed?
66
- processed? && !error.nil?
72
+ processed? && !skipped? && !error.nil?
67
73
  end
68
74
 
69
75
  # @return [Array<String>, nil]
@@ -81,9 +87,14 @@ module Petitest
81
87
  end
82
88
  end
83
89
 
90
+ # @note Override
91
+ def inspect
92
+ "#<#{self.class}>"
93
+ end
94
+
84
95
  # @return [Boolean]
85
96
  def passed?
86
- processed? && error.nil?
97
+ processed? && !skipped? && !failed?
87
98
  end
88
99
 
89
100
  # @return [Boolean]
@@ -93,7 +104,7 @@ module Petitest
93
104
 
94
105
  def run
95
106
  self.started_at = ::Time.now
96
- test_group_class.new.send(test_method.method_name)
107
+ test.send(test_method_name)
97
108
  true
98
109
  rescue => error
99
110
  self.error = error
@@ -103,15 +114,21 @@ module Petitest
103
114
  @processed = true
104
115
  end
105
116
 
106
- # @todo
107
117
  # @return [Boolean]
108
118
  def skipped?
109
- false
119
+ processed? && error.is_a?(::Petitest::AssertionSkipError)
110
120
  end
111
121
 
112
- # @return [String]
113
- def test_signature
114
- [test_group_class, test_method.method_name].join("#")
122
+ # @return [Petitest::TestMethod]
123
+ def test_method
124
+ @test_method ||= begin
125
+ source_location = test.public_method(test_method_name).source_location
126
+ ::Petitest::TestMethod.new(
127
+ line_number: source_location[0],
128
+ method_name: test_method_name,
129
+ path: source_location[1],
130
+ )
131
+ end
115
132
  end
116
133
  end
117
134
  end
@@ -3,19 +3,19 @@ require "petitest/texts/base_text"
3
3
  module Petitest
4
4
  module Texts
5
5
  class ErrorMessageText < ::Petitest::Texts::BaseText
6
- # @return [Petitest::TestCase]
7
- attr_reader :test_case
6
+ # @return [Petitest::Test]
7
+ attr_reader :test
8
8
 
9
- # @param test_case [Petitest::TestCase]
10
- def initialize(test_case:)
11
- @test_case = test_case
9
+ # @param test [Petitest::Test]
10
+ def initialize(test:)
11
+ @test = test
12
12
  end
13
13
 
14
14
  # @note Override
15
15
  def to_s
16
16
  elements = []
17
- elements << test_case.error_class_name unless test_case.error.is_a?(::Petitest::AssertionFailureError)
18
- elements << test_case.error_message unless test_case.error_message.empty?
17
+ elements << test.runner.error_class_name unless test.runner.error.is_a?(::Petitest::AssertionFailureError)
18
+ elements << test.runner.error_message unless test.runner.error_message.empty?
19
19
  string = elements.join("\n")
20
20
  colorize(string, :error)
21
21
  end
@@ -6,14 +6,14 @@ module Petitest
6
6
  # @return [Integer]
7
7
  attr_reader :index
8
8
 
9
- # @return [Petitest::TestCase]
10
- attr_reader :test_case
9
+ # @return [Petitest::Test]
10
+ attr_reader :test
11
11
 
12
12
  # @param index [Integer]
13
- # @param test_case [Petitest::TestCase]
14
- def initialize(index:, test_case:)
13
+ # @param test [Petitest::Test]
14
+ def initialize(index:, test:)
15
15
  @index = index
16
- @test_case = test_case
16
+ @test = test
17
17
  end
18
18
 
19
19
  # @note Override
@@ -29,26 +29,21 @@ module Petitest
29
29
  # @return [String]
30
30
  def body
31
31
  [
32
- ::Petitest::Texts::RaisedCodeText.new(test_case: test_case),
33
- ::Petitest::Texts::ErrorMessageText.new(test_case: test_case),
34
- ::Petitest::Texts::FilteredBacktraceText.new(test_case: test_case),
32
+ ::Petitest::Texts::RaisedCodeText.new(test: test),
33
+ ::Petitest::Texts::ErrorMessageText.new(test: test),
34
+ ::Petitest::Texts::FilteredBacktraceText.new(test: test),
35
35
  ].join("\n")
36
36
  end
37
37
 
38
38
  # @return [String]
39
39
  def heading
40
- "#{ordinal_number}) #{test_signature}"
40
+ "#{ordinal_number}) #{test.class}##{test.runner.test_method_name}"
41
41
  end
42
42
 
43
43
  # @return [Integer]
44
44
  def ordinal_number
45
45
  index + 1
46
46
  end
47
-
48
- # @return [String]
49
- def test_signature
50
- test_case.test_signature
51
- end
52
47
  end
53
48
  end
54
49
  end
@@ -3,12 +3,12 @@ require "petitest/texts/base_text"
3
3
  module Petitest
4
4
  module Texts
5
5
  class FailuresText < ::Petitest::Texts::BaseText
6
- # @return [Array<Petitest::TestCase>]
7
- attr_reader :test_cases
6
+ # @return [Array<Petitest::Test>]
7
+ attr_reader :tests
8
8
 
9
- # @param test_cases [Array<Petitest::TestCase>]
10
- def initialize(test_cases:)
11
- @test_cases = test_cases
9
+ # @param tests [Array<Petitest::Test>]
10
+ def initialize(tests:)
11
+ @tests = tests
12
12
  end
13
13
 
14
14
  # @note Override
@@ -28,10 +28,10 @@ module Petitest
28
28
 
29
29
  # @return [Array<Petitest::Textx::FailuresElementText>]
30
30
  def failures_element_texts
31
- test_cases.map.with_index do |test_case, index|
31
+ tests.map.with_index do |test, index|
32
32
  ::Petitest::Texts::FailuresElementText.new(
33
33
  index: index,
34
- test_case: test_case,
34
+ test: test,
35
35
  )
36
36
  end
37
37
  end
@@ -3,17 +3,17 @@ require "petitest/texts/base_text"
3
3
  module Petitest
4
4
  module Texts
5
5
  class FilteredBacktraceText < ::Petitest::Texts::BaseText
6
- # @return [Petitest::TestCase]
7
- attr_reader :test_case
6
+ # @return [Petitest::Test]
7
+ attr_reader :test
8
8
 
9
- # @param test_case [Petitest::TestCase]
10
- def initialize(test_case:)
11
- @test_case = test_case
9
+ # @param test [Petitest::Test]
10
+ def initialize(test:)
11
+ @test = test
12
12
  end
13
13
 
14
14
  # @note Override
15
15
  def to_s
16
- colorize(test_case.filtered_backtrace.join("\n").gsub(/^/, "# "), :detail)
16
+ colorize(test.runner.filtered_backtrace.join("\n").gsub(/^/, "# "), :detail)
17
17
  end
18
18
  end
19
19
  end
@@ -3,12 +3,12 @@ require "petitest/texts/base_text"
3
3
  module Petitest
4
4
  module Texts
5
5
  class RaisedCodeText < ::Petitest::Texts::BaseText
6
- # @return [Petitest::TestCase]
7
- attr_reader :test_case
6
+ # @return [Petitest::Test]
7
+ attr_reader :test
8
8
 
9
- # @param test_case [Petitest::TestCase]
10
- def initialize(test_case:)
11
- @test_case = test_case
9
+ # @param test [Petitest::Test]
10
+ def initialize(test:)
11
+ @test = test
12
12
  end
13
13
 
14
14
  # @note Override
@@ -44,8 +44,8 @@ module Petitest
44
44
  # @return [Array<String>]
45
45
  def caller_segments
46
46
  @caller_segments ||= begin
47
- if test_case.filtered_backtrace[0]
48
- test_case.filtered_backtrace[0].split(":", 3)
47
+ if test.runner.filtered_backtrace[0]
48
+ test.runner.filtered_backtrace[0].split(":", 3)
49
49
  else
50
50
  []
51
51
  end
@@ -3,12 +3,12 @@ require "petitest/texts/base_text"
3
3
  module Petitest
4
4
  module Texts
5
5
  class TestCountsText < ::Petitest::Texts::BaseText
6
- # @return [Array<Petitest::TestCase>]
7
- attr_reader :test_cases
6
+ # @return [Array<Petitest::Test>]
7
+ attr_reader :tests
8
8
 
9
- # @param test_cases [Array<Petitest::TestCase>]
10
- def initialize(test_cases:)
11
- @test_cases = test_cases
9
+ # @param tests [Array<Petitest::Test>]
10
+ def initialize(tests:)
11
+ @tests = tests
12
12
  end
13
13
 
14
14
  # @note Override
@@ -24,31 +24,31 @@ module Petitest
24
24
  # @return [String]
25
25
  def body
26
26
  [
27
- text_of_count_of_test_cases,
28
- text_of_count_of_passed_test_cases,
29
- text_of_count_of_failed_test_cases,
30
- text_of_count_of_skipped_test_cases,
27
+ text_of_count_of_tests,
28
+ text_of_count_of_passed_tests,
29
+ text_of_count_of_failed_tests,
30
+ text_of_count_of_skipped_tests,
31
31
  ].join("\n")
32
32
  end
33
33
 
34
34
  # @return [Integer]
35
- def count_of_failed_test_cases
36
- test_cases.select(&:failed?).length
35
+ def count_of_failed_tests
36
+ tests.map(&:runner).select(&:failed?).length
37
37
  end
38
38
 
39
39
  # @return [Integer]
40
- def count_of_passed_test_cases
41
- test_cases.select(&:passed?).length
40
+ def count_of_passed_tests
41
+ tests.map(&:runner).select(&:passed?).length
42
42
  end
43
43
 
44
44
  # @return [Integer]
45
- def count_of_skipped_test_cases
46
- test_cases.select(&:skipped?).length
45
+ def count_of_skipped_tests
46
+ tests.map(&:runner).select(&:skipped?).length
47
47
  end
48
48
 
49
49
  # @return [Integer]
50
- def count_of_test_cases
51
- test_cases.length
50
+ def count_of_tests
51
+ tests.length
52
52
  end
53
53
 
54
54
  # @return [String]
@@ -58,27 +58,27 @@ module Petitest
58
58
 
59
59
  # @return [Integer]
60
60
  def max_digits_length
61
- @max_digits_length ||= count_of_test_cases.to_s.length
61
+ @max_digits_length ||= count_of_tests.to_s.length
62
62
  end
63
63
 
64
64
  # @return [String]
65
- def text_of_count_of_failed_test_cases
66
- colorize("%#{max_digits_length}d failures" % count_of_failed_test_cases, :error)
65
+ def text_of_count_of_failed_tests
66
+ colorize("%#{max_digits_length}d failures" % count_of_failed_tests, :error)
67
67
  end
68
68
 
69
69
  # @return [String]
70
- def text_of_count_of_passed_test_cases
71
- colorize("%#{max_digits_length}d passes" % count_of_passed_test_cases, :pass)
70
+ def text_of_count_of_passed_tests
71
+ colorize("%#{max_digits_length}d passes" % count_of_passed_tests, :pass)
72
72
  end
73
73
 
74
74
  # @return [String]
75
- def text_of_count_of_skipped_test_cases
76
- colorize("%#{max_digits_length}d skips" % count_of_skipped_test_cases, :skip)
75
+ def text_of_count_of_skipped_tests
76
+ colorize("%#{max_digits_length}d skips" % count_of_skipped_tests, :skip)
77
77
  end
78
78
 
79
79
  # @return [String]
80
- def text_of_count_of_test_cases
81
- "%#{max_digits_length}d tests" % count_of_test_cases
80
+ def text_of_count_of_tests
81
+ "%#{max_digits_length}d tests" % count_of_tests
82
82
  end
83
83
  end
84
84
  end
@@ -0,0 +1,27 @@
1
+ require "petitest/texts/base_text"
2
+
3
+ module Petitest
4
+ module Texts
5
+ class TestResultCharacterText < ::Petitest::Texts::BaseText
6
+ # @return [Petitest::Test]
7
+ attr_reader :test
8
+
9
+ # @param test [Petitest::Test]
10
+ def initialize(test:)
11
+ @test = test
12
+ end
13
+
14
+ # @note Override
15
+ def to_s
16
+ case
17
+ when test.runner.failed?
18
+ colorize("F", :error)
19
+ when test.runner.skipped?
20
+ colorize("*", :skip)
21
+ else
22
+ "."
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,37 @@
1
+ require "petitest/texts/base_text"
2
+
3
+ module Petitest
4
+ module Texts
5
+ class TestResultLineText < ::Petitest::Texts::BaseText
6
+ # @return [Petitest::Test]
7
+ attr_reader :test
8
+
9
+ # @param test [Petitest::Test]
10
+ def initialize(test:)
11
+ @test = test
12
+ end
13
+
14
+ # @note Override
15
+ def to_s
16
+ indent(
17
+ colorize("##{test.runner.test_method_name}", color_type),
18
+ 2 * (test.runner.test_group.nest_level + 1),
19
+ )
20
+ end
21
+
22
+ private
23
+
24
+ # @return [Symbol]
25
+ def color_type
26
+ case
27
+ when test.runner.failed?
28
+ :error
29
+ when test.runner.skipped?
30
+ :skip
31
+ else
32
+ :pass
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end