test_bench_legacy 1.3.5

Sign up to get free protection for your applications and to get access to all the features.
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