test_bench_legacy 1.3.5

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 (50) hide show
  1. checksums.yaml +7 -0
  2. data/bin/bench +10 -0
  3. data/lib/test_bench.rb +37 -0
  4. data/lib/test_bench/activate.rb +3 -0
  5. data/lib/test_bench/assert.rb +58 -0
  6. data/lib/test_bench/assert/failed.rb +25 -0
  7. data/lib/test_bench/assert/proc.rb +24 -0
  8. data/lib/test_bench/assert/refute.rb +9 -0
  9. data/lib/test_bench/cli.rb +4 -0
  10. data/lib/test_bench/cli/cli.rb +108 -0
  11. data/lib/test_bench/controls.rb +16 -0
  12. data/lib/test_bench/controls/binding.rb +17 -0
  13. data/lib/test_bench/controls/clock/elapsed.rb +41 -0
  14. data/lib/test_bench/controls/clock/reference.rb +15 -0
  15. data/lib/test_bench/controls/dir_substitute.rb +58 -0
  16. data/lib/test_bench/controls/error.rb +63 -0
  17. data/lib/test_bench/controls/executor/substitute.rb +27 -0
  18. data/lib/test_bench/controls/expand_path.rb +23 -0
  19. data/lib/test_bench/controls/fixture.rb +36 -0
  20. data/lib/test_bench/controls/kernel_substitute.rb +72 -0
  21. data/lib/test_bench/controls/output.rb +106 -0
  22. data/lib/test_bench/controls/path.rb +11 -0
  23. data/lib/test_bench/controls/result.rb +64 -0
  24. data/lib/test_bench/controls/telemetry.rb +23 -0
  25. data/lib/test_bench/controls/test_script.rb +23 -0
  26. data/lib/test_bench/executor.rb +45 -0
  27. data/lib/test_bench/expand_path.rb +44 -0
  28. data/lib/test_bench/fixture.rb +17 -0
  29. data/lib/test_bench/output.rb +169 -0
  30. data/lib/test_bench/output/assertions.rb +43 -0
  31. data/lib/test_bench/output/palette.rb +59 -0
  32. data/lib/test_bench/output/writer.rb +94 -0
  33. data/lib/test_bench/output/writer/assertions.rb +29 -0
  34. data/lib/test_bench/output/writer/assertions/line.rb +76 -0
  35. data/lib/test_bench/registry.rb +32 -0
  36. data/lib/test_bench/result.rb +71 -0
  37. data/lib/test_bench/result/assertions.rb +11 -0
  38. data/lib/test_bench/result/null.rb +12 -0
  39. data/lib/test_bench/runner.rb +59 -0
  40. data/lib/test_bench/settings.rb +62 -0
  41. data/lib/test_bench/settings/defaults.rb +29 -0
  42. data/lib/test_bench/settings/environment.rb +124 -0
  43. data/lib/test_bench/settings/registry.rb +17 -0
  44. data/lib/test_bench/structure.rb +89 -0
  45. data/lib/test_bench/telemetry.rb +130 -0
  46. data/lib/test_bench/telemetry/assertions.rb +85 -0
  47. data/lib/test_bench/telemetry/registry.rb +17 -0
  48. data/lib/test_bench/telemetry/subscription.rb +23 -0
  49. data/lib/test_bench/test_bench.rb +33 -0
  50. metadata +94 -0
