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,17 @@
1
+ module TestBench
2
+ class Settings
3
+ module Registry
4
+ extend self
5
+
6
+ def registry
7
+ @registry ||= TestBench::Registry.build do
8
+ Settings.new
9
+ end
10
+ end
11
+
12
+ def get binding
13
+ registry.get binding
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,89 @@
1
+ module TestBench
2
+ module Structure
3
+ def assert subject, mod=nil, assert_class: nil, caller_location: nil, &block
4
+ assert_class ||= Assert
5
+ caller_location ||= caller_locations[0]
6
+
7
+ telemetry = Telemetry::Registry.get binding
8
+
9
+ unless assert_class.(subject, mod, &block)
10
+ raise Assert::Failed.build caller_location
11
+ end
12
+
13
+ ensure
14
+ telemetry.asserted
15
+ end
16
+
17
+ def comment prose
18
+ telemetry = Telemetry::Registry.get binding
19
+
20
+ telemetry.commented prose
21
+ end
22
+
23
+ def context prose=nil, suppress_exit: nil, &block
24
+ suppress_exit ||= false
25
+
26
+ telemetry = Telemetry::Registry.get binding
27
+
28
+ unless prose.nil? or prose.is_a? String
29
+ raise TypeError, "Prose must be a String"
30
+ end
31
+
32
+ begin
33
+ telemetry.context_entered prose
34
+ block.() if block
35
+
36
+ rescue => error
37
+ Structure.error error, binding
38
+
39
+ ensure
40
+ nesting = telemetry.context_exited prose
41
+
42
+ if nesting.zero? and telemetry.failed?
43
+ exit 1 unless suppress_exit
44
+ end
45
+ end
46
+ end
47
+
48
+ def refute *arguments, &block
49
+ assert(*arguments, :assert_class => Assert::Refute, :caller_location => caller_locations[0], &block)
50
+ end
51
+
52
+ def test prose=nil, &block
53
+ telemetry = Telemetry::Registry.get binding
54
+
55
+ prose ||= 'Test'
56
+
57
+ unless prose.is_a? String
58
+ raise TypeError, "Prose must be a String"
59
+ end
60
+
61
+ if block.nil?
62
+ telemetry.test_skipped prose
63
+ return
64
+ end
65
+
66
+ begin
67
+ telemetry.test_started prose
68
+ block.()
69
+ telemetry.test_passed prose
70
+
71
+ rescue => error
72
+ telemetry.test_failed prose
73
+ Structure.error error, binding
74
+
75
+ ensure
76
+ telemetry.test_finished prose
77
+ end
78
+ end
79
+
80
+ def self.error error, binding
81
+ telemetry = Telemetry::Registry.get binding
82
+ settings = Settings::Registry.get binding
83
+
84
+ telemetry.error_raised error
85
+
86
+ exit 1 if settings.abort_on_error
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,130 @@
1
+ module TestBench
2
+ class Telemetry
3
+ include Observable
4
+
5
+ attr_accessor :failed
6
+ attr_writer :nesting
7
+ attr_writer :sink
8
+
9
+ def self.build
10
+ instance = new
11
+
12
+ if Settings.toplevel.record_telemetry
13
+ instance.sink = []
14
+ end
15
+
16
+ instance
17
+ end
18
+
19
+ def asserted
20
+ publish :asserted
21
+ end
22
+
23
+ def commented prose
24
+ publish :commented, prose
25
+ end
26
+
27
+ def context_entered prose
28
+ publish :context_entered, prose
29
+
30
+ self.nesting += 1
31
+ end
32
+
33
+ def context_exited prose
34
+ publish :context_exited, prose
35
+
36
+ self.nesting -= 1
37
+
38
+ nesting
39
+ end
40
+
41
+ def error_raised error
42
+ self.failed = true
43
+
44
+ publish :error_raised, error
45
+ end
46
+
47
+ def failed?
48
+ if failed then true else false end
49
+ end
50
+
51
+ def file_finished file
52
+ publish :file_finished, file
53
+ end
54
+
55
+ def file_started file
56
+ publish :file_started, file
57
+ end
58
+
59
+ def nesting
60
+ @nesting ||= 0
61
+ end
62
+
63
+ def passed?
64
+ not failed?
65
+ end
66
+
67
+ def publish event, *arguments
68
+ changed
69
+ notify_observers event, *arguments
70
+
71
+ record = Record.new event, *arguments
72
+ sink << record
73
+ end
74
+
75
+ def run_started
76
+ publish :run_started
77
+ end
78
+
79
+ def run_finished
80
+ publish :run_finished
81
+ end
82
+
83
+ def sink
84
+ @sink ||= NullSink
85
+ end
86
+
87
+ def subscribe subscriber
88
+ subscription = Subscription.new subscriber
89
+ add_observer subscription
90
+ subscription
91
+ end
92
+
93
+ def test_failed prose
94
+ publish :test_failed, prose
95
+ end
96
+
97
+ def test_finished prose
98
+ publish :test_finished, prose
99
+ end
100
+
101
+ def test_passed prose
102
+ publish :test_passed, prose
103
+ end
104
+
105
+ def test_skipped prose
106
+ publish :test_skipped, prose
107
+ end
108
+
109
+ def test_started prose
110
+ publish :test_started, prose
111
+ end
112
+
113
+ def self.subscribe subscriber
114
+ toplevel_telemetry = Registry.get TOPLEVEL_BINDING
115
+ toplevel_telemetry.subscribe subscriber
116
+ end
117
+
118
+ Record = Struct.new :event, :data
119
+
120
+ module NullSink
121
+ extend Enumerable
122
+
123
+ def self.<< event
124
+ end
125
+
126
+ def self.each &block
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,85 @@
1
+ module TestBench
2
+ class Telemetry
3
+ module Assertions
4
+ def elapsed? seconds
5
+ seconds == elapsed_time
6
+ end
7
+
8
+ def record_count &block
9
+ sink.count do |record|
10
+ block.(record)
11
+ end
12
+ end
13
+
14
+ def recorded_any? control_event
15
+ count = record_count do |record|
16
+ record.event == control_event
17
+ end
18
+
19
+ count > 0
20
+ end
21
+
22
+ def recorded_asserted?
23
+ recorded_any? :asserted
24
+ end
25
+
26
+ def recorded_comment?
27
+ recorded_any? :commented
28
+ end
29
+
30
+ def recorded_context_entered?
31
+ recorded_any? :context_entered
32
+ end
33
+
34
+ def recorded_context_exited?
35
+ recorded_any? :context_exited
36
+ end
37
+
38
+ def recorded_error_raised?
39
+ recorded_any? :error_raised
40
+ end
41
+
42
+ def recorded_file_finished?
43
+ recorded_any? :file_finished
44
+ end
45
+
46
+ def recorded_file_started?
47
+ recorded_any? :file_started
48
+ end
49
+
50
+ def recorded_run_finished?
51
+ recorded_any? :run_finished
52
+ end
53
+
54
+ def recorded_run_started?
55
+ recorded_any? :run_started
56
+ end
57
+
58
+ def recorded_test_failed?
59
+ recorded_any? :test_failed
60
+ end
61
+
62
+ def recorded_test_finished?
63
+ recorded_any? :test_finished
64
+ end
65
+
66
+ def recorded_test_passed?
67
+ recorded_any? :test_passed
68
+ end
69
+
70
+ def recorded_test_skipped?
71
+ recorded_any? :test_skipped
72
+ end
73
+
74
+ def recorded_test_started?
75
+ recorded_any? :test_started
76
+ end
77
+
78
+ def test? prose
79
+ record_count do |record|
80
+ record.event == :test_started and record.data == prose
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,17 @@
1
+ module TestBench
2
+ class Telemetry
3
+ module Registry
4
+ extend self
5
+
6
+ def registry
7
+ @registry ||= TestBench::Registry.build do
8
+ Telemetry.build
9
+ end
10
+ end
11
+
12
+ def get binding
13
+ registry.get binding
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ module TestBench
2
+ class Telemetry
3
+ class Subscription
4
+ attr_reader :subscriber
5
+
6
+ def initialize subscriber
7
+ @subscriber = subscriber
8
+ end
9
+
10
+ def update event, argument=nil
11
+ return unless subscriber.respond_to? event
12
+
13
+ method = subscriber.method event
14
+
15
+ if method.arity == 0
16
+ subscriber.public_send event
17
+ else
18
+ subscriber.public_send event, argument
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,33 @@
1
+ module TestBench
2
+ def self.activate
3
+ # Monkeypatch assert, context, and test onto the main object
4
+ unless TOPLEVEL_BINDING.receiver.is_a? Structure
5
+ TOPLEVEL_BINDING.receiver.extend Structure
6
+ end
7
+
8
+ # Ruby pre 2.2 did not implement Binding#receiver
9
+ unless TOPLEVEL_BINDING.respond_to? :receiver
10
+ ::Binding.class_exec do
11
+ def receiver
12
+ eval "self"
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ # Build the output instance that will be used to render all the test output
19
+ output = Output.build
20
+
21
+ # Settings can affect the output (verbosity & color), so we pass the output
22
+ # object into the toplevel settings object and then apply environment
23
+ # variables to it.
24
+ settings = Settings::Registry.get TOPLEVEL_BINDING
25
+ settings.writer = output.writer
26
+ Settings::Environment.(settings)
27
+
28
+ # Configure reverse backtraces on output
29
+ output.reverse_backtraces = settings.reverse_backtraces
30
+
31
+ # Telemetry pushes updates to output for display
32
+ Telemetry.subscribe output
33
+ end
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: test_bench_legacy
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.5
5
+ platform: ruby
6
+ authors:
7
+ - Nathan Ladd
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-09-11 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Test Bench Legacy is the legacy version of a test framework for Ruby
14
+ designed to offer the minimum set of features necessary to test well designed code
15
+ effectively.
16
+ email: jf.arseneau@wealthbar.com
17
+ executables:
18
+ - bench
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - bin/bench
23
+ - lib/test_bench.rb
24
+ - lib/test_bench/activate.rb
25
+ - lib/test_bench/assert.rb
26
+ - lib/test_bench/assert/failed.rb
27
+ - lib/test_bench/assert/proc.rb
28
+ - lib/test_bench/assert/refute.rb
29
+ - lib/test_bench/cli.rb
30
+ - lib/test_bench/cli/cli.rb
31
+ - lib/test_bench/controls.rb
32
+ - lib/test_bench/controls/binding.rb
33
+ - lib/test_bench/controls/clock/elapsed.rb
34
+ - lib/test_bench/controls/clock/reference.rb
35
+ - lib/test_bench/controls/dir_substitute.rb
36
+ - lib/test_bench/controls/error.rb
37
+ - lib/test_bench/controls/executor/substitute.rb
38
+ - lib/test_bench/controls/expand_path.rb
39
+ - lib/test_bench/controls/fixture.rb
40
+ - lib/test_bench/controls/kernel_substitute.rb
41
+ - lib/test_bench/controls/output.rb
42
+ - lib/test_bench/controls/path.rb
43
+ - lib/test_bench/controls/result.rb
44
+ - lib/test_bench/controls/telemetry.rb
45
+ - lib/test_bench/controls/test_script.rb
46
+ - lib/test_bench/executor.rb
47
+ - lib/test_bench/expand_path.rb
48
+ - lib/test_bench/fixture.rb
49
+ - lib/test_bench/output.rb
50
+ - lib/test_bench/output/assertions.rb
51
+ - lib/test_bench/output/palette.rb
52
+ - lib/test_bench/output/writer.rb
53
+ - lib/test_bench/output/writer/assertions.rb
54
+ - lib/test_bench/output/writer/assertions/line.rb
55
+ - lib/test_bench/registry.rb
56
+ - lib/test_bench/result.rb
57
+ - lib/test_bench/result/assertions.rb
58
+ - lib/test_bench/result/null.rb
59
+ - lib/test_bench/runner.rb
60
+ - lib/test_bench/settings.rb
61
+ - lib/test_bench/settings/defaults.rb
62
+ - lib/test_bench/settings/environment.rb
63
+ - lib/test_bench/settings/registry.rb
64
+ - lib/test_bench/structure.rb
65
+ - lib/test_bench/telemetry.rb
66
+ - lib/test_bench/telemetry/assertions.rb
67
+ - lib/test_bench/telemetry/registry.rb
68
+ - lib/test_bench/telemetry/subscription.rb
69
+ - lib/test_bench/test_bench.rb
70
+ homepage: https://github.com/WealthBar/test-bench-1.x
71
+ licenses:
72
+ - MIT
73
+ metadata: {}
74
+ post_install_message:
75
+ rdoc_options: []
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ requirements: []
89
+ rubyforge_project:
90
+ rubygems_version: 2.7.6
91
+ signing_key:
92
+ specification_version: 4
93
+ summary: The legacy version of a frugal test framework for Ruby
94
+ test_files: []