// Copyright 2011 Aaron Jacobs. All Rights Reserved. // Author: aaronjjacobs@gmail.com (Aaron Jacobs) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package oglematchers provides a set of matchers useful in a testing or // mocking framework. These matchers are inspired by and mostly compatible with // Google Test for C++ and Google JS Test. // // This package is used by github.com/smartystreets/assertions/internal/ogletest and // github.com/smartystreets/assertions/internal/oglemock, which may be more directly useful if you're not // writing your own testing package or defining your own matchers. package oglematchers // A Matcher is some predicate implicitly defining a set of values that it // matches. For example, GreaterThan(17) matches all numeric values greater // than 17, and HasSubstr("taco") matches all strings with the substring // "taco". // // Matchers are typically exposed to tests via constructor functions like // HasSubstr. In order to implement such a function you can either define your // own matcher type or use NewMatcher. type Matcher interface { // Check whether the supplied value belongs to the the set defined by the // matcher. Return a non-nil error if and only if it does not. // // The error describes why the value doesn't match. The error text is a // relative clause that is suitable for being placed after the value. For // example, a predicate that matches strings with a particular substring may, // when presented with a numerical value, return the following error text: // // "which is not a string" // // Then the failure message may look like: // // Expected: has substring "taco" // Actual: 17, which is not a string // // If the error is self-apparent based on the description of the matcher, the // error text may be empty (but the error still non-nil). For example: // // Expected: 17 // Actual: 19 // // If you are implementing a new matcher, see also the documentation on // FatalError. Matches(candidate interface{}) error // Description returns a string describing the property that values matching // this matcher have, as a verb phrase where the subject is the value. For // example, "is greather than 17" or "has substring "taco"". Description() string } // FatalError is an implementation of the error interface that may be returned // from matchers, indicating the error should be propagated. Returning a // *FatalError indicates that the matcher doesn't process values of the // supplied type, or otherwise doesn't know how to handle the value. // // For example, if GreaterThan(17) returned false for the value "taco" without // a fatal error, then Not(GreaterThan(17)) would return true. This is // technically correct, but is surprising and may mask failures where the wrong // sort of matcher is accidentally used. Instead, GreaterThan(17) can return a // fatal error, which will be propagated by Not(). type FatalError struct { errorText string } // NewFatalError creates a FatalError struct with the supplied error text. func NewFatalError(s string) *FatalError { return &FatalError{s} } func (e *FatalError) Error() string { return e.errorText }