theorem 1.2.1 → 1.2.4

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: '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