theorem 1.2.2 → 1.2.5

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