blob: 6f0ddf2fbbdf9201a5412d0663ca6b1dddb23e66 [file] [log] [blame]
// 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.
import "dart:mirrors";
import "package:expect/expect.dart";
import "stringify.dart";
class Class<T1, T2> {
final field;
Class(this.field);
factory Class.factoryNoOptional(a, b) => new Class<T1, T2>(a - b);
factory Class.redirectingFactoryNoOptional(a, b) = Class.factoryNoOptional;
factory Class.factoryUnnamedOptional(a, [b = 42]) => new Class<T1, T2>(a - b);
factory Class.redirectingFactoryUnnamedOptional(a, [b]) =
Class.factoryUnnamedOptional;
factory Class.factoryNamedOptional(a, {b: 42}) {
return new Class<T1, T2>(a - b);
}
factory Class.redirectingFactoryNamedOptional(a, {b}) =
Class.factoryNamedOptional;
factory Class.factoryMoreNamedOptional(a, {b: 0, c: 2}) {
return new Class<T1, T2>(a - b - c);
}
factory Class.redirectingFactoryMoreNamedOptional(a, {b}) =
Class.factoryMoreNamedOptional;
factory Class.factoryMoreUnnamedOptional(a, [b = 0, c = 2]) {
return new Class<T1, T2>(a - b - c);
}
factory Class.redirectingFactoryMoreUnnamedOptional(a, [b]) =
Class.factoryMoreUnnamedOptional;
factory Class.redirectingFactoryStringIntTypeParameters(a, b) =
Class<String, int>.factoryNoOptional;
factory Class.redirectingFactoryStringTypeParameters(a, b) =
Class
<String> /// 02: static type warning
.factoryNoOptional;
factory Class.redirectingFactoryTypeParameters(a, b) =
Class<T1, T2>.factoryNoOptional;
factory Class.redirectingFactoryReversedTypeParameters(a, b) =
Class<T2, T1>.factoryNoOptional;
}
main() {
var classMirror = reflectClass(Class);
var instanceMirror = classMirror.newInstance(const Symbol(''), [2]);
Expect.equals(2, instanceMirror.reflectee.field);
instanceMirror = classMirror.newInstance(
#redirectingFactoryNoOptional, [8, 6]);
Expect.equals(2, instanceMirror.reflectee.field);
instanceMirror = classMirror.newInstance(
#redirectingFactoryUnnamedOptional, [43, 1]);
Expect.equals(42, instanceMirror.reflectee.field);
instanceMirror = classMirror.newInstance(
#redirectingFactoryMoreUnnamedOptional, [43, 1]);
Expect.equals(40, instanceMirror.reflectee.field);
instanceMirror = classMirror.newInstance(
#redirectingFactoryStringIntTypeParameters, [43, 1]);
Expect.equals(42, instanceMirror.reflectee.field);
Expect.isTrue(instanceMirror.reflectee is Class<String, int>);
Expect.isFalse(instanceMirror.reflectee is Class<int, String>);
instanceMirror = classMirror.newInstance(
#redirectingFactoryStringTypeParameters, [43, 1]);
Expect.equals(42, instanceMirror.reflectee.field);
Expect.isTrue(instanceMirror.reflectee is Class<String, int>);
Expect.isTrue(instanceMirror.reflectee is Class<String, String>);
Expect.isTrue(instanceMirror.reflectee is Class<int, String>);
bool isDart2js = false;
isDart2js = true; /// 01: ok
if (isDart2js) return;
instanceMirror = classMirror.newInstance(
#redirectingFactoryUnnamedOptional, [43]);
Expect.equals(1, instanceMirror.reflectee.field);
instanceMirror = classMirror.newInstance(
#redirectingFactoryNamedOptional, [43]);
Expect.equals(1, instanceMirror.reflectee.field);
instanceMirror = classMirror.newInstance(
#redirectingFactoryNamedOptional,
[43],
new Map()..[#b] = 1);
Expect.equals(42, instanceMirror.reflectee.field);
instanceMirror = classMirror.newInstance(
#redirectingFactoryMoreNamedOptional,
[43],
new Map()..[#b] = 1);
Expect.equals(40, instanceMirror.reflectee.field);
classMirror = reflect(new Class<String, int>(42)).type;
instanceMirror = classMirror.newInstance(
#redirectingFactoryTypeParameters, [43, 1]);
Expect.equals(42, instanceMirror.reflectee.field);
Expect.isTrue(instanceMirror.reflectee is Class<String, int>);
Expect.isFalse(instanceMirror.reflectee is Class<int, String>);
instanceMirror = classMirror.newInstance(
#redirectingFactoryReversedTypeParameters, [43, 1]);
Expect.equals(42, instanceMirror.reflectee.field);
Expect.isTrue(instanceMirror.reflectee is Class<int, String>);
Expect.isFalse(instanceMirror.reflectee is Class<String, int>);
}