theorem 1.2.2 → 1.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fa09d87e0b219e171e02728791f787a6ecd68a759e8a21143e85302361f68a1d
4
- data.tar.gz: 739e1c4e6e19a3145d7c87c8ea688d10be70cce45735939e7f5d0bdf1817d385
3
+ metadata.gz: ee6da97e143aea34cbdcac8dc8399267376345c958186bb4fcd3db2a282553e8
4
+ data.tar.gz: 7312e470f9ad0442de46f23b8d755389a6a3c43891c1f98ed9fce1ab4ae31036
5
5
  SHA512:
6
- metadata.gz: 49ef938d77de1eacfd29a61c312acb396de525adb5c9b9699d3698cd31d8511c05665c560b55de61bc0fb9884024b32dbc61771cc0e44ae5267f26301cd46a18
7
- data.tar.gz: 2fe7a59bec06dfd7b14c02e9245cdd0e9ca1ccf013f83254706cccd8e72a3aba9ac3048d9b0ed083b14f3d3e552c8cdd1b42ed75d24cc6ee67581740e5048f7f
6
+ metadata.gz: 721afc1fff1e6dee399907cadfb453633ec2b848b2e847968e0ca56f7db490bb69100e3887faa3769653c7fd090ece96e3aa2527f9cb890030905063302b5ae2
7
+ data.tar.gz: 932e5c189ed8c47d3c4e96da2591bd54d17bd5c3abfb0d480db0093823dbd40d76f84ac329bcaab47b2271e364abb32ce192306fdee197e6160ab86f6d63610d
@@ -50,6 +50,19 @@ module Theorem
50
50
  @state = []
51
51
  end
52
52
 
53
+ def clone
54
+ @state.map!(&:clone)
55
+ self
56
+ end
57
+
58
+ def reverse_run!(ctx, **params)
59
+ ctx.instance_exec @state.reverse, ctx, params do |state, ctx, params|
60
+ state.each do |b|
61
+ ctx.instance_exec **params, &b
62
+ end
63
+ end
64
+ end
65
+
53
66
  def run!(ctx)
54
67
  ctx.instance_exec @state, ctx do |state, ctx|
55
68
  state.each do |b|
@@ -62,8 +75,8 @@ module Theorem
62
75
  @state.empty?
63
76
  end
64
77
 
65
- def reverse_prepare(&block)
66
- @state.unshift block
78
+ def concat(beaker)
79
+ @state.concat beaker.instance_variable_get('@state')
67
80
  end
68
81
 
69
82
  def prepare(&block)
@@ -27,7 +27,8 @@ module Theorem
27
27
  inner.suite_finished_subscribers.each do |subscriber|
28
28
  subscriber.call(results, duration)
29
29
  end
30
- exit results.any?(&:failed?) ? 1 : 0
30
+
31
+ inner.instance_exec results, &mod.run_exit
31
32
  end
32
33
  end
33
34
  end
@@ -39,10 +40,18 @@ module Theorem
39
40
  @on_load_tests = block
40
41
  end
41
42
 
43
+ def on_exit(&block)
44
+ @on_exit = block
45
+ end
46
+
42
47
  def on_run(&block)
43
48
  @on_run = block
44
49
  end
45
50
 
51
+ def run_exit
52
+ @on_exit || default_exit
53
+ end
54
+
46
55
  def run_loader
47
56
  @on_run || default_runner
48
57
  end
@@ -53,6 +62,12 @@ module Theorem
53
62
 
54
63
  private
55
64
 
65
+ def default_exit
66
+ lambda do |results|
67
+ exit results.any?(&:failed?) ? 1 : 0
68
+ end
69
+ end
70
+
56
71
  def default_loader
57
72
  lambda do |options|
58
73
  directory = options[:directory] || '.'
@@ -4,6 +4,7 @@ require_relative 'completed_test'
4
4
  require_relative 'beaker'
5
5
  require_relative 'registry'
6
6
  require_relative 'test'
7
+ require_relative 'let'
7
8
 
8
9
  module Theorem
9
10
  module Control
@@ -25,6 +26,7 @@ module Theorem
25
26
  block.call(@notary)
26
27
  end
27
28
 
29
+ klass.extend Let
28
30
  klass.extend ClassMethods
29
31
  klass.instance_eval do
30
32
  @before_all ||= Beaker.new
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Theorem
4
+ module Control
5
+ # compatibility with let in rspec
6
+ module Let
7
+ def let(name, &block)
8
+ setup_let(name, &block)
9
+ instance_exec @let_registry do |registry|
10
+ @before_each.prepare do
11
+ define_singleton_method name do
12
+ raise "can't find #{name}" unless registry[:let][name]
13
+
14
+ registry[:let][name][:value] ||= instance_exec &registry[:let][name][:block]
15
+ end
16
+ end
17
+
18
+ @after_each.prepare do
19
+ registry[:let][name][:value] = nil
20
+ end
21
+ end
22
+ end
23
+ alias_method :each_with, :let
24
+
25
+ def let_it_be(name, &block)
26
+ setup_let(name, :let_it_be, &block)
27
+ instance_exec @let_registry do |registry|
28
+ @before_all.prepare do
29
+ define_singleton_method name do
30
+ raise "can't find #{name}" unless registry[:let_it_be][name]
31
+
32
+ registry[:let_it_be][name][:value] ||= instance_exec &registry[:let_it_be][name][:block]
33
+ end
34
+ end
35
+ @after_all.prepare do
36
+ registry[:let_it_be][name][:value] = nil
37
+ end
38
+ end
39
+ end
40
+ alias_method :all_with, :let_it_be
41
+
42
+ private
43
+
44
+ def setup_let(name, type=:let, &block)
45
+ @let_registry ||= {}
46
+ @let_registry[type] ||= {}
47
+ @let_registry[type][name] = { block: block, value: nil }
48
+
49
+ define_singleton_method name do
50
+ raise "can't find #{name}" unless @let_registry[type][name]
51
+
52
+ @let_registry[type][name][:value] ||= @let_registry[type][name][:block].call
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -25,7 +25,7 @@ module Theorem
25
25
 
