test_bench 1.0.1.0 → 1.2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/lib/test_bench.rb +12 -10
  3. data/lib/test_bench/cli.rb +2 -2
  4. data/lib/test_bench/cli/parse_arguments.rb +50 -37
  5. data/lib/test_bench/controls.rb +8 -2
  6. data/lib/test_bench/controls/error.rb +8 -8
  7. data/lib/test_bench/controls/output/batch_data.rb +52 -0
  8. data/lib/test_bench/controls/output/detail_setting.rb +29 -0
  9. data/lib/test_bench/controls/output/exercise.rb +7 -0
  10. data/lib/test_bench/controls/output/log_level.rb +7 -0
  11. data/lib/test_bench/controls/output/newline_character.rb +6 -1
  12. data/lib/test_bench/controls/output/summary/error.rb +5 -21
  13. data/lib/test_bench/controls/output/summary/session.rb +20 -0
  14. data/lib/test_bench/controls/pattern.rb +6 -2
  15. data/lib/test_bench/controls/time.rb +30 -2
  16. data/lib/test_bench/deactivation_variants.rb +0 -10
  17. data/lib/test_bench/fixtures.rb +3 -1
  18. data/lib/test_bench/output.rb +14 -2
  19. data/lib/test_bench/output/batch_data.rb +17 -0
  20. data/lib/test_bench/output/buffer.rb +114 -0
  21. data/lib/test_bench/output/log.rb +27 -0
  22. data/lib/test_bench/output/raw.rb +353 -0
  23. data/lib/test_bench/output/summary.rb +146 -0
  24. data/lib/test_bench/output/summary/session.rb +94 -0
  25. data/lib/test_bench/output/timer/substitute.rb +1 -1
  26. data/lib/test_bench/output/writer.rb +3 -3
  27. data/lib/test_bench/run.rb +9 -9
  28. data/lib/test_bench/test_bench.rb +23 -3
  29. metadata +18 -17
  30. data/lib/test_bench/controls/output/summary/run.rb +0 -59
  31. data/lib/test_bench/output/build.rb +0 -57
  32. data/lib/test_bench/output/levels/debug.rb +0 -229
  33. data/lib/test_bench/output/levels/failure.rb +0 -31
  34. data/lib/test_bench/output/levels/none.rb +0 -13
  35. data/lib/test_bench/output/levels/pass.rb +0 -286
  36. data/lib/test_bench/output/levels/summary.rb +0 -21
  37. data/lib/test_bench/output/summary/error.rb +0 -77
  38. data/lib/test_bench/output/summary/run.rb +0 -102
  39. data/lib/test_bench/output/summary/run/print.rb +0 -98
