Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(117)

Unified Diff: test/codegen/lib/html/custom_elements_test.dart

Issue 1930043002: Add all dart:html tests from the sdk to test/codegen. (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: ptal Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: test/codegen/lib/html/custom_elements_test.dart
diff --git a/test/codegen/lib/html/custom_elements_test.dart b/test/codegen/lib/html/custom_elements_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..3ab52074aceeb906cdf1893508aa144f8eb11415
--- /dev/null
+++ b/test/codegen/lib/html/custom_elements_test.dart
@@ -0,0 +1,188 @@
+// 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 custom_elements_test;
+import 'dart:async';
+import 'dart:html';
+import 'package:unittest/html_individual_config.dart';
+import 'package:unittest/unittest.dart';
+import 'utils.dart';
+
+class CustomMixin {
+ var mixinMethodCalled;
+
+ void mixinMethod() {
+ mixinMethodCalled = true;
+ }
+}
+
+class CustomType extends HtmlElement with CustomMixin{
+ bool createdCalled = false;
+
+ factory CustomType() => null;
+ CustomType.created(): super.created() {
+ createdCalled = true;
+ customCreatedCount++;
+ }
+
+ void invokeMixinMethod() {
+ mixinMethod();
+ }
+}
+
+int customCreatedCount = 0;
+
+int nextTagId = 0;
+String get nextTag => 'x-type${nextTagId++}';
+
+class NotAnElement {}
+
+main() {
+ useHtmlIndividualConfiguration();
+
+ setUp(() => customElementsReady);
+
+ group('register', () {
+ test('register', () {
+ var tag = nextTag;
+ document.registerElement(tag, CustomType);
+
+ var element = new Element.tag(tag);
+ expect(element, isNotNull);
+ expect(element is CustomType, isTrue);
+ expect(element.createdCalled, isTrue);
+ });
+
+ test('register twice', () {
+ var tag = nextTag;
+ document.registerElement(tag, CustomType);
+ expect(() {
+ document.registerElement(tag, CustomType);
+ }, throws, reason: 'Cannot register a tag more than once.');
+
+ var newTag = nextTag;
+ document.registerElement(newTag, CustomType);
+
+ var element = new Element.tag(newTag);
+ expect(element, isNotNull);
+ expect(element is CustomType, isTrue);
+ });
+
+ test('register null', () {
+ expect(() {
+ document.registerElement(nextTag, null);
+ }, throws, reason: 'Cannot register a null type.');
+ });
+
+ test('register native', () {
+ expect(() {
+ document.registerElement(nextTag, BodyElement);
+ }, throws, reason: 'Cannot register a native element.');
+ });
+
+ test('register non-element', () {
+ expect(() {
+ document.registerElement(nextTag, NotAnElement);
+ }, throws, reason: 'Cannot register a non-element.');
+ });
+ });
+
+ // TODO(vsm): Modify this test once we agree on the proper semantics.
+ /*
+ group('preregister', () {
+
+ test('pre-registration construction', () {
+ var tag = nextTag;
+ var dom = new Element.html('<div><$tag></$tag></div>');
+
+ var preElement = dom.children[0];
+ expect(preElement, isNotNull);
+ expect(preElement is HtmlElement, isTrue);
+ expect(preElement is CustomType, isFalse);
+ var firedOnPre = false;
+ preElement.onFocus.listen((_) {
+ firedOnPre = true;
+ });
+
+ document.registerElement(tag, CustomType);
+ upgradeCustomElements(dom);
+
+ var postElement = dom.children[0];
+ expect(postElement, isNotNull);
+ expect(postElement is CustomType, isTrue);
+ expect(postElement.createdCalled, isTrue);
+
+ // Element from first query remains an UnknownElement.
+ expect(preElement is HtmlElement, isTrue);
+ expect(preElement.parent, dom);
+ expect(dom.children.length, 1);
+
+ var firedOnPost = false;
+ postElement.onFocus.listen((_) {
+ firedOnPost = true;
+ });
+ // Event handlers persist on old and new element.
+ postElement.dispatchEvent(new Event('focus'));
+ expect(firedOnPre, isTrue);
+ expect(firedOnPost, isTrue);
+ });
+ });*/
+
+ group('innerHtml', () {
+ test('query', () {
+ var tag = nextTag;
+ document.registerElement(tag, CustomType);
+ var element = new DivElement();
+ element.setInnerHtml('<$tag></$tag>',
+ treeSanitizer: new NullTreeSanitizer());
+ upgradeCustomElements(element);
+ document.body.nodes.add(element);
+ var queried = query(tag);
+
+ expect(queried, isNotNull);
+ expect(queried is CustomType, isTrue);
+ expect(queried.createdCalled, isTrue);
+ });
+
+ test('query id', () {
+ var tag = nextTag;
+ document.registerElement(tag, CustomType);
+ var element = new DivElement();
+ element.setInnerHtml('<$tag id="someid"></$tag>',
+ treeSanitizer: new NullTreeSanitizer());
+ upgradeCustomElements(element);
+ document.body.nodes.add(element);
+ var queried = query('#someid');
+
+ expect(queried, isNotNull);
+ expect(queried is CustomType, isTrue);
+ expect(queried.id, "someid");
+ });
+ });
+
+ group('lifecycle', () {
+ test('created', () {
+ int oldCount = customCreatedCount;
+ var tag = nextTag;
+ document.registerElement(tag, CustomType);
+ var element = new DivElement();
+ element.setInnerHtml('<$tag></$tag>',
+ treeSanitizer: new NullTreeSanitizer());
+ upgradeCustomElements(element);
+ document.body.nodes.add(element);
+ expect(customCreatedCount, oldCount + 1);
+ });
+ });
+
+ group('mixins', () {
+ test('can invoke mixin methods', () {
+ var tag = nextTag;
+ document.registerElement(tag, CustomType);
+
+ var element = new Element.tag(tag);
+ element.invokeMixinMethod();
+ expect(element.mixinMethodCalled, isTrue);
+ });
+ });
+}
« no previous file with comments | « test/codegen/lib/html/custom_elements_23127_test.html ('k') | test/codegen/lib/html/custom_elements_test.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698