blob: d30bc6627a1615bb0198167f6242f77f755ecb62 [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 polymer.test.bind_mdv_test;
import 'dart:async';
import 'dart:html';
import 'package:template_binding/template_binding.dart';
import 'package:observe/observe.dart';
import 'package:observe/mirrors_used.dart'; // make test smaller.
import 'package:unittest/html_config.dart';
import 'package:unittest/unittest.dart';
import 'package:web_components/polyfill.dart';
main() {
useHtmlConfiguration();
var registered = customElementsReady.then((_) {
document.register('my-div', MyDivElement);
});
setUp(() => registered);
group('bindModel', bindModelTests);
}
bindModelTests() {
var div;
setUp(() {
div = new MyDivElement();
document.body.append(div);
});
tearDown(() {
div.remove();
});
parseAndBindHTML(html, model) =>
templateBind(new Element.tag('template')
..setInnerHtml(html, treeSanitizer: const NullTreeSanitizer()))
.createInstance(model);
test('bindModel', () {
var fragment = parseAndBindHTML('<div id="a" foo="{{bar}}"></div>', div);
div.append(fragment);
var a = div.query('#a');
div.bar = 5;
return onAttributeChange(a).then((_) {
expect(a.attributes['foo'], '5');
div.bar = 8;
return onAttributeChange(a).then((_) {
expect(a.attributes['foo'], '8');
});
});
});
test('bind input', () {
var fragment = parseAndBindHTML('<input value="{{bar}}" />', div);
div.append(fragment);
var a = div.query('input');
div.bar = 'hello';
// TODO(sorvell): fix this when observe-js lets us explicitly listen for
// a change on input.value
Observable.dirtyCheck();
return new Future.microtask(() {
expect(a.value, 'hello');
});
});
}
class MyDivElement extends HtmlElement with Observable {
factory MyDivElement() => new Element.tag('my-div');
MyDivElement.created() : super.created();
@observable var bar;
}
class NullTreeSanitizer implements NodeTreeSanitizer {
const NullTreeSanitizer();
void sanitizeTree(Node node) {}
}
Future onAttributeChange(Element node) {
var completer = new Completer();
new MutationObserver((records, observer) {
observer.disconnect();
completer.complete();
})..observe(node, attributes: true);
scheduleMicrotask(Observable.dirtyCheck);
return completer.future;
}