matchi 3.3.1 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,9 +4,6 @@ module Matchi
4
4
  class BeWithin
5
5
  # *BeWithin of* matcher.
6
6
  class Of
7
- # @return [Numeric] An expected value.
8
- attr_reader :expected
9
-
10
7
  # Initialize the matcher with a delta and an expected value.
11
8
  #
12
9
  # @example
@@ -17,6 +14,10 @@ module Matchi
17
14
  # @param delta [Numeric] The accepted variation of the actual value.
18
15
  # @param expected [Numeric] The expected value.
19
16
  def initialize(delta, expected)
17
+ raise ::ArgumentError, "delta must be a Numeric" unless delta.is_a?(::Numeric)
18
+ raise ::ArgumentError, "expected must be a Numeric" unless expected.is_a?(::Numeric)
19
+ raise ::ArgumentError, "delta must be non-negative" if delta.negative?
20
+
20
21
  @delta = delta
21
22
  @expected = expected
22
23
  end
@@ -28,25 +29,22 @@ module Matchi
28
29
  # require "matchi/be_within/of"
29
30
  #
30
31
  # matcher = Matchi::BeWithin::Of.new(1, 41)
31
- #
32
- # matcher.expected # => 41
33
- # matcher.matches? { 42 } # => true
32
+ # matcher.match? { 42 } # => true
34
33
  #
35
34
  # @yieldreturn [Numeric] The block of code to execute.
36
35
  #
37
36
  # @return [Boolean] Comparison between the actual and the expected values.
38
- def matches?
39
- (expected - yield).abs <= @delta
40
- end
37
+ def match?
38
+ raise ::ArgumentError, "a block must be provided" unless block_given?
41
39
 
42
- # A string containing a human-readable representation of the matcher.
43
- def inspect
44
- "#{self.class}(#{@delta}, #{expected})"
40
+ (@expected - yield).abs <= @delta
45
41
  end
46
42
 
47
43
  # Returns a string representing the matcher.
44
+ #
45
+ # @return [String] a human-readable description of the matcher
48
46
  def to_s
49
- "be within #{@delta} of #{expected}"
47
+ "be within #{@delta} of #{@expected}"
50
48
  end
51
49
  end
52
50
  end
@@ -14,6 +14,9 @@ module Matchi
14
14
  #
15
15
  # @param delta [Numeric] A numeric value.
16
16
  def initialize(delta)
17
+ raise ::ArgumentError, "delta must be a Numeric" unless delta.is_a?(::Numeric)
18
+ raise ::ArgumentError, "delta must be non-negative" if delta.negative?
19
+
17
20
  @delta = delta
18
21
  end
19
22
 
@@ -27,7 +30,7 @@ module Matchi
27
30
  #
28
31
  # @param expected [Numeric] The expected value.
29
32
  #
30
- # @return [#matches?] A *be_within of* matcher.
33
+ # @return [#match?] A *be_within of* matcher.
31
34
  def of(expected)
32
35
  Of.new(@delta, expected)
33
36
  end
@@ -4,9 +4,6 @@ module Matchi
4
4
  class Change
5
5
  # *Change by* matcher.
6
6
  class By
7
- # @return [#object_id] An expected delta.
8
- attr_reader :expected
9
-
10
7
  # Initialize the matcher with an object and a block.
11
8
  #
12
9
  # @example
@@ -20,6 +17,9 @@ module Matchi
20
17
  # @param state [Proc] A block of code to execute to get the
21
18
  # state of the object.
22
19
  def initialize(expected, &state)
20
+ raise ::ArgumentError, "expected must be a Numeric" unless expected.is_a?(::Numeric)
21
+ raise ::ArgumentError, "a block must be provided" unless block_given?
22
+
23
23
  @expected = expected
24
24
  @state = state
25
25
  end
@@ -33,30 +33,27 @@ module Matchi
33
33
  # object = []
34
34
  #
35
35
  # matcher = Matchi::Change::By.new(1) { object.length }
36
- #
37
- # matcher.expected # => 1
38
- # matcher.matches? { object << "foo" } # => true
36
+ # matcher.match? { object << "foo" } # => true
39
37
  #
40
38
  # @yieldreturn [#object_id] The block of code to execute.
41
39
  #
42
40
  # @return [Boolean] Comparison between the value before and after the
43
41
  # code execution.
