166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Copyright (c) 2013 The Chromium Authors. All rights reserved.
266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Use of this source code is governed by a BSD-style license that can be
366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// found in the LICENSE file.
466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis'use strict';
666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('base.unittest.test_error');
866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.exportTo('base.unittest', function() {
966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  function forAllAssertMethodsIn_(prototype, fn) {
1066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    for (var fieldName in prototype) {
1166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (fieldName.indexOf('assert') != 0)
1266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        continue;
1366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var fieldValue = prototype[fieldName];
1466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (typeof fieldValue != 'function')
1566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        continue;
1666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      fn(fieldName, fieldValue);
1766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    }
1866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  }
1966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
2066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  var Assertions = {};
2166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  Assertions.prototype = {
2266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertTrue: function(a, opt_message) {
2366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (a)
2466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
2566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var message = opt_message || 'Expected true, got ' + a;
2666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new base.unittest.TestError(message);
2766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
2866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
2966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertFalse: function(a, opt_message) {
3066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (!a)
3166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
3266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var message = opt_message || 'Expected false, got ' + a;
3366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new base.unittest.TestError(message);
3466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
3566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
3666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertUndefined: function(a, opt_message) {
3766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (a === undefined)
3866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
3966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var message = opt_message || 'Expected undefined, got ' + a;
4066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new base.unittest.TestError(message);
4166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
4266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
4366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertNotUndefined: function(a, opt_message) {
4466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (a !== undefined)
4566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
4666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var message = opt_message || 'Expected not undefined, got ' + a;
4766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new base.unittest.TestError(message);
4866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
4966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
5066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertNull: function(a, opt_message) {
5166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (a === null)
5266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
5366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var message = opt_message || 'Expected null, got ' + a;
5466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new base.unittest.TestError(message);
5566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
5666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
5766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertNotNull: function(a, opt_message) {
5866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (a !== null)
5966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
6066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var message = opt_message || 'Expected non-null, got ' + a;
6166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new base.unittest.TestError(message);
6266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
6366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
6466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertEquals: function(a, b, opt_message) {
6566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (a === b)
6666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
6766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var message = opt_message || 'Expected\n"' + JSON.stringify(a) +
6866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          '"\ngot\n"' + JSON.stringify(b) + '"';
6966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new base.unittest.TestError(message);
7066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
7166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertNotEquals: function(a, b, opt_message) {
7366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (a !== b)
7466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
7566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var message = opt_message || 'Expected something not equal to ' + b;
7666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new base.unittest.TestError(message);
7766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
7866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertArrayEquals: function(a, b, opt_message) {
8066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (a.length === b.length) {
8166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var ok = true;
8266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        for (var i = 0; i < a.length; i++) {
8366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          ok &= (a[i] === b[i]);
8466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }
8566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        if (ok)
8666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          return;
8766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
8866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
8966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var message = opt_message || 'Expected array ' + a + ', got array ' + b;
9066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new base.unittest.TestError(message);
9166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
9266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
9366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertArrayShallowEquals: function(a, b, opt_message) {
9466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (a.length === b.length) {
9566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var ok = true;
9666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        for (var i = 0; i < a.length; i++) {
9766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          ok &= (a[i] === b[i]);
9866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }
9966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        if (ok)
10066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          return;
10166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
10266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
10366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var message = opt_message || 'Expected array ' + b + ', got array ' + a;
10466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new base.unittest.TestError(message);
10566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
10666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
10766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertAlmostEquals: function(a, b, opt_message) {
10866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (Math.abs(a - b) < 0.00001)
10966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
11066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var message = opt_message || 'Expected almost ' + a + ', got ' + b;
11166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new base.unittest.TestError(message);
11266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
11366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
11466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertVec2Equals: function(a, b, opt_message) {
11566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (a[0] === b[0] &&
11666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          a[1] === b[1])
11766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
11866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var message = opt_message || 'Expected (' + a[0] + ',' + a[1] +
11966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          ') but got (' + b[0] + ',' + b[1] + ')';
12066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new base.unittest.TestError(message);
12166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
12266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
12366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertVec3Equals: function(a, b, opt_message) {
12466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (a[0] === b[0] &&
12566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          a[1] === b[1] &&
12666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          a[2] === b[2])
12766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
12866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var message = opt_message || 'Expected ' + vec3.toString(a) +
12966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          ' but got ' + vec3.toString(b);
13066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new base.unittest.TestError(message);
13166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
13266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
13366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertQuadEquals: function(a, b, opt_message) {
13466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var ok = true;
13566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      ok &= a.p1[0] === b.p1[0] && a.p1[1] === b.p1[1];
13666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      ok &= a.p2[0] === b.p2[0] && a.p2[1] === b.p2[1];
13766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      ok &= a.p3[0] === b.p3[0] && a.p3[1] === b.p3[1];
13866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      ok &= a.p4[0] === b.p4[0] && a.p4[1] === b.p4[1];
13966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (ok)
14066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
14166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var message = opt_message || 'Expected "' + a.toString() +
14266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          '", got "' + b.toString() + '"';
14366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new base.unittest.TestError(message);
14466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
14566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
14666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertRectEquals: function(a, b, opt_message) {
14766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var ok = true;
14866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (a.x === b.x && a.y === b.y &&
14966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          a.width === b.width && a.height === b.height) {
15066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
15166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
15266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
15366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var message = opt_message || 'Expected "' + a.toString() +
15466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          '", got "' + b.toString() + '"';
15566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new base.unittest.TestError(message);
15666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
15766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
15866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertObjectEquals: function(a, b, opt_message) {
15966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var a_json = JSON.stringify(a);
16066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var b_json = JSON.stringify(b);
16166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (a_json === b_json)
16266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
16366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var message = opt_message || 'Expected ' + a_json + ', got ' + b_json;
16466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new base.unittest.TestError(message);
16566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
16666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
16766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertThrows: function(fn, opt_message) {
16866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      try {
16966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        fn();
17066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      } catch (e) {
17166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
17266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
17366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var message = opt_message || 'Expected throw from ' + fn;
17466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new base.unittest.TestError(message);
17566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
17666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
17766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertDoesNotThrow: function(fn, opt_message) {
17866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      try {
17966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        fn();
18066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      } catch (e) {
18166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var message = opt_message || 'Expected to not throw from ' + fn +
18266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            ' but got: ' + e;
18366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        throw new TestError(message);
18466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
18566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
18666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
18766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertApproxEquals: function(a, b, opt_epsilon, opt_message) {
18866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (a === b)
18966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
19066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var epsilon = opt_epsilon || 0.000001; // 6 digits.
19166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      a = Math.abs(a);
19266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      b = Math.abs(b);
19366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var relative_error = Math.abs(a - b) / (a + b);
19466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (relative_error < epsilon)
19566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
19666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var message = opt_message || 'Expect ' + a + ' and ' + b +
19766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          ' to be within ' + epsilon + ' was ' + relative_error;
19866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new base.unittest.TestError(message);
19966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
20066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
20166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertVisible: function(elt) {
20266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (!elt.offsetHeight || !elt.offsetWidth)
20366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        throw new base.unittest.TestError('Expected element to be visible');
20466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    }
20566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
20666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
20766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  function bindGlobals_() {
20866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    forAllAssertMethodsIn_(Assertions.prototype,
20966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        function(fieldName, fieldValue) {
21066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          global[fieldName] = fieldValue.bind(this);
21166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
21266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
21366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  bindGlobals_();
21466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
21566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  return {
21666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    Assertions: Assertions
21766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
21866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis});
21966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
220