Update HaveValueMatcher to use MatchData

This commit is contained in:
Michael Miller 2019-03-06 02:19:12 -07:00
parent 3f1d8751fe
commit 76d09a22ff
2 changed files with 154 additions and 82 deletions

View File

@ -1,84 +1,139 @@
require "../spec_helper" require "../spec_helper"
private struct FakeValueSet
def has_value?(value)
true
end
end
describe Spectator::Matchers::HaveValueMatcher do describe Spectator::Matchers::HaveValueMatcher do
describe "#match?" do describe "#match" do
context "with an existing value" do context "returned MatchData" do
it "is true" do describe "#matched?" do
hash = Hash{"foo" => "bar"} context "with an existing value" do
value = "bar" it "is true" do
partial = new_partial(hash) hash = Hash{"foo" => "bar"}
matcher = Spectator::Matchers::HaveValueMatcher.new(value) value = "bar"
matcher.match?(partial).should be_true partial = new_partial(hash)
matcher = Spectator::Matchers::HaveValueMatcher.new(value)
match_data = matcher.match(partial)
match_data.matched?.should be_true
end
end
context "with a non-existent value" do
it "is false" do
hash = Hash{"foo" => "bar"}
value = "baz"
partial = new_partial(hash)
matcher = Spectator::Matchers::HaveValueMatcher.new(value)
match_data = matcher.match(partial)
match_data.matched?.should be_false
end
end
end end
end
context "with a non-existent value" do describe "#values" do
it "is false" do context "value" do
hash = Hash{"foo" => "bar"} it "is the expected value" do
value = "baz" hash = {"foo" => "bar"}
partial = new_partial(hash) value = "baz"
matcher = Spectator::Matchers::HaveValueMatcher.new(value) partial = new_partial(hash)
matcher.match?(partial).should be_false matcher = Spectator::Matchers::HaveValueMatcher.new(value)
match_data = matcher.match(partial)
match_data.values[:value].should eq(value)
end
end
context "actual" do
context "when #values is available" do
it "is the list of values" do
hash = Hash{"foo" => "bar"}
value = "baz"
partial = new_partial(hash)
matcher = Spectator::Matchers::HaveValueMatcher.new(value)
match_data = matcher.match(partial)
match_data.values[:actual].should eq(hash.values)
end
end
context "when #values isn't available" do
it "is the actual value" do
actual = FakeValueSet.new
value = "baz"
partial = new_partial(actual)
matcher = Spectator::Matchers::HaveValueMatcher.new(value)
match_data = matcher.match(partial)
match_data.values[:actual].should eq(actual)
end
end
end
end end
end
end
describe "#message" do describe "#message" do
it "contains the actual label" do it "contains the actual label" do
hash = Hash{"foo" => "bar"} hash = Hash{"foo" => "bar"}
value = "bar" value = "bar"
label = "blah" label = "blah"
partial = new_partial(hash, label) partial = new_partial(hash, label)
matcher = Spectator::Matchers::HaveValueMatcher.new(value) matcher = Spectator::Matchers::HaveValueMatcher.new(value)
matcher.message(partial).should contain(label) match_data = matcher.match(partial)
end match_data.message.should contain(label)
end
it "contains the expected label" do it "contains the expected label" do
hash = Hash{"foo" => "bar"} hash = Hash{"foo" => "bar"}
value = "bar" value = "bar"
label = "blah" label = "blah"
partial = new_partial(hash) partial = new_partial(hash)
matcher = Spectator::Matchers::HaveValueMatcher.new(value, label) matcher = Spectator::Matchers::HaveValueMatcher.new(value, label)
matcher.message(partial).should contain(label) match_data = matcher.match(partial)
end match_data.message.should contain(label)
end
context "when the expected label is omitted" do context "when the expected label is omitted" do
it "contains the stringified key" do it "contains the stringified key" do
hash = Hash{"foo" => "bar"} hash = Hash{"foo" => "bar"}
value = "bar" value = "bar"
partial = new_partial(hash) partial = new_partial(hash)
matcher = Spectator::Matchers::HaveValueMatcher.new(value) matcher = Spectator::Matchers::HaveValueMatcher.new(value)
matcher.message(partial).should contain(value.to_s) match_data = matcher.match(partial)
match_data.message.should contain(value.to_s)
end
end
end end
end
end
describe "#negated_message" do describe "#negated_message" do
it "contains the actual label" do it "contains the actual label" do
hash = Hash{"foo" => "bar"} hash = Hash{"foo" => "bar"}
value = "bar" value = "bar"
label = "blah" label = "blah"
partial = new_partial(hash, label) partial = new_partial(hash, label)
matcher = Spectator::Matchers::HaveValueMatcher.new(value) matcher = Spectator::Matchers::HaveValueMatcher.new(value)
matcher.negated_message(partial).should contain(label) match_data = matcher.match(partial)
end match_data.negated_message.should contain(label)
end
it "contains the expected label" do it "contains the expected label" do
hash = Hash{"foo" => "bar"} hash = Hash{"foo" => "bar"}
value = "bar" value = "bar"
label = "blah" label = "blah"
partial = new_partial(hash) partial = new_partial(hash)
matcher = Spectator::Matchers::HaveValueMatcher.new(value, label) matcher = Spectator::Matchers::HaveValueMatcher.new(value, label)
matcher.negated_message(partial).should contain(label) match_data = matcher.match(partial)
end match_data.negated_message.should contain(label)
end
context "when the expected label is omitted" do context "when the expected label is omitted" do
it "contains the stringified key" do it "contains the stringified key" do
hash = Hash{"foo" => "bar"} hash = Hash{"foo" => "bar"}
value = "bar" value = "bar"
partial = new_partial(hash) partial = new_partial(hash)
matcher = Spectator::Matchers::HaveValueMatcher.new(value) matcher = Spectator::Matchers::HaveValueMatcher.new(value)
matcher.negated_message(partial).should contain(value.to_s) match_data = matcher.match(partial)
match_data.negated_message.should contain(value.to_s)
end
end
end end
end end
end end

