theorem 1.2.1 → 1.2.4

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: '09d0acbeb340968a19cb27122ba6c852b66b2cc4347fdfca7f6ba6a9f7781ce0'
4
- data.tar.gz: aef702741a59ff1a11f08e6225b0804b30b813ed0cc8eb5184cdd50c54587901
3
+ metadata.gz: 482c54bf255ca8192a63190101ea3ff32aaf902d37c6badae8e52966d2222d66
4
+ data.tar.gz: 8728e81f43d1acbc6f99a553de5400d253325e9b8ba13ba5d788be817c6f0f42
5
5
  SHA512:
6
- metadata.gz: 6055b29fd80529f514b73363a18582122a5e23b312fda318b3d83a546bb7d8b062fcaf87f57858340e432bc1327a183f1b494c107d0970861b9548974f34996f
7
- data.tar.gz: 40c0dc5d7660db43bdf6606aae81a43c48cb5015dd29eacd63a4f2afc2e0daa2d70b34f1ce04560f190d2dd282caef3bc67d4c37236c5bcda3abfce5bed65aad
6
+ metadata.gz: 9d8a3adabb93286bfcc8679e9437378c36c447395fa3d7e51e39d26cfd56d17dec529cc1ce30bd5ac9d805a7bba952521afca39bceb546f44168a2068a28bf76
7
+ data.tar.gz: 0efadbdc23011608363b7ca4b617fbcb0e103045104e23a71e2aca10554a1a8e44a3912ce6e07aba9211919c5d07738da314361546ced2454f43ca239cf810de
@@ -68,7 +68,7 @@ module Theorem
68
68
  end
69
69
  end
70
70
  hash = {}
71
- hash[:percentile] = (below.size.to_f / sorted.size.to_f) * 100
71
+ hash[:percentile] = (below.size.to_f / (sorted.size.to_f + 1)) * 100
72
72
  hash[:test] = test
73
73
  arr << hash
74
74
  end
@@ -90,12 +90,12 @@ module Theorem
90
90
  return 'Not run' if test[:test].duration.nil?
91
91
 
92
92
  str = "#{format('%<num>0.10f', num: test[:test].duration)} seconds"
93
- rank = ((test[:percentile] / 100) * (test[:test].duration + 1)) * 100
94
- if rank < 5
93
+ rank = test[:percentile]
94
+ if rank < 10
95
95
  str.red
96
- elsif rank > 95
96
+ elsif rank > 90
97
97
  str.green
98
- elsif rank < 10
98
+ elsif rank < 30
99
99
  str.yellow
100
100
  else
101
101
  str
@@ -50,6 +50,14 @@ module Theorem
50
50
  @state = []
51
51
  end
52
52
 
53
+ def reverse_run!(ctx)
54
+ ctx.instance_exec @state.reverse, ctx do |state, ctx|
55
+ state.each do |b|
56
+ ctx.instance_eval &b
57
+ end
58
+ end
59
+ end
60
+
53
61
  def run!(ctx)
54
62
  ctx.instance_exec @state, ctx do |state, ctx|
55
63
  state.each do |b|
@@ -62,8 +70,8 @@ module Theorem
62
70
  @state.empty?
63
71
  end
64
72
 
65
- def reverse_prepare(&block)
66
- @state.unshift block
73
+ def concat(beaker)
74
+ @state.concat beaker.instance_variable_get('@state')
67
75
  end
68
76
 
69
77
  def prepare(&block)
@@ -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
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
40
41
 
41
42
  @parent_before_each ||= []
42
- @parent_before_each << me.before_each_beaker
43
+ @before_each.concat me.before_each_beaker
43
44
 
44
45
  @parent_after_each ||= []
45
- @parent_after_each.unshift me.after_each_beaker
46
+ @after_each.concat me.after_each_beaker
46
47
 
47
48
  @parent_after_all ||= []
48
- @parent_after_all.unshift me.after_all_beaker
49
+ @after_all.concat me.after_all_beaker
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
@@ -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
@@ -202,11 +201,7 @@ module Theorem
202
201
  end
203
202
 
204
203
  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
204
+ @after_each.reverse_run!(test_case)
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.1
4
+ version: 1.2.4
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-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: extended_dir
@@ -124,6 +124,7 @@ files:
124
124
  - src/theorem/completed_test.rb
125
125
  - src/theorem/harness.rb
126
126
  - src/theorem/hypothesis.rb
127
+ - src/theorem/let.rb
127
128
  - src/theorem/notation.rb
128
129
  - src/theorem/registry.rb
129
130
  - src/theorem/reporter.rb