calificador 0.1.0 → 0.2.0
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 +4 -4
- data/README.md +35 -16
- data/TODO.md +16 -0
- data/calificador.gemspec +54 -0
- data/lib/calificador.rb +8 -4
- data/lib/calificador/assert.rb +15 -0
- data/lib/calificador/assertor.rb +79 -35
- data/lib/calificador/build/attribute_evaluator.rb +34 -30
- data/lib/calificador/build/basic_factory.rb +195 -0
- data/lib/calificador/build/mock_factory.rb +151 -0
- data/lib/calificador/build/object_factory.rb +85 -0
- data/lib/calificador/build/trait.rb +0 -20
- data/lib/calificador/context/basic_context.rb +406 -0
- data/lib/calificador/context/class_method_context.rb +0 -0
- data/lib/calificador/{spec → context}/condition_context.rb +1 -3
- data/lib/calificador/{spec/type_context.rb → context/instance_context.rb} +5 -10
- data/lib/calificador/context/operation_context.rb +27 -0
- data/lib/calificador/context/override/argument_override.rb +73 -0
- data/lib/calificador/context/override/basic_override.rb +14 -0
- data/lib/calificador/context/override/factory_override.rb +31 -0
- data/lib/calificador/context/override/property_override.rb +61 -0
- data/lib/calificador/context/test_environment.rb +283 -0
- data/lib/calificador/{spec → context}/test_method.rb +2 -31
- data/lib/calificador/{spec → context}/test_root.rb +3 -15
- data/lib/calificador/{spec/examine_context.rb → context/type_context.rb} +7 -10
- data/lib/calificador/key.rb +27 -15
- data/lib/calificador/minitest/minitest_patches.rb +0 -2
- data/lib/calificador/test.rb +1 -3
- data/lib/calificador/test_mixin.rb +143 -139
- data/lib/calificador/util/call_formatter.rb +5 -5
- data/lib/calificador/util/core_extensions.rb +104 -79
- data/lib/calificador/util/proxy_object.rb +63 -0
- data/lib/calificador/version.rb +1 -1
- metadata +22 -42
- data/lib/calificador/build/attribute_container.rb +0 -103
- data/lib/calificador/build/factory.rb +0 -132
- data/lib/calificador/spec/basic_context.rb +0 -353
- data/lib/calificador/spec/class_method_context.rb +0 -42
- data/lib/calificador/spec/instance_method_context.rb +0 -38
- data/lib/calificador/spec/test_environment.rb +0 -141
- data/lib/calificador/spec/value_override.rb +0 -37
@@ -1,17 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
using Calificador::Util::CoreExtensions
|
4
|
-
|
5
3
|
module Calificador
|
6
|
-
module
|
4
|
+
module Context
|
7
5
|
# Factory class
|
8
6
|
class TestMethod < BasicContext
|
9
|
-
class Dsl < BasicContext::Dsl
|
10
|
-
def body(&block)
|
11
|
-
delegate.body = block
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
7
|
attr_reader :body, :expected_to_fail
|
16
8
|
|
17
9
|
def initialize(parent:, subject_key:, description:, overrides:, expected_to_fail: false, body:)
|
@@ -28,7 +20,7 @@ module Calificador
|
|
28
20
|
|
29
21
|
test_class.class_eval(<<~METHOD, file, line_number)
|
30
22
|
define_method(test_method_name) do
|
31
|
-
__run_test(
|
23
|
+
__run_test(context: test_method)
|
32
24
|
end
|
33
25
|
METHOD
|
34
26
|
|
@@ -38,27 +30,6 @@ module Calificador
|
|
38
30
|
def method_name
|
39
31
|
@method_name ||= "test_: #{full_description}"
|
40
32
|
end
|
41
|
-
|
42
|
-
def run_test(test:)
|
43
|
-
body = self.body
|
44
|
-
environment = TestEnvironment.new(test: test, context: self)
|
45
|
-
|
46
|
-
if expected_to_fail
|
47
|
-
passed = begin
|
48
|
-
environment.instance_exec(&body)
|
49
|
-
true
|
50
|
-
rescue ::Minitest::Assertion => e
|
51
|
-
test.pass(e.message)
|
52
|
-
false
|
53
|
-
end
|
54
|
-
|
55
|
-
test.flunk("Expected test to fail") if passed
|
56
|
-
else
|
57
|
-
environment.instance_exec(&body)
|
58
|
-
end
|
59
|
-
|
60
|
-
environment.__done
|
61
|
-
end
|
62
33
|
end
|
63
34
|
end
|
64
35
|
end
|
@@ -1,20 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
using Calificador::Util::CoreExtensions
|
4
|
-
|
5
3
|
module Calificador
|
6
|
-
module
|
7
|
-
class TestRoot <
|
8
|
-
class Dsl < ExamineContext::Dsl
|
9
|
-
def body(&block)
|
10
|
-
delegate.body = block
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
4
|
+
module Context
|
5
|
+
class TestRoot < InstanceContext
|
14
6
|
attr_accessor :test_class
|
15
7
|
|
16
8
|
def initialize(test_class:, subject_key:, description:, &body)
|
17
|
-
super(parent: nil, subject_key: subject_key, description: description
|
9
|
+
super(parent: nil, subject_key: subject_key, description: description)
|
18
10
|
|
19
11
|
@test_class = test_class
|
20
12
|
@body = body
|
@@ -30,10 +22,6 @@ module Calificador
|
|
30
22
|
super
|
31
23
|
end
|
32
24
|
|
33
|
-
def create_result(subject:, arguments:, options:, block:)
|
34
|
-
subject
|
35
|
-
end
|
36
|
-
|
37
25
|
protected
|
38
26
|
|
39
27
|
def setup_body
|
@@ -1,24 +1,21 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
using Calificador::Util::CoreExtensions
|
4
|
-
|
5
3
|
module Calificador
|
6
|
-
module
|
7
|
-
class
|
8
|
-
|
9
|
-
|
4
|
+
module Context
|
5
|
+
class TypeContext < BasicContext
|
6
|
+
def initialize(parent:, subject_key:, description:, overrides: [])
|
7
|
+
raise ArgumentError, "Subject must be a must be a #{BasicObject}" unless subject_key.type <= BasicObject
|
10
8
|
|
11
|
-
def initialize(parent:, subject_key:, description:, overrides: {})
|
12
9
|
super(
|
13
10
|
parent: parent,
|
14
11
|
description: description,
|
15
12
|
subject_key: subject_key,
|
16
|
-
overrides: overrides
|
13
|
+
overrides: overrides
|
17
14
|
)
|
18
15
|
end
|
19
16
|
|
20
|
-
def create_subject(environment
|
21
|
-
|
17
|
+
def create_subject(environment:)
|
18
|
+
subject_key.type
|
22
19
|
end
|
23
20
|
|
24
21
|
def subtree_root?
|
data/lib/calificador/key.rb
CHANGED
@@ -2,27 +2,36 @@
|
|
2
2
|
|
3
3
|
require "minitest"
|
4
4
|
|
5
|
-
using Calificador::Util::CoreExtensions
|
6
|
-
|
7
5
|
module Calificador
|
8
6
|
# Test subject key
|
9
7
|
class Key
|
8
|
+
NO_TRAIT = :"<none>"
|
10
9
|
DEFAULT_TRAIT = :"<default>"
|
11
|
-
INHERITED_TRAIT = :"<inherited>"
|
12
10
|
|
13
11
|
class << self
|
14
|
-
def [](type, trait =
|
12
|
+
def [](type, trait = NO_TRAIT)
|
15
13
|
new(type: type, trait: trait)
|
16
14
|
end
|
17
15
|
end
|
18
16
|
|
19
17
|
attr_reader :type, :trait
|
20
18
|
|
21
|
-
def initialize(type:, trait:
|
22
|
-
|
19
|
+
def initialize(type:, trait: NO_TRAIT)
|
20
|
+
trait ||= NO_TRAIT
|
21
|
+
|
22
|
+
raise ArgumentError, "Type must be a #{Module}, not '#{type}' (#{type.class})" unless type.is_a?(Module)
|
23
|
+
raise ArgumentError, "Trait must be a #{Symbol}" unless trait.is_a?(Symbol)
|
23
24
|
|
24
25
|
@type = type
|
25
|
-
@trait = trait
|
26
|
+
@trait = trait
|
27
|
+
end
|
28
|
+
|
29
|
+
def trait?
|
30
|
+
@trait != NO_TRAIT && @trait != DEFAULT_TRAIT
|
31
|
+
end
|
32
|
+
|
33
|
+
def default_trait?
|
34
|
+
@trait == DEFAULT_TRAIT
|
26
35
|
end
|
27
36
|
|
28
37
|
def hash
|
@@ -30,30 +39,33 @@ module Calificador
|
|
30
39
|
end
|
31
40
|
|
32
41
|
def ==(other)
|
33
|
-
(@type == other.type) && (@trait == other.trait)
|
42
|
+
other.is_a?(Key) && (@type == other.type) && (@trait == other.trait)
|
34
43
|
end
|
35
44
|
|
36
45
|
alias_method :eql?, :==
|
37
46
|
|
38
|
-
def to_s
|
39
|
-
|
47
|
+
def to_s(base_module: nil)
|
48
|
+
type_name = @type.name_without_common_parents(base: base_module)
|
49
|
+
@trait == NO_TRAIT ? type_name : "#{type_name} (#{@trait})"
|
40
50
|
end
|
41
51
|
|
42
52
|
alias_method :inspect, :to_s
|
43
53
|
|
44
54
|
def with(trait)
|
45
55
|
case trait
|
46
|
-
when INHERITED_TRAIT
|
47
|
-
self
|
48
56
|
when nil, DEFAULT_TRAIT
|
49
|
-
|
57
|
+
self
|
50
58
|
else
|
51
59
|
trait == @trait ? self : Key.new(type: @type, trait: trait)
|
52
60
|
end
|
53
61
|
end
|
54
62
|
|
55
|
-
def
|
56
|
-
@trait !=
|
63
|
+
def with_default(key)
|
64
|
+
if @trait == DEFAULT_TRAIT && @trait != key.trait
|
65
|
+
Key[@type, key.trait]
|
66
|
+
else
|
67
|
+
self
|
68
|
+
end
|
57
69
|
end
|
58
70
|
end
|
59
71
|
end
|
data/lib/calificador/test.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "minitest"
|
4
|
-
|
5
|
-
using Calificador::Util::CoreExtensions
|
4
|
+
require "forwardable"
|
6
5
|
|
7
6
|
module Calificador
|
8
7
|
# Mixin for unit tests
|
9
8
|
module TestMixin
|
9
|
+
extend Forwardable
|
10
|
+
|
10
11
|
Key = Calificador::Key
|
11
12
|
|
12
13
|
class << self
|
@@ -19,189 +20,155 @@ module Calificador
|
|
19
20
|
end
|
20
21
|
end
|
21
22
|
|
22
|
-
def
|
23
|
+
def singleton_method_added(method)
|
24
|
+
raise "Adding singleton methods (#{method}) to tests is not supported here" if __current_test_environment?
|
25
|
+
|
26
|
+
super
|
27
|
+
end
|
28
|
+
|
29
|
+
def_delegator :__current_test_environment, :subject
|
30
|
+
def_delegator :__current_test_environment, :create
|
31
|
+
|
32
|
+
def __run_test(context:)
|
23
33
|
stack_marker = "calificador_test_#{SecureRandom.uuid.gsub("-", "_")}"
|
24
34
|
|
25
|
-
|
35
|
+
environment = Context::TestEnvironment.new(parent: context, test_instance: self)
|
36
|
+
__register_current_environment(stack_marker: stack_marker, environment: environment)
|
26
37
|
|
27
38
|
begin
|
28
39
|
instance_eval(<<~METHOD, stack_marker, 1)
|
29
|
-
|
40
|
+
environment.run_test
|
30
41
|
METHOD
|
31
42
|
ensure
|
32
|
-
|
43
|
+
__unregister_current_environment(stack_marker: stack_marker)
|
33
44
|
end
|
34
45
|
end
|
35
46
|
|
36
47
|
protected
|
37
48
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
@__calificador_current_test_run = TestRun.new(test_instance: self, test_method: test_method)
|
42
|
-
Calificador::Test.__register_current_run(stack_marker: stack_marker, test_run: @__calificador_current_test_run)
|
49
|
+
def __register_current_environment(stack_marker:, environment:)
|
50
|
+
@__calificador_current_test_environment = environment
|
51
|
+
Calificador::Test.__register_current_environment(stack_marker: stack_marker, environment: environment)
|
43
52
|
end
|
44
53
|
|
45
|
-
def
|
46
|
-
if !instance_variable_defined?(:@
|
54
|
+
def __unregister_current_environment(stack_marker:)
|
55
|
+
if !instance_variable_defined?(:@__calificador_current_test_environment) || @__calificador_current_test_environment.nil?
|
47
56
|
raise StandardError, "No current test run registered"
|
48
57
|
end
|
49
58
|
|
50
|
-
Calificador::Test.
|
51
|
-
@
|
59
|
+
Calificador::Test.__unregister_current_environment(stack_marker: stack_marker)
|
60
|
+
@__calificador_current_test_environment = nil
|
52
61
|
end
|
53
62
|
|
54
|
-
def
|
55
|
-
if !instance_variable_defined?(:@
|
63
|
+
def __current_test_environment
|
64
|
+
if !instance_variable_defined?(:@__calificador_current_test_environment) || @__calificador_current_test_environment.nil?
|
56
65
|
raise StandardError, "No current test run registered"
|
57
66
|
end
|
58
67
|
|
59
|
-
@
|
68
|
+
@__calificador_current_test_environment
|
69
|
+
end
|
70
|
+
|
71
|
+
def __current_test_environment?
|
72
|
+
instance_variable_defined?(:@__calificador_current_test_environment) || !@__calificador_current_test_environment
|
60
73
|
end
|
61
74
|
|
62
75
|
# Class methods for unit tests
|
63
76
|
module ClassMethods
|
77
|
+
extend Forwardable
|
78
|
+
|
64
79
|
def run_all_tests(reporter: MiniTest::CompositeReporter.new)
|
65
80
|
runnable_methods.each do |method|
|
66
81
|
run_one_method(self, method, reporter)
|
67
82
|
end
|
68
83
|
end
|
69
84
|
|
70
|
-
def examines(
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
end
|
76
|
-
|
77
|
-
def factory(type, description = nil, name: nil, &block)
|
78
|
-
__root_context.dsl_config do
|
79
|
-
factory(type, description, name: nil, &block)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def examine(subject_type, description = nil, trait: Key::INHERITED_TRAIT, **values, &block)
|
84
|
-
__root_context.dsl_config do
|
85
|
-
examine(subject_type, description, trait: trait, **values, &block)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def method(method, description = nil, **values, &block)
|
90
|
-
__root_context.dsl_config do
|
91
|
-
method(method, description, &block)
|
85
|
+
def examines(subject_class, *description_or_trait_or_init)
|
86
|
+
if instance_variable_defined?(:@__calificador_root_context) && @__calificador_root_context
|
87
|
+
raise <<~MESSAGE.gsub("\n", " ")
|
88
|
+
Cannot specify 'examines' after a test context has been defined. The 'examines' statement should be the first statement in your test class
|
89
|
+
MESSAGE
|
92
90
|
end
|
93
|
-
end
|
94
91
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
92
|
+
arguments = Context::BasicContext.extract_arguments(
|
93
|
+
subject_key: Key[subject_class],
|
94
|
+
values: description_or_trait_or_init,
|
95
|
+
names: %i[description trait init]
|
96
|
+
)
|
100
97
|
|
101
|
-
|
102
|
-
__root_context.dsl_config do
|
103
|
-
must(description, trait: trait, **values, &block)
|
104
|
-
end
|
105
|
-
end
|
98
|
+
arguments.description ||= __default_instance_description(subject_key: arguments.subject_key)
|
106
99
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
100
|
+
@__calificador_root_context = Context::TestRoot.new(
|
101
|
+
test_class: self,
|
102
|
+
subject_key: arguments.subject_key,
|
103
|
+
description: arguments.description
|
104
|
+
)
|
111
105
|
end
|
112
106
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
end
|
118
|
-
|
119
|
-
def without(description, trait: Key::INHERITED_TRAIT, **values, &block)
|
120
|
-
__root_context.dsl_config do
|
121
|
-
without(description, trait: trait, **values, &block)
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
def where(description, trait: Key::INHERITED_TRAIT, **values, &block)
|
126
|
-
__root_context.dsl_config do
|
127
|
-
where(description, trait: trait, **values, &block)
|
128
|
-
end
|
129
|
-
end
|
107
|
+
def_delegators :__calificador_current_context, :factory, :mock
|
108
|
+
def_delegators :__calificador_current_context, :type, :examine, :operation, :with, :without, :where
|
109
|
+
def_delegators :__calificador_current_context, :must, :must_fail
|
110
|
+
def_delegators :__calificador_current_context, :args, :props
|
130
111
|
|
131
112
|
def body(&block)
|
132
113
|
class_eval(&block)
|
133
114
|
end
|
134
115
|
|
135
|
-
def
|
136
|
-
|
137
|
-
type_name = name.gsub(%r{(?<=\w)Test\z}, "")
|
138
|
-
|
139
|
-
if Kernel.const_defined?(type_name)
|
140
|
-
@__calificador_subject_type = Kernel.const_get(type_name)
|
141
|
-
else
|
142
|
-
raise StandardError, "Cannot determine test subject type from test class name '#{name}'"
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
@__calificador_subject_type
|
116
|
+
def __default_type_description(subject_key:)
|
117
|
+
subject_key.type.name_without_common_parents(base: self)
|
147
118
|
end
|
148
119
|
|
149
|
-
def
|
150
|
-
|
151
|
-
raise StandardError, "Cannot redefine test subject type"
|
152
|
-
end
|
120
|
+
def __default_instance_description(subject_key:)
|
121
|
+
description = StringIO.new
|
153
122
|
|
154
|
-
|
155
|
-
|
123
|
+
description << subject_key.type.name_without_common_parents(base: self)
|
124
|
+
description << "(" << subject_key.trait.to_s.gsub("_", " ") << ")" if subject_key.trait?
|
156
125
|
|
157
|
-
|
158
|
-
if !instance_variable_defined?(:@__calificador_subject_trait) || @__calificador_subject_trait.nil?
|
159
|
-
@__calificador_subject_trait = Key::DEFAULT_TRAIT
|
160
|
-
end
|
161
|
-
|
162
|
-
@__calificador_subject_trait
|
126
|
+
description.string
|
163
127
|
end
|
164
128
|
|
165
|
-
def
|
166
|
-
|
167
|
-
|
168
|
-
|
129
|
+
def __default_factory_name(subject_key:)
|
130
|
+
description = StringIO.new
|
131
|
+
|
132
|
+
description << subject_key.type.base_name.snake_case
|
133
|
+
description << "_" << subject_key.trait.to_s if subject_key.trait?
|
169
134
|
|
170
|
-
|
135
|
+
description.string
|
171
136
|
end
|
172
137
|
|
173
138
|
def __root_context
|
174
139
|
if !instance_variable_defined?(:@__calificador_root_context) || @__calificador_root_context.nil?
|
175
|
-
|
176
|
-
description = "#{description} {#{__subject_trait}}" unless __subject_trait.equal?(Key::DEFAULT_TRAIT)
|
140
|
+
subject_key = __calificador_guess_subject_key
|
177
141
|
|
178
|
-
@__calificador_root_context =
|
142
|
+
@__calificador_root_context = Context::TestRoot.new(
|
179
143
|
test_class: self,
|
180
|
-
subject_key:
|
181
|
-
description:
|
144
|
+
subject_key: subject_key,
|
145
|
+
description: __default_instance_description(subject_key: subject_key)
|
182
146
|
)
|
183
147
|
end
|
184
148
|
|
185
149
|
@__calificador_root_context
|
186
150
|
end
|
187
151
|
|
188
|
-
def
|
152
|
+
def __register_current_environment(stack_marker:, environment:)
|
189
153
|
__calificador_test_lock.synchronize do
|
190
|
-
|
154
|
+
if __calificador_test_environments.key?(stack_marker)
|
155
|
+
raise KeyError,
|
156
|
+
"Test run #{stack_marker} already registered"
|
157
|
+
end
|
191
158
|
|
192
|
-
|
159
|
+
__calificador_test_environments[stack_marker] = environment
|
193
160
|
end
|
194
161
|
end
|
195
162
|
|
196
|
-
def
|
163
|
+
def __unregister_current_environment(stack_marker:)
|
197
164
|
__calificador_test_lock.synchronize do
|
198
|
-
if
|
165
|
+
if __calificador_test_environments.delete(stack_marker).nil?
|
199
166
|
raise KeyError, "Could not unregister test #{stack_marker}"
|
200
167
|
end
|
201
168
|
end
|
202
169
|
end
|
203
170
|
|
204
|
-
def
|
171
|
+
def __current_test_environment
|
205
172
|
__calificador_test_lock.synchronize do
|
206
173
|
location = ::Kernel.caller_locations.find do |l|
|
207
174
|
%r{\Acalificador_test_[a-zA-Z0-9_]+\z} =~ l.path
|
@@ -209,49 +176,59 @@ module Calificador
|
|
209
176
|
|
210
177
|
raise StandardError, "Could not find current test run in call stack" unless location
|
211
178
|
|
212
|
-
|
179
|
+
__calificador_test_environments.fetch(location.path) do
|
213
180
|
raise KeyError, "No test run registered for #{location.path}"
|
214
181
|
end
|
215
182
|
end
|
216
183
|
end
|
217
184
|
|
218
|
-
def
|
219
|
-
|
185
|
+
def __calificador_configure(context:, block:)
|
186
|
+
__calificador_push_context(context)
|
220
187
|
|
221
|
-
|
188
|
+
begin
|
189
|
+
class_exec(&block)
|
190
|
+
ensure
|
191
|
+
__calificador_pop_context
|
192
|
+
end
|
222
193
|
end
|
223
194
|
|
224
|
-
def
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
factory_method_name = if factory.name.to_s.start_with?("test_")
|
229
|
-
"create_#{factory.name}"
|
230
|
-
else
|
231
|
-
factory.name
|
232
|
-
end
|
195
|
+
def method_added(method)
|
196
|
+
if !method.start_with?("test_: ") && __calificador_contexts.size > 1
|
197
|
+
raise "Adding methods (#{method}) to tests is not supported here"
|
198
|
+
end
|
233
199
|
|
234
|
-
|
235
|
-
|
236
|
-
end
|
200
|
+
super
|
201
|
+
end
|
237
202
|
|
238
|
-
|
239
|
-
trait = factory.key.trait # rubocop:disable Lint/UselessAssignment
|
203
|
+
protected
|
240
204
|
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
end
|
245
|
-
METHOD
|
205
|
+
def __calificador_contexts
|
206
|
+
if !instance_variable_defined?(:@__calificador_contexts) || @__calificador_contexts.nil?
|
207
|
+
@__calificador_contexts = [__root_context]
|
246
208
|
end
|
209
|
+
|
210
|
+
@__calificador_contexts
|
247
211
|
end
|
248
212
|
|
249
|
-
|
213
|
+
def __calificador_push_context(context)
|
214
|
+
__calificador_contexts.push(context)
|
215
|
+
context
|
216
|
+
end
|
250
217
|
|
251
|
-
def
|
252
|
-
|
218
|
+
def __calificador_pop_context
|
219
|
+
raise "Cannot remove root context" unless __calificador_contexts.size > 1
|
220
|
+
|
221
|
+
__calificador_contexts.pop
|
222
|
+
end
|
253
223
|
|
254
|
-
|
224
|
+
def __calificador_current_context
|
225
|
+
__calificador_contexts.last
|
226
|
+
end
|
227
|
+
|
228
|
+
def __calificador_test_environments
|
229
|
+
@__calificador_test_environments = {} unless instance_variable_defined?(:@__calificador_test_environments)
|
230
|
+
|
231
|
+
@__calificador_test_environments
|
255
232
|
end
|
256
233
|
|
257
234
|
def __calificador_test_lock
|
@@ -259,6 +236,33 @@ module Calificador
|
|
259
236
|
|
260
237
|
@__calificador_test_lock
|
261
238
|
end
|
239
|
+
|
240
|
+
def __calificador_guess_subject_key
|
241
|
+
type_name = name&.gsub(%r{(?<=\w)Test\z}, "")
|
242
|
+
|
243
|
+
unless type_name
|
244
|
+
raise StandardError, <<~MESSAGE.gsub("\n", " ")
|
245
|
+
Cannot guess test subject class from test class name '#{name}'. Please use 'examines' to specify the test subject.
|
246
|
+
MESSAGE
|
247
|
+
end
|
248
|
+
|
249
|
+
unless Kernel.const_defined?(type_name)
|
250
|
+
raise StandardError, <<~MESSAGE.gsub("\n", " ")
|
251
|
+
Guessed test subject type (#{type_name}) does not exist. Please use 'examines' to specify the test subject.
|
252
|
+
MESSAGE
|
253
|
+
end
|
254
|
+
|
255
|
+
subject_type = Kernel.const_get(type_name)
|
256
|
+
|
257
|
+
if subject_type <= Singleton || subject_type <= BasicObject || subject_type.is_a?(Module)
|
258
|
+
Key[subject_type]
|
259
|
+
else
|
260
|
+
raise StandardError, <<~MESSAGE.gsub("\n", " ")
|
261
|
+
Guessed test subject type (#{subject_type}) is not a Class, a Module or a Singleton. Please use 'examines'
|
262
|
+
to specify the test subject.
|
263
|
+
MESSAGE
|
264
|
+
end
|
265
|
+
end
|
262
266
|
end
|
263
267
|
end
|
264
268
|
end
|