Files
sdk/tests/html/node_model_test.dart
T
blois@google.com 2b09ca8fb9 Attempting to stabilize node_model_test on IE9
Basically the test is passing fine on my IE9 VMs and the individual tests are passing on the bots, but it appears that when everything is run together on the bots, that the tests fail.

What I believe is happening is that we're delaying the MutationEvents using window.setImmediate which is being polyfilled on IE9 to window.setTimeout(0) and running into a timing issue on slow machines with the test.

We should have a much better resolution once we get a proper setImmediate from dart2js.

BUG=

Review URL: https://codereview.chromium.org//12899003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@20119 260f80e4-7a28-3924-810f-c04153c831b5
2013-03-15 22:52:34 +00:00

193 lines
3.9 KiB
Dart

// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library node_model_test;
import 'dart:async';
import 'dart:html';
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_config.dart';
var stepDuration;
Future get nextStep {
return new Future.delayed(stepDuration);
}
class ModelTracker {
Element element = new DivElement();
List models = [];
ModelTracker() {
element.onModelChanged.listen((node) {
models.add(node.model);
});
}
void append(ModelTracker other) {
element.append(other.element);
}
get model => element.model;
void set model(value) {
element.model = value;
}
void clearModel() {
element.clearModel();
}
void remove() {
element.remove();
}
}
main() {
useHtmlConfiguration();
if (MutationObserver.supported) {
stepDuration = new Duration();
} else {
// Need to step after the tree update notifications, but on IE9 these may
// get polyfilled to use setTimeout(0). So use a longer timer to try to
// get a later callback.
stepDuration = new Duration(milliseconds: 15);
}
test('basic top down', () {
var a = new DivElement();
var b = new SpanElement();
var c = new DivElement();
var d = new DivElement();
var e = new DivElement();
var model = {};
var model2 = {};
var model3 = {};
document.body.append(a);
a.append(b);
a.model = model;
expect(a.model, model);
expect(b.model, model);
b.append(c);
return nextStep.then((_) {
expect(c.model, model);
d.append(e);
c.append(d);
return nextStep;
}).then((_) {
expect(e.model, model);
b.remove();
return nextStep;
}).then((_) {
expect(b.model, isNull);
expect(e.model, isNull);
return nextStep;
}).then((_) {
a.append(b);
a.model = model2;
return nextStep;
}).then((_) {
expect(e.model, model2);
c.model = model3;
expect(c.model, model3);
expect(b.model, model2);
expect(e.model, model3);
return nextStep;
}).then((_) {
d.remove();
c.append(d);
return nextStep;
}).then((_) {
expect(d.model, model3);
c.clearModel();
expect(d.model, model2);
a.remove();
return nextStep;
});
});
test('changes', () {
var a = new ModelTracker();
var b = new ModelTracker();
var c = new ModelTracker();
var d = new ModelTracker();
var model = {};
var cModel = {};
document.body.append(a.element);
a.append(b);
return nextStep.then((_) {
expect(a.models, []);
expect(b.models.length, 0);
a.model = model;
expect(a.models, [model]);
expect(b.models, [model]);
b.append(c);
return nextStep;
}).then((_) {
expect(c.models, [model]);
c.append(d);
return nextStep;
}).then((_) {
c.model = cModel;
expect(b.models, [model]);
expect(c.models, [model, cModel]);
expect(d.models, [model, cModel]);
c.clearModel();
expect(c.models, [model, cModel, model]);
expect(d.models, [model, cModel, model]);
a.remove();
return nextStep;
});
});
test('bottom up', () {
var a = new ModelTracker();
var b = new ModelTracker();
var c = new ModelTracker();
var d = new ModelTracker();
var aModel = {};
var cModel = {};
c.append(d);
c.model = cModel;
b.append(c);
a.append(b);
a.model = aModel;
document.body.append(a.element);
return nextStep.then((_) {
expect(a.models, [aModel]);
expect(b.models, [aModel]);
expect(c.models, [cModel]);
expect(d.models, [cModel]);
a.remove();
return nextStep;
});
});
}