// Copyright (c) 2015, 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.

// @dart = 2.9

// Regression test for http://dartbug.com/23127
// Tests super calls to a custom element upgrade constructor with various
// combinations of parameters and type arguments.

library custom_elements_23127_test;

import 'dart:async';
import 'dart:html';
import 'package:async_helper/async_minitest.dart';
import 'utils.dart';

abstract class B1 extends HtmlElement {
  void action();

  B1.created() : super.created() {
    action();
  }
}

abstract class B1T<T> extends HtmlElement {
  void action();
  var qq = false;
  B1T.created() : super.created() {
    action();
    qq = this is T;
  }
}

abstract class B2 extends HtmlElement {
  void action();
  var qq;
  B2.created([a = 1, b = 2, c = 3])
      : qq = callTwice(() => ++a * ++b), // [a] and [b] are boxed.
        super.created() {
    action();
    qq = [qq, a, b, c];
  }
}

abstract class B2T<T> extends HtmlElement {
  void action();
  var qq;
  B2T.created([a = 1, b = 2, c = 3])
      : qq = callTwice(() => ++a * ++b),
        super.created() {
    action();
    qq = [this is T, qq, a, b, c];
  }
}

class C1 extends B1 {
  int z;
  C1.created() : super.created();
  action() {
    z = 3;
  }
}

class C1T extends B1T {
  int z;
  C1T.created() : super.created();
  action() {
    z = 3;
  }
}

class C2 extends B2 {
  int z;
  C2.created() : super.created(20);
  action() {
    z = 3;
  }
}

class C2T extends B2T {
  int z;
  C2T.created() : super.created(20);
  action() {
    z = 3;
  }
}

var callTwice;

main() async {
  await customElementsReady;

  callTwice = (f) {
    f();
    return f();
  };

  group('baseline', () {
    test('C1', () {
      document.register('x-c1', C1);
      C1 e = document.createElement('x-c1');
      expect(e.z, 3);
    });
  });

  group('c1t', () {
    test('C1T', () {
      document.register('x-c1t', C1T);
      C1T e = document.createElement('x-c1t');
      expect(e.z, 3);
      expect(e.qq, true);
    });
  });

  group('c2', () {
    test('C2', () {
      document.register('x-c2', C2);
      C2 e = document.createElement('x-c2');
      expect(e.z, 3);
      expect(e.qq, [88, 22, 4, 3]);
    });
  });

  group('c2t', () {
    test('C2T', () {
      document.register('x-c2t', C2T);
      C2T e = document.createElement('x-c2t');
      expect(e.z, 3);
      expect(e.qq, [true, 88, 22, 4, 3]);
    });
  });
}
