org.scalatest.matchers

class MatchResult

[source: org/scalatest/matchers/MatchResult.scala]

case final class MatchResult(val matches : Boolean, val failureMessage : java.lang.String, val negatedFailureMessage : java.lang.String, val midSentenceFailureMessage : java.lang.String, val midSentenceNegatedFailureMessage : java.lang.String)
extends scala.Product
The result of a match operation, such as one performed by a Matcher or BeMatcher, which contains one field that indicates whether the match succeeded and four fields that provide failure messages to report under different circumstances.

A MatchResult's matches field indicates whether a match succeeded. If it succeeded, matches will be true. The other four fields contain failure message strings, one of which will be presented to the user in case of a match failure. If a match succeeds, none of these strings will be used, because no failure message will be reported (i.e., because there was no failure to report). If a match fails (matches is false), the failureMessage (or midSentenceFailure—more on that below) will be reported to help the user understand what went wrong.

Understanding negatedFailureMessage

The negatedFailureMessage exists so that it can become the failureMessage if the matcher is inverted, which happens, for instance, if it is passed to not. Here's an example:

 val equalSeven = equal (7)
 val notEqualSeven = not (equalSeven)
 

The Matcher[Int] that results from passing 7 to equal, which is assigned to the equalSeven variable, will compare Ints passed to its apply method with 7. If 7 is passed, the equalSeven match will succeed. If anything other than 7 is passed, it will fail. By contrast, the notEqualSeven matcher, which results from passing equalSeven to not, does just the opposite. If 7 is passed, the notEqualSeven match will fail. If anything other than 7 is passed, it will succeed.

For example, if 8 is passed, equalSeven's MatchResult will contain:

            expression: equalSeven(8)
               matches: false
        failureMessage: 8 did not equal 7
 negatedFailureMessage: 8 equaled 7
 

Although the negatedFailureMessage is nonsensical, it will not be reported to the user. Only the failureMessage, which does actually explain what caused the failure, will be reported by the user. If you pass 8 to notEqualSeven's apply method, by contrast, the failureMessage and negatedFailureMessage will be:

            expression: notEqualSeven(8)
               matches: true
        failureMessage: 8 equaled 7
 negatedFailureMessage: 8 did not equal 7
 

Note that the messages are swapped from the equalSeven messages. This swapping was effectively performed by the not matcher, which in addition to swapping the failureMessage and negatedFailureMessage, also inverted the matches value. Thus when you pass the same value to both equalSeven and notEqualSeven the matches field of one MatchResult will be true and the other false. Because the matches field of the MatchResult returned by notEqualSeven(8) is true, the nonsensical failureMessage, "8 equaled 7", will not be reported to the user.

If 7 is passed, by contrast, the failureMessage and negatedFailureMessage of equalSeven will be:

            expression: equalSeven(7)
               matches: true
        failureMessage: 7 did not equal 7
 negatedFailureMessage: 7 equaled 7
 

In this case equalSeven's failureMessage is nonsensical, but because the match succeeded, the nonsensical message will not be reported to the user. If you pass 7 to notEqualSeven's apply method, you'll get:

            expression: notEqualSeven(7)
               matches: false
        failureMessage: 7 equaled 7
 negatedFailureMessage: 7 did not equal 7
 

Again the messages are swapped from the equalSeven messages, but this time, the failureMessage makes sense and explains what went wrong: the notEqualSeven match failed because the number passed did in fact equal 7. Since the match failed, this failure message, "7 equaled 7", will be reported to the user.

Understanding the "midSentence" messages

When a ScalaTest matcher expression that involves and or or fails, the failure message that results is composed from the failure messages of the left and right matcher operatnds to and or or. For example:

 8 should (equal (7) or equal (9))
 

This above expression would fail with the following failure message reported to the user:

 8 did not equal 7, and 8 did not equal 9
 

This works fine, but what if the failure messages being combined begin with a capital letter, such as:

 The name property did not equal "Ricky"
 

A combination of two such failure messages might result in an abomination of English punctuation, such as:

 The name property did not equal "Ricky", and The name property did not equal "Bobby"
 

