// 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.

// @dart = 2.9

// This test uses the multi-test "ok" feature to create two positive tests from
// one file. One of these tests fail on dart2js, but pass on the VM, or vice
// versa.
// TODO(ahe): When both implementations agree, remove the multi-test parts.

library test.mixin_application_test;

import 'dart:mirrors';

import 'package:expect/expect.dart';

import 'model.dart';
import 'stringify.dart';

class Mixin {
  int i = 0;
  m() {}
}

class Mixin2 {
  int i2 = 0;
  m2() {}
}

class MixinApplication = C with Mixin;
class MixinApplicationA = C with Mixin, Mixin2;

class UnusedMixinApplication = C with Mixin;

class Subclass extends C with Mixin {
  f() {}
}

class Subclass2 extends MixinApplication {
  g() {}
}

class SubclassA extends C with Mixin, Mixin2 {
  fa() {}
}

class Subclass2A extends MixinApplicationA {
  ga() {}
}

membersOf(ClassMirror cm) {
  var result = new Map();
  cm.declarations.forEach((k, v) {
    if (v is MethodMirror && !v.isConstructor) result[k] = v;
    if (v is VariableMirror) result[k] = v;
  });
  return result;
}

constructorsOf(ClassMirror cm) {
  var result = new Map();
  cm.declarations.forEach((k, v) {
    if (v is MethodMirror && v.isConstructor) result[k] = v;
  });
  return result;
}

checkClass(Type type, List<String> expectedSuperclasses) {
  int i = 0;
  for (ClassMirror cls = reflectClass(type);
      cls != null;
      cls = cls.superclass) {
    expect(expectedSuperclasses[i++], cls);
  }
  Expect.equals(i, expectedSuperclasses.length, '$type');
}

expectSame(ClassMirror a, ClassMirror b) {
  Expect.equals(a, b);
  expect(stringify(a), b);
  expect(stringify(b), a);
}

testMixin() {
  checkClass(Mixin, [
    'Class(s(Mixin) in s(test.mixin_application_test), top-level)',
    'Class(s(Object) in s(dart.core), top-level)',
  ]);

  expect(
      '{i: Variable(s(i) in s(Mixin)),'
      ' m: Method(s(m) in s(Mixin))}',
      membersOf(reflectClass(Mixin)));

  expect('{Mixin: Method(s(Mixin) in s(Mixin), constructor)}',
      constructorsOf(reflectClass(Mixin)));
}

testMixin2() {
  checkClass(Mixin2, [
    'Class(s(Mixin2) in s(test.mixin_application_test), top-level)',
    'Class(s(Object) in s(dart.core), top-level)',
  ]);

  expect(
      '{i2: Variable(s(i2) in s(Mixin2)),'
      ' m2: Method(s(m2) in s(Mixin2))}',
      membersOf(reflectClass(Mixin2)));

  expect('{Mixin2: Method(s(Mixin2) in s(Mixin2), constructor)}',
      constructorsOf(reflectClass(Mixin2)));
}

testMixinApplication() {
  checkClass(MixinApplication, [
    'Class(s(MixinApplication) in s(test.mixin_application_test), top-level)',
    'Class(s(C) in s(test.model), top-level)',
    'Class(s(B) in s(test.model), top-level)',
    'Class(s(A) in s(test.model), top-level)',
    'Class(s(Object) in s(dart.core), top-level)',
  ]);

  String owner = 'Mixin';
  expect(
      '{i: Variable(s(i) in s($owner)),'
      ' m: Method(s(m) in s($owner))}',
      membersOf(reflectClass(MixinApplication)));

  expect(
      '{MixinApplication: Method(s(MixinApplication) in s(MixinApplication),'
      ' constructor)}',
      constructorsOf(reflectClass(MixinApplication)));

  expectSame(reflectClass(C), reflectClass(MixinApplication).superclass);
}