44
- def matches?
42
+ def match?
43
+ raise ::ArgumentError, "a block must be provided" unless block_given?
44
+
45
45
  value_before = @state.call
46
46
  yield
47
47
  value_after = @state.call
48
48
 
49
- expected == (value_after - value_before)
50
- end
51
-
52
- # A string containing a human-readable representation of the matcher.
53
- def inspect
54
- "#{self.class}(#{expected.inspect})"
49
+ @expected == (value_after - value_before)
55
50
  end
56
51
 
57
52
  # Returns a string representing the matcher.
53
+ #
54
+ # @return [String] a human-readable description of the matcher
58
55
  def to_s
59
- "change by #{expected.inspect}"
56
+ "change by #{@expected.inspect}"
60
57
  end
61
58
  end
62
59
  end
@@ -4,9 +4,6 @@ module Matchi
4
4
  class Change
5
5
  # *Change by at least* matcher.
6
6
  class ByAtLeast
7
- # @return [#object_id] An expected delta.
8
- attr_reader :expected
9
-
10
7
  # Initialize the matcher with an object and a block.
11
8
  #
12
9
  # @example
@@ -20,6 +17,10 @@ module Matchi
20
17
  # @param state [Proc] A block of code to execute to get the
21
18
  # state of the object.
22
19
  def initialize(expected, &state)
20
+ raise ::ArgumentError, "expected must be a Numeric" unless expected.is_a?(::Numeric)
21
+ raise ::ArgumentError, "a block must be provided" unless block_given?
22
+ raise ::ArgumentError, "expected must be non-negative" if expected.negative?
23
+
23
24
  @expected = expected
24
25
  @state = state
25
26
  end
@@ -33,30 +34,27 @@ module Matchi
33
34
  # object = []
34
35
  #
35
36
  # matcher = Matchi::Change::ByAtLeast.new(1) { object.length }
36
- #
37
- # matcher.expected # => 1
38
- # matcher.matches? { object << "foo" } # => true
37
+ # matcher.match? { object << "foo" } # => true
39
38
  #
40
39
  # @yieldreturn [#object_id] The block of code to execute.
41
40
  #
42
41
  # @return [Boolean] Comparison between the value before and after the
43
42
  # code execution.
44
- def matches?
43
+ def match?
44
+ raise ::ArgumentError, "a block must be provided" unless block_given?
45
+
45
46
  value_before = @state.call
46
47
  yield
47
48
  value_after = @state.call
48
49
 
49
- expected <= (value_after - value_before)
50
- end
51
-
52
- # A string containing a human-readable representation of the matcher.
53
- def inspect
54
- "#{self.class}(#{expected.inspect})"
50
+ @expected <= (value_after - value_before)
55
51
  end
56
52
 
57
53
  # Returns a string representing the matcher.
54
+ #
55
+ # @return [String] a human-readable description of the matcher
58
56
  def to_s
59
- "change by at least #{expected.inspect}"
57
+ "change by at least #{@expected.inspect}"
60
58
  end
61
59
  end
62
60
  end
@@ -4,9 +4,6 @@ module Matchi
4
4
  class Change
5
5
  # *Change by at most* matcher.
6
6
  class ByAtMost
7
- # @return [#object_id] An expected delta.
8
- attr_reader :expected
9
-
10
7
  # Initialize the matcher with an object and a block.
11
8
  #
12
9
  # @example
@@ -20,6 +17,10 @@ module Matchi
20
17
  # @param state [Proc] A block of code to execute to get the
21
18
  # state of the object.
22
19
  def initialize(expected, &state)
20
+ raise ::ArgumentError, "expected must be a Numeric" unless expected.is_a?(::Numeric)
21
+ raise ::ArgumentError, "a block must be provided" unless block_given?
22
+ raise ::ArgumentError, "expected must be non-negative" if expected.negative?
23
+
23
24
  @expected = expected
24
25
  @state = state
25
26
  end
@@ -33,30 +34,27 @@ module Matchi
33
34
  # object = []
34
35
  #
35
36
  # matcher = Matchi::Change::ByAtMost.new(1) { object.length }
36
- #
37
- # matcher.expected # => 1
38
- # matcher.matches? { object << "foo" } # => true
37
+ # matcher.match? { object << "foo" } # => true
39
38
  #
40
39
  # @yieldreturn [#object_id] The block of code to execute.
41
40
  #
