1 | // Copyright 2012 The Closure Library Authors. All Rights Reserved. |
2 | // |
3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
4 | // you may not use this file except in compliance with the License. |
5 | // You may obtain a copy of the License at |
6 | // |
7 | // http://www.apache.org/licenses/LICENSE-2.0 |
8 | // |
9 | // Unless required by applicable law or agreed to in writing, software |
10 | // distributed under the License is distributed on an "AS-IS" BASIS, |
11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 | // See the License for the specific language governing permissions and |
13 | // limitations under the License. |
14 | |
15 | /** |
16 | * @fileoverview Provides the built-in logic matchers: anyOf, allOf, and isNot. |
17 | * |
18 | */ |
19 | |
20 | |
21 | goog.provide('goog.labs.testing.AllOfMatcher'); |
22 | goog.provide('goog.labs.testing.AnyOfMatcher'); |
23 | goog.provide('goog.labs.testing.IsNotMatcher'); |
24 | |
25 | |
26 | goog.require('goog.array'); |
27 | goog.require('goog.labs.testing.Matcher'); |
28 | |
29 | |
30 | |
31 | /** |
32 | * The AllOf matcher. |
33 | * |
34 | * @param {!Array.<!goog.labs.testing.Matcher>} matchers Input matchers. |
35 | * |
36 | * @constructor |
37 | * @struct |
38 | * @implements {goog.labs.testing.Matcher} |
39 | * @final |
40 | */ |
41 | goog.labs.testing.AllOfMatcher = function(matchers) { |
42 | /** |
43 | * @type {!Array.<!goog.labs.testing.Matcher>} |
44 | * @private |
45 | */ |
46 | this.matchers_ = matchers; |
47 | }; |
48 | |
49 | |
50 | /** |
51 | * Determines if all of the matchers match the input value. |
52 | * |
53 | * @override |
54 | */ |
55 | goog.labs.testing.AllOfMatcher.prototype.matches = function(actualValue) { |
56 | return goog.array.every(this.matchers_, function(matcher) { |
57 | return matcher.matches(actualValue); |
58 | }); |
59 | }; |
60 | |
61 | |
62 | /** |
63 | * Describes why the matcher failed. The returned string is a concatenation of |
64 | * all the failed matchers' error strings. |
65 | * |
66 | * @override |
67 | */ |
68 | goog.labs.testing.AllOfMatcher.prototype.describe = |
69 | function(actualValue) { |
70 | // TODO(user) : Optimize this to remove duplication with matches ? |
71 | var errorString = ''; |
72 | goog.array.forEach(this.matchers_, function(matcher) { |
73 | if (!matcher.matches(actualValue)) { |
74 | errorString += matcher.describe(actualValue) + '\n'; |
75 | } |
76 | }); |
77 | return errorString; |
78 | }; |
79 | |
80 | |
81 | |
82 | /** |
83 | * The AnyOf matcher. |
84 | * |
85 | * @param {!Array.<!goog.labs.testing.Matcher>} matchers Input matchers. |
86 | * |
87 | * @constructor |
88 | * @struct |
89 | * @implements {goog.labs.testing.Matcher} |
90 | * @final |
91 | */ |
92 | goog.labs.testing.AnyOfMatcher = function(matchers) { |
93 | /** |
94 | * @type {!Array.<!goog.labs.testing.Matcher>} |
95 | * @private |
96 | */ |
97 | this.matchers_ = matchers; |
98 | }; |
99 | |
100 | |
101 | /** |
102 | * Determines if any of the matchers matches the input value. |
103 | * |
104 | * @override |
105 | */ |
106 | goog.labs.testing.AnyOfMatcher.prototype.matches = function(actualValue) { |
107 | return goog.array.some(this.matchers_, function(matcher) { |
108 | return matcher.matches(actualValue); |
109 | }); |
110 | }; |
111 | |
112 | |
113 | /** |
114 | * Describes why the matcher failed. |
115 | * |
116 | * @override |
117 | */ |
118 | goog.labs.testing.AnyOfMatcher.prototype.describe = |
119 | function(actualValue) { |
120 | // TODO(user) : Optimize this to remove duplication with matches ? |
121 | var errorString = ''; |
122 | goog.array.forEach(this.matchers_, function(matcher) { |
123 | if (!matcher.matches(actualValue)) { |
124 | errorString += matcher.describe(actualValue) + '\n'; |
125 | } |
126 | }); |
127 | return errorString; |
128 | }; |
129 | |
130 | |
131 | |
132 | /** |
133 | * The IsNot matcher. |
134 | * |
135 | * @param {!goog.labs.testing.Matcher} matcher The matcher to negate. |
136 | * |
137 | * @constructor |
138 | * @struct |
139 | * @implements {goog.labs.testing.Matcher} |
140 | * @final |
141 | */ |
142 | goog.labs.testing.IsNotMatcher = function(matcher) { |
143 | /** |
144 | * @type {!goog.labs.testing.Matcher} |
145 | * @private |
146 | */ |
147 | this.matcher_ = matcher; |
148 | }; |
149 | |
150 | |
151 | /** |
152 | * Determines if the input value doesn't satisfy a matcher. |
153 | * |
154 | * @override |
155 | */ |
156 | goog.labs.testing.IsNotMatcher.prototype.matches = function(actualValue) { |
157 | return !this.matcher_.matches(actualValue); |
158 | }; |
159 | |
160 | |
161 | /** |
162 | * Describes why the matcher failed. |
163 | * |
164 | * @override |
165 | */ |
166 | goog.labs.testing.IsNotMatcher.prototype.describe = |
167 | function(actualValue) { |
168 | return 'The following is false: ' + this.matcher_.describe(actualValue); |
169 | }; |
170 | |
171 | |
172 | /** |
173 | * Creates a matcher that will succeed only if all of the given matchers |
174 | * succeed. |
175 | * |
176 | * @param {...goog.labs.testing.Matcher} var_args The matchers to test |
177 | * against. |
178 | * |
179 | * @return {!goog.labs.testing.AllOfMatcher} The AllOf matcher. |
180 | */ |
181 | function allOf(var_args) { |
182 | var matchers = goog.array.toArray(arguments); |
183 | return new goog.labs.testing.AllOfMatcher(matchers); |
184 | } |
185 | |
186 | |
187 | /** |
188 | * Accepts a set of matchers and returns a matcher which matches |
189 | * values which satisfy the constraints of any of the given matchers. |
190 | * |
191 | * @param {...goog.labs.testing.Matcher} var_args The matchers to test |
192 | * against. |
193 | * |
194 | * @return {!goog.labs.testing.AnyOfMatcher} The AnyOf matcher. |
195 | */ |
196 | function anyOf(var_args) { |
197 | var matchers = goog.array.toArray(arguments); |
198 | return new goog.labs.testing.AnyOfMatcher(matchers); |
199 | } |
200 | |
201 | |
202 | /** |
203 | * Returns a matcher that negates the input matcher. The returned |
204 | * matcher matches the values not matched by the input matcher and vice-versa. |
205 | * |
206 | * @param {!goog.labs.testing.Matcher} matcher The matcher to test against. |
207 | * |
208 | * @return {!goog.labs.testing.IsNotMatcher} The IsNot matcher. |
209 | */ |
210 | function isNot(matcher) { |
211 | return new goog.labs.testing.IsNotMatcher(matcher); |
212 | } |