blob: 10ff172b838e165dba9d0be40d632835500ea350 [file] [log] [blame]
// 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 observe_utils;
import 'dart:async';
import 'dart:html';
import 'package:observe/observe.dart';
import 'package:unittest/unittest.dart';
final bool parserHasNativeTemplate = () {
var div = new DivElement()..innerHtml = '<table><template>';
return div.firstChild.firstChild != null &&
div.firstChild.firstChild.tagName == 'TEMPLATE';
}();
toSymbolMap(Map map) {
var result = new ObservableMap.linked();
map.forEach((key, value) {
if (value is Map) value = toSymbolMap(value);
result[new Symbol(key)] = value;
});
return result;
}
recursivelySetTemplateModel(element, model, [delegate]) {
for (var node in element.queryAll('*')) {
if (node.isTemplate) {
node.bindingDelegate = delegate;
node.model = model;
}
}
}
dispatchEvent(type, target) {
target.dispatchEvent(new Event(type, cancelable: false));
}
class FooBarModel extends ObservableBase {
@observable var foo;
@observable var bar;
FooBarModel([this.foo, this.bar]);
}
class FooBarNotifyModel extends ChangeNotifierBase implements FooBarModel {
var _foo;
var _bar;
FooBarNotifyModel([this._foo, this._bar]);
get foo => _foo;
set foo(value) {
_foo = notifyPropertyChange(const Symbol('foo'), _foo, value);
}
get bar => _bar;
set bar(value) {
_bar = notifyPropertyChange(const Symbol('bar'), _bar, value);
}
}
// TODO(jmesserly): this is a copy/paste from observe_test_utils.dart
// Is it worth putting it in its own package, or in an existing one?
void performMicrotaskCheckpoint() {
Observable.dirtyCheck();
while (_pending.length > 0) {
var pending = _pending;
_pending = [];
for (var callback in pending) {
try {
callback();
} catch (e, s) {
new Completer().completeError(e, s);
}
}
Observable.dirtyCheck();
}
}
List<Function> _pending = [];
wrapMicrotask(void testCase()) {
return () {
runZonedExperimental(() {
try {
testCase();
} finally {
performMicrotaskCheckpoint();
}
}, onRunAsync: (callback) => _pending.add(callback));
};
}
observeTest(name, testCase) => test(name, wrapMicrotask(testCase));
solo_observeTest(name, testCase) => solo_test(name, wrapMicrotask(testCase));