Skip to content
This repository was archived by the owner on Dec 6, 2017. It is now read-only.

Commit 57523ea

Browse files
author
Anting Shen
committed
test(dart2js): Added preamble to dart2js test (required by dart 1.6+)
1 parent 79be3d6 commit 57523ea

File tree

2 files changed

+290
-2
lines changed

2 files changed

+290
-2
lines changed

run-tests.sh

+7-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,13 @@ echo "run dart2js on tests"
1414
mkdir -p out
1515
dart2js --minify -c test/main.dart -o out/main.dart.js
1616

17-
echo "run tests in node"
18-
node out/main.dart.js
17+
# attach a preamble file to dart2js output to emulate browser
18+
# so node doesn't complain about lack of browser objects
19+
cp test_assets/d8.js out/main.js
20+
cat out/main.dart.js >> out/main.js
21+
22+
echo "Running compiled tests in node..."
23+
node out/main.js
1924

2025
echo "run transformer tests"
2126
pub build --mode=debug test

test_assets/d8.js

+283
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,283 @@
1+
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
// Javascript preamble, that lets the output of dart2js run on V8's d8 shell.
6+
7+
// Node wraps files and provides them with a different `this`. The global
8+
// `this` can be accessed through `global`.
9+
10+
var self = this;
11+
if (typeof global != "undefined") self = global; // Node.js.
12+
13+
(function(self) {
14+
// Using strict mode to avoid accidentally defining global variables.
15+
"use strict"; // Should be first statement of this function.
16+
17+
// Location (Uri.base)
18+
19+
var workingDirectory;
20+
// TODO(sgjesse): This does not work on Windows.
21+
if (typeof os == "object" && "system" in os) {
22+
// V8.
23+
workingDirectory = os.system("pwd");
24+
var length = workingDirectory.length;
25+
if (workingDirectory[length - 1] == '\n') {
26+
workingDirectory = workingDirectory.substring(0, length - 1);
27+
}
28+
} else if (typeof process != "undefined" &&
29+
typeof process.cwd == "function") {
30+
// Node.js.
31+
workingDirectory = process.cwd();
32+
}
33+
self.location = { href: "file://" + workingDirectory + "/" };
34+
35+
// Event loop.
36+
37+
// Task queue as cyclic list queue.
38+
var taskQueue = new Array(8); // Length is power of 2.
39+
var head = 0;
40+
var tail = 0;
41+
var mask = taskQueue.length - 1;
42+
function addTask(elem) {
43+
taskQueue[head] = elem;
44+
head = (head + 1) & mask;
45+
if (head == tail) _growTaskQueue();
46+
}
47+
function removeTask() {
48+
if (head == tail) return;
49+
var result = taskQueue[tail];
50+
taskQueue[tail] = undefined;
51+
tail = (tail + 1) & mask;
52+
return result;
53+
}
54+
function _growTaskQueue() {
55+
// head == tail.
56+
var length = taskQueue.length;
57+
var split = head;
58+
taskQueue.length = length * 2;
59+
if (split * 2 < length) { // split < length / 2
60+
for (var i = 0; i < split; i++) {
61+
taskQueue[length + i] = taskQueue[i];
62+
taskQueue[i] = undefined;
63+
}
64+
head += length;
65+
} else {
66+
for (var i = split; i < length; i++) {
67+
taskQueue[length + i] = taskQueue[i];
68+
taskQueue[i] = undefined;
69+
}
70+
tail += length;
71+
}
72+
mask = taskQueue.length - 1;
73+
}
74+
75+
// Mapping from timer id to timer function.
76+
// The timer id is written on the function as .$timerId.
77+
// That field is cleared when the timer is cancelled, but it is not returned
78+
// from the queue until its time comes.
79+
var timerIds = {};
80+
var timerIdCounter = 1; // Counter used to assing ids.
81+
82+
// Zero-timer queue as simple array queue using push/shift.
83+
var zeroTimerQueue = [];
84+
85+
function addTimer(f, ms) {
86+
var id = timerIdCounter++;
87+
f.$timerId = id;
88+
timerIds[id] = f;
89+
if (ms == 0) {
90+
zeroTimerQueue.push(f);
91+
} else {
92+
addDelayedTimer(f, ms);
93+
}
94+
return id;
95+
}
96+
97+
function nextZeroTimer() {
98+
while (zeroTimerQueue.length > 0) {
99+
var action = zeroTimerQueue.shift();
100+
if (action.$timerId !== undefined) return action;
101+
}
102+
}
103+
104+
function nextEvent() {
105+
var action = removeTask();
106+
if (action) {
107+
return action;
108+
}
109+
do {
110+
action = nextZeroTimer();
111+
if (action) break;
112+
var nextList = nextDelayedTimerQueue();
113+
if (!nextList) {
114+
return;
115+
}
116+
var newTime = nextList.shift();
117+
advanceTimeTo(newTime);
118+
zeroTimerQueue = nextList;
119+
} while (true)
120+
var id = action.$timerId;
121+
clearTimerId(action, id);
122+
return action;
123+
}
124+
125+
// Mocking time.
126+
var timeOffset = 0;
127+
var now = function() {
128+
// Install the mock Date object only once.
129+
// Following calls to "now" will just use the new (mocked) Date.now
130+
// method directly.
131+
installMockDate();
132+
now = Date.now;
133+
return Date.now();
134+
};
135+
var originalDate = Date;
136+
var originalNow = originalDate.now;
137+
function advanceTimeTo(time) {
138+
timeOffset = time - originalNow();
139+
}
140+
function installMockDate() {
141+
var NewDate = function Date(Y, M, D, h, m, s, ms) {
142+
if (this instanceof Date) {
143+
// Assume a construct call.
144+
switch (arguments.length) {
145+
case 0: return new originalDate(originalNow() + timeOffset);
146+
case 1: return new originalDate(Y);
147+
case 2: return new originalDate(Y, M);
148+
case 3: return new originalDate(Y, M, D);
149+
case 4: return new originalDate(Y, M, D, h);
150+
case 5: return new originalDate(Y, M, D, h, m);
151+
case 6: return new originalDate(Y, M, D, h, m, s);
152+
default: return new originalDate(Y, M, D, h, m, s, ms);
153+
}
154+
}
155+
return new originalDate(originalNow() + timeOffset).toString();
156+
};
157+
NewDate.UTC = originalDate.UTC;
158+
NewDate.parse = originalDate.parse;
159+
NewDate.now = function now() { return originalNow() + timeOffset; };
160+
NewDate.prototype = originalDate.prototype;
161+
originalDate.prototype.constructor = NewDate;
162+
Date = NewDate;
163+
}
164+
165+
// Heap priority queue with key index.
166+
// Each entry is list of [timeout, callback1 ... callbackn].
167+
var timerHeap = [];
168+
var timerIndex = {};
169+
function addDelayedTimer(f, ms) {
170+
var timeout = now() + ms;
171+
var timerList = timerIndex[timeout];
172+
if (timerList == null) {
173+
timerList = [timeout, f];
174+
timerIndex[timeout] = timerList;
175+
var index = timerHeap.length;
176+
timerHeap.length += 1;
177+
bubbleUp(index, timeout, timerList);
178+
} else {
179+
timerList.push(f);
180+
}
181+
}
182+
183+
function nextDelayedTimerQueue() {
184+
if (timerHeap.length == 0) return null;
185+
var result = timerHeap[0];
186+
var last = timerHeap.pop();
187+
if (timerHeap.length > 0) {
188+
bubbleDown(0, last[0], last);
189+
}
190+
return result;
191+
}
192+
193+
function bubbleUp(index, key, value) {
194+
while (index != 0) {
195+
var parentIndex = (index - 1) >> 1;
196+
var parent = timerHeap[parentIndex];
197+
var parentKey = parent[0];
198+
if (key > parentKey) break;
199+
timerHeap[index] = parent;
200+
index = parentIndex;
201+
}
202+
timerHeap[index] = value;
203+
}
204+
205+
function bubbleDown(index, key, value) {
206+
while (true) {
207+
var leftChildIndex = index * 2 + 1;
208+
if (leftChildIndex >= timerHeap.length) break;
209+
var minChildIndex = leftChildIndex;
210+
var minChild = timerHeap[leftChildIndex];
211+
var minChildKey = minChild[0];
212+
var rightChildIndex = leftChildIndex + 1;
213+
if (rightChildIndex < timerHeap.length) {
214+
var rightChild = timerHeap[rightChildIndex];
215+
var rightKey = rightChild[0];
216+
if (rightKey < minChildKey) {
217+
minChildIndex = rightChildIndex;
218+
minChild = rightChild;
219+
minChildKey = rightKey;
220+
}
221+
}
222+
if (minChildKey > key) break;
223+
timerHeap[index] = minChild;
224+
index = minChildIndex;
225+
}
226+
timerHeap[index] = value;
227+
}
228+
229+
function addInterval(f, ms) {
230+
var id = timerIdCounter++;
231+
function repeat() {
232+
// Reactivate with the same id.
233+
repeat.$timerId = id;
234+
timerIds[id] = repeat;
235+
addDelayedTimer(repeat, ms);
236+
f();
237+
}
238+
repeat.$timerId = id;
239+
timerIds[id] = repeat;
240+
addDelayedTimer(repeat, ms);
241+
return id;
242+
}
243+
244+
function cancelTimer(id) {
245+
var f = timerIds[id];
246+
if (f == null) return;
247+
clearTimerId(f, id);
248+
}
249+
250+
function clearTimerId(f, id) {
251+
f.$timerId = undefined;
252+
delete timerIds[id];
253+
}
254+
255+
function eventLoop(action) {
256+
while (action) {
257+
try {
258+
action();
259+
} catch (e) {
260+
if (typeof onerror == "function") {
261+
onerror(e, null, -1);
262+
} else {
263+
throw e;
264+
}
265+
}
266+
action = nextEvent();
267+
}
268+
}
269+
270+
// Global properties. "self" refers to the global object, so adding a
271+
// property to "self" defines a global variable.
272+
self.dartMainRunner = function(main, args) {
273+
// Initialize.
274+
var action = function() { main(args); }
275+
eventLoop(action);
276+
};
277+
self.setTimeout = addTimer;
278+
self.clearTimeout = cancelTimer;
279+
self.setInterval = addInterval;
280+
self.clearInterval = cancelTimer;
281+
self.scheduleImmediate = addTask;
282+
self.self = self;
283+
})(self);

0 commit comments

Comments
 (0)