@@ -0,0 +1,146 @@
1
+ module TestBench
2
+ module Output
3
+ class Summary
4
+ include Fixture::Output
5
+
6
+ include Writer::Dependency
7
+
8
+ def file_count
9
+ @file_count ||= 0
10
+ end
11
+ attr_writer :file_count
12
+
13
+ def test_count
14
+ @test_count ||= 0
15
+ end
16
+ attr_writer :test_count
17
+
18
+ def pass_count
19
+ @pass_count ||= 0
20
+ end
21
+ attr_writer :pass_count
22
+
23
+ def skip_count
24
+ @skip_count ||= 0
25
+ end
26
+ attr_writer :skip_count
27
+
28
+ def failure_count
29
+ @failure_count ||= 0
30
+ end
31
+ attr_writer :failure_count
32
+
33
+ def error_count
34
+ @error_count ||= 0
35
+ end
36
+ attr_writer :error_count
37
+
38
+ def elapsed_time
39
+ @elapsed_time ||= 0
40
+ end
41
+ attr_writer :elapsed_time
42
+
43
+ def timer
44
+ @timer ||= Timer::Substitute.build
45
+ end
46
+ attr_writer :timer
47
+
48
+ def errors_by_file
49
+ @errors_by_file ||= Hash.new do |hash, key|
50
+ hash[key] = []
51
+ end
52
+ end
53
+ attr_writer :errors_by_file
54
+
55
+ attr_accessor :current_file
56
+
57
+ def configure(writer: nil, device: nil, styling: nil)
58
+ Writer.configure(self, writer: writer, device: device, styling: styling)
59
+ Timer.configure(self)
60
+ end
61
+
62
+ def self.build(writer: nil, device: nil, styling: nil)
63
+ instance = new
64
+ instance.configure(writer: writer, device: device, styling: styling)
65
+ instance
66
+ end
67
+
68
+ def enter_file(file)
69
+ timer.start
70
+
71
+ self.current_file = file
72
+ end
73
+
74
+ def exit_file(_, _)
75
+ elapsed_time = timer.stop
76
+
77
+ self.elapsed_time += elapsed_time
78
+
79
+ self.file_count += 1
80
+ end
81
+
82
+ def finish_test(_, result)
83
+ self.test_count += 1
84
+
85
+ if result
86
+ self.pass_count += 1
87
+ else
88
+ self.failure_count += 1
89
+ end
90
+ end
91
+
92
+ def skip_test(_)
93
+ self.skip_count += 1
94
+ end
95
+
96
+ def error(error)
97
+ errors_by_file[current_file] << error
98
+
99
+ self.error_count += 1
100
+ end
101
+
102
+ def finish(_)
103
+ error_summary
104
+
105
+ session_summary
106
+ end
107
+
108
+ def session_summary
109
+ Session.(file_count: file_count, test_count: test_count, pass_count: pass_count, skip_count: skip_count, failure_count: failure_count, error_count: error_count, elapsed_time: elapsed_time, writer: writer)
110
+ end
111
+
112
+ def error_summary
113
+ return if errors_by_file.empty?
114
+
115
+ writer
116
+ .escape_code(:bold)
117
+ .escape_code(:red)
118
+ .text('Error Summary:')
119
+ .escape_code(:reset_intensity)
120
+ .escape_code(:reset_fg)
121
+ .newline
122
+
123
+ errors_by_file.each do |file, errors|
124
+ error_count = errors.count
125
+
126
+ writer
127
+ .text(error_count.to_s.rjust(4, ' '))
128
+ .text(": #{file}")
129
+ .newline
130
+
131
+ errors.each do |error|
132
+ writer
133
+ .text(' ')
134
+ .escape_code(:red)
135
+
136
+ PrintError.error_message(error, writer: writer)
137
+
138
+ writer.escape_code(:reset_fg)
139
+ end
140
+ end
141
+
142
+ writer.newline
143
+ end
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,94 @@
1
+ module TestBench
2
+ module Output
3
+ class Summary
4
+ module Session
5
+ def self.call(file_count: nil, test_count: nil, pass_count: nil, skip_count: nil, failure_count: nil, error_count: nil, elapsed_time: nil, writer: nil)
6
+ file_count ||= 0
7
+ test_count ||= 0
8
+ pass_count ||= 0
9
+ skip_count ||= 0
10
+ failure_count ||= 0
11
+ error_count ||= 0
12
+ elapsed_time ||= 0
13
+ writer ||= Writer.build
14
+
15
+ failed = error_count > 0
16
+
17
+ if elapsed_time.nonzero?
18
+ tests_per_second = test_count / elapsed_time
19
+ end
20
+
21
+ if failed
22
+ writer.escape_code(:red)
23
+ end
24
+
25
+ writer
26
+ .text("Finished running #{numeric_label(file_count, 'file')}")
27
+ .newline
28
+ .text("Ran %s in %.3fs (%.1f tests/second)" % [
29
+ numeric_label(test_count, 'test'),
30
+ elapsed_time,
31
+ tests_per_second || 0])
32
+ .newline
33
+
34
+ if pass_count.nonzero? && !failed
35
+ writer
36
+ .escape_code(:green)
37
+ .text("#{pass_count} passed")
38
+ .escape_code(:reset_fg)
39
+ else
40
+ writer.text("#{pass_count} passed")
41
+ end
42
+
43
+ writer.text(", ")
44
+
45
+ if skip_count.nonzero? && !failed
46
+ writer
47
+ .escape_code(:yellow)
48
+ .text("#{skip_count} skipped")
49
+ .escape_code(:reset_fg)
50
+ else
51
+ writer.text("#{skip_count} skipped")
52
+ end
53
+
54
+ writer.text(", ")
55
+
56
+ if failure_count.nonzero?
57
+ writer
58
+ .escape_code(:bold)
59
+ .text("#{failure_count} failed")
60
+ .escape_code(:reset_intensity)
61
+ else
62
+ writer.text("0 failed")
63
+ end
64
+
65
+ writer.text(", ")
66
+
67
+ if failed
68
+ writer
69
+ .escape_code(:bold)
70
+ .text(numeric_label(error_count, 'total error'))
71
+ .escape_code(:reset_intensity)
72
+ .escape_code(:reset_fg)
73
+ else
74
+ writer.text("0 total errors")
75
+ end
76
+
77
+ 2.times do
78
+ writer.newline
79
+ end
80
+ end
81
+
82
+ def self.numeric_label(number, label, plural_text=nil)
83
+ plural_text ||= 's'
84
+
85
+ if number == 1
86
+ "#{number} #{label}"
87
+ else
88
+ "#{number} #{label}#{plural_text}"
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -8,7 +8,7 @@ module TestBench
8
8
 
