| Index: tests/language/function_type/test_generator.dart
|
| diff --git a/tests/language/function_type/test_generator.dart b/tests/language/function_type/test_generator.dart
|
| deleted file mode 100644
|
| index 68f8a7cb7612e3c2461484890a10cee872008ddf..0000000000000000000000000000000000000000
|
| --- a/tests/language/function_type/test_generator.dart
|
| +++ /dev/null
|
| @@ -1,770 +0,0 @@
|
| -// Copyright (c) 2016, 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:io';
|
| -
|
| -// By convention:
|
| -//
|
| -// T: generic type of typedef.
|
| -// A: generic type of returned function.
|
| -// B: generic type of function.
|
| -//
|
| -// Example:
|
| -// typedef F<T>: Function<A> Function<B>();
|
| -//
|
| -// We only use: Function, List, int (and function types).
|
| -// We import 'dart:core' directly and with prefix 'core'.
|
| -
|
| -abstract class Printable {
|
| - /// Builds a descriptive string that can be used as an identifier.
|
| - ///
|
| - /// The string is mainly used for disambiguation, and not for its readability.
|
| - void writeIdentifier(StringBuffer buffer);
|
| -}
|
| -
|
| -abstract class TypeLike implements Printable {
|
| - /// Prints `this` as valid Dart code for a Type.
|
| - void writeType(StringBuffer buffer);
|
| -
|
| - /// Whether this instance uses T in some way.
|
| - bool get usesT;
|
| -}
|
| -
|
| -/// Provides a unique integer for every parameter in a function.
|
| -int parameterNameCounter = 0;
|
| -
|
| -/// Whether `T` should be replaced with `int`.
|
| -bool shouldReplaceTWithInt = false;
|
| -
|
| -class Parameter implements Printable {
|
| - final TypeLike type;
|
| - final String name;
|
| -
|
| - Parameter(this.type, this.name);
|
| -
|
| - // Type or name can be null.
|
| - @override
|
| - writeIdentifier(buffer) {
|
| - if (type == null) {
|
| - buffer.write("null");
|
| - } else {
|
| - type.writeIdentifier(buffer);
|
| - }
|
| - buffer.write("_");
|
| - buffer.write(name);
|
| - }
|
| -
|
| - void writeType(StringBuffer buffer) {
|
| - assert(type != null || name != null);
|
| - if (name == null) {
|
| - type.writeType(buffer);
|
| - } else if (type == null) {
|
| - buffer.write(name);
|
| - } else {
|
| - type.writeType(buffer);
|
| - buffer.write(" ");
|
| - buffer.write(name);
|
| - }
|
| - }
|
| -
|
| - void writeInFunction(StringBuffer buffer) {
|
| - assert(type != null || name != null);
|
| - if (name == null) {
|
| - type.writeType(buffer);
|
| - buffer.write(" x");
|
| - buffer.write(parameterNameCounter++);
|
| - } else if (type == null) {
|
| - buffer.write(name);
|
| - } else {
|
| - type.writeType(buffer);
|
| - buffer.write(" ");
|
| - buffer.write(name);
|
| - }
|
| - }
|
| -
|
| - bool operator ==(other) {
|
| - return other is Parameter && name == other.name && type == other.type;
|
| - }
|
| -
|
| - int get hashCode {
|
| - return ((name.hashCode * 37) ^ type.hashCode) & 0xFFFFFFFF;
|
| - }
|
| -
|
| - bool get usesT => type?.usesT == true;
|
| -}
|
| -
|
| -class GenericParameter implements TypeLike {
|
| - final String name;
|
| - final TypeLike bound;
|
| -
|
| - GenericParameter(this.name, [this.bound]);
|
| -
|
| - // Bound may be null.
|
| - @override
|
| - writeIdentifier(buffer) {
|
| - buffer.write(name);
|
| - buffer.write("_");
|
| - if (bound == null) {
|
| - buffer.write("null");
|
| - } else {
|
| - bound.writeIdentifier(buffer);
|
| - }
|
| - }
|
| -
|
| - @override
|
| - writeType(buffer) {
|
| - buffer.write(name);
|
| - if (bound != null) {
|
| - buffer.write(" extends ");
|
| - bound.writeType(buffer);
|
| - }
|
| - }
|
| -
|
| - bool operator ==(other) {
|
| - return other is GenericParameter &&
|
| - name == other.name &&
|
| - bound == other.bound;
|
| - }
|
| -
|
| - int get hashCode {
|
| - return ((name.hashCode * 23) ^ bound.hashCode) & 0xFFFFFFFF;
|
| - }
|
| -
|
| - bool get usesT {
|
| - return bound?.usesT == true;
|
| - }
|
| -}
|
| -
|
| -void _describeList(StringBuffer buffer, List<Printable> list) {
|
| - if (list == null) {
|
| - buffer.write("0");
|
| - return;
|
| - }
|
| - buffer.write(list.length.toString());
|
| - buffer.write("_");
|
| - for (int i = 0; i < list.length; i++) {
|
| - if (i != 0) buffer.write("_");
|
| - list[i].writeIdentifier(buffer);
|
| - }
|
| -}
|
| -
|
| -void _writeTypes(StringBuffer buffer, List<TypeLike> list,
|
| - [String prefix = "", String postfix = ""]) {
|
| - if (list == null || list.isEmpty) return;
|
| - buffer.write(prefix);
|
| - for (int i = 0; i < list.length; i++) {
|
| - if (i != 0) buffer.write(", ");
|
| - list[i].writeType(buffer);
|
| - }
|
| - buffer.write(postfix);
|
| -}
|
| -
|
| -void _writeParameters(
|
| - StringBuffer buffer, List<Parameter> list, bool inFunction,
|
| - [String prefix = "", String postfix = ""]) {
|
| - if (list == null || list.isEmpty) return;
|
| - buffer.write(prefix);
|
| - for (int i = 0; i < list.length; i++) {
|
| - if (i != 0) buffer.write(", ");
|
| - if (inFunction) {
|
| - list[i].writeInFunction(buffer);
|
| - } else {
|
| - list[i].writeType(buffer);
|
| - }
|
| - }
|
| - buffer.write(postfix);
|
| -}
|
| -
|
| -bool _listUsesT(List elements) {
|
| - if (elements == null) return false;
|
| - return elements.any((p) => p.usesT);
|
| -}
|
| -
|
| -bool _listEquals(List list1, List list2) {
|
| - if (list1 == list2) return true; // Also covers both being null.
|
| - if (list1 == null || list2 == null) return false;
|
| - for (int i = 0; i < list1.length; i++) {
|
| - if (list1[i] != list2[i]) return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -int _listHash(List list) {
|
| - if (list == null) return null.hashCode;
|
| - int result = 71;
|
| - for (int i = 0; i < list.length; i++) {
|
| - result = ((result * 11) ^ list[i].hashCode) & 0xFFFFFFFF;
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -class FunctionType implements TypeLike {
|
| - final TypeLike returnType;
|
| - final List<GenericParameter> generic;
|
| - final List<Parameter> required;
|
| - final List<Parameter> optional;
|
| - final List<Parameter> named;
|
| -
|
| - FunctionType(this.returnType, this.generic, this.required,
|
| - [this.optional, this.named]);
|
| -
|
| - @override
|
| - writeIdentifier(buffer) {
|
| - buffer.write("Fun_");
|
| - if (returnType == null) {
|
| - buffer.write("null");
|
| - } else {
|
| - returnType.writeIdentifier(buffer);
|
| - }
|
| - buffer.write("_");
|
| - _describeList(buffer, generic);
|
| - buffer.write("_");
|
| - _describeList(buffer, required);
|
| - buffer.write("_");
|
| - _describeList(buffer, optional);
|
| - buffer.write("_");
|
| - _describeList(buffer, named);
|
| - }
|
| -
|
| - @override
|
| - writeType(buffer) {
|
| - if (returnType != null) {
|
| - returnType.writeType(buffer);
|
| - buffer.write(" ");
|
| - }
|
| - buffer.write("Function");
|
| - if (generic != null) _writeTypes(buffer, generic, "<", ">");
|
| - buffer.write("(");
|
| - bool notInFunction = true;
|
| - _writeParameters(buffer, required, notInFunction);
|
| - if ((optional != null || named != null) &&
|
| - required != null &&
|
| - required.isNotEmpty) {
|
| - buffer.write(", ");
|
| - }
|
| - _writeParameters(buffer, optional, notInFunction, "[", "]");
|
| - _writeParameters(buffer, named, notInFunction, "{", "}");
|
| - buffer.write(")");
|
| - }
|
| -
|
| - /// Writes this type as if it was a function.
|
| - void writeFunction(StringBuffer buffer, String name, {bool replaceT: true}) {
|
| - shouldReplaceTWithInt = replaceT;
|
| - parameterNameCounter = 0;
|
| -
|
| - if (returnType != null) {
|
| - returnType.writeType(buffer);
|
| - buffer.write(" ");
|
| - }
|
| -
|
| - buffer.write(name);
|
| - if (generic != null) _writeTypes(buffer, generic, "<", ">");
|
| - buffer.write("(");
|
| - bool inFunction = true;
|
| - _writeParameters(buffer, required, inFunction);
|
| - if ((optional != null || named != null) &&
|
| - required != null &&
|
| - required.isNotEmpty) {
|
| - buffer.write(", ");
|
| - }
|
| - _writeParameters(buffer, optional, inFunction, "[", "]");
|
| - _writeParameters(buffer, named, inFunction, "{", "}");
|
| - buffer.write(") => null;");
|
| -
|
| - shouldReplaceTWithInt = false;
|
| - }
|
| -
|
| - bool operator ==(other) {
|
| - return returnType == other.returnType &&
|
| - _listEquals(generic, other.generic) &&
|
| - _listEquals(required, other.required) &&
|
| - _listEquals(optional, other.optional) &&
|
| - _listEquals(named, other.named);
|
| - }
|
| -
|
| - int get hashCode {
|
| - return ((returnType.hashCode * 13) ^
|
| - (_listHash(generic) * 17) ^
|
| - (_listHash(required) * 53) ^
|
| - (_listHash(optional) ^ 31) ^
|
| - (_listHash(named) * 87)) &
|
| - 0xFFFFFFFF;
|
| - }
|
| -
|
| - bool get usesT {
|
| - return returnType?.usesT == true ||
|
| - [generic, required, optional, named].any(_listUsesT);
|
| - }
|
| -}
|
| -
|
| -class NominalType implements TypeLike {
|
| - final String prefix;
|
| - final String name;
|
| - final List<TypeLike> generic;
|
| -
|
| - NominalType(this.name, [this.prefix, this.generic]);
|
| -
|
| - @override
|
| - writeIdentifier(buffer) {
|
| - buffer.write(prefix);
|
| - buffer.write("_");
|
| - buffer.write(name);
|
| - _describeList(buffer, generic);
|
| - }
|
| -
|
| - @override
|
| - writeType(buffer) {
|
| - if (prefix != null && prefix != "") {
|
| - buffer.write(prefix);
|
| - buffer.write(".");
|
| - }
|
| - if (shouldReplaceTWithInt && name == "T") {
|
| - buffer.write("int");
|
| - } else {
|
| - buffer.write(name);
|
| - }
|
| - _writeTypes(buffer, generic, "<", ">");
|
| - }
|
| -
|
| - bool operator ==(other) {
|
| - return other is NominalType && prefix == other.prefix && name == other.name;
|
| - }
|
| -
|
| - int get hashCode {
|
| - return ((prefix.hashCode * 37) ^ name.hashCode) & 0xFFFFFFFF;
|
| - }
|
| -
|
| - bool get usesT => name == "T" || _listUsesT(generic);
|
| -}
|
| -
|
| -List<FunctionType> buildFunctionTypes() {
|
| - List<GenericParameter> as = [
|
| - new GenericParameter("A"),
|
| - // new GenericParameter("A", new NominalType("int")),
|
| - // new GenericParameter("A", new NominalType("int", "core")),
|
| - ];
|
| - List<GenericParameter> bs = [
|
| - // new GenericParameter("B"),
|
| - // new GenericParameter("B", new NominalType("int")),
|
| - new GenericParameter("B", new NominalType("int", "core")),
|
| - ];
|
| - List<TypeLike> basicTypes = [
|
| - new NominalType("int"),
|
| - // new NominalType("int", "core"),
|
| - // new NominalType("List"),
|
| - // new NominalType("List", "core"),
|
| - new NominalType("Function"),
|
| - new NominalType("List", "", [new NominalType("Function")]),
|
| - new NominalType("List", "core", [new NominalType("int", "core")]),
|
| - new NominalType("List", "", [new NominalType("T")]),
|
| - // new NominalType("List", "", [new NominalType("Function")]),
|
| - ];
|
| -
|
| - List<TypeLike> basicsPlusNull = [
|
| - basicTypes,
|
| - <TypeLike>[null]
|
| - ].expand((x) => x).toList();
|
| -
|
| - List<TypeLike> basicsPlusNullPlusVoid = [
|
| - basicsPlusNull,
|
| - [new NominalType("void")],
|
| - ].expand((x) => x).toList();
|
| -
|
| - List<TypeLike> basicsPlusNullPlusB = [
|
| - basicsPlusNull,
|
| - [
|
| - new NominalType("B"),
|
| - new NominalType("List", "", [new NominalType("B")])
|
| - ]
|
| - ].expand((x) => x).toList();
|
| -
|
| - List<TypeLike> basicsPlusNullPlusBPlusVoid = [
|
| - basicsPlusNullPlusB,
|
| - [new NominalType("void")],
|
| - ].expand((x) => x).toList();
|
| -
|
| - List<TypeLike> basicsPlusNullPlusA = [
|
| - basicsPlusNull,
|
| - [
|
| - new NominalType("A"),
|
| - new NominalType("List", "", [new NominalType("A")])
|
| - ]
|
| - ].expand((x) => x).toList();
|
| -
|
| - List<TypeLike> basicsPlusNullPlusAPlusVoid = [
|
| - basicsPlusNullPlusA,
|
| - [new NominalType("void")],
|
| - ].expand((x) => x).toList();
|
| -
|
| - List<TypeLike> buildFunctionTypes(TypeLike returnType, TypeLike parameterType,
|
| - [List<GenericParameter> generics,
|
| - bool generateMoreCombinations = false]) {
|
| - List<TypeLike> result = [];
|
| -
|
| - if (parameterType == null) {
|
| - // int Function().
|
| - result.add(new FunctionType(returnType, generics, null));
|
| - return result;
|
| - }
|
| -
|
| - // int Function(int x).
|
| - result.add(new FunctionType(
|
| - returnType, generics, [new Parameter(parameterType, "x")]));
|
| -
|
| - if (!generateMoreCombinations) return result;
|
| -
|
| - // int Function([int x]).
|
| - result.add(new FunctionType(
|
| - returnType, generics, null, [new Parameter(parameterType, "x")]));
|
| - // int Function(int, [int x])
|
| - result.add(new FunctionType(
|
| - returnType,
|
| - generics,
|
| - [new Parameter(new NominalType("int"), null)],
|
| - [new Parameter(parameterType, "x")]));
|
| - // int Function(int x, [int x])
|
| - result.add(new FunctionType(
|
| - returnType,
|
| - generics,
|
| - [new Parameter(new NominalType("int"), "y")],
|
| - [new Parameter(parameterType, "x")]));
|
| - // int Function(int);
|
| - result.add(new FunctionType(
|
| - returnType, generics, [new Parameter(parameterType, null)]));
|
| - // int Function([int]);
|
| - result.add(new FunctionType(
|
| - returnType, generics, null, [new Parameter(parameterType, null)]));
|
| - // int Function(int, [int])
|
| - result.add(new FunctionType(
|
| - returnType,
|
| - generics,
|
| - [new Parameter(new NominalType("int"), null)],
|
| - [new Parameter(parameterType, null)]));
|
| - // int Function(int x, [int])
|
| - result.add(new FunctionType(
|
| - returnType,
|
| - generics,
|
| - [new Parameter(new NominalType("int"), "x")],
|
| - [new Parameter(parameterType, null)]));
|
| - // int Function({int x}).
|
| - result.add(new FunctionType(returnType, generics, null, null,
|
| - [new Parameter(parameterType, "x")]));
|
| - // int Function(int, {int x})
|
| - result.add(new FunctionType(
|
| - returnType,
|
| - generics,
|
| - [new Parameter(new NominalType("int"), null)],
|
| - null,
|
| - [new Parameter(parameterType, "x")]));
|
| - // int Function(int x, {int x})
|
| - result.add(new FunctionType(
|
| - returnType,
|
| - generics,
|
| - [new Parameter(new NominalType("int"), "y")],
|
| - null,
|
| - [new Parameter(parameterType, "x")]));
|
| - return result;
|
| - }
|
| -
|
| - // The "smaller" function types. May also be used non-nested.
|
| - List<TypeLike> functionTypes = [];
|
| -
|
| - for (TypeLike returnType in basicsPlusNullPlusVoid) {
|
| - for (TypeLike parameterType in basicsPlusNull) {
|
| - bool generateMoreCombinations = true;
|
| - functionTypes.addAll(buildFunctionTypes(
|
| - returnType, parameterType, null, generateMoreCombinations));
|
| - }
|
| - }
|
| -
|
| - // These use `B` from the generic type of the enclosing function.
|
| - List<TypeLike> returnFunctionTypesB = [];
|
| - for (TypeLike returnType in basicsPlusNullPlusBPlusVoid) {
|
| - TypeLike parameterType = new NominalType("B");
|
| - returnFunctionTypesB.addAll(buildFunctionTypes(returnType, parameterType));
|
| - }
|
| - for (TypeLike parameterType in basicsPlusNull) {
|
| - TypeLike returnType = new NominalType("B");
|
| - returnFunctionTypesB.addAll(buildFunctionTypes(returnType, parameterType));
|
| - }
|
| -
|
| - for (TypeLike returnType in basicsPlusNullPlusAPlusVoid) {
|
| - for (TypeLike parameterType in basicsPlusNullPlusA) {
|
| - for (GenericParameter a in as) {
|
| - functionTypes
|
| - .addAll(buildFunctionTypes(returnType, parameterType, [a]));
|
| - }
|
| - }
|
| - }
|
| -
|
| - List<TypeLike> types = [];
|
| - types.addAll(functionTypes);
|
| -
|
| - // Now add some higher-order function types.
|
| - for (TypeLike returnType in functionTypes) {
|
| - types.addAll(buildFunctionTypes(returnType, null));
|
| - types.addAll(buildFunctionTypes(returnType, new NominalType("int")));
|
| - for (var b in bs) {
|
| - types.addAll(buildFunctionTypes(returnType, null, [b]));
|
| - types.addAll(buildFunctionTypes(returnType, new NominalType("int"), [b]));
|
| - }
|
| - }
|
| - for (TypeLike returnType in returnFunctionTypesB) {
|
| - for (var b in bs) {
|
| - types.addAll(buildFunctionTypes(returnType, null, [b]));
|
| - types.addAll(buildFunctionTypes(returnType, new NominalType("int"), [b]));
|
| - }
|
| - }
|
| -
|
| - return types;
|
| -}
|
| -
|
| -final String HEADER = """
|
| -// Copyright (c) 2016, 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.
|
| -
|
| -// GENERATED - DON'T EDIT.
|
| -// GENERATED - DON'T EDIT.
|
| -// GENERATED - DON'T EDIT.
|
| -// GENERATED - DON'T EDIT.
|
| -// GENERATED - DON'T EDIT.
|
| -// GENERATED - DON'T EDIT.
|
| -// GENERATED - DON'T EDIT.
|
| -// GENERATED - DON'T EDIT.
|
| -
|
| -import 'dart:core';
|
| -import 'dart:core' as core;
|
| -import 'package:expect/expect.dart';
|
| -
|
| -@NoInline()
|
| -@AssumeDynamic()
|
| -confuse(f) => f;
|
| -
|
| -final bool inCheckedMode =
|
| - (() { bool result = false; assert(result = true); return result; })();
|
| -""";
|
| -
|
| -
|
| -class Unit {
|
| - final String name;
|
| - final StringBuffer typedefs = new StringBuffer();
|
| - final StringBuffer globals = new StringBuffer();
|
| - final StringBuffer tests = new StringBuffer();
|
| - final StringBuffer fields = new StringBuffer();
|
| - final StringBuffer statics = new StringBuffer();
|
| - final StringBuffer testMethods = new StringBuffer();
|
| - final StringBuffer methods = new StringBuffer();
|
| -
|
| - Unit(this.name);
|
| -
|
| - void write(StringBuffer buffer) {
|
| - buffer.write("""
|
| -$HEADER
|
| -
|
| -$typedefs
|
| -
|
| -$globals
|
| -
|
| -class $name<T> {
|
| - final bool tIsBool;
|
| - final bool tIsInt;
|
| - final bool tIsDynamic;
|
| -
|
| -$fields
|
| -
|
| - $name({this.tIsBool: false, this.tIsInt: false})
|
| - : tIsDynamic = !tIsBool && !tIsInt;
|
| -
|
| -$methods
|
| -
|
| - runTests() {\n$tests }
|
| -
|
| -$testMethods
|
| -}
|
| -
|
| -void main() {
|
| - new $name().runTests();
|
| - new $name<int>(tIsInt: true).runTests();
|
| - new $name<bool>(tIsBool: true).runTests();
|
| -}
|
| - """);
|
| - }
|
| -}
|
| -
|
| -
|
| -final TEST_METHOD_HEADER = """
|
| - void #testName() {
|
| - // #typeCode""";
|
| -
|
| -// Tests that apply for every type.
|
| -final COMMON_TESTS_TEMPLATE = """
|
| - Expect.isTrue(#staticFunName is #typeName);
|
| - Expect.isTrue(confuse(#staticFunName) is #typeName);
|
| - // In checked mode, verifies the type.
|
| - #typeCode #localName;
|
| - // The static function #staticFunName sets `T` to `int`.
|
| - if (!tIsBool) {
|
| - #fieldName = #staticFunName as dynamic;
|
| - #localName = #staticFunName as dynamic;
|
| - #fieldName = confuse(#staticFunName);
|
| - #localName = confuse(#staticFunName);
|
| - }
|
| -
|
| - Expect.isTrue(#methodFunName is #typeName);
|
| - Expect.isTrue(#methodFunName is #typeCode);
|
| - Expect.isTrue(confuse(#methodFunName) is #typeName);
|
| - // In checked mode, verifies the type.
|
| - #fieldName = #methodFunName;
|
| - #localName = #methodFunName;
|
| - #fieldName = confuse(#methodFunName);
|
| - #localName = confuse(#methodFunName);""";
|
| -
|
| -// Tests that depend on the typedef "T" argument.
|
| -//
|
| -// These tests are executed when the surrounding class is instantiated with
|
| -// its generic type set to `int`, `dynamic` or `bool`. In the latter case, the
|
| -// class field `tIsBool` is set to true.
|
| -
|
| -// While the types themselves are not affected by the class` `T`, the methods
|
| -// of the class may use `T`:
|
| -//
|
| -// For example:
|
| -// class A<T> {
|
| -// f(List<T> x) {}
|
| -// }
|
| -final TYPEDEF_T_TESTS_TEMPLATE = """
|
| - if (!tIsBool) {
|
| - Expect.isTrue(#staticFunName is #typeName<int>);
|
| - Expect.isFalse(#staticFunName is #typeName<bool>);
|
| - Expect.isTrue(confuse(#staticFunName) is #typeName<int>);
|
| - Expect.isFalse(confuse(#staticFunName) is #typeName<bool>);
|
| - Expect.equals(tIsDynamic, #methodFunName is #typeName<bool>);
|
| - Expect.equals(tIsDynamic, confuse(#methodFunName) is #typeName<bool>);
|
| - } else {
|
| - if (inCheckedMode) {
|
| - Expect.throws(() { #fieldName = (#staticFunName as dynamic); });
|
| - Expect.throws(() { #fieldName = confuse(#staticFunName); });
|
| - #typeCode #localName;
|
| - Expect.throws(() { #localName = (#staticFunName as dynamic); });
|
| - Expect.throws(() { #localName = confuse(#staticFunName); });
|
| - }
|
| - #typeCode #localName = #methodFunName;
|
| - // In checked mode, verifies the type.
|
| - #fieldName = #methodFunName;
|
| - #fieldName = confuse(#methodFunName);
|
| - }""";
|
| -
|
| -final TEST_METHOD_FOOTER = " }";
|
| -
|
| -String createTypeName(int id) => "F$id";
|
| -String createStaticFunName(int id) => "f$id";
|
| -String createMethodFunName(int id) => "m$id";
|
| -String createFieldName(int id) => "x$id";
|
| -String createLocalName(int id) => "l$id";
|
| -String createTestName(int id) => "test${createTypeName(id)}";
|
| -
|
| -String createTypeCode(FunctionType type) {
|
| - StringBuffer typeBuffer = new StringBuffer();
|
| - type.writeType(typeBuffer);
|
| - return typeBuffer.toString();
|
| -}
|
| -String createStaticFunCode(FunctionType type, int id) {
|
| - StringBuffer staticFunBuffer = new StringBuffer();
|
| - type.writeFunction(staticFunBuffer, createStaticFunName(id));
|
| - return staticFunBuffer.toString();
|
| -}
|
| -
|
| -String createMethodFunCode(FunctionType type, int id) {
|
| - StringBuffer methodFunBuffer = new StringBuffer();
|
| - type.writeFunction(methodFunBuffer, createMethodFunName(id), replaceT: false);
|
| - return methodFunBuffer.toString();
|
| -}
|
| -
|
| -String createTestMethodFunCode(FunctionType type, String typeCode, int id) {
|
| - String fillTemplate(String template, int id) {
|
| - var result = template
|
| - .replaceAll("#typeName", createTypeName(id))
|
| - .replaceAll("#staticFunName", createStaticFunName(id))
|
| - .replaceAll("#methodFunName", createMethodFunName(id))
|
| - .replaceAll("#fieldName", createFieldName(id))
|
| - .replaceAll("#localName", createLocalName(id))
|
| - .replaceAll("#testName", createTestName(id))
|
| - .replaceAll("#typeCode", typeCode);
|
| - assert(!result.contains("#"));
|
| - return result;
|
| - }
|
| -
|
| - String commonTests = fillTemplate(COMMON_TESTS_TEMPLATE, id);
|
| - String genericTTests = "";
|
| - if (type.usesT) {
|
| - genericTTests = fillTemplate(TYPEDEF_T_TESTS_TEMPLATE, id);
|
| - }
|
| - return """
|
| -${fillTemplate(TEST_METHOD_HEADER, id)}
|
| -$commonTests
|
| -$genericTTests
|
| -$TEST_METHOD_FOOTER
|
| -""";
|
| -}
|
| -
|
| -void generateTests() {
|
| - // Keep methods and classes smaller by distributing over several different
|
| - // classes.
|
| - List<Unit> units = [];
|
| - for (int i = 0; i < 100; i++) {
|
| - units.add(new Unit("U$i"));
|
| - }
|
| -
|
| - var types = buildFunctionTypes();
|
| -
|
| - int typeCounter = 0;
|
| - types.forEach((FunctionType type) {
|
| - Unit unit = units[typeCounter % units.length];
|
| -
|
| - String typeName = createTypeName(typeCounter);
|
| - String fieldName = createFieldName(typeCounter);
|
| - String testName = createTestName(typeCounter);
|
| -
|
| - String typeCode = createTypeCode(type);
|
| - String staticFunCode = createStaticFunCode(type, typeCounter);
|
| - String methodFunCode = createMethodFunCode(type, typeCounter);
|
| - String testMethodCode =
|
| - createTestMethodFunCode(type, typeCode, typeCounter);
|
| -
|
| -
|
| - unit.typedefs.writeln("typedef $typeName<T> = $typeCode;");
|
| - unit.globals.writeln(staticFunCode);
|
| - unit.fields.writeln(" $typeCode $fieldName;");
|
| - unit.methods.writeln(" $methodFunCode");
|
| - unit.testMethods.writeln("$testMethodCode");
|
| - unit.tests.writeln(" $testName();");
|
| -
|
| - typeCounter++;
|
| - });
|
| -
|
| - for (int i = 0; i < units.length; i++) {
|
| - var unit = units[i];
|
| - var buffer = new StringBuffer();
|
| - unit.write(buffer);
|
| - var path = Platform.script.resolve("function_type${i}_test.dart").path;
|
| - new File(path).writeAsStringSync(buffer.toString());
|
| - }
|
| -}
|
| -
|
| -void printUsage() {
|
| - print("""
|
| -Generates function type tests.
|
| -
|
| -All tests are generated in the same directory as this script.
|
| -""");
|
| -}
|
| -
|
| -void main(List<String> arguments) {
|
| - if (arguments.length != 0) {
|
| - printUsage();
|
| - return;
|
| - }
|
| - generateTests();
|
| -}
|
|
|