@@ -0,0 +1,29 @@
1
+ module TestBench
2
+ class Output
3
+ class Writer
4
+ module Assertions
5
+ def raw_text
6
+ device.rewind
7
+ device.read
8
+ end
9
+
10
+ def wrote? expected_prose
11
+ raw_text == expected_prose
12
+ end
13
+
14
+ def wrote_line? *arguments
15
+ raw_text.each_line.any? do |line_text|
16
+ line = Line.parse line_text
17
+ return true if line.(*arguments)
18
+ end
19
+
20
+ false
21
+ end
22
+
23
+ def wrote_nothing?
24
+ raw_text.empty?
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,76 @@
1
+ module TestBench
2
+ class Output
3
+ class Writer
4
+ module Assertions
5
+ class Line
6
+ IgnoreParameter = Object.new
7
+
8
+ attr_reader :match
9
+
10
+ def initialize match
11
+ @match = match
12
+ end
13
+
14
+ def self.parse line
15
+ match = Pattern.match line
16
+ new match
17
+ end
18
+
19
+ def call expected_prose, bg: IgnoreParameter, fg: IgnoreParameter, indentation: IgnoreParameter
20
+ return unless match
21
+
22
+ return unless prose? expected_prose
23
+ return unless foreground_color? fg unless fg == IgnoreParameter
24
+ return unless background_color? bg unless bg == IgnoreParameter
25
+ return unless indentation? indentation unless indentation == IgnoreParameter
26
+
27
+ true
28
+ end
29
+
30
+ def background_color? bg
31
+ if bg.nil?
32
+ match['bg'].nil?
33
+ else
34
+ _, code = Palette.get bg
35
+ match['bg'].to_i == code + 40
36
+ end
37
+ end
38
+
39
+ def foreground_color? fg
40
+ if fg.nil?
41
+ match['fg'].nil? and match['brightness'].nil?
42
+ else
43
+ brightness, code = Palette.get fg
44
+ match['fg'].to_i == code + 30 and
45
+ match['brightness'].to_i == brightness
46
+ end
47
+ end
48
+
49
+ def indentation? indentation
50
+ match['indentation'].to_s == ' ' * indentation
51
+ end
52
+
53
+ def prose? expected_prose
54
+ match['prose'] == expected_prose
55
+ end
56
+
57
+ Pattern = %r{
58
+ \A
59
+ (?<indentation>[[:space:]]{2})*
60
+ (?<color>
61
+ \e\[
62
+ (?:(?<brightness>[01])|(?<fg>3[0-7])|(?<bg>4[0-7]))
63
+ (?:
64
+ ;(?:(?<brightness>[01])|(?<fg>3[0-7])|(?<bg>4[0-7]))
65
+ ){0,2}
66
+ m
67
+ )?
68
+ (?<prose>[^\e\n]+)
69
+ (?:\e\[0m)?
70
+ \Z
71
+ }x
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,32 @@
1
+ module TestBench
2
+ class Registry
3
+ attr_reader :factory
4
+
5
+ def initialize factory
6
+ @factory = factory
7
+ end
8
+
9
+ def self.build &block
10
+ factory = block
11
+ new factory
12
+ end
13
+
14
+ def key binding
15
+ binding.receiver.object_id
16
+ end
17
+
18
+ def get binding
19
+ key = self.key binding
20
+ table[key] ||= factory.()
21
+ end
22
+
23
+ def set binding, value
24
+ key = self.key binding
25
+ table[key] = value
26
+ end
27
+
28
+ def table
29
+ @table ||= {}
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,71 @@
1
+ module TestBench
2
+ class Result < Struct.new :files, :passes, :failures, :skips, :assertions, :errors, :start_time, :stop_time
3
+ attr_writer :clock
4
+
5
+ def self.build
6
+ instance = new [], 0, 0, 0, 0, 0
7
+ instance.started
8
+ instance
9
+ end
10
+
11
+ def asserted
12
+ self.assertions += 1
13
+ end
14
+
15
+ def clock
16
+ @clock ||= Time
17
+ end
18
+
19
+ def elapsed_time
20
+ stop_time - start_time
21
+ end
22
+
23
+ def error_raised error
24
+ self.errors += 1
25
+ end
26
+
27
+ def failed?
28
+ not passed?
29
+ end
30
+
31
+ def file_finished file
32
+ files << file
33
+ end
34
+
35
+ def finished
36
+ self.stop_time ||= clock.now
37
+ end
38
+ alias_method :run_finished, :finished
39
+
40
+ def passed?
41
+ failures.zero? and errors.zero?
42
+ end
43
+
44
+ def started
45
+ self.start_time = clock.now
46
+ end
47
+ alias_method :run_started, :started
48
+
49
+ def test_failed prose
50
+ self.failures += 1
51
+ end
52
+
53
+ def test_passed prose
54
+ self.passes += 1
55
+ end
56
+
57
+ def test_skipped prose
58
+ self.skips += 1
59
+ end
60
+
61
+ def tests
62
+ failures + passes + skips
63
+ end
64
+
65
+ def tests_per_second
66
+ elapsed_time = self.elapsed_time
67
+ elapsed_time = elapsed_time.next_float if elapsed_time.zero?
68
+ Rational tests, elapsed_time
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,11 @@
1
+ module TestBench
2
+ class Result
3
+ module Assertions
4
+ def executed? *control_files
5
+ control_files.all? do |control_file|
6
+ files.include? control_file
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ module TestBench
2
+ class Result
3
+ module Null
4
+ def self.method_missing *;
5
+ end
6
+
7
+ def self.respond_to? _
8
+ true
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,59 @@
1
+ module TestBench
2
+ class Runner
3
+ attr_writer :executor
4
+ attr_writer :expand_path
5
+ attr_reader :paths
6
+ attr_reader :telemetry
7
+
8
+ def initialize paths, telemetry
9
+ @paths = paths
10
+ @telemetry = telemetry
11
+ end
12
+
13
+ def self.build paths, root_directory, exclude_pattern: nil
14
+ telemetry = Telemetry::Registry.get TOPLEVEL_BINDING
15
+
16
+ instance = new paths, telemetry
17
+ instance.executor = Executor.build
18
+ instance.expand_path = ExpandPath.build root_directory, exclude_pattern
19
+ instance
20
+ end
21
+
22
+ def self.call paths, root_directory=nil, exclude_pattern: nil
23
+ paths = Array paths
24
+ root_directory ||= File.dirname caller_locations[0].path
25
+
26
+ instance = build paths, root_directory, :exclude_pattern => exclude_pattern
27
+ instance.()
28
+ end
29
+
30
+ def call
31
+ telemetry.run_started
32
+
33
+ files = gather_files
34
+ execute files
35
+ return telemetry.passed?
36
+
37
+ ensure
38
+ telemetry.run_finished
39
+ end
40
+
41
+ def gather_files
42
+ paths.flat_map do |path|
43
+ Array expand_path.(path)
44
+ end
45
+ end
46
+
47
+ def execute files
48
+ executor.(files)
49
+ end
50
+
51
+ def executor
52
+ @executor ||= Executor.build
53
+ end
54
+
55
+ def expand_path
56
+ @expand_path ||= proc do [] end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,62 @@
1
+ module TestBench
2
+ class Settings
3
+ attr_writer :abort_on_error
4
+ attr_writer :exclude_pattern
5
+ attr_writer :writer
6
+ attr_writer :record_telemetry
7
+ attr_writer :reverse_backtraces
8
+ attr_writer :tests_dir
9
+
10
+ def abort_on_error
11
+ nil_coalesce :@abort_on_error, Defaults.abort_on_error
12
+ end
13
+
14
+ def color
15
+ writer.color
16
+ end
17
+
18
+ def color= value
19
+ writer.color = value
20
+ end
21
+
22
+ def exclude_pattern
23
+ nil_coalesce :@exclude_pattern, Defaults.exclude_pattern
24
+ end
25
+
26
+ def lower_verbosity
27
+ writer.lower_verbosity
28
+ end
29
+
30
+ def nil_coalesce ivar, default_value
31
+ if instance_variable_defined? ivar
32
+ instance_variable_get ivar
33
+ else
34
+ instance_variable_set ivar, default_value
35
+ end
36
+ end
37
+
38
+ def raise_verbosity
39
+ writer.raise_verbosity
40
+ end
41
+
42
+ def record_telemetry
43
+ nil_coalesce :@record_telemetry, Defaults.record_telemetry
44
+ end
45
+
46
+ def reverse_backtraces
47
+ nil_coalesce :@reverse_backtraces, Defaults.reverse_backtraces
48
+ end
49
+
50
+ def tests_dir
51
+ nil_coalesce :@tests_dir, Defaults.tests_dir
52
+ end
53
+
54
+ def writer
55
+ @writer ||= Output::Writer.new
56
+ end
57
+
58
+ def self.toplevel
59
+ Registry.get TOPLEVEL_BINDING
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,29 @@
1
+ module TestBench
2
+ class Settings
3
+ module Defaults
4
+ def self.abort_on_error
5
+ false
6
+ end
7
+
8
+ def self.color
9
+ nil
10
+ end
11
+
12
+ def self.exclude_pattern
13
+ "_init\\.rb$"
14
+ end
15
+
16
+ def self.record_telemetry
17
+ false
18
+ end
19
+
20
+ def self.reverse_backtraces
21
+ false
22
+ end
23
+
24
+ def self.tests_dir
25
+ 'tests'
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,124 @@
1
+ module TestBench
2
+ class Settings
3
+ class Environment
4
+ attr_reader :settings
5
+ attr_writer :env
6
+
7
+ def initialize settings
8
+ @settings = settings
9
+ end
10
+
11
+ def self.build settings, env=nil
12
+ env ||= ENV
13
+
14
+ instance = new settings
15
+ instance.env = env
16
+ instance
17
+ end
18
+
19
+ def self.call *arguments
20
+ instance = build(*arguments)
21
+ instance.()
22
+ end
23
+
24
+ def call
25
+ abort_on_error
26
+ color
27
+ exclude_pattern
28
+ reverse_backtraces
29
+ quiet
30
+ record_telemetry
31
+ tests_dir
32
+ verbose
33
+ end
34
+
35
+ def activated? value
36
+ if affirmative_pattern.match value
37
+ true
38
+ elsif value.nil? or negative_pattern.match value
39
+ false
40
+ else
41
+ invalid_boolean value
42
+ end
43
+ end
44
+
45
+ def affirmative_pattern
46
+ @@affirmative_pattern ||= %r{\A(?:on|yes|y|1)\z}i
47
+ end
48
+
49
+ def color
50
+ if deactivated? env['TEST_BENCH_COLOR']
51
+ settings.color = false
52
+ elsif activated? env['TEST_BENCH_COLOR']
53
+ settings.color = true
54
+ end
55
+ end
56
+
57
+ def deactivated? value
58
+ if negative_pattern.match value
59
+ true
60
+ elsif value.nil? or affirmative_pattern.match value
61
+ false
62
+ else
63
+ invalid_boolean value
64
+ end
65
+ end
66
+
67
+ def env
68
+ @env ||= {}
69
+ end
70
+
71
+ def abort_on_error
72
+ if activated? env['TEST_BENCH_ABORT_ON_ERROR']
73
+ settings.abort_on_error = true
74
+ end
75
+ end
76
+
77
+ def exclude_pattern
78
+ if pattern = env['TEST_BENCH_EXCLUDE_PATTERN']
79
+ settings.exclude_pattern = pattern
80
+ end
81
+ end
82
+
83
+ def invalid_boolean value
84
+ raise ArgumentError, %{Invalid boolean value #{value.inspect}; values that are toggled can be set via "on" or "off", "yes" or "no", "y" or "n", or "0" or "1".}
85
+ end
86
+
87
+ def negative_pattern
88
+ @@negative_pattern ||= %r{\A(?:off|no|n|0)\z}i
89
+ end
90
+
91
+ def record_telemetry
92
+ if activated? env['TEST_BENCH_RECORD_TELEMETRY']
93
+ settings.record_telemetry = true
94
+ end
95
+ end
96
+
97
+ def reverse_backtraces
98
+ if activated? env['TEST_BENCH_REVERSE_BACKTRACES']
99
+ settings.reverse_backtraces = true
100
+ end
101
+ end
102
+
103
+ def quiet
104
+ if activated? env['TEST_BENCH_QUIET']
105
+ settings.lower_verbosity
106
+ settings.lower_verbosity
107
+ end
108
+ end
109
+
110
+ def tests_dir
111
+ tests_dir = env['TEST_BENCH_TESTS_DIR']
112
+
113
+ settings.tests_dir = tests_dir if tests_dir
114
+ end
115
+
116
+ def verbose
117
+ if activated? env['TEST_BENCH_VERBOSE']
118
+ settings.raise_verbosity
119
+ settings.raise_verbosity
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end