42
41
  # @return [Boolean] Comparison between the value before and after the
43
42
  # code execution.
44
- def matches?
43
+ def match?
44
+ raise ::ArgumentError, "a block must be provided" unless block_given?
45
+
45
46
  value_before = @state.call
46
47
  yield
47
48
  value_after = @state.call
48
49
 
49
- expected >= (value_after - value_before)
50
- end
51
-
52
- # A string containing a human-readable representation of the matcher.
53
- def inspect
54
- "#{self.class}(#{expected.inspect})"
50
+ @expected >= (value_after - value_before)
55
51
  end
56
52
 
57
53
  # Returns a string representing the matcher.
54
+ #
55
+ # @return [String] a human-readable description of the matcher
58
56
  def to_s
59
- "change by at most #{expected.inspect}"
57
+ "change by at most #{@expected.inspect}"
60
58
  end
61
59
  end
62
60
  end
@@ -5,9 +5,6 @@ module Matchi
5
5
  class From
6
6
  # *Change from to* matcher.
7
7
  class To
8
- # @return [#object_id] An expected new value.
9
- attr_reader :expected
10
-
11
8
  # Initialize the matcher with two objects and a block.
12
9
  #
13
10
  # @example
@@ -22,6 +19,8 @@ module Matchi
22
19
  # @param state [Proc] A block of code to execute to
23
20
  # get the state of the object.
24
21
  def initialize(expected_init, expected_new_value, &state)
22
+ raise ::ArgumentError, "a block must be provided" unless block_given?
23
+
25
24
  @expected_init = expected_init
26
25
  @expected = expected_new_value
27
26
  @state = state
@@ -36,32 +35,29 @@ module Matchi
36
35
  # object = "foo"
37
36
  #
38
37
  # matcher = Matchi::Change::From::To.new("foo", "FOO") { object.to_s }
39
- #
40
- # matcher.expected # => "FOO"
41
- # matcher.matches? { object.upcase! } # => true
38
+ # matcher.match? { object.upcase! } # => true
42
39
  #
43
40
  # @yieldreturn [#object_id] The block of code to execute.
44
41
  #
45
42
  # @return [Boolean] Comparison between the value before and after the
46
43
  # code execution.
47
- def matches?
44
+ def match?
45
+ raise ::ArgumentError, "a block must be provided" unless block_given?
46
+
48
47
  value_before = @state.call
49
48
  return false unless @expected_init == value_before
50
49
 
51
50
  yield
52
51
  value_after = @state.call
53
52
 
54
- expected == value_after
55
- end
56
-
57
- # A string containing a human-readable representation of the matcher.
58
- def inspect
59
- "#{self.class}(#{@expected_init.inspect}, #{expected.inspect})"
53
+ @expected == value_after
60
54
  end
61
55
 
62
56
  # Returns a string representing the matcher.
57
+ #
58
+ # @return [String] a human-readable description of the matcher
63
59
  def to_s
64
- "change from #{@expected_init.inspect} to #{expected.inspect}"
60
+ "change from #{@expected_init.inspect} to #{@expected.inspect}"
65
61
  end
66
62
  end
67
63
  end
@@ -19,6 +19,8 @@ module Matchi
19
19
  # @param state [Proc] A block of code to execute to get the
20
20
  # state of the object.
21
21
  def initialize(expected, &state)
22
+ raise ::ArgumentError, "a block must be provided" unless block_given?
23
+
22
24
  @expected = expected
23
25
  @state = state
24
26
  end
@@ -35,7 +37,7 @@ module Matchi
35
37
  #
36
38
  # @param expected_new_value [#object_id] The new value to expect.
37
39
  #
38
- # @return [#matches?] A *change from to* matcher.
40
+ # @return [#match?] A *change from to* matcher.
39
41
  def to(expected_new_value)
40
42
  To.new(@expected, expected_new_value, &@state)
41
43
  end
@@ -4,9 +4,6 @@ module Matchi
4
4
  class Change
5
5
  # *Change to* matcher.
6
6
  class To
7
- # @return [#object_id] An expected new value.
8
- attr_reader :expected
9
-
10
7
  # Initialize the matcher with an object and a block.
11
8
  #
12
9
  # @example
@@ -20,6 +17,8 @@ module Matchi
20
17
  # @param state [Proc] A block of code to execute to get the
21
18
  # state of the object.