Because ScalaTest is an internationalized application, taking all of its strings from a property file enabling it to be localized, it isn't a good idea to force the first character to lower case. Besides, it might actually represent a String value which should stay upper case. The midSentenceFailureMessage exists for this situation. If the failure message is used at the beginning of the sentence, failureMessage will be used. But if it appears mid-sentence, or at the end of the sentence, midSentenceFailureMessage will be used. Given these failure message strings:

            failureMessage: The name property did not equal "Bobby"
 midSentenceFailureMessage: the name property did not equal "Bobby"
 

The resulting failure of the or expression involving to matchers would make any English teacher proud:

 The name property did not equal "Ricky", and the name property did not equal "Bobby"
 
Parameters
matches - indicates whether or not the matcher matched
failureMessage - a failure message to report if a match fails
negatedFailureMessage - a message with a meaning opposite to that of the failure message
midSentenceFailureMessage - a failure message suitable for appearing mid-sentence
midSentenceNegatedFailureMessage - a negated failure message suitable for appearing mid-sentence
Author
Bill Venners
Additional Constructor Summary
def this (matches : Boolean, failureMessage : java.lang.String, negatedFailureMessage : java.lang.String) : MatchResult
Constructs a new MatchResult with passed matches, failureMessage, and negativeFailureMessage fields. The midSentenceFailureMessage will return the same string as failureMessage, and the midSentenceNegatedFailureMessage will return the same string as negatedFailureMessage.
Method Summary
override def equals (arg0 : Any) : Boolean
This method is used to compare the receiver object (this) with the argument object (arg0) for equivalence.
override def hashCode : Int
Returns a hash code value for the object.
override def productArity : Int
override def productElement (arg0 : Int) : Any
override def productPrefix : java.lang.String
override def toString : java.lang.String
Returns a string representation of the object.
Methods inherited from AnyRef
getClass, clone, notify, notifyAll, wait, wait, wait, finalize, ==, !=, eq, ne, synchronized
Methods inherited from Any
==, !=, isInstanceOf, asInstanceOf
Additional Constructor Details
def this(matches : Boolean, failureMessage : java.lang.String, negatedFailureMessage : java.lang.String) : MatchResult
Constructs a new MatchResult with passed matches, failureMessage, and negativeFailureMessage fields. The midSentenceFailureMessage will return the same string as failureMessage, and the midSentenceNegatedFailureMessage will return the same string as negatedFailureMessage.
Parameters
matches - indicates whether or not the matcher matched
failureMessage - a failure message to report if a match fails
negatedFailureMessage - a message with a meaning opposite to that of the failure message

Method Details
override def hashCode : Int
Returns a hash code value for the object.

The default hashing algorithm is platform dependent. Note that it is allowed for two objects to have identical hash codes (o1.hashCode.equals(o2.hashCode)) yet not be equal (o1.equals(o2) returns false). A degenerate implementation could always return 0. However, it is required that if two objects are equal (o1.equals(o2) returns true) that they have identical hash codes (o1.hashCode.equals(o2.hashCode)). Therefore, when overriding this method, be sure to verify that the behavior is consistent with the equals method.

Returns
the hash code value for the object.


override def toString : java.lang.String
Returns a string representation of the object.

The default representation is platform dependent.

Returns
a string representation of the object.


override def equals(arg0 : Any) : Boolean
This method is used to compare the receiver object (this) with the argument object (arg0) for equivalence.

The default implementations of this method is an equivalence relation:

  • It is reflexive: for any instance x of type Any, x.equals(x) should return true.
  • It is symmetric: for any instances x and y of type Any, x.equals(y) should return true if and only if y.equals(x) returns true.
  • It is transitive: for any instances x, y, and z of type AnyRef if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true.

If you override this method, you should verify that your implementation remains an equivalence relation. Additionally, when overriding this method it is often necessary to override hashCode to ensure that objects that are "equal" (o1.equals(o2) returns true) hash to the same Int (o1.hashCode.equals(o2.hashCode)).

Parameters
arg0 - the object to compare against this object for equality.
Returns
true if the receiver object is equivalent to the argument; false otherwise.


override def productPrefix : java.lang.String
Overrides
scala.Product.scala.Product.productPrefix

override def productArity : Int
Overrides
scala.Product.scala.Product.productArity

override def productElement(arg0 : Int) : Any
Overrides
scala.Product.scala.Product.productElement


Copyright (C) 2001-2009 Artima, Inc. All rights reserved.