diff --git a/spec/helpers/spy_sut.cr b/spec/helpers/spy_sut.cr index ef86b3a..3c45ccb 100644 --- a/spec/helpers/spy_sut.cr +++ b/spec/helpers/spy_sut.cr @@ -4,9 +4,18 @@ class SpySUT # Number of times the `#==` method was called. getter eq_call_count = 0 + # Number of times the `#===` method was called. + getter case_eq_call_count = 0 + # Returns true and increments `#eq_call_count`. def ==(other : T) forall T @eq_call_count += 1 true end + + # Returns true and increments `#case_eq_call_count`. + def ===(other : T) forall T + @case_eq_call_count += 1 + true + end end diff --git a/spec/matchers/case_matcher_spec.cr b/spec/matchers/case_matcher_spec.cr new file mode 100644 index 0000000..060523a --- /dev/null +++ b/spec/matchers/case_matcher_spec.cr @@ -0,0 +1,154 @@ +require "../spec_helper" + +describe Spectator::Matchers::CaseMatcher do + describe "#match?" do + it "compares using #===" do + spy = SpySUT.new + partial = Spectator::Expectations::ValueExpectationPartial.new(42) + matcher = Spectator::Matchers::CaseMatcher.new(spy) + matcher.match?(partial).should be_true + spy.case_eq_call_count.should be > 0 + end + + context "with identical values" do + it "is true" do + value = 42 + partial = Spectator::Expectations::ValueExpectationPartial.new(value) + matcher = Spectator::Matchers::CaseMatcher.new(value) + matcher.match?(partial).should be_true + end + end + + context "with different values" do + it "is false" do + value1 = 42 + value2 = 777 + partial = Spectator::Expectations::ValueExpectationPartial.new(value1) + matcher = Spectator::Matchers::CaseMatcher.new(value2) + matcher.match?(partial).should be_false + end + end + + context "with the same instance" do + it "is true" do + # Box is used because it is a reference type and doesn't override the == method. + ref = Box.new([] of Int32) + partial = Spectator::Expectations::ValueExpectationPartial.new(ref) + matcher = Spectator::Matchers::CaseMatcher.new(ref) + matcher.match?(partial).should be_true + end + end + + context "with different instances" do + context "with same contents" do + it "is true" do + array1 = [1, 2, 3] + array2 = [1, 2, 3] + partial = Spectator::Expectations::ValueExpectationPartial.new(array1) + matcher = Spectator::Matchers::CaseMatcher.new(array2) + matcher.match?(partial).should be_true + end + end + + context "with different contents" do + it "is false" do + array1 = [1, 2, 3] + array2 = [4, 5, 6] + partial = Spectator::Expectations::ValueExpectationPartial.new(array1) + matcher = Spectator::Matchers::CaseMatcher.new(array2) + matcher.match?(partial).should be_false + end + end + + context "with the same type" do + it "is true" do + value1 = "foobar" + value2 = String + partial = Spectator::Expectations::ValueExpectationPartial.new(value1) + matcher = Spectator::Matchers::CaseMatcher.new(value2) + matcher.match?(partial).should be_true + end + end + + context "with a different type" do + it "is false" do + value1 = "foobar" + value2 = Array + partial = Spectator::Expectations::ValueExpectationPartial.new(value1) + matcher = Spectator::Matchers::CaseMatcher.new(value2) + matcher.match?(partial).should be_false + end + end + end + end + + describe "#message" do + it "mentions ===" do + value = 42 + partial = Spectator::Expectations::ValueExpectationPartial.new(value) + matcher = Spectator::Matchers::CaseMatcher.new(value) + matcher.message(partial).should contain("===") + end + + it "contains the actual label" do + value = 42 + label = "everything" + partial = Spectator::Expectations::ValueExpectationPartial.new(label, value) + matcher = Spectator::Matchers::CaseMatcher.new(value) + matcher.message(partial).should contain(label) + end + + it "contains the expected label" do + value = 42 + label = "everything" + partial = Spectator::Expectations::ValueExpectationPartial.new(value) + matcher = Spectator::Matchers::CaseMatcher.new(label, value) + matcher.message(partial).should contain(label) + end + + context "when expected label is omitted" do + it "contains stringified form of expected value" do + value1 = 42 + value2 = 777 + partial = Spectator::Expectations::ValueExpectationPartial.new(value1) + matcher = Spectator::Matchers::CaseMatcher.new(value2) + matcher.message(partial).should contain(value2.to_s) + end + end + end + + describe "#negated_message" do + it "mentions ===" do + value = 42 + partial = Spectator::Expectations::ValueExpectationPartial.new(value) + matcher = Spectator::Matchers::CaseMatcher.new(value) + matcher.negated_message(partial).should contain("===") + end + + it "contains the actual label" do + value = 42 + label = "everything" + partial = Spectator::Expectations::ValueExpectationPartial.new(label, value) + matcher = Spectator::Matchers::CaseMatcher.new(value) + matcher.negated_message(partial).should contain(label) + end + + it "contains the expected label" do + value = 42 + label = "everything" + partial = Spectator::Expectations::ValueExpectationPartial.new(value) + matcher = Spectator::Matchers::CaseMatcher.new(label, value) + matcher.negated_message(partial).should contain(label) + end + + context "when expected label is omitted" do + it "contains stringified form of expected value" do + value1 = 42 + value2 = 777 + partial = Spectator::Expectations::ValueExpectationPartial.new(value1) + matcher = Spectator::Matchers::CaseMatcher.new(value2) + matcher.negated_message(partial).should contain(value2.to_s) + end + end + end +end