// 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 tests uses the multi-test "ok" feature:
// none: Desired behaviour, passing on the VM.
// 01: Trimmed version for dart2js.
//
// TODO(rmacnak,ahe): Remove multi-test when VM and dart2js are on par.

/** Test of [ParameterMirror]. */
library test.parameter_test;

import 'dart:mirrors';

import 'package:expect/expect.dart';
import 'stringify.dart';

class B {
  B();
  B.foo(int x);
  B.bar(int z, x);

  // TODO(6490): Currently only supported by the VM.
  B.baz(final int x, int y, final int z);
  B.qux(int x, [int y = 3 + 1]);
  B.quux(int x, {String str: "foo"});
  B.corge({int x: 3 * 17, String str: "bar"});

  var _x;
  get x => _x;
  set x(final value) {
    _x = value;
  }

  grault([int x = 0]) {}
  garply({int y = 0}) {}
  waldo(int z) {}
}

class C<S extends int, T> {
  // TODO(6490): Currently only supported by the VM.
  foo(int a, S b) => b;
  bar(S a, T b, num c) {}
}

main() {
  ClassMirror cm = reflectClass(B);
  var constructors = new Map<Symbol, MethodMirror>();
  cm.declarations.forEach((k, v) {
    if (v is MethodMirror && v.isConstructor) constructors[k] = v;
  });

  List<Symbol> constructorKeys = [
    #B,
    #B.bar,
    #B.baz,
    #B.foo,
    #B.quux,
    #B.qux,
    #B.corge
  ];
  Expect.setEquals(constructorKeys, constructors.keys);

  MethodMirror unnamedConstructor = constructors[#B] as MethodMirror;
  expect('Method(s(B) in s(B), constructor)', unnamedConstructor);
  expect('[]', unnamedConstructor.parameters);
  expect('Class(s(B) in s(test.parameter_test), top-level)',
      unnamedConstructor.returnType);

  MethodMirror fooConstructor = constructors[#B.foo] as MethodMirror;
  expect('Method(s(B.foo) in s(B), constructor)', fooConstructor);
  expect(
      '[Parameter(s(x) in s(B.foo),'
      ' type = Class(s(int) in s(dart.core), top-level))]',
      fooConstructor.parameters);
  expect('Class(s(B) in s(test.parameter_test), top-level)',
      fooConstructor.returnType);

  MethodMirror barConstructor = constructors[#B.bar] as MethodMirror;
  expect('Method(s(B.bar) in s(B), constructor)', barConstructor);
  expect(
      '[Parameter(s(z) in s(B.bar),'
      ' type = Class(s(int) in s(dart.core), top-level)), '
      'Parameter(s(x) in s(B.bar),'
      ' type = Type(s(dynamic), top-level))]',
      barConstructor.parameters);
  expect('Class(s(B) in s(test.parameter_test), top-level)',
      barConstructor.returnType);

  // dart2js stops testing here.
  return; // //# 01: ok

  MethodMirror bazConstructor = constructors[#B.baz] as MethodMirror;
  expect('Method(s(B.baz) in s(B), constructor)', bazConstructor);
  expect(
      '[Parameter(s(x) in s(B.baz), final,'
      ' type = Class(s(int) in s(dart.core), top-level)), '
      'Parameter(s(y) in s(B.baz),'
      ' type = Class(s(int) in s(dart.core), top-level)), '
      'Parameter(s(z) in s(B.baz), final,'
      ' type = Class(s(int) in s(dart.core), top-level))]',
      bazConstructor.parameters);
  expect('Class(s(B) in s(test.parameter_test), top-level)',
      bazConstructor.returnType);

  MethodMirror quxConstructor = constructors[#B.qux] as MethodMirror;
  expect('Method(s(B.qux) in s(B), constructor)', quxConstructor);
  expect(
      '[Parameter(s(x) in s(B.qux),'
      ' type = Class(s(int) in s(dart.core), top-level)), '
      'Parameter(s(y) in s(B.qux), optional,'
      ' value = Instance(value = 4),'
      ' type = Class(s(int) in s(dart.core), top-level))]',
      quxConstructor.parameters);
  expect('Class(s(B) in s(test.parameter_test), top-level)',
      quxConstructor.returnType);

  MethodMirror quuxConstructor = constructors[#B.quux] as MethodMirror;
  expect('Method(s(B.quux) in s(B), constructor)', quuxConstructor);
  expect(
      '[Parameter(s(x) in s(B.quux),'
      ' type = Class(s(int) in s(dart.core), top-level)), '
      'Parameter(s(str) in s(B.quux), optional, named,'
      ' value = Instance(value = foo),'
      ' type = Class(s(String) in s(dart.core), top-level))]',
      quuxConstructor.parameters);
  expect('Class(s(B) in s(test.parameter_test), top-level)',
      quuxConstructor.returnType);

  MethodMirror corgeConstructor = constructors[#B.corge] as MethodMirror;
  expect('Method(s(B.corge) in s(B), constructor)', corgeConstructor);
  expect(
      '[Parameter(s(x) in s(B.corge), optional, named,'
      ' value = Instance(value = 51),'
      ' type = Class(s(int) in s(dart.core), top-level)), '
      'Parameter(s(str) in s(B.corge), optional, named,'
      ' value = Instance(value = bar),'
      ' type = Class(s(String) in s(dart.core), top-level))]',
      corgeConstructor.parameters);
  expect('Class(s(B) in s(test.parameter_test), top-level)',
      corgeConstructor.returnType);

  MethodMirror xGetter = cm.declarations[#x] as MethodMirror;
  expect('Method(s(x) in s(B), getter)', xGetter);
  expect('[]', xGetter.parameters);

  MethodMirror xSetter = cm.declarations[const Symbol('x=')] as MethodMirror;
  expect('Method(s(x=) in s(B), setter)', xSetter);
  expect(
      '[Parameter(s(value) in s(x=), final,'
      ' type = Type(s(dynamic), top-level))]',
      xSetter.parameters);

  MethodMirror grault = cm.declarations[#grault] as MethodMirror;
  expect('Method(s(grault) in s(B))', grault);
  expect(
      '[Parameter(s(x) in s(grault), optional, value = Instance(value = 0),'
      ' type = Class(s(int) in s(dart.core), top-level))]',
      grault.parameters);
  expect('Instance(value = 0)', grault.parameters[0].defaultValue);

  MethodMirror garply = cm.declarations[#garply] as MethodMirror;
  expect('Method(s(garply) in s(B))', garply);
  expect(
      '[Parameter(s(y) in s(garply), optional, named, value = Instance(value = 0),'
      ' type = Class(s(int) in s(dart.core), top-level))]',
      garply.parameters);
  expect('Instance(value = 0)', garply.parameters[0].defaultValue);

  MethodMirror waldo = cm.declarations[#waldo] as MethodMirror;
  expect('Method(s(waldo) in s(B))', waldo);
  expect(
      '[Parameter(s(z) in s(waldo),'
      ' type = Class(s(int) in s(dart.core), top-level))]',
      waldo.parameters);
  expect('<null>', waldo.parameters[0].defaultValue);

  cm = reflectClass(C);

  MethodMirror fooInC = cm.declarations[#foo] as MethodMirror;
  expect('Method(s(foo) in s(C))', fooInC);

  // Names of type variables are not preserved after type canonicalization
  // and are therefore not compared to expected names.


  MethodMirror barInC = cm.declarations[#bar] as MethodMirror;
  expect('Method(s(bar) in s(C))', barInC);
}
