// 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 test.mixin_application_test;

@MirrorsUsed(targets: "test.mixin_application_test")
import 'dart:mirrors';

import 'package:expect/expect.dart';

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

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

class Mixin2 {
  int i2;
  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 (var 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();
}