26
26
  def edit(key, &block)
27
27
  data = read(key)
28
- block.call(data)
28
+ data = block.call(data)
29
29
  write(key, data)
30
30
  end
31
31
  end
@@ -7,7 +7,8 @@ module Theorem
7
7
  def self.extended(mod)
8
8
  mod.extend(mod)
9
9
  mod.define_singleton_method :included do |root|
10
- mod.subscriptions.each do |subscription, handler|
10
+ subscriptions = mod.subscriptions || []
11
+ subscriptions.each do |subscription, handler|
11
12
  mod.instance_exec root, subscription, handler do |root, sub, handle|
12
13
  root.send(sub, &handle)
13
14
  end
data/src/theorem/test.rb CHANGED
@@ -33,19 +33,20 @@ module Theorem
33
33
  # module
34
34
  module ClassMethods
35
35
  def inherited(klass)
36
+ klass.extend ClassMethods
36
37
  klass.include(control)
37
38
  klass.instance_exec self do |me|
38
39
  @parent_before_all ||= []
39
- @parent_before_all << me.before_all_beaker
40
+ @before_all.concat me.before_all_beaker.clone
40
41
 
41
42
  @parent_before_each ||= []
42
- @parent_before_each << me.before_each_beaker
43
+ @before_each.concat me.before_each_beaker.clone
43
44
 
44
45
  @parent_after_each ||= []
45
- @parent_after_each.unshift me.after_each_beaker
46
+ @after_each.concat me.after_each_beaker.clone
46
47
 
47
48
  @parent_after_all ||= []
48
- @parent_after_all.unshift me.after_all_beaker
49
+ @after_all.concat me.after_all_beaker.clone
49
50
  end
50
51
  super
51
52
  end
@@ -63,11 +64,11 @@ module Theorem
63
64
  end
64
65
 
65
66
  def after_each(&block)
66
- @after_each.reverse_prepare(&block)
67
+ @after_each.prepare(&block)
67
68
  end
68
69
 
69
70
  def after_all(&block)
70
- @after_all.reverse_prepare(&block)
71
+ @after_all.prepare(&block)
71
72
  end
72
73
 
73
74
  def experiments(klass, **opts, &block)
@@ -104,6 +105,8 @@ module Theorem
104
105
  end
105
106
 
106
107
  def run!
108
+ return [] if @tests.empty?
109
+
107
110
  test_case = new
108
111
 
109
112
  # run before all beakers to create state in test case
@@ -129,7 +132,7 @@ module Theorem
129
132
 
130
133
  before_test_case = test_case.clone
131
134
  error ||= run_test(test, before_test_case)
132
- error ||= run_after_each_beakers(before_test_case)
135
+ error ||= run_after_each_beakers(before_test_case, error: error)
133
136
 
134
137
  notary = test_case.notary.merge(test.notary)
135
138
 
@@ -183,11 +186,7 @@ module Theorem
183
186
  end
184
187
 
185
188
  def run_after_all_beakers(results, test_case)
186
- @after_all.run!(test_case)
187
-
188
- @parent_after_all&.each do |beaker|
189
- beaker.run!(test_case)
190
- end
189
+ @after_all.reverse_run!(test_case)
191
190
 
192
191
  []
193
192
  rescue Exception => error
@@ -201,12 +200,8 @@ module Theorem
201
200
  results
202
201
  end
203
202
 
204
- def run_after_each_beakers(test_case)
205
- @after_each.run!(test_case)
206
-
207
- @parent_after_each&.each do |beaker|
208
- beaker.run!(test_case)
209
- end
203
+ def run_after_each_beakers(test_case, **params)
204
+ @after_each.reverse_run!(test_case, **params)
210
205
  nil
211
206
  rescue Exception => error
212
207
  Theorem.handle_exception(error)
@@ -215,9 +210,6 @@ module Theorem
215
210
  end
216
211
 
217
212
  def run_before_each_beakers(test_case)
218
- @parent_before_each&.each do |beaker|
219
- beaker.run!(test_case)
220
- end
221
213
  @before_each.run!(test_case)
222
214
  nil
223
215
  rescue Exception => error
@@ -227,9 +219,6 @@ module Theorem
227
219
  end
228
220
 
229
221
  def run_before_all_beakers(test_case)
230
- @parent_before_all&.each do |beaker|
231
- beaker.run!(test_case)
232
- end
233
222
  @before_all.run!(test_case)
234
223
  []
235
224
  rescue Exception => error
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: theorem
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Gregory
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-11 00:00:00.000000000 Z
11
+ date: 2022-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: extended_dir
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: parallel
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
111
125
  description: simple and extensible test library toolkit
112
126
  email: sean.christopher.gregory@gmail.com
113
127
  executables:
@@ -124,6 +138,7 @@ files:
124
138
  - src/theorem/completed_test.rb
125
139
  - src/theorem/harness.rb
126
140
  - src/theorem/hypothesis.rb
141
+ - src/theorem/let.rb
127
142
  - src/theorem/notation.rb
128
143
  - src/theorem/registry.rb
129
144
  - src/theorem/reporter.rb