22
19
  def initialize(expected, &state)
20
+ raise ::ArgumentError, "a block must be provided" unless block_given?
21
+
23
22
  @expected = expected
24
23
  @state = state
25
24
  end
@@ -33,29 +32,26 @@ module Matchi
33
32
  # object = "foo"
34
33
  #
35
34
  # matcher = Matchi::Change::To.new("FOO") { object.to_s }
36
- #
37
- # matcher.expected # => "FOO"
38
- # matcher.matches? { object.upcase! } # => true
35
+ # matcher.match? { object.upcase! } # => true
39
36
  #
40
37
  # @yieldreturn [#object_id] The block of code to execute.
41
38
  #
42
39
  # @return [Boolean] Comparison between the value before and after the
43
40
  # code execution.
44
- def matches?
41
+ def match?
42
+ raise ::ArgumentError, "a block must be provided" unless block_given?
43
+
45
44
  yield
46
45
  value_after = @state.call
47
46
 
48
- expected == value_after
49
- end
50
-
51
- # A string containing a human-readable representation of the matcher.
52
- def inspect
53
- "#{self.class}(#{expected.inspect})"
47
+ @expected == value_after
54
48
  end
55
49
 
56
50
  # Returns a string representing the matcher.
51
+ #
52
+ # @return [String] a human-readable description of the matcher
57
53
  def to_s
58
- "change to #{expected.inspect}"
54
+ "change to #{@expected.inspect}"
59
55
  end
60
56
  end
61
57
  end
data/lib/matchi/change.rb CHANGED
@@ -19,10 +19,11 @@ module Matchi
19
19
  #
20
20
  # @param object [#object_id] An object.
21
21
  # @param method [Symbol] The name of a method.
22
- # @param args [Array] A list of arguments.
23
- # @param kwargs [Hash] A list of keyword arguments.
24
- def initialize(object, method, *args, **kwargs, &block)
25
- @state = -> { object.send(method, *args, **kwargs, &block) }
22
+ def initialize(object, method, ...)
23
+ raise ::ArgumentError, "method must be a Symbol" unless method.is_a?(::Symbol)
24
+ raise ::ArgumentError, "object must respond to method" unless object.respond_to?(method)
25
+
26
+ @state = -> { object.send(method, ...) }
26
27
  end
27
28
 
28
29
  # Specifies a minimum delta of the expected change.
@@ -37,7 +38,7 @@ module Matchi
37
38
  #
38
39
  # @param minimum_delta [#object_id] The minimum delta of the expected change.
39
40
  #
40
- # @return [#matches?] A *change by at least* matcher.
41
+ # @return [#match?] A *change by at least* matcher.
41
42
  def by_at_least(minimum_delta)
42
43
  ByAtLeast.new(minimum_delta, &@state)
43
44
  end
@@ -54,7 +55,7 @@ module Matchi
54
55
  #
55
56
  # @param maximum_delta [#object_id] The maximum delta of the expected change.
56
57
  #
57
- # @return [#matches?] A *change by at most* matcher.
58
+ # @return [#match?] A *change by at most* matcher.
58
59
  def by_at_most(maximum_delta)
59
60
  ByAtMost.new(maximum_delta, &@state)
60
61
  end
@@ -71,7 +72,7 @@ module Matchi
71
72
  #
72
73
  # @param delta [#object_id] The delta of the expected change.
73
74
  #
74
- # @return [#matches?] A *change by* matcher.
75
+ # @return [#match?] A *change by* matcher.
75
76
  def by(delta)
76
77
  By.new(delta, &@state)
77
78
  end
@@ -86,7 +87,7 @@ module Matchi
86
87
  #
87
88
  # @param old_value [#object_id] The original value.
88
89
  #
89
- # @return [#matches?] A *change from* wrapper.
90
+ # @return [#match?] A *change from* wrapper.
90
91
  def from(old_value)
91
92
  From.new(old_value, &@state)
92
93
  end
@@ -101,7 +102,7 @@ module Matchi
101
102
  #
102
103
  # @param new_value [#object_id] The new value to expect.
103
104
  #
104
- # @return [#matches?] A *change to* matcher.
105
+ # @return [#match?] A *change to* matcher.
105
106
  def to(new_value)
106
107
  To.new(new_value, &@state)
107
108
  end
data/lib/matchi/eq.rb CHANGED
@@ -3,9 +3,6 @@
3
3
  module Matchi