testMixinApplicationA() {
  String owner = ' in s(test.mixin_application_test)';
  checkClass(MixinApplicationA, [
    'Class(s(MixinApplicationA)'
        ' in s(test.mixin_application_test), top-level)',
    'Class(s(test.model.C with test.mixin_application_test.Mixin)'
        '$owner, top-level)',
    'Class(s(C) in s(test.model), top-level)',
    'Class(s(B) in s(test.model), top-level)',
    'Class(s(A) in s(test.model), top-level)',
    'Class(s(Object) in s(dart.core), top-level)',
  ]);

  owner = 'Mixin2';
  expect(
      '{i2: Variable(s(i2) in s($owner)),'
      ' m2: Method(s(m2) in s($owner))}',
      membersOf(reflectClass(MixinApplicationA)));

  expect(
      '{MixinApplicationA: Method(s(MixinApplicationA) in s(MixinApplicationA),'
      ' constructor)}',
      constructorsOf(reflectClass(MixinApplicationA)));

  expect(
      '{i: Variable(s(i) in s(Mixin)),'
      ' m: Method(s(m) in s(Mixin))}',
      membersOf(reflectClass(MixinApplicationA).superclass));

  String name = 'test.model.C with test.mixin_application_test.Mixin';
  expect(
      '{$name:'
      ' Method(s($name)'
      ' in s($name), constructor)}',
      constructorsOf(reflectClass(MixinApplicationA).superclass));

  expectSame(
      reflectClass(C), reflectClass(MixinApplicationA).superclass.superclass);
}

testUnusedMixinApplication() {
  checkClass(UnusedMixinApplication, [
    'Class(s(UnusedMixinApplication) in s(test.mixin_application_test),'
        ' top-level)',
    'Class(s(C) in s(test.model), top-level)',
    'Class(s(B) in s(test.model), top-level)',
    'Class(s(A) in s(test.model), top-level)',
    'Class(s(Object) in s(dart.core), top-level)',
  ]);

  String owner = 'Mixin';
  expect(
      '{i: Variable(s(i) in s($owner)),'
      ' m: Method(s(m) in s($owner))}',
      membersOf(reflectClass(UnusedMixinApplication)));

  expect(
      '{UnusedMixinApplication: Method(s(UnusedMixinApplication)'
      ' in s(UnusedMixinApplication), constructor)}',
      constructorsOf(reflectClass(UnusedMixinApplication)));

  expectSame(reflectClass(C), reflectClass(UnusedMixinApplication).superclass);
}

testSubclass() {
  String owner = ' in s(test.mixin_application_test)';
  checkClass(Subclass, [
    'Class(s(Subclass) in s(test.mixin_application_test), top-level)',
    'Class(s(test.model.C with test.mixin_application_test.Mixin)'
        '$owner, top-level)',
    'Class(s(C) in s(test.model), top-level)',
    'Class(s(B) in s(test.model), top-level)',
    'Class(s(A) in s(test.model), top-level)',
    'Class(s(Object) in s(dart.core), top-level)',
  ]);

  expect('{f: Method(s(f) in s(Subclass))}', membersOf(reflectClass(Subclass)));

  expect('{Subclass: Method(s(Subclass) in s(Subclass), constructor)}',
      constructorsOf(reflectClass(Subclass)));

  expect(
      '{i: Variable(s(i) in s(Mixin)),'
      ' m: Method(s(m) in s(Mixin))}',
      membersOf(reflectClass(Subclass).superclass));

  String name = 'test.model.C with test.mixin_application_test.Mixin';
  expect(
      '{$name:'
      ' Method(s($name)'
      ' in s($name), constructor)}',
      constructorsOf(reflectClass(Subclass).superclass));

  expectSame(reflectClass(C), reflectClass(Subclass).superclass.superclass);
}

