1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5'use strict';
6
7base.require('base.unittest.test_error');
8base.exportTo('base.unittest', function() {
9  function forAllAssertMethodsIn_(prototype, fn) {
10    for (var fieldName in prototype) {
11      if (fieldName.indexOf('assert') != 0)
12        continue;
13      var fieldValue = prototype[fieldName];
14      if (typeof fieldValue != 'function')
15        continue;
16      fn(fieldName, fieldValue);
17    }
18  }
19
20  var Assertions = {};
21  Assertions.prototype = {
22    assertTrue: function(a, opt_message) {
23      if (a)
24        return;
25      var message = opt_message || 'Expected true, got ' + a;
26      throw new base.unittest.TestError(message);
27    },
28
29    assertFalse: function(a, opt_message) {
30      if (!a)
31        return;
32      var message = opt_message || 'Expected false, got ' + a;
33      throw new base.unittest.TestError(message);
34    },
35
36    assertUndefined: function(a, opt_message) {
37      if (a === undefined)
38        return;
39      var message = opt_message || 'Expected undefined, got ' + a;
40      throw new base.unittest.TestError(message);
41    },
42
43    assertNotUndefined: function(a, opt_message) {
44      if (a !== undefined)
45        return;
46      var message = opt_message || 'Expected not undefined, got ' + a;
47      throw new base.unittest.TestError(message);
48    },
49
50    assertNull: function(a, opt_message) {
51      if (a === null)
52        return;
53      var message = opt_message || 'Expected null, got ' + a;
54      throw new base.unittest.TestError(message);
55    },
56
57    assertNotNull: function(a, opt_message) {
58      if (a !== null)
59        return;
60      var message = opt_message || 'Expected non-null, got ' + a;
61      throw new base.unittest.TestError(message);
62    },
63
64    assertEquals: function(a, b, opt_message) {
65      if (a === b)
66        return;
67      var message = opt_message || 'Expected\n"' + JSON.stringify(a) +
68          '"\ngot\n"' + JSON.stringify(b) + '"';
69      throw new base.unittest.TestError(message);
70    },
71
72    assertNotEquals: function(a, b, opt_message) {
73      if (a !== b)
74        return;
75      var message = opt_message || 'Expected something not equal to ' + b;
76      throw new base.unittest.TestError(message);
77    },
78
79    assertArrayEquals: function(a, b, opt_message) {
80      if (a.length === b.length) {
81        var ok = true;
82        for (var i = 0; i < a.length; i++) {
83          ok &= (a[i] === b[i]);
84        }
85        if (ok)
86          return;
87      }
88
89      var message = opt_message || 'Expected array ' + a + ', got array ' + b;
90      throw new base.unittest.TestError(message);
91    },
92
93    assertArrayShallowEquals: function(a, b, opt_message) {
94      if (a.length === b.length) {
95        var ok = true;
96        for (var i = 0; i < a.length; i++) {
97          ok &= (a[i] === b[i]);
98        }
99        if (ok)
100          return;
101      }
102
103      var message = opt_message || 'Expected array ' + b + ', got array ' + a;
104      throw new base.unittest.TestError(message);
105    },
106
107    assertAlmostEquals: function(a, b, opt_message) {
108      if (Math.abs(a - b) < 0.00001)
109        return;
110      var message = opt_message || 'Expected almost ' + a + ', got ' + b;
111      throw new base.unittest.TestError(message);
112    },
113
114    assertVec2Equals: function(a, b, opt_message) {
115      if (a[0] === b[0] &&
116          a[1] === b[1])
117        return;
118      var message = opt_message || 'Expected (' + a[0] + ',' + a[1] +
119          ') but got (' + b[0] + ',' + b[1] + ')';
120      throw new base.unittest.TestError(message);
121    },
122
123    assertVec3Equals: function(a, b, opt_message) {
124      if (a[0] === b[0] &&
125          a[1] === b[1] &&
126          a[2] === b[2])
127        return;
128      var message = opt_message || 'Expected ' + vec3.toString(a) +
129          ' but got ' + vec3.toString(b);
130      throw new base.unittest.TestError(message);
131    },
132
133    assertQuadEquals: function(a, b, opt_message) {
134      var ok = true;
135      ok &= a.p1[0] === b.p1[0] && a.p1[1] === b.p1[1];
136      ok &= a.p2[0] === b.p2[0] && a.p2[1] === b.p2[1];
137      ok &= a.p3[0] === b.p3[0] && a.p3[1] === b.p3[1];
138      ok &= a.p4[0] === b.p4[0] && a.p4[1] === b.p4[1];
139      if (ok)
140        return;
141      var message = opt_message || 'Expected "' + a.toString() +
142          '", got "' + b.toString() + '"';
143      throw new base.unittest.TestError(message);
144    },
145
146    assertRectEquals: function(a, b, opt_message) {
147      var ok = true;
148      if (a.x === b.x && a.y === b.y &&
149          a.width === b.width && a.height === b.height) {
150        return;
151      }
152
153      var message = opt_message || 'Expected "' + a.toString() +
154          '", got "' + b.toString() + '"';
155      throw new base.unittest.TestError(message);
156    },
157
158    assertObjectEquals: function(a, b, opt_message) {
159      var a_json = JSON.stringify(a);
160      var b_json = JSON.stringify(b);
161      if (a_json === b_json)
162        return;
163      var message = opt_message || 'Expected ' + a_json + ', got ' + b_json;
164      throw new base.unittest.TestError(message);
165    },
166
167    assertThrows: function(fn, opt_message) {
168      try {
169        fn();
170      } catch (e) {
171        return;
172      }
173      var message = opt_message || 'Expected throw from ' + fn;
174      throw new base.unittest.TestError(message);
175    },
176
177    assertDoesNotThrow: function(fn, opt_message) {
178      try {
179        fn();
180      } catch (e) {
181        var message = opt_message || 'Expected to not throw from ' + fn +
182            ' but got: ' + e;
183        throw new TestError(message);
184      }
185    },
186
187    assertApproxEquals: function(a, b, opt_epsilon, opt_message) {
188      if (a === b)
189        return;
190      var epsilon = opt_epsilon || 0.000001; // 6 digits.
191      a = Math.abs(a);
192      b = Math.abs(b);
193      var relative_error = Math.abs(a - b) / (a + b);
194      if (relative_error < epsilon)
195        return;
196      var message = opt_message || 'Expect ' + a + ' and ' + b +
197          ' to be within ' + epsilon + ' was ' + relative_error;
198      throw new base.unittest.TestError(message);
199    },
200
201    assertVisible: function(elt) {
202      if (!elt.offsetHeight || !elt.offsetWidth)
203        throw new base.unittest.TestError('Expected element to be visible');
204    }
205  };
206
207  function bindGlobals_() {
208    forAllAssertMethodsIn_(Assertions.prototype,
209        function(fieldName, fieldValue) {
210          global[fieldName] = fieldValue.bind(this);
211        });
212  };
213  bindGlobals_();
214
215  return {
216    Assertions: Assertions
217  };
218});
219
220