rspec-json_matchers 0.1.0.alpha.1 → 0.1.0.alpha.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -1
- data/.rubocop.yml +31 -0
- data/Gemfile +1 -1
- data/README.md +36 -0
- data/Rakefile +1 -1
- data/doc/Story.md +129 -0
- data/lib/rspec-json_matchers.rb +1 -1
- data/lib/rspec/json_matchers/comparers/abstract_comparer.rb +111 -77
- data/lib/rspec/json_matchers/comparers/comparison_result.rb +1 -1
- data/lib/rspec/json_matchers/comparers/exact_keys_comparer.rb +6 -6
- data/lib/rspec/json_matchers/comparers/include_keys_comparer.rb +5 -6
- data/lib/rspec/json_matchers/expectation.rb +81 -31
- data/lib/rspec/json_matchers/expectations/abstract.rb +4 -3
- data/lib/rspec/json_matchers/expectations/core.rb +12 -8
- data/lib/rspec/json_matchers/expectations/mixins/built_in.rb +25 -13
- data/lib/rspec/json_matchers/expectations/private.rb +40 -33
- data/lib/rspec/json_matchers/matchers.rb +3 -3
- data/lib/rspec/json_matchers/matchers/be_json_matcher.rb +16 -6
- data/lib/rspec/json_matchers/matchers/be_json_with_sizes_matcher.rb +4 -1
- data/lib/rspec/json_matchers/matchers/be_json_with_something_matcher.rb +51 -37
- data/lib/rspec/json_matchers/utils/collection_keys_extractor.rb +4 -3
- data/lib/rspec/json_matchers/utils/key_path/extraction.rb +149 -0
- data/lib/rspec/json_matchers/utils/key_path/path.rb +18 -12
- data/lib/rspec/json_matchers/version.rb +3 -1
- data/rspec-json_matchers.gemspec +7 -5
- metadata +7 -5
- data/lib/rspec/json_matchers/utils/key_path/extraction_result.rb +0 -22
- data/lib/rspec/json_matchers/utils/key_path/extractor.rb +0 -70
@@ -12,15 +12,15 @@ module RSpec
|
|
12
12
|
|
13
13
|
# @note with side effect on `#reasons`
|
14
14
|
def has_matched_keys?
|
15
|
-
actual_keys = Utils::CollectionKeysExtractor.extract(actual)
|
16
|
-
expected_keys = Utils::CollectionKeysExtractor.extract(expected)
|
17
15
|
(actual_keys == expected_keys).tap do |success|
|
18
|
-
unless success
|
19
|
-
diff_keys = (actual_keys - expected_keys) + (expected_keys - actual_keys)
|
20
|
-
reasons.push(diff_keys.awesome_inspect)
|
21
|
-
end
|
16
|
+
reasons.push(diff_keys.awesome_inspect) unless success
|
22
17
|
end
|
23
18
|
end
|
19
|
+
|
20
|
+
def diff_keys
|
21
|
+
(actual_keys - expected_keys) +
|
22
|
+
(expected_keys - actual_keys)
|
23
|
+
end
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -12,15 +12,14 @@ module RSpec
|
|
12
12
|
|
13
13
|
# @note with side effect on `#reasons`
|
14
14
|
def has_matched_keys?
|
15
|
-
actual_keys = Utils::CollectionKeysExtractor.extract(actual)
|
16
|
-
expected_keys = Utils::CollectionKeysExtractor.extract(expected)
|
17
15
|
(expected_keys.subset?(actual_keys)).tap do |success|
|
18
|
-
unless success
|
19
|
-
diff_keys = (expected_keys - actual_keys)
|
20
|
-
reasons.push(diff_keys.awesome_inspect)
|
21
|
-
end
|
16
|
+
reasons.push(diff_keys.awesome_inspect) unless success
|
22
17
|
end
|
23
18
|
end
|
19
|
+
|
20
|
+
def diff_keys
|
21
|
+
expected_keys - actual_keys
|
22
|
+
end
|
24
23
|
end
|
25
24
|
end
|
26
25
|
end
|
@@ -3,7 +3,8 @@ require "abstract_class"
|
|
3
3
|
module RSpec
|
4
4
|
module JsonMatchers
|
5
5
|
# Represents an expectation of an object (usually called `expected`)
|
6
|
-
# Built to avoid {Object#===} usage like other matcher gems,
|
6
|
+
# Built to avoid {Object#===} usage like other matcher gems,
|
7
|
+
# like `rspec-json_matcher`
|
7
8
|
# Actually `rspec-mocks` `3.x` also uses it, but only internally
|
8
9
|
#
|
9
10
|
# @api
|
@@ -11,18 +12,24 @@ module RSpec
|
|
11
12
|
# But only used for this gem
|
12
13
|
# @abstract
|
13
14
|
# This class MUST be used after being inherited
|
14
|
-
# Subclasses MUST override {#expect?}
|
15
|
+
# Subclasses MUST override {#expect?}
|
16
|
+
# to allow this gem to determine the test result
|
15
17
|
class Expectation
|
16
18
|
extend AbstractClass
|
17
19
|
|
20
|
+
# Determine the value passed in
|
21
|
+
# is "expected" by self or not
|
22
|
+
# And return the result
|
23
|
+
#
|
18
24
|
# @abstract
|
19
|
-
# This method MUST be overridden
|
25
|
+
# This method MUST be overridden
|
26
|
+
# to allow this gem to determine the test result
|
20
27
|
#
|
21
|
-
# @param
|
28
|
+
# @param _value [Object] actual value to be evaluated
|
22
29
|
#
|
23
30
|
# @return [Bool] Whether the `value` is expected
|
24
|
-
def expect?(
|
25
|
-
|
31
|
+
def expect?(_value)
|
32
|
+
fail NotImplementedError
|
26
33
|
end
|
27
34
|
|
28
35
|
class << self
|
@@ -35,30 +42,7 @@ module RSpec
|
|
35
42
|
#
|
36
43
|
# @return [Expectation]
|
37
44
|
def build(value)
|
38
|
-
|
39
|
-
|
40
|
-
if value.is_a?(Regexp)
|
41
|
-
return Expectations::Private::MatchingRegexp[value]
|
42
|
-
end
|
43
|
-
|
44
|
-
if value.is_a?(Range)
|
45
|
-
return Expectations::Private::InRange[value]
|
46
|
-
end
|
47
|
-
|
48
|
-
if value.respond_to?(:call)
|
49
|
-
return Expectations::Private::SatisfyingCallable[value]
|
50
|
-
end
|
51
|
-
|
52
|
-
if value.is_a?(Class)
|
53
|
-
# Subclass
|
54
|
-
# See http://ruby-doc.org/core-2.2.2/Module.html#method-i-3C
|
55
|
-
if value < Expectations::Core::SingletonExpectation
|
56
|
-
return value::INSTANCE
|
57
|
-
end
|
58
|
-
return Expectations::Private::KindOf[value]
|
59
|
-
end
|
60
|
-
|
61
|
-
Expectations::Private::Eq[value]
|
45
|
+
Builder.new(value).build
|
62
46
|
end
|
63
47
|
# @api private
|
64
48
|
#
|
@@ -67,7 +51,73 @@ module RSpec
|
|
67
51
|
# @return [Array<Expectation>]
|
68
52
|
# @see .build
|
69
53
|
def build_many(values)
|
70
|
-
values.flat_map{|v| build(v) }
|
54
|
+
values.flat_map { |v| build(v) }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# @api private
|
59
|
+
#
|
60
|
+
# Represents a builder that
|
61
|
+
# returns a {Expectation} object from an input object
|
62
|
+
class Builder
|
63
|
+
# Creates a bullder with an object that
|
64
|
+
# might or might not be a {Expectation} object
|
65
|
+
#
|
66
|
+
# @param object [Object]
|
67
|
+
# any object that should be "built"
|
68
|
+
# into a {Expectation} object
|
69
|
+
def initialize(object)
|
70
|
+
@object = object
|
71
|
+
end
|
72
|
+
|
73
|
+
# Create and return a {Expectation} object
|
74
|
+
# according to one of the following
|
75
|
+
# - the class of object
|
76
|
+
# - does the object respond to `#call`
|
77
|
+
# - the ancestors of the object (when it's a class)
|
78
|
+
#
|
79
|
+
# @return [Expectation] a {Expectation} object
|
80
|
+
def build
|
81
|
+
return object if object.is_a?(Expectation)
|
82
|
+
return expectation_by_class unless expectation_by_class.nil?
|
83
|
+
return expectation_for_call if object.respond_to?(:call)
|
84
|
+
return expectation_by_ancestors if object.is_a?(Class)
|
85
|
+
|
86
|
+
Expectations::Private::Eq[object]
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
OBJECT_CLASS_TO_EXPECTATION_HASH = {
|
92
|
+
Regexp => -> (obj) { Expectations::Private::MatchingRegexp[obj] },
|
93
|
+
Range => -> (obj) { Expectations::Private::InRange[obj] },
|
94
|
+
}.freeze
|
95
|
+
private_constant :OBJECT_CLASS_TO_EXPECTATION_HASH
|
96
|
+
|
97
|
+
attr_reader(*[:object])
|
98
|
+
|
99
|
+
def expectation_by_class
|
100
|
+
if instance_variable_defined?(:@expectation_by_object_class)
|
101
|
+
return @expectation_by_object_class
|
102
|
+
end
|
103
|
+
|
104
|
+
proc = OBJECT_CLASS_TO_EXPECTATION_HASH[object.class]
|
105
|
+
return nil if proc.nil?
|
106
|
+
|
107
|
+
proc.call(object)
|
108
|
+
end
|
109
|
+
|
110
|
+
def expectation_by_ancestors
|
111
|
+
# Subclass
|
112
|
+
# See http://ruby-doc.org/core-2.2.2/Module.html#method-i-3C
|
113
|
+
if object < Expectations::Core::SingletonExpectation
|
114
|
+
return object::INSTANCE
|
115
|
+
end
|
116
|
+
Expectations::Private::KindOf[object]
|
117
|
+
end
|
118
|
+
|
119
|
+
def expectation_for_call
|
120
|
+
Expectations::Private::SatisfyingCallable[object]
|
71
121
|
end
|
72
122
|
end
|
73
123
|
end
|
@@ -6,12 +6,14 @@ module RSpec
|
|
6
6
|
module JsonMatchers
|
7
7
|
module Expectations
|
8
8
|
# @api private
|
9
|
-
# All classes within module
|
9
|
+
# All classes within module
|
10
|
+
# should NOT be able to be used directly / extended
|
10
11
|
#
|
11
12
|
# Classes in this namespace are depending on {Core}
|
12
13
|
# and depended by some classes in {Expectations::Mixins::BuiltIn}
|
13
14
|
# They are all abstract too, thus the naming, but might change
|
14
|
-
# This namespace is created is to avoid require order problem
|
15
|
+
# This namespace is created is to avoid require order problem
|
16
|
+
# when putting classes here in {Private}
|
15
17
|
module Abstract
|
16
18
|
# @abstract
|
17
19
|
# Only for reducing code duplication
|
@@ -29,7 +31,6 @@ module RSpec
|
|
29
31
|
value.is_a?(Numeric)
|
30
32
|
end
|
31
33
|
end
|
32
|
-
|
33
34
|
end
|
34
35
|
end
|
35
36
|
end
|
@@ -14,9 +14,11 @@ module RSpec
|
|
14
14
|
module Core
|
15
15
|
# @abstract
|
16
16
|
# This class MUST be used after being inherited
|
17
|
-
# Subclasses will have a constant `INSTANCE`
|
17
|
+
# Subclasses will have a constant `INSTANCE`
|
18
|
+
# storing the only instance of that class
|
18
19
|
# @note
|
19
|
-
# This class assumed descendants to NOT
|
20
|
+
# This class assumed descendants to NOT
|
21
|
+
# override {.inherited} or call `super` if overridden
|
20
22
|
# Otherwise the constant `INSTANCE` won't work
|
21
23
|
# @note
|
22
24
|
# The constant `INSTANCE` will be referred with namespace,
|
@@ -69,22 +71,22 @@ module RSpec
|
|
69
71
|
# But only 1 argument is accepted
|
70
72
|
def self.[](*values)
|
71
73
|
unless values.size == EXPECTED_VALUE_SIZE
|
72
|
-
|
74
|
+
fail(
|
75
|
+
ArgumentError,
|
76
|
+
"Exactly #{EXPECTED_VALUE_SIZE} argument is required",
|
77
|
+
)
|
73
78
|
end
|
74
79
|
super
|
75
80
|
end
|
76
81
|
end
|
77
82
|
|
78
|
-
# Takes any number of objects and
|
83
|
+
# Takes any number of objects and
|
84
|
+
# converts into expectation objects (if not already)
|
79
85
|
#
|
80
86
|
# @abstract
|
81
87
|
class CompositeExpectation < CallableExpectation
|
82
88
|
extend AbstractClass
|
83
89
|
|
84
|
-
private
|
85
|
-
attr_reader :expectations
|
86
|
-
public
|
87
|
-
|
88
90
|
# (see CallableExpectation.[])
|
89
91
|
# Also all values will be converted into expectations
|
90
92
|
def self.[](*values)
|
@@ -93,6 +95,8 @@ module RSpec
|
|
93
95
|
|
94
96
|
private
|
95
97
|
|
98
|
+
attr_reader :expectations
|
99
|
+
|
96
100
|
def initialize(expectations)
|
97
101
|
@expectations = expectations
|
98
102
|
end
|
@@ -9,7 +9,8 @@ module RSpec
|
|
9
9
|
# @api
|
10
10
|
# The modules under this module can be included (in RSpec)
|
11
11
|
#
|
12
|
-
# If this gem or extensions gems decide to
|
12
|
+
# If this gem or extensions gems decide to
|
13
|
+
# add different groups of expectations classes
|
13
14
|
# Which aim to be included in example groups
|
14
15
|
# They should add the namespace modules here
|
15
16
|
module Mixins
|
@@ -22,7 +23,8 @@ module RSpec
|
|
22
23
|
module BuiltIn
|
23
24
|
# Whatever the value is, it just passes
|
24
25
|
# A more verbose solution than passing {Object} in
|
25
|
-
# (That also works since everything parsed
|
26
|
+
# (That also works since everything parsed
|
27
|
+
# by {JSON} inherits from {Object})
|
26
28
|
#
|
27
29
|
# @example
|
28
30
|
# { key_with_unstable_content => Anything }
|
@@ -61,22 +63,20 @@ module RSpec
|
|
61
63
|
end
|
62
64
|
end
|
63
65
|
|
64
|
-
# Takes exactly one object and converts to
|
66
|
+
# Takes exactly one object and converts to
|
67
|
+
# an expectation object (if not already)
|
65
68
|
# Validates `value` to be {Array}
|
66
69
|
# And uses stored expectation for checking all elements of `value`
|
67
70
|
class ArrayOf < Expectations::Core::SingleValueCallableExpectation
|
68
|
-
private
|
69
|
-
attr_reader :children_elements_expectation
|
70
|
-
public
|
71
|
-
|
72
71
|
def expect?(value)
|
73
72
|
value.is_a?(Array) &&
|
74
73
|
(empty_allowed? || !value.empty?) &&
|
75
|
-
value.all? {|v| children_elements_expectation.expect?(v) }
|
74
|
+
value.all? { |v| children_elements_expectation.expect?(v) }
|
76
75
|
end
|
77
76
|
|
78
77
|
# {Enumerable#all?} returns `true` when collection is empty
|
79
|
-
# So this method can be called to signal the expectation to
|
78
|
+
# So this method can be called to signal the expectation to
|
79
|
+
# do or do not expect an empty collection
|
80
80
|
#
|
81
81
|
# @param allow [Boolean]
|
82
82
|
# optional
|
@@ -84,7 +84,7 @@ module RSpec
|
|
84
84
|
#
|
85
85
|
# @return [ArrayOf] the matcher itself
|
86
86
|
def allow_empty(allow = true)
|
87
|
-
@empty_allowed =
|
87
|
+
@empty_allowed = allow
|
88
88
|
self
|
89
89
|
end
|
90
90
|
|
@@ -97,13 +97,15 @@ module RSpec
|
|
97
97
|
|
98
98
|
private
|
99
99
|
|
100
|
+
attr_reader :children_elements_expectation
|
101
|
+
|
100
102
|
def initialize(value)
|
101
103
|
@children_elements_expectation = Expectation.build(value)
|
102
104
|
@empty_allowed = true
|
103
105
|
end
|
104
106
|
|
105
107
|
def empty_allowed?
|
106
|
-
|
108
|
+
@empty_allowed
|
107
109
|
end
|
108
110
|
end
|
109
111
|
|
@@ -127,6 +129,15 @@ module RSpec
|
|
127
129
|
end
|
128
130
|
end
|
129
131
|
|
132
|
+
# (see AnyOf)
|
133
|
+
# It will pass regardless of {#expectations}
|
134
|
+
# if the value is `nil`
|
135
|
+
class NullableOf < AnyOf
|
136
|
+
def expect?(value)
|
137
|
+
value.nil? || super
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
130
141
|
# Takes any number of {Integer} or {Range} (if not already)
|
131
142
|
# Validates `value` to be {Array}
|
132
143
|
# And the size matches any value passed in
|
@@ -134,7 +145,8 @@ module RSpec
|
|
134
145
|
# @note
|
135
146
|
# For behaviour of "and" (which should be a rare case)
|
136
147
|
# Combine {AllOf} & {ArrayWithSize}
|
137
|
-
# Or raise an issue to add support for
|
148
|
+
# Or raise an issue to add support for
|
149
|
+
# switching to "and" with another method call
|
138
150
|
class ArrayWithSize < AnyOf
|
139
151
|
# `Fixnum` & `Bignum` will be returned instead of `Integer`
|
140
152
|
# in `#class` for numbers
|
@@ -149,7 +161,7 @@ module RSpec
|
|
149
161
|
# Overrides {Expectation.build}
|
150
162
|
def build(value)
|
151
163
|
expectation_classes_mappings.fetch(value.class) do
|
152
|
-
-> (_) {
|
164
|
+
-> (_) { fail ArgumentError, <<-ERR }
|
153
165
|
Expected expection(s) to be kind of
|
154
166
|
#{expectation_classes_mappings.keys.inspect}
|
155
167
|
but found #{value.inspect}
|
@@ -7,10 +7,13 @@ module RSpec
|
|
7
7
|
module JsonMatchers
|
8
8
|
module Expectations
|
9
9
|
# @api private
|
10
|
-
# All classes within module should NOT be able
|
10
|
+
# All classes within module should NOT be able
|
11
|
+
# to be used directly / extended
|
11
12
|
#
|
12
|
-
# All classes in this module are internal expectations used
|
13
|
-
#
|
13
|
+
# All classes in this module are internal expectations used
|
14
|
+
# when non-expectation object/class is passed in
|
15
|
+
# Extension gems should have their own namespace and
|
16
|
+
# should NOT add new classes to this namespace
|
14
17
|
# Classes here have dependency on {Core} & {Mixins::BuiltIn}
|
15
18
|
#
|
16
19
|
# TODO: Remove dependency on {Mixins::BuiltIn}
|
@@ -21,16 +24,14 @@ module RSpec
|
|
21
24
|
# Takes exactly one object
|
22
25
|
# Use stored value & `==` for checking `value`
|
23
26
|
class Eq < Core::SingleValueCallableExpectation
|
24
|
-
private
|
25
|
-
attr_reader :expected_value
|
26
|
-
public
|
27
|
-
|
28
27
|
def expect?(value)
|
29
28
|
value == expected_value
|
30
29
|
end
|
31
30
|
|
32
31
|
private
|
33
32
|
|
33
|
+
attr_reader :expected_value
|
34
|
+
|
34
35
|
def initialize(value)
|
35
36
|
@expected_value = value
|
36
37
|
end
|
@@ -50,18 +51,18 @@ module RSpec
|
|
50
51
|
EXPECTED_CLASS = Class
|
51
52
|
private_constant :EXPECTED_CLASS
|
52
53
|
|
53
|
-
private
|
54
|
-
attr_reader :expected_class
|
55
|
-
public
|
56
|
-
|
57
54
|
def expect?(value)
|
58
55
|
value.is_a?(expected_class)
|
59
56
|
end
|
60
57
|
|
61
58
|
private
|
62
59
|
|
60
|
+
attr_reader :expected_class
|
61
|
+
|
63
62
|
def initialize(value)
|
64
|
-
|
63
|
+
unless value.is_a?(EXPECTED_CLASS)
|
64
|
+
fail ArgumentError, "a #{EXPECTED_CLASS} is required"
|
65
|
+
end
|
65
66
|
@expected_class = value
|
66
67
|
end
|
67
68
|
end
|
@@ -75,18 +76,18 @@ module RSpec
|
|
75
76
|
EXPECTED_CLASS = Range
|
76
77
|
private_constant :EXPECTED_CLASS
|
77
78
|
|
78
|
-
private
|
79
|
-
attr_reader :range
|
80
|
-
public
|
81
|
-
|
82
79
|
def expect?(value)
|
83
80
|
range.cover?(value)
|
84
81
|
end
|
85
82
|
|
86
83
|
private
|
87
84
|
|
85
|
+
attr_reader :range
|
86
|
+
|
88
87
|
def initialize(value)
|
89
|
-
|
88
|
+
unless value.is_a?(EXPECTED_CLASS)
|
89
|
+
fail ArgumentError, "a #{EXPECTED_CLASS} is required"
|
90
|
+
end
|
90
91
|
@range = value
|
91
92
|
end
|
92
93
|
end
|
@@ -100,20 +101,20 @@ module RSpec
|
|
100
101
|
EXPECTED_CLASS = Regexp
|
101
102
|
private_constant :EXPECTED_CLASS
|
102
103
|
|
103
|
-
private
|
104
|
-
attr_reader :regexp
|
105
|
-
public
|
106
|
-
|
107
104
|
def expect?(value)
|
108
105
|
# regex =~ string seems to be fastest
|
109
106
|
# @see https://stackoverflow.com/questions/11887145/fastest-way-to-check-if-a-string-matches-or-not-a-regexp-in-ruby
|
110
|
-
value.is_a?(String) &&
|
107
|
+
value.is_a?(String) && regexp =~ value
|
111
108
|
end
|
112
109
|
|
113
110
|
private
|
114
111
|
|
112
|
+
attr_reader :regexp
|
113
|
+
|
115
114
|
def initialize(value)
|
116
|
-
|
115
|
+
unless value.is_a?(EXPECTED_CLASS)
|
116
|
+
fail ArgumentError, "a #{EXPECTED_CLASS} is required"
|
117
|
+
end
|
117
118
|
@regexp = value
|
118
119
|
end
|
119
120
|
end
|
@@ -124,18 +125,19 @@ module RSpec
|
|
124
125
|
# Takes exactly one object
|
125
126
|
# Use stored proc for checking `value`
|
126
127
|
class SatisfyingCallable < Core::SingleValueCallableExpectation
|
127
|
-
private
|
128
|
-
attr_reader :callable
|
129
|
-
public
|
130
|
-
|
131
128
|
def expect?(value)
|
132
129
|
callable.call(value)
|
133
130
|
end
|
134
131
|
|
135
132
|
private
|
136
133
|
|
134
|
+
attr_reader :callable
|
135
|
+
|
137
136
|
def initialize(value)
|
138
|
-
|
137
|
+
unless value.respond_to?(:call)
|
138
|
+
fail ArgumentError,
|
139
|
+
"an object which respond to `:call` is required"
|
140
|
+
end
|
139
141
|
@callable = value
|
140
142
|
end
|
141
143
|
end
|
@@ -154,24 +156,29 @@ module RSpec
|
|
154
156
|
# Used internally by a matcher method
|
155
157
|
#
|
156
158
|
# Comparing to {Expectations::Mixins::BuiltIn::ArrayWithSize}
|
157
|
-
# This also accepts `Hash` and `Array
|
159
|
+
# This also accepts `Hash` and `Array`
|
160
|
+
# and return false for collection matching
|
158
161
|
class ArrayWithSize < Expectations::Mixins::BuiltIn::ArrayWithSize
|
159
162
|
# `Fixnum` & `Bignum` will be returned instead of `Integer`
|
160
163
|
# in `#class` for numbers
|
161
|
-
|
164
|
+
ADDITIONAL_EXPECTATION_CLASS_MAPPINGS = {
|
162
165
|
Array => -> (_) { Expectations::Private::Nothing::INSTANCE },
|
163
166
|
Hash => -> (_) { Expectations::Private::Nothing::INSTANCE },
|
164
167
|
}.freeze
|
165
|
-
private_constant :
|
168
|
+
private_constant :ADDITIONAL_EXPECTATION_CLASS_MAPPINGS
|
166
169
|
|
167
170
|
class << self
|
168
171
|
private
|
169
172
|
|
170
|
-
# Overrides
|
173
|
+
# Overrides
|
174
|
+
# {Expectations::Mixins::BuiltIn::ArrayWithSize.
|
175
|
+
# expectation_classes_mappings}
|
171
176
|
#
|
172
177
|
# @return [Hash]
|
173
178
|
def expectation_classes_mappings
|
174
|
-
super.merge(
|
179
|
+
super.merge(
|
180
|
+
ADDITIONAL_EXPECTATION_CLASS_MAPPINGS,
|
181
|
+
)
|
175
182
|
end
|
176
183
|
end
|
177
184
|
end
|