9
9
  class Timer < Timer
10
10
  def elapsed_time
11
- @elapsed_time ||= 0
11
+ @elapsed_time ||= 0.0
12
12
  end
13
13
  attr_writer :elapsed_time
14
14
 
@@ -106,7 +106,7 @@ module TestBench
106
106
 
107
107
  def newline
108
108
  sync
109
- device.puts
109
+ device.puts('')
110
110
  self.byte_offset += 1
111
111
  self
112
112
  end
@@ -130,7 +130,7 @@ module TestBench
130
130
  end
131
131
 
132
132
  def self.styling?(device, styling_setting=nil)
133
- styling_setting ||= Defaults.styling_setting
133
+ styling_setting ||= Defaults.styling
134
134
 
135
135
  assure_styling_setting(styling_setting)
136
136
 
@@ -177,7 +177,7 @@ module TestBench
177
177
  $stdout
178
178
  end
179
179
 
180
- def self.styling_setting
180
+ def self.styling
181
181
  styling = ::ENV['TEST_BENCH_OUTPUT_STYLING']
182
182
 
183
183
  if styling.nil?
@@ -3,14 +3,14 @@ module TestBench
3
3
  Error = Class.new(RuntimeError)
4
4
 
5
5
  def session
6
- @session ||= Session::Substitute.build
6
+ @session ||= Fixture::Session::Substitute.build
7
7
  end
8
8
  attr_writer :session
9
9
 
10
- def exclude_file_pattern
11
- @exclude_file_pattern ||= Defaults.exclude_file_pattern
10
+ def exclude_pattern
11
+ @exclude_pattern ||= Defaults.exclude_pattern
12
12
  end
13
- attr_writer :exclude_file_pattern
13
+ attr_writer :exclude_pattern
14
14
 
15
15
  attr_reader :paths
16
16
 
@@ -18,14 +18,14 @@ module TestBench
18
18
  @paths = Array(paths)
19
19
  end
20
20
 
21
- def self.build(*paths, exclude_file_pattern: nil, session: nil, output: nil)
21
+ def self.build(*paths, exclude: nil, session: nil, output: nil)
22
22
  session ||= TestBench.session
23
23
 
24
24
  instance = new(*paths)
25
25
 
26
- instance.exclude_file_pattern = exclude_file_pattern unless exclude_file_pattern.nil?
26
+ instance.exclude_pattern = exclude unless exclude.nil?
27
27
 
28
- Session.configure(instance, session: session)
28
+ Fixture::Session.configure(instance, session: session)
29
29
  instance.session.output = output unless output.nil?
30
30
 
31
31
  instance
@@ -80,7 +80,7 @@ module TestBench
80
80
  glob_pattern = File.join(path, '**/*.rb')
81
81
 
82
82
  Dir[glob_pattern].sort.each do |path|
83
- next if exclude_file_pattern.match?(path)
83
+ next if exclude_pattern.match?(path)
84
84
 
85
85
  file(path)
86
86
  end
@@ -91,7 +91,7 @@ module TestBench
91
91
  end
92
92
 
93
93
  module Defaults
94
- def self.exclude_file_pattern
94
+ def self.exclude_pattern
95
95
  pattern = ENV.fetch('TEST_BENCH_EXCLUDE_FILE_PATTERN') do
96
96
  '_init.rb$'
97
97
  end
@@ -2,7 +2,9 @@ module TestBench
2
2
  def self.session
3
3
  @session ||= build_session.tap do |session|
4
4
  at_exit do
5
- exit 1 if session.failed?
5
+ exit_code = exit_code(session)
6
+
7
+ exit(exit_code) unless exit_code.zero?
6
8
  end
7
9
  end
8
10
  end
@@ -65,7 +67,7 @@ module TestBench
65
67
  end
66
68
 
67
69
  def self.session_error_policy(abort_on_error=nil)
68
- abort_on_error = Session::Defaults.abort_on_error if abort_on_error.nil?
70
+ abort_on_error = Defaults.abort_on_error if abort_on_error.nil?
69
71
 
70
72
  if abort_on_error
71
73
  :abort
@@ -74,11 +76,29 @@ module TestBench
74
76
  end
