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

// @dart = 2.9

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);
}
