standalone-pre.js revision cfb0617749a64f2e177386b030d46007b8c4b179
1function description(msg)
2{
3    print(msg);
4    print("\nOn success, you will see a series of \"PASS\" messages, followed by \"TEST COMPLETE\".\n");
5    print();
6}
7
8function debug(msg)
9{
10    print(msg);
11}
12
13function escapeString(text)
14{
15    return text.replace(/\0/g, "");
16}
17
18function testPassed(msg)
19{
20    print("PASS", escapeString(msg));
21}
22
23function testFailed(msg)
24{
25    print("FAIL", escapeString(msg));
26}
27
28function areArraysEqual(_a, _b)
29{
30    if (_a.length !== _b.length)
31        return false;
32    for (var i = 0; i < _a.length; i++)
33        if (_a[i] !== _b[i])
34            return false;
35    return true;
36}
37
38function isMinusZero(n)
39{
40    // the only way to tell 0 from -0 in JS is the fact that 1/-0 is
41    // -Infinity instead of Infinity
42    return n === 0 && 1/n < 0;
43}
44
45function isResultCorrect(_actual, _expected)
46{
47    if (_expected === 0)
48        return _actual === _expected && (1/_actual) === (1/_expected);
49    if (_actual === _expected)
50        return true;
51    if (typeof(_expected) == "number" && isNaN(_expected))
52        return typeof(_actual) == "number" && isNaN(_actual);
53    if (Object.prototype.toString.call(_expected) == Object.prototype.toString.call([]))
54        return areArraysEqual(_actual, _expected);
55    return false;
56}
57
58function stringify(v)
59{
60    if (v === 0 && 1/v < 0)
61        return "-0";
62    else return "" + v;
63}
64
65function shouldBe(_a, _b)
66{
67  if (typeof _a != "string" || typeof _b != "string")
68    debug("WARN: shouldBe() expects string arguments");
69  var exception;
70  var _av;
71  try {
72     _av = eval(_a);
73  } catch (e) {
74     exception = e;
75  }
76  var _bv = eval(_b);
77
78  if (exception)
79    testFailed(_a + " should be " + _bv + ". Threw exception " + exception);
80  else if (isResultCorrect(_av, _bv))
81    testPassed(_a + " is " + _b);
82  else if (typeof(_av) == typeof(_bv))
83    testFailed(_a + " should be " + _bv + ". Was " + stringify(_av) + ".");
84  else
85    testFailed(_a + " should be " + _bv + " (of type " + typeof _bv + "). Was " + _av + " (of type " + typeof _av + ").");
86}
87
88function shouldBeTrue(_a) { shouldBe(_a, "true"); }
89function shouldBeFalse(_a) { shouldBe(_a, "false"); }
90function shouldBeNaN(_a) { shouldBe(_a, "NaN"); }
91function shouldBeNull(_a) { shouldBe(_a, "null"); }
92
93function shouldBeEqualToString(a, b)
94{
95  var unevaledString = '"' + b.replace(/"/g, "\"") + '"';
96  shouldBe(a, unevaledString);
97}
98
99function shouldBeUndefined(_a)
100{
101  var exception;
102  var _av;
103  try {
104     _av = eval(_a);
105  } catch (e) {
106     exception = e;
107  }
108
109  if (exception)
110    testFailed(_a + " should be undefined. Threw exception " + exception);
111  else if (typeof _av == "undefined")
112    testPassed(_a + " is undefined.");
113  else
114    testFailed(_a + " should be undefined. Was " + _av);
115}
116
117
118function shouldThrow(_a, _e)
119{
120  var exception;
121  var _av;
122  try {
123     _av = eval(_a);
124  } catch (e) {
125     exception = e;
126  }
127
128  var _ev;
129  if (_e)
130      _ev =  eval(_e);
131
132  if (exception) {
133    if (typeof _e == "undefined" || exception == _ev)
134      testPassed(_a + " threw exception " + exception + ".");
135    else
136      testFailed(_a + " should throw " + (typeof _e == "undefined" ? "an exception" : _ev) + ". Threw exception " + exception + ".");
137  } else if (typeof _av == "undefined")
138    testFailed(_a + " should throw " + (typeof _e == "undefined" ? "an exception" : _ev) + ". Was undefined.");
139  else
140    testFailed(_a + " should throw " + (typeof _e == "undefined" ? "an exception" : _ev) + ". Was " + _av + ".");
141}
142