75
77
  end
76
78
 
79
+ def self.exit_code(session, fail_deactivated_tests: nil)
80
+ if fail_deactivated_tests.nil?
81
+ fail_deactivated_tests = Defaults.fail_deactivated_tests
82
+ end
83
+
84
+ if session.failed?
85
+ 1
86
+ elsif session.skip?
87
+ fail_deactivated_tests ? 2 : 0
88
+ else
89
+ 0
90
+ end
91
+ end
92
+
77
93
  Session = Fixture::Session
78
94
 
79
- module Session::Defaults
95
+ module Defaults
80
96
  def self.abort_on_error
81
97
  Environment::Boolean.fetch('TEST_BENCH_ABORT_ON_ERROR', false)
82
98
  end
99
+
100
+ def self.fail_deactivated_tests
101
+ Environment::Boolean.fetch('TEST_BENCH_FAIL_DEACTIVATED_TESTS', true)
102
+ end
83
103
  end
84
104
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test_bench
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1.0
4
+ version: 1.2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Ladd
8
- autorequire:
8
+ autorequire:
9
9
  bindir: script
10
10
  cert_chain: []
11
- date: 2020-06-11 00:00:00.000000000 Z
11
+ date: 2020-08-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test_bench-fixture
@@ -38,7 +38,7 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- description:
41
+ description:
42
42
  email: nathanladd+github@gmail.com
43
43
  executables:
44
44
  - bench
@@ -55,12 +55,16 @@ files:
55
55
  - lib/test_bench/controls/directory.rb
56
56
  - lib/test_bench/controls/error.rb
57
57
  - lib/test_bench/controls/fixture.rb
58
+ - lib/test_bench/controls/output/batch_data.rb
59
+ - lib/test_bench/controls/output/detail_setting.rb
58
60
  - lib/test_bench/controls/output/escape_code.rb
61
+ - lib/test_bench/controls/output/exercise.rb
62
+ - lib/test_bench/controls/output/log_level.rb
59
63
  - lib/test_bench/controls/output/newline_character.rb
60
64
  - lib/test_bench/controls/output/print_error.rb
61
65
  - lib/test_bench/controls/output/styling.rb
62
66
  - lib/test_bench/controls/output/summary/error.rb
63
- - lib/test_bench/controls/output/summary/run.rb
67
+ - lib/test_bench/controls/output/summary/session.rb
64
68
  - lib/test_bench/controls/path.rb
65
69
  - lib/test_bench/controls/pattern.rb
66
70
  - lib/test_bench/controls/result.rb
@@ -71,16 +75,13 @@ files:
71
75
  - lib/test_bench/fixtures.rb
72
76
  - lib/test_bench/fixtures/configure_receiver.rb
73
77
  - lib/test_bench/output.rb
74
- - lib/test_bench/output/build.rb
75
- - lib/test_bench/output/levels/debug.rb
76
- - lib/test_bench/output/levels/failure.rb
77
- - lib/test_bench/output/levels/none.rb
78
- - lib/test_bench/output/levels/pass.rb
79
- - lib/test_bench/output/levels/summary.rb
78
+ - lib/test_bench/output/batch_data.rb
79
+ - lib/test_bench/output/buffer.rb
80
+ - lib/test_bench/output/log.rb
80
81
  - lib/test_bench/output/print_error.rb
81
- - lib/test_bench/output/summary/error.rb
82
- - lib/test_bench/output/summary/run.rb
83
- - lib/test_bench/output/summary/run/print.rb
82
+ - lib/test_bench/output/raw.rb
83
+ - lib/test_bench/output/summary.rb
84
+ - lib/test_bench/output/summary/session.rb
84
85
  - lib/test_bench/output/timer.rb
85
86
  - lib/test_bench/output/timer/substitute.rb
86
87
  - lib/test_bench/output/writer.rb
@@ -95,7 +96,7 @@ homepage: https://github.com/test-bench/test-bench
95
96
  licenses:
96
97
  - MIT
97
98
  metadata: {}
98
- post_install_message:
99
+ post_install_message:
99
100
  rdoc_options: []
100
101
  require_paths:
101
102
  - lib
@@ -110,8 +111,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
110
111
  - !ruby/object:Gem::Version
111
112
  version: '0'
112
113
  requirements: []
113
- rubygems_version: 3.1.2
114
- signing_key:
114
+ rubygems_version: 3.1.4
115
+ signing_key:
115
116
  specification_version: 4
116
117
  summary: Principled Test Framework for Ruby
117
118
  test_files: []