1967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch// svg/dynamic-updates tests set enablePixelTesting=true, as we want to dump text + pixel results
2cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockif (window.layoutTestController)
3967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    layoutTestController.dumpAsText(window.enablePixelTesting);
4cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
5cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction description(msg)
6cfb0617749a64f2e177386b030d46007b8c4b179Steve Block{
7cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    // For MSIE 6 compatibility
8cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    var span = document.createElement("span");
9cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    span.innerHTML = '<p>' + msg + '</p><p>On success, you will see a series of "<span class="pass">PASS</span>" messages, followed by "<span class="pass">TEST COMPLETE</span>".</p>';
10cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    var description = document.getElementById("description");
11cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    if (description.firstChild)
12cfb0617749a64f2e177386b030d46007b8c4b179Steve Block        description.replaceChild(span, description.firstChild);
13cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    else
14cfb0617749a64f2e177386b030d46007b8c4b179Steve Block        description.appendChild(span);
15cfb0617749a64f2e177386b030d46007b8c4b179Steve Block}
16cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
17cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction debug(msg)
18cfb0617749a64f2e177386b030d46007b8c4b179Steve Block{
19cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    var span = document.createElement("span");
20cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    document.getElementById("console").appendChild(span); // insert it first so XHTML knows the namespace
21cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    span.innerHTML = msg + '<br />';
22cfb0617749a64f2e177386b030d46007b8c4b179Steve Block}
23cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
24cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction escapeHTML(text)
25cfb0617749a64f2e177386b030d46007b8c4b179Steve Block{
26dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/\0/g, "\\0");
27cfb0617749a64f2e177386b030d46007b8c4b179Steve Block}
28cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
29cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction testPassed(msg)
30cfb0617749a64f2e177386b030d46007b8c4b179Steve Block{
31cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    debug('<span><span class="pass">PASS</span> ' + escapeHTML(msg) + '</span>');
32cfb0617749a64f2e177386b030d46007b8c4b179Steve Block}
33cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
34cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction testFailed(msg)
35cfb0617749a64f2e177386b030d46007b8c4b179Steve Block{
36cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    debug('<span><span class="fail">FAIL</span> ' + escapeHTML(msg) + '</span>');
37cfb0617749a64f2e177386b030d46007b8c4b179Steve Block}
38cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
39cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction areArraysEqual(_a, _b)
40cfb0617749a64f2e177386b030d46007b8c4b179Steve Block{
41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    try {
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (_a.length !== _b.length)
43cfb0617749a64f2e177386b030d46007b8c4b179Steve Block            return false;
44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        for (var i = 0; i < _a.length; i++)
45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (_a[i] !== _b[i])
46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                return false;
47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } catch (ex) {
48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
50cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    return true;
51cfb0617749a64f2e177386b030d46007b8c4b179Steve Block}
52cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
53cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction isMinusZero(n)
54cfb0617749a64f2e177386b030d46007b8c4b179Steve Block{
55cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    // the only way to tell 0 from -0 in JS is the fact that 1/-0 is
56cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    // -Infinity instead of Infinity
57cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    return n === 0 && 1/n < 0;
58cfb0617749a64f2e177386b030d46007b8c4b179Steve Block}
59cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
60cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction isResultCorrect(_actual, _expected)
61cfb0617749a64f2e177386b030d46007b8c4b179Steve Block{
62cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    if (_expected === 0)
63cfb0617749a64f2e177386b030d46007b8c4b179Steve Block        return _actual === _expected && (1/_actual) === (1/_expected);
64cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    if (_actual === _expected)
65cfb0617749a64f2e177386b030d46007b8c4b179Steve Block        return true;
66cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    if (typeof(_expected) == "number" && isNaN(_expected))
67cfb0617749a64f2e177386b030d46007b8c4b179Steve Block        return typeof(_actual) == "number" && isNaN(_actual);
68cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    if (Object.prototype.toString.call(_expected) == Object.prototype.toString.call([]))
69cfb0617749a64f2e177386b030d46007b8c4b179Steve Block        return areArraysEqual(_actual, _expected);
70cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    return false;
71cfb0617749a64f2e177386b030d46007b8c4b179Steve Block}
72cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
73cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction stringify(v)
74cfb0617749a64f2e177386b030d46007b8c4b179Steve Block{
75cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    if (v === 0 && 1/v < 0)
76cfb0617749a64f2e177386b030d46007b8c4b179Steve Block        return "-0";
77cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    else return "" + v;
78cfb0617749a64f2e177386b030d46007b8c4b179Steve Block}
79cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
80cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction evalAndLog(_a)
81cfb0617749a64f2e177386b030d46007b8c4b179Steve Block{
82cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  if (typeof _a != "string")
83cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    debug("WARN: tryAndLog() expects a string argument");
84cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
85cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  // Log first in case things go horribly wrong or this causes a sync event.
86cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  debug(_a);
87cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
88cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  var _av;
89cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  try {
90cfb0617749a64f2e177386b030d46007b8c4b179Steve Block     _av = eval(_a);
91cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  } catch (e) {
92cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    testFailed(_a + " threw exception " + e);
93cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  }
946c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen  return _av;
95cfb0617749a64f2e177386b030d46007b8c4b179Steve Block}
96cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
97cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction shouldBe(_a, _b)
98cfb0617749a64f2e177386b030d46007b8c4b179Steve Block{
99cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  if (typeof _a != "string" || typeof _b != "string")
100cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    debug("WARN: shouldBe() expects string arguments");
101cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  var exception;
102cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  var _av;
103cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  try {
104cfb0617749a64f2e177386b030d46007b8c4b179Steve Block     _av = eval(_a);
105cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  } catch (e) {
106cfb0617749a64f2e177386b030d46007b8c4b179Steve Block     exception = e;
107cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  }
108cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  var _bv = eval(_b);
109cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
110cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  if (exception)
111cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    testFailed(_a + " should be " + _bv + ". Threw exception " + exception);
112cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  else if (isResultCorrect(_av, _bv))
113cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    testPassed(_a + " is " + _b);
114cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  else if (typeof(_av) == typeof(_bv))
115cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    testFailed(_a + " should be " + _bv + ". Was " + stringify(_av) + ".");
116cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  else
117cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    testFailed(_a + " should be " + _bv + " (of type " + typeof _bv + "). Was " + _av + " (of type " + typeof _av + ").");
118cfb0617749a64f2e177386b030d46007b8c4b179Steve Block}
119cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
120cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction shouldBeTrue(_a) { shouldBe(_a, "true"); }
121cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction shouldBeFalse(_a) { shouldBe(_a, "false"); }
122cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction shouldBeNaN(_a) { shouldBe(_a, "NaN"); }
123cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction shouldBeNull(_a) { shouldBe(_a, "null"); }
124cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
125cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction shouldBeEqualToString(a, b)
126cfb0617749a64f2e177386b030d46007b8c4b179Steve Block{
127a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch  var unevaledString = '"' + b.replace(/\\/g, "\\\\").replace(/"/g, "\"").replace(/\n/g, "\\n").replace(/\r/g, "\\r") + '"';
128cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  shouldBe(a, unevaledString);
129cfb0617749a64f2e177386b030d46007b8c4b179Steve Block}
130cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
131cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction shouldEvaluateTo(actual, expected) {
132cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  // A general-purpose comparator.  'actual' should be a string to be
133cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  // evaluated, as for shouldBe(). 'expected' may be any type and will be
134cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  // used without being eval'ed.
135cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  if (expected == null) {
136cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    // Do this before the object test, since null is of type 'object'.
137cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    shouldBeNull(actual);
138cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  } else if (typeof expected == "undefined") {
139cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    shouldBeUndefined(actual);
140cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  } else if (typeof expected == "function") {
141cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    // All this fuss is to avoid the string-arg warning from shouldBe().
142cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    try {
143cfb0617749a64f2e177386b030d46007b8c4b179Steve Block      actualValue = eval(actual);
144cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    } catch (e) {
145cfb0617749a64f2e177386b030d46007b8c4b179Steve Block      testFailed("Evaluating " + actual + ": Threw exception " + e);
146cfb0617749a64f2e177386b030d46007b8c4b179Steve Block      return;
147cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    }
148cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    shouldBe("'" + actualValue.toString().replace(/\n/g, "") + "'",
149cfb0617749a64f2e177386b030d46007b8c4b179Steve Block             "'" + expected.toString().replace(/\n/g, "") + "'");
150cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  } else if (typeof expected == "object") {
151cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    shouldBeTrue(actual + " == '" + expected + "'");
152cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  } else if (typeof expected == "string") {
153cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    shouldBe(actual, expected);
154cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  } else if (typeof expected == "boolean") {
155cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    shouldBe("typeof " + actual, "'boolean'");
156cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    if (expected)
157cfb0617749a64f2e177386b030d46007b8c4b179Steve Block      shouldBeTrue(actual);
158cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    else
159cfb0617749a64f2e177386b030d46007b8c4b179Steve Block      shouldBeFalse(actual);
160cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  } else if (typeof expected == "number") {
161cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    shouldBe(actual, stringify(expected));
162cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  } else {
163cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    debug(expected + " is unknown type " + typeof expected);
164cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    shouldBeTrue(actual, "'"  +expected.toString() + "'");
165cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  }
166cfb0617749a64f2e177386b030d46007b8c4b179Steve Block}
167cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
168cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction shouldBeNonZero(_a)
169cfb0617749a64f2e177386b030d46007b8c4b179Steve Block{
170cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  var exception;
171cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  var _av;
172cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  try {
173cfb0617749a64f2e177386b030d46007b8c4b179Steve Block     _av = eval(_a);
174cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  } catch (e) {
175cfb0617749a64f2e177386b030d46007b8c4b179Steve Block     exception = e;
176cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  }
177cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
178cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  if (exception)
179cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    testFailed(_a + " should be non-zero. Threw exception " + exception);
180cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  else if (_av != 0)
181cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    testPassed(_a + " is non-zero.");
182cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  else
183cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    testFailed(_a + " should be non-zero. Was " + _av);
184cfb0617749a64f2e177386b030d46007b8c4b179Steve Block}
185cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
186cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction shouldBeNonNull(_a)
187cfb0617749a64f2e177386b030d46007b8c4b179Steve Block{
188cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  var exception;
189cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  var _av;
190cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  try {
191cfb0617749a64f2e177386b030d46007b8c4b179Steve Block     _av = eval(_a);
192cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  } catch (e) {
193cfb0617749a64f2e177386b030d46007b8c4b179Steve Block     exception = e;
194cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  }
195cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
196cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  if (exception)
197cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    testFailed(_a + " should be non-null. Threw exception " + exception);
198cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  else if (_av != null)
199cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    testPassed(_a + " is non-null.");
200cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  else
201cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    testFailed(_a + " should be non-null. Was " + _av);
202cfb0617749a64f2e177386b030d46007b8c4b179Steve Block}
203cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
204cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction shouldBeUndefined(_a)
205cfb0617749a64f2e177386b030d46007b8c4b179Steve Block{
206cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  var exception;
207cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  var _av;
208cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  try {
209cfb0617749a64f2e177386b030d46007b8c4b179Steve Block     _av = eval(_a);
210cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  } catch (e) {
211cfb0617749a64f2e177386b030d46007b8c4b179Steve Block     exception = e;
212cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  }
213cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
214cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  if (exception)
215cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    testFailed(_a + " should be undefined. Threw exception " + exception);
216cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  else if (typeof _av == "undefined")
217cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    testPassed(_a + " is undefined.");
218cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  else
219cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    testFailed(_a + " should be undefined. Was " + _av);
220cfb0617749a64f2e177386b030d46007b8c4b179Steve Block}
221cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
222e14391e94c850b8bd03680c23b38978db68687a8John Reckfunction shouldBeDefined(_a)
223e14391e94c850b8bd03680c23b38978db68687a8John Reck{
224e14391e94c850b8bd03680c23b38978db68687a8John Reck  var exception;
225e14391e94c850b8bd03680c23b38978db68687a8John Reck  var _av;
226e14391e94c850b8bd03680c23b38978db68687a8John Reck  try {
227e14391e94c850b8bd03680c23b38978db68687a8John Reck     _av = eval(_a);
228e14391e94c850b8bd03680c23b38978db68687a8John Reck  } catch (e) {
229e14391e94c850b8bd03680c23b38978db68687a8John Reck     exception = e;
230e14391e94c850b8bd03680c23b38978db68687a8John Reck  }
231e14391e94c850b8bd03680c23b38978db68687a8John Reck
232e14391e94c850b8bd03680c23b38978db68687a8John Reck  if (exception)
233e14391e94c850b8bd03680c23b38978db68687a8John Reck    testFailed(_a + " should be defined. Threw exception " + exception);
234e14391e94c850b8bd03680c23b38978db68687a8John Reck  else if (_av !== undefined)
235e14391e94c850b8bd03680c23b38978db68687a8John Reck    testPassed(_a + " is defined.");
236e14391e94c850b8bd03680c23b38978db68687a8John Reck  else
237e14391e94c850b8bd03680c23b38978db68687a8John Reck    testFailed(_a + " should be defined. Was " + _av);
238e14391e94c850b8bd03680c23b38978db68687a8John Reck}
239e14391e94c850b8bd03680c23b38978db68687a8John Reck
240967717af5423377c967781471ee106e2bb4e11c8Ben Murdochfunction shouldBeGreaterThanOrEqual(_a, _b) {
241967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (typeof _a != "string" || typeof _b != "string")
242967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        debug("WARN: shouldBeGreaterThanOrEqual expects string arguments");
243967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
244967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    var exception;
245967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    var _av;
246967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    try {
247967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        _av = eval(_a);
248967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    } catch (e) {
249967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        exception = e;
250967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    }
251967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    var _bv = eval(_b);
252967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
253967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (exception)
254967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        testFailed(_a + " should be >= " + _b + ". Threw exception " + exception);
255967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    else if (typeof _av == "undefined" || _av < _bv)
256967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        testFailed(_a + " should be >= " + _b + ". Was " + _av + " (of type " + typeof _av + ").");
257967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    else
258967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        testPassed(_a + " is >= " + _b);
259967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
260cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
261cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction shouldThrow(_a, _e)
262cfb0617749a64f2e177386b030d46007b8c4b179Steve Block{
263cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  var exception;
264cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  var _av;
265cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  try {
266cfb0617749a64f2e177386b030d46007b8c4b179Steve Block     _av = eval(_a);
267cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  } catch (e) {
268cfb0617749a64f2e177386b030d46007b8c4b179Steve Block     exception = e;
269cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  }
270cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
271cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  var _ev;
272cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  if (_e)
273cfb0617749a64f2e177386b030d46007b8c4b179Steve Block      _ev =  eval(_e);
274cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
275cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  if (exception) {
276cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    if (typeof _e == "undefined" || exception == _ev)
277cfb0617749a64f2e177386b030d46007b8c4b179Steve Block      testPassed(_a + " threw exception " + exception + ".");
278cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    else
279cfb0617749a64f2e177386b030d46007b8c4b179Steve Block      testFailed(_a + " should throw " + (typeof _e == "undefined" ? "an exception" : _ev) + ". Threw exception " + exception + ".");
280cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  } else if (typeof _av == "undefined")
281cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    testFailed(_a + " should throw " + (typeof _e == "undefined" ? "an exception" : _ev) + ". Was undefined.");
282cfb0617749a64f2e177386b030d46007b8c4b179Steve Block  else
283cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    testFailed(_a + " should throw " + (typeof _e == "undefined" ? "an exception" : _ev) + ". Was " + _av + ".");
284cfb0617749a64f2e177386b030d46007b8c4b179Steve Block}
285cfb0617749a64f2e177386b030d46007b8c4b179Steve Block
286cfb0617749a64f2e177386b030d46007b8c4b179Steve Blockfunction gc() {
287cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    if (typeof GCController !== "undefined")
288cfb0617749a64f2e177386b030d46007b8c4b179Steve Block        GCController.collect();
289cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    else {
290cfb0617749a64f2e177386b030d46007b8c4b179Steve Block        function gcRec(n) {
291cfb0617749a64f2e177386b030d46007b8c4b179Steve Block            if (n < 1)
292cfb0617749a64f2e177386b030d46007b8c4b179Steve Block                return {};
293cfb0617749a64f2e177386b030d46007b8c4b179Steve Block            var temp = {i: "ab" + i + (i / 100000)};
294cfb0617749a64f2e177386b030d46007b8c4b179Steve Block            temp += "foo";
295cfb0617749a64f2e177386b030d46007b8c4b179Steve Block            gcRec(n-1);
296cfb0617749a64f2e177386b030d46007b8c4b179Steve Block        }
297cfb0617749a64f2e177386b030d46007b8c4b179Steve Block        for (var i = 0; i < 1000; i++)
298cfb0617749a64f2e177386b030d46007b8c4b179Steve Block            gcRec(10)
299cfb0617749a64f2e177386b030d46007b8c4b179Steve Block    }
300cfb0617749a64f2e177386b030d46007b8c4b179Steve Block}
3015ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
3025ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// It's possible for an async test to call finishJSTest() before js-test-post.js
3035ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// has been parsed.
3045ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenfunction finishJSTest()
3055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
3065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    wasFinishJSTestCalled = true;
3075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (!window.wasPostTestScriptParsed)
3085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return;
3095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    shouldBeTrue("successfullyParsed");
3105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    debug('<br /><span class="pass">TEST COMPLETE</span>');
3115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (window.jsTestIsAsync && window.layoutTestController)
3125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        layoutTestController.notifyDone();
3135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
314