petitest 0.2.1 → 0.3.0

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