// 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 constructor_calls_created_synchronously_test;

import 'dart:html';
import 'dart:mirrors';

import 'package:unittest/unittest.dart';

import 'utils.dart';

class A extends HtmlElement {
  static final tag = 'x-a';
  factory A() => new Element.tag(tag);
  A.created() : super.created() {
    ncallbacks++;
  }

  static int ncallbacks = 0;
}

main() {
  // Adapted from Blink's
  // fast/dom/custom/constructor-calls-created-synchronously test.

  var registered = false;
  setUp(() {
    return customElementsReady.then((_) {
      if (!registered) {
        registered = true;
        document.registerElement2(A.tag, {'prototype': A});
      }
    });
  });

  test('createdCallback', () {
    var x = new A();
    expect(A.ncallbacks, 1);
  });

  test('clone node', () {
    A.ncallbacks = 0;

    var a = new A();
    expect(A.ncallbacks, 1);
    var b = a.clone(false);
    expect(A.ncallbacks, 2);
    expect(b is A, isTrue);
  });

  test("can extend elements that don't have special prototypes", () {
    document.registerElement2(
        'fancy-section', {'prototype': FancySection, 'extends': 'section'});
    var fancy = document.createElement('section', 'fancy-section');
    expect(fancy is FancySection, true, reason: 'fancy-section was registered');
    expect((fancy as FancySection).wasCreated, true,
        reason: 'FancySection ctor was called');
  });
}

class FancySection extends HtmlElement {
  bool wasCreated = false;
  FancySection.created() : super.created() {
    wasCreated = true;
  }
}