View File

@ -5,27 +5,44 @@ module Spectator::Matchers
# The set is checked with the `has_value?` method. # The set is checked with the `has_value?` method.
struct HaveValueMatcher(ExpectedType) < ValueMatcher(ExpectedType) struct HaveValueMatcher(ExpectedType) < ValueMatcher(ExpectedType)
# Determines whether the matcher is satisfied with the value given to it. # Determines whether the matcher is satisfied with the value given to it.
# True is returned if the match was successful, false otherwise. private def match?(actual)
def match?(partial) actual.has_value?(expected)
partial.actual.has_value?(expected)
end end
# Determines whether the matcher is satisfied with the partial given to it. # Determines whether the matcher is satisfied with the partial given to it.
# `MatchData` is returned that contains information about the match. # `MatchData` is returned that contains information about the match.
def match(partial) : MatchData def match(partial)
raise NotImplementedError.new("#match") values = ExpectedActual.new(partial, self)
MatchData.new(match?(values.actual), values)
end end
# Describes the condition that satisfies the matcher. # Match data specific to this matcher.
# This is informational and displayed to the end-user. private struct MatchData(ExpectedType, ActualType) < MatchData
def message(partial) # Creates the match data.
"Expected #{partial.label} to have value #{label}" def initialize(matched, @values : ExpectedActual(ExpectedType, ActualType))
end super(matched)
end
# Describes the condition that won't satsify the matcher. # Information about the match.
# This is informational and displayed to the end-user. def values
def negated_message(partial) actual = @values.actual
"Expected #{partial.label} to not have value #{label}" {
value: @values.expected,
actual: actual.responds_to?(:values) ? actual.values : actual,
}
end
# Describes the condition that satisfies the matcher.
# This is informational and displayed to the end-user.
def message
"#{@values.actual_label} has value #{@values.expected_label}"
end
# Describes the condition that won't satsify the matcher.
# This is informational and displayed to the end-user.
def negated_message
"#{@values.actual_label} does not have value #{@values.expected_label}"
end
end end
end end
end end