4
4
  # *Equivalence* matcher.
5
5
  class Eq
6
- # @return [#eql?] An expected equivalent object.
7
- attr_reader :expected
8
-
9
6
  # Initialize the matcher with an object.
10
7
  #
11
8
  # @example
@@ -24,26 +21,23 @@ module Matchi
24
21
  # require "matchi/eq"
25
22
  #
26
23
  # matcher = Matchi::Eq.new("foo")
27
- #
28
- # matcher.expected # => "foo"
29
- # matcher.matches? { "foo" } # => true
24
+ # matcher.match? { "foo" } # => true
30
25
  #
31
26
  # @yieldreturn [#object_id] The actual value to compare to the expected
32
27
  # one.
33
28
  #
34
29
  # @return [Boolean] Comparison between actual and expected values.
35
- def matches?
36
- expected.eql?(yield)
37
- end
30
+ def match?
31
+ raise ::ArgumentError, "a block must be provided" unless block_given?
38
32
 
39
- # A string containing a human-readable representation of the matcher.
40
- def inspect
41
- "#{self.class}(#{expected.inspect})"
33
+ @expected.eql?(yield)
42
34
  end
43
35
 
44
36
  # Returns a string representing the matcher.
37
+ #
38
+ # @return [String] a human-readable description of the matcher
45
39
  def to_s
46
- "eq #{expected.inspect}"
40
+ "eq #{@expected.inspect}"
47
41
  end
48
42
  end
49
43
  end
data/lib/matchi/match.rb CHANGED
@@ -3,9 +3,6 @@
3
3
  module Matchi
4
4
  # *Regular expressions* matcher.
5
5
  class Match
6
- # @return [#match] A regular expression.
7
- attr_reader :expected
8
-
9
6
  # Initialize the matcher with an instance of Regexp.
10
7
  #
11
8
  # @example
@@ -15,6 +12,8 @@ module Matchi
15
12
  #
16
13
  # @param expected [#match] A regular expression.
17
14
  def initialize(expected)
15
+ raise ::ArgumentError, "expected must respond to match?" unless expected.respond_to?(:match?)
16
+
18
17
  @expected = expected
19
18
  end
20
19
 
@@ -24,26 +23,23 @@ module Matchi
24
23
  # require "matchi/match"
25
24
  #
26
25
  # matcher = Matchi::Match.new(/^foo$/)
27
- #
28
- # matcher.expected # => /^foo$/
29
- # matcher.matches? { "foo" } # => true
26
+ # matcher.match? { "foo" } # => true
30
27
  #
31
28
  # @yieldreturn [#object_id] The actual value to compare to the expected
32
29
  # one.
33
30
  #
34
31
  # @return [Boolean] Comparison between actual and expected values.
35
- def matches?
36
- expected.match?(yield)
37
- end
32
+ def match?
33
+ raise ::ArgumentError, "a block must be provided" unless block_given?
38
34
 
39
- # A string containing a human-readable representation of the matcher.
40
- def inspect
41
- "#{self.class}(#{expected.inspect})"
35
+ @expected.match?(yield)
42
36
  end
43
37
 
44
38
  # Returns a string representing the matcher.
39
+ #
40
+ # @return [String] a human-readable description of the matcher
45
41
  def to_s
46
- "match #{expected.inspect}"
42
+ "match #{@expected.inspect}"
47
43
  end
48
44
  end
49
45
  end
@@ -16,53 +16,42 @@ module Matchi
16
16
  # @param block [Proc] A block of code.
17
17
  def initialize(name, *args, **kwargs, &block)
18
18
  @name = String(name)
19
-
20
- raise ::ArgumentError unless valid_name?
19
+ raise ::ArgumentError, "invalid predicate name format" unless valid_name?
21
20
 
22
21
  @args = args
23
22
  @kwargs = kwargs
24
23
  @block = block
25
24
  end
26
25
 
27
- # @return [Array] The method name with any arguments to send to the subject.
28
- def expected
29
- [method_name, @args, @kwargs, @block]
30
- end
31
-
32
26
  # Boolean comparison between the actual value and the expected value.
33
27
  #
34
28
  # @example
35
29
  # require "matchi/predicate"
36
30
  #
37
31
  # matcher = Matchi::Predicate.new(:be_empty)
