// Copyright (c) 2014, 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.parameter_of_mixin_app_constructor;

import 'dart:mirrors';
import 'stringify.dart';

class MapView {
  final _map;
  MapView(map) : this._map = map;
}

abstract class UnmodifiableMapMixin {
  someFunctionality() {}
}

class UnmodifiableMapView1 extends MapView with UnmodifiableMapMixin {
  UnmodifiableMapView1(map1) : super(map1);
}

class UnmodifiableMapView2 = MapView with UnmodifiableMapMixin;

class S {
  S(int p1, String p2);
}

class M1 {}

class M2 {}

class M3 {}

class MorePlumbing = S with M1, M2, M3;

soleConstructorOf(ClassMirror cm) {
  return cm.declarations.values
      .where((dm) => dm is MethodMirror && dm.isConstructor)
      .single;
}

main() {
  ClassMirror umv1 = reflectClass(UnmodifiableMapView1);
  expect(
      '[Parameter(s(map1) in s(UnmodifiableMapView1),'
      ' type = Type(s(dynamic), top-level))]',
      soleConstructorOf(umv1).parameters);
  expect(
      '[Parameter(s(map) in s(test.parameter_of_mixin_app_constructor.MapView'
      ' with test.parameter_of_mixin_app_constructor.UnmodifiableMapMixin),'
      ' final, type = Type(s(dynamic), top-level))]',
      soleConstructorOf(umv1.superclass!).parameters);
  expect(
      '[Parameter(s(map) in s(MapView),'
      ' type = Type(s(dynamic), top-level))]',
      soleConstructorOf(umv1.superclass!.superclass!).parameters);
  expect('[]',
      soleConstructorOf(umv1.superclass!.superclass!.superclass!).parameters);

  ClassMirror umv2 = reflectClass(UnmodifiableMapView2);
  expect(
      '[Parameter(s(map) in s(UnmodifiableMapView2),'
      ' final, type = Type(s(dynamic), top-level))]',
      soleConstructorOf(umv2).parameters);
  expect(
      '[Parameter(s(map) in s(MapView),'
      ' type = Type(s(dynamic), top-level))]',
      soleConstructorOf(umv2.superclass!).parameters);
  expect('[]', soleConstructorOf(umv2.superclass!.superclass!).parameters);

  ClassMirror mp = reflectClass(MorePlumbing);
  expect(
      '[Parameter(s(p1) in s(MorePlumbing),'
      ' final, type = Type(s(dynamic), top-level)),'
      ' Parameter(s(p2) in s(MorePlumbing),'
      ' final, type = Type(s(dynamic), top-level))]',
      soleConstructorOf(mp).parameters);
  expect(
      '[Parameter(s(p1) in s(test.parameter_of_mixin_app_constructor.S'
      ' with test.parameter_of_mixin_app_constructor.M1,'
      ' test.parameter_of_mixin_app_constructor.M2),'
      ' final, type = Type(s(dynamic), top-level)),'
      ' Parameter(s(p2) in s(test.parameter_of_mixin_app_constructor.S'
      ' with test.parameter_of_mixin_app_constructor.M1,'
      ' test.parameter_of_mixin_app_constructor.M2),'
      ' final, type = Type(s(dynamic), top-level))]',
      soleConstructorOf(mp.superclass!).parameters);
  expect(
      '[Parameter(s(p1) in s(test.parameter_of_mixin_app_constructor.S'
      ' with test.parameter_of_mixin_app_constructor.M1),'
      ' final, type = Type(s(dynamic), top-level)),'
      ' Parameter(s(p2) in s(test.parameter_of_mixin_app_constructor.S'
      ' with test.parameter_of_mixin_app_constructor.M1),'
      ' final, type = Type(s(dynamic), top-level))]',
      soleConstructorOf(mp.superclass!.superclass!).parameters);
  expect(
      '[Parameter(s(p1) in s(S),'
      ' type = Class(s(int) in s(dart.core), top-level)),'
      ' Parameter(s(p2) in s(S),'
      ' type = Class(s(String) in s(dart.core), top-level))]',
      soleConstructorOf(mp.superclass!.superclass!.superclass!).parameters);
  expect(
      '[]',
      soleConstructorOf(mp.superclass!.superclass!.superclass!.superclass!)
          .parameters);
}
