// Copyright 2012 The Closure Library Authors. All Rights Reserved. // // 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. /** * @fileoverview Provides the built-in logic matchers: anyOf, allOf, and isNot. * */ goog.provide('goog.labs.testing.AllOfMatcher'); goog.provide('goog.labs.testing.AnyOfMatcher'); goog.provide('goog.labs.testing.IsNotMatcher'); goog.require('goog.array'); goog.require('goog.labs.testing.Matcher'); /** * The AllOf matcher. * * @param {!Array} matchers Input matchers. * * @constructor * @struct * @implements {goog.labs.testing.Matcher} * @final */ goog.labs.testing.AllOfMatcher = function(matchers) { /** * @type {!Array} * @private */ this.matchers_ = matchers; }; /** * Determines if all of the matchers match the input value. * * @override */ goog.labs.testing.AllOfMatcher.prototype.matches = function(actualValue) { return goog.array.every(this.matchers_, function(matcher) { return matcher.matches(actualValue); }); }; /** * Describes why the matcher failed. The returned string is a concatenation of * all the failed matchers' error strings. * * @override */ goog.labs.testing.AllOfMatcher.prototype.describe = function(actualValue) { // TODO(user) : Optimize this to remove duplication with matches ? var errorString = ''; goog.array.forEach(this.matchers_, function(matcher) { if (!matcher.matches(actualValue)) { errorString += matcher.describe(actualValue) + '\n'; } }); return errorString; }; /** * The AnyOf matcher. * * @param {!Array} matchers Input matchers. * * @constructor * @struct * @implements {goog.labs.testing.Matcher} * @final */ goog.labs.testing.AnyOfMatcher = function(matchers) { /** * @type {!Array} * @private */ this.matchers_ = matchers; }; /** * Determines if any of the matchers matches the input value. * * @override */ goog.labs.testing.AnyOfMatcher.prototype.matches = function(actualValue) { return goog.array.some(this.matchers_, function(matcher) { return matcher.matches(actualValue); }); }; /** * Describes why the matcher failed. * * @override */ goog.labs.testing.AnyOfMatcher.prototype.describe = function(actualValue) { // TODO(user) : Optimize this to remove duplication with matches ? var errorString = ''; goog.array.forEach(this.matchers_, function(matcher) { if (!matcher.matches(actualValue)) { errorString += matcher.describe(actualValue) + '\n'; } }); return errorString; }; /** * The IsNot matcher. * * @param {!goog.labs.testing.Matcher} matcher The matcher to negate. * * @constructor * @struct * @implements {goog.labs.testing.Matcher} * @final */ goog.labs.testing.IsNotMatcher = function(matcher) { /** * @type {!goog.labs.testing.Matcher} * @private */ this.matcher_ = matcher; }; /** * Determines if the input value doesn't satisfy a matcher. * * @override */ goog.labs.testing.IsNotMatcher.prototype.matches = function(actualValue) { return !this.matcher_.matches(actualValue); }; /** * Describes why the matcher failed. * * @override */ goog.labs.testing.IsNotMatcher.prototype.describe = function(actualValue) { return 'The following is false: ' + this.matcher_.describe(actualValue); }; /** * Creates a matcher that will succeed only if all of the given matchers * succeed. * * @param {...goog.labs.testing.Matcher} var_args The matchers to test * against. * * @return {!goog.labs.testing.AllOfMatcher} The AllOf matcher. */ function allOf(var_args) { var matchers = goog.array.toArray(arguments); return new goog.labs.testing.AllOfMatcher(matchers); } /** * Accepts a set of matchers and returns a matcher which matches * values which satisfy the constraints of any of the given matchers. * * @param {...goog.labs.testing.Matcher} var_args The matchers to test * against. * * @return {!goog.labs.testing.AnyOfMatcher} The AnyOf matcher. */ function anyOf(var_args) { var matchers = goog.array.toArray(arguments); return new goog.labs.testing.AnyOfMatcher(matchers); } /** * Returns a matcher that negates the input matcher. The returned * matcher matches the values not matched by the input matcher and vice-versa. * * @param {!goog.labs.testing.Matcher} matcher The matcher to test against. * * @return {!goog.labs.testing.IsNotMatcher} The IsNot matcher. */ function isNot(matcher) { return new goog.labs.testing.IsNotMatcher(matcher); }