38
- #
39
- # matcher.expected # => [:empty?, [], {}, nil]
40
- # matcher.matches? { [] } # => true
32
+ # matcher.match? { [] } # => true
41
33
  #
42
34
  # @example
43
35
  # require "matchi/predicate"
44
36
  #
45
37
  # matcher = Matchi::Predicate.new(:have_key, :foo)
46
- #
47
- # matcher.expected # => [:has_key?, [:foo], {}, nil]
48
- # matcher.matches? { { foo: 42 } } # => true
38
+ # matcher.match? { { foo: 42 } } # => true
49
39
  #
50
40
  # @yieldreturn [#object_id] The actual value to receive the method request.
51
41
  #
52
42
  # @return [Boolean] A boolean returned by the actual value being tested.
53
- def matches?
43
+ def match?
44
+ raise ::ArgumentError, "a block must be provided" unless block_given?
45
+
54
46
  value = yield.send(method_name, *@args, **@kwargs, &@block)
55
47
  return value if [false, true].include?(value)
56
48
 
57
49
  raise ::TypeError, "Boolean expected, but #{value.class} instance returned."
58
50
  end
59
51
 
60
- # A string containing a human-readable representation of the matcher.
61
- def inspect
62
- "#{self.class}(#{@name}, *#{@args.inspect}, **#{@kwargs.inspect}, &#{@block.inspect})"
63
- end
64
-
65
52
  # Returns a string representing the matcher.
53
+ #
54
+ # @return [String] a human-readable description of the matcher
66
55
  def to_s
67
56
  (
68
57
  "#{@name.tr("_", " ")} " + [
@@ -3,9 +3,6 @@
3
3
  module Matchi
4
4
  # *Expecting errors* matcher.
5
5
  class RaiseException
6
- # @return [String] The expected exception name.
7
- attr_reader :expected
8
-
9
6
  # Initialize the matcher with a descendant of class Exception.
10
7
  #
11
8
  # @example
@@ -16,6 +13,10 @@ module Matchi
16
13
  # @param expected [Exception, #to_s] The expected exception name.
17
14
  def initialize(expected)
18
15
  @expected = String(expected)
16
+ return if /\A[A-Z]/.match?(@expected)
17
+
18
+ raise ::ArgumentError,
19
+ "expected must start with an uppercase letter (got: #{@expected})"
19
20
  end
20
21
 
21
22
  # Boolean comparison between the actual value and the expected value.
@@ -24,30 +25,42 @@ module Matchi
24
25
  # require "matchi/raise_exception"
25
26
  #
26
27
  # matcher = Matchi::RaiseException.new(NameError)
27
- #
28
- # matcher.expected # => "NameError"
29
- # matcher.matches? { Boom } # => true
28
+ # matcher.match? { Boom } # => true
30
29
  #
31
30
  # @yieldreturn [#object_id] The actual value to compare to the expected
32
31
  # one.
33
32
  #
34
33
  # @return [Boolean] Comparison between actual and expected values.
35
- def matches?
36
- yield
37
- rescue self.class.const_get(expected) => _e
38
- true
39
- else
40
- false
41
- end
34
+ def match?
35
+ raise ::ArgumentError, "a block must be provided" unless block_given?
36
+
37
+ klass = expected_class
38
+ raise ::ArgumentError, "expected exception class must inherit from Exception" unless klass <= ::Exception
42
39
 
43
- # A string containing a human-readable representation of the matcher.
44
- def inspect
45
- "#{self.class}(#{expected})"
40
+ begin
41
+ yield
42
+ false
43
+ rescue Exception => e # rubocop:disable Lint/RescueException
44
+ e.class <= klass # Checks if the class of the thrown exception is klass or one of its subclasses
45
+ end
46
46
  end
47
47
 
48
48
  # Returns a string representing the matcher.
49
+ #
50
+ # @return [String] a human-readable description of the matcher
49
51
  def to_s
50
- "raise exception #{expected}"
52
+ "raise exception #{@expected}"
53
+ end
54
+
55
+ private
56
+
57
+ # Resolves the expected class name to an actual Class object.
58
+ # This method handles both string and symbol class names through constant resolution.
59
+ #
60
+ # @return [Class] the resolved class
61
+ # @raise [NameError] if the class doesn't exist
62
+ def expected_class
63
+ ::Object.const_get(@expected)
51
64
  end
52
65
  end
53
66
  end