testSubclass2() {
  checkClass(Subclass2, [
    'Class(s(Subclass2) in s(test.mixin_application_test), top-level)',
    'Class(s(MixinApplication) in s(test.mixin_application_test), top-level)',
    'Class(s(C) in s(test.model), top-level)',
    'Class(s(B) in s(test.model), top-level)',
    'Class(s(A) in s(test.model), top-level)',
    'Class(s(Object) in s(dart.core), top-level)',
  ]);

  expect(
      '{g: Method(s(g) in s(Subclass2))}', membersOf(reflectClass(Subclass2)));

  expect('{Subclass2: Method(s(Subclass2) in s(Subclass2), constructor)}',
      constructorsOf(reflectClass(Subclass2)));

  expectSame(
      reflectClass(MixinApplication), reflectClass(Subclass2).superclass);
}

testSubclassA() {
  String owner = ' in s(test.mixin_application_test)';
  checkClass(SubclassA, [
    'Class(s(SubclassA) in s(test.mixin_application_test), top-level)',
    'Class(s(test.model.C with test.mixin_application_test.Mixin,'
        ' test.mixin_application_test.Mixin2)$owner, top-level)',
    'Class(s(test.model.C with test.mixin_application_test.Mixin)$owner,'
        ' top-level)',
    'Class(s(C) in s(test.model), top-level)',
    'Class(s(B) in s(test.model), top-level)',
    'Class(s(A) in s(test.model), top-level)',
    'Class(s(Object) in s(dart.core), top-level)',
  ]);

  expect('{fa: Method(s(fa) in s(SubclassA))}',
      membersOf(reflectClass(SubclassA)));

  expect('{SubclassA: Method(s(SubclassA) in s(SubclassA), constructor)}',
      constructorsOf(reflectClass(SubclassA)));

  expect(
      '{i2: Variable(s(i2) in s(Mixin2)),'
      ' m2: Method(s(m2) in s(Mixin2))}',
      membersOf(reflectClass(SubclassA).superclass));

  String name = 'test.model.C with test.mixin_application_test.Mixin,'
      ' test.mixin_application_test.Mixin2';
  expect('{$name: Method(s($name) in s($name), constructor)}',
      constructorsOf(reflectClass(SubclassA).superclass));

  expect(
      '{i: Variable(s(i) in s(Mixin)),'
      ' m: Method(s(m) in s(Mixin))}',
      membersOf(reflectClass(SubclassA).superclass.superclass));

  name = 'test.model.C with test.mixin_application_test.Mixin';
  expect(
      '{$name:'
      ' Method(s($name)'
      ' in s($name), constructor)}',
      constructorsOf(reflectClass(SubclassA).superclass.superclass));

  expectSame(reflectClass(C),
      reflectClass(SubclassA).superclass.superclass.superclass);
}

testSubclass2A() {
  String owner = ' in s(test.mixin_application_test)';
  checkClass(Subclass2A, [
    'Class(s(Subclass2A) in s(test.mixin_application_test), top-level)',
    'Class(s(MixinApplicationA) in s(test.mixin_application_test),'
        ' top-level)',
    'Class(s(test.model.C with test.mixin_application_test.Mixin)$owner,'
        ' top-level)',
    'Class(s(C) in s(test.model), top-level)',
    'Class(s(B) in s(test.model), top-level)',
    'Class(s(A) in s(test.model), top-level)',
    'Class(s(Object) in s(dart.core), top-level)',
  ]);

  expect('{ga: Method(s(ga) in s(Subclass2A))}',
      membersOf(reflectClass(Subclass2A)));

  expect('{Subclass2A: Method(s(Subclass2A) in s(Subclass2A), constructor)}',
      constructorsOf(reflectClass(Subclass2A)));

  expectSame(
      reflectClass(MixinApplicationA), reflectClass(Subclass2A).superclass);
}

main() {
  testMixin();
  testMixin2();
  testMixinApplication();
  testMixinApplicationA();
  testUnusedMixinApplication();
  testSubclass();
  testSubclass2();
  testSubclassA();
  testSubclass2A();
}
