Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(205)

Unified Diff: test/mjsunit/harmony/typesystem/simple-types.js

Issue 1810943002: Add parsing for tuple types (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@types
Patch Set: More test refactoring and minor fixes Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « test/cctest/test-parsing.cc ('k') | test/mjsunit/harmony/typesystem/testgen.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/mjsunit/harmony/typesystem/simple-types.js
diff --git a/test/mjsunit/harmony/typesystem/simple-types.js b/test/mjsunit/harmony/typesystem/simple-types.js
index 5c09802050235d94bf14a41506a61e8676ae6349..59a6350ba1accab9274e9a0681eb03bb998424d9 100644
--- a/test/mjsunit/harmony/typesystem/simple-types.js
+++ b/test/mjsunit/harmony/typesystem/simple-types.js
@@ -5,181 +5,14 @@
// Flags: --harmony-types
+load("test/mjsunit/harmony/typesystem/typegen.js");
+
+
// In all the following functions, the size parameter (positive integer)
// denotes how many test cases will be tried. The variable test_size
// controls execution time of this test. It should not be too high.
let test_size = 1000;
-function CheckValid(type) {
- // print("V:", type);
- assertDoesNotThrow("'use types'; var x: " + type + ";");
-}
-
-function CheckInvalid(type) {
- // print("I:", type);
- assertThrows("'use types'; var x: " + type + ";", SyntaxError);
-}
-
-// Parameters:
-// multiplicity: positive integer
-// generator: (size: positive integer, ...params: any[]) => Iterator<SomeType>
-// transformations: [false | ((t: SomeType) => OtherType)]
-// params: any[]
-//
-// A "test generator" object will have its "generator" generate tests,
-// will transform each generated test with all of its "transformations"
-// and will yield the results. false transformations will be ignored.
-class TestGen {
- constructor(multiplicity, generator, transformations, ...params) {
- // Determines how often this generator will run, compared to other ones.
- this.multiplicity = multiplicity;
- // The generator function. It will be called with (size, ...params),
- // for an appropriate size provided externally to method initialize.
- this.generator = generator;
- // The list of transformation functions, excluding false ones.
- this.transformations = transformations.filter(f => f !== false);
- // The optional parameters to be passed to the generator function.
- this.params = params;
- }
- // Returns how many tests this test generator is expected to yield
- // in a row.
- weight() {
- return this.multiplicity * this.transformations.length;
- }
- // Initialize the generator function.
- initialize(size) {
- this.factory = this.generator(size, ...this.params);
- }
- // Is the test generator exhausted?
- exhausted() {
- return this.factory === null;
- }
- // Return a generator that will yield up to weight tests.
- // It returns an Iterator<OtherType>.
- * [Symbol.iterator]() {
- for (let i = 0; i < this.multiplicity; i++) {
- let element = this.factory.next();
- if (element.done) {
- this.factory = null;
- return;
- }
- for (let f of this.transformations) yield f(element.value);
- }
- }
-}
-
-// Parameters:
-// size: positive integer
-// generators: [false | string | TestGen]
-//
-// This generator function will yield up to size tests. It will iterate
-// cyclically through the list of test generators. A string in this list
-// behaves as a simple generator yielding just one test; a false value
-// behaves as a generator yielding nothing. For every test generator in
-// the list, this function will generate as many tests as its weight
-// before proceeding to the next test generator. Once a generator is
-// exhausted, it is ignored in subsequent iterations.
-function* Generate(size, generators) {
- let fixed = 0, flexible = 0;
- for (let gen of generators) {
- if (gen === false) continue;
- if (typeof gen === "string") fixed++;
- else flexible += gen.weight();
- }
- if (fixed + flexible == 0) throw "Empty list of test generators";
- let remaining = 0;
- for (let gen of generators) {
- if (gen === false) continue;
- if (typeof gen !== "string") {
- let weight = 1 + gen.weight();
- gen.initialize(Math.ceil(size * weight / flexible));
- remaining++;
- }
- }
- for (let once = true; true; once = false) {
- if (remaining == 0) return;
- for (let gen of generators) {
- if (gen === false) continue;
- if (typeof gen === "string") {
- if (once) {
- if (size-- <= 0) return; else yield gen;
- }
- continue;
- }
- if (gen.exhausted()) continue;
- for (let test of gen) {
- if (size-- <= 0) return; else yield test;
- }
- if (gen.exhausted()) remaining--;
- }
- }
-}
-
-// Parameters:
-// size: positive integer
-// generators: [string | TestGen]
-//
-// This function will generate all tests yielded by Generate and will
-// discard the results. It will normally be called with test generators
-// whose transformation functions test for validity (e.g. CheckValid or
-// CheckInvalid) and do not return anything interesting.
-function Test(size, generators) {
- for (let attempt of Generate(size, generators)) continue;
-}
-
-
-// In the rest, for each NonTerminal symbol in the parser grammar that we
-// care to test, there are two generator functions (ValidNonTerminal and
-// InvalidNonTerminal) yielding valid and non valid terms for this symbol.
-// These functions are of the form to be passed to Generate.
-// There is also a test (using the TestNonTerminal function).
-
-
-// Primary types.
-
-function ValidPrimaryTypes(size, proper=false) {
- return Generate(size, [
- "any",
- "void",
- "this",
- new TestGen(1, ValidTypes, [
- t => "(" + t + ")"
- ]),
- new TestGen(1, ValidPrimaryTypes, [
- t => t + "[]",
- t => t + "[][]",
- t => "(" + t + "[])",
- t => "(" + t + "[])[]",
- ]),
- proper && "number",
- proper && "boolean",
- proper && "string",
- proper && "symbol"
- ]);
-}
-
-function InvalidPrimaryTypes(size, proper=false) {
- return Generate(size, [
- // Undefined variable. Removed, this is a semantic error now.
- // "whatever",
- // Legal parenthesized parameter lists that are not types.
- "()", "(a: number, b: string)", "(x, y, z)",
- // Illegal types in legal places.
- new TestGen(1, InvalidTypes, [
- t => "(" + t + ")"
- ]),
- new TestGen(1, InvalidPrimaryTypes, [
- t => t + "[]",
- t => t + "[][]",
- t => "(" + t + "[])",
- t => "(" + t + "[])[]",
- ]),
- // Line terminator in arrays.
- new TestGen(1, ValidTypes, [
- t => "(" + t + "\n[])"
- ])
- ]);
-}
(function TestPrimaryTypes(size) {
Test(size, [
@@ -189,36 +22,6 @@ function InvalidPrimaryTypes(size, proper=false) {
})(test_size);
-// Intersection types.
-
-function ValidIntersectionTypes(size, proper=false) {
- return Generate(size, [
- new TestGen(1, ValidPrimaryTypes, [
- !proper && (t => t),
- t => t + " & " + t,
- t => "(" + t + " & " + t + ") & " + t,
- t => t + " & (" + t + " & " + t + ")",
- t => t + " & " + t + " & " + t
- ])
- ]);
-}
-
-function InvalidIntersectionTypes(size, proper=false) {
- return Generate(size, [
- // Illegal types in legal places.
- new TestGen(4, InvalidPrimaryTypes, [
- !proper && (t => t),
- t => t + " & " + t,
- t => "(" + t + " & " + t + ") & " + t,
- t => t + " & (" + t + " & " + t + ")",
- t => t + " & " + t + " & " + t
- ]),
- // Right hand side is a function or constructor type.
- new TestGen(1, ValidFunctionTypes, [t => "any & " + t], false),
- new TestGen(1, ValidFunctionTypes, [t => "any & " + t], true)
- ]);
-}
-
(function TestIntersectionTypes(size) {
Test(size, [
new TestGen(4, ValidIntersectionTypes, [CheckValid], true),
@@ -227,36 +30,6 @@ function InvalidIntersectionTypes(size, proper=false) {
})(test_size);
-// Union types.
-
-function ValidUnionTypes(size, proper=false) {
- return Generate(size, [
- new TestGen(1, ValidIntersectionTypes, [
- !proper && (t => t),
- t => t + " | " + t,
- t => "(" + t + " | " + t + ") | " + t,
- t => t + " | (" + t + " | " + t + ")",
- t => t + " | " + t + " | " + t
- ])
- ]);
-}
-
-function InvalidUnionTypes(size, proper=false) {
- return Generate(size, [
- // Illegal types in legal places.
- new TestGen(1, InvalidIntersectionTypes, [
- !proper && (t => t),
- t => t + " | " + t,
- t => "(" + t + " | " + t + ") | " + t,
- t => t + " | (" + t + " | " + t + ")",
- t => t + " | " + t + " | " + t
- ]),
- // Right hand side is a function or constructor type.
- new TestGen(1, ValidFunctionTypes, [t => "any | " + t], false),
- new TestGen(1, ValidFunctionTypes, [t => "any | " + t], true)
- ]);
-}
-
(function TestUnionTypes(size) {
Test(size, [
new TestGen(4, ValidUnionTypes, [CheckValid], true),
@@ -265,41 +38,6 @@ function InvalidUnionTypes(size, proper=false) {
})(test_size);
-// Function and constructor types.
-
-function ValidFunctionTypes(size, constr) {
- let c = constr ? "new " : "";
- return Generate(size, [
- new TestGen(1, ValidTypes, [
- t => c + "() => " + t,
- t => c + "(a: " + t + ") => " + t,
- t => c + "(a:" + t + ", b?:" + t + ") => " + t,
- t => c + "(a:" + t + ", b?:" + t + ", c) => " + t,
- t => c + "(a:" + t + ", b?:" + t + ", c?) => " + t,
- t => c + "(a:" + t + ", b:" + t + ", c, ...d) => " + t,
- t => c + "(a:" + t + ", b:" + t + ", c, ...d) => " + t,
- t => c + "(a:" + t + ", b:" + t + ", c, ...d: string[]) => " + t
- ])
- ]);
-}
-
-function InvalidFunctionTypes(size, constr) {
- let c = constr ? "new " : "";
- return Generate(size, [
- // Illegal types in legal places.
- new TestGen(1, InvalidTypes, [
- t => c + "() => " + t,
- t => c + "(a: " + t + ") => " + t,
- t => c + "(a:" + t + ", b?:" + t + ") => " + t,
- t => c + "(a:" + t + ", b?:" + t + ", c) => " + t,
- t => c + "(a:" + t + ", b?:" + t + ", c?) => " + t,
- t => c + "(a:" + t + ", b:" + t + ", c, ...d) => " + t,
- t => c + "(a:" + t + ", b:" + t + ", c, ...d) => " + t,
- t => c + "(a:" + t + ", b:" + t + ", c, ...d: string[]) => " + t
- ])
- ]);
-}
-
(function TestFunctionAndConstructorTypes(size) {
Test(size, [
new TestGen(4, ValidFunctionTypes, [CheckValid], false),
@@ -308,20 +46,3 @@ function InvalidFunctionTypes(size, constr) {
new TestGen(1, InvalidFunctionTypes, [CheckInvalid], true)
]);
})(test_size);
-
-
-// All simple types.
-
-function ValidTypes(size) {
- return Generate(size, [
- new TestGen(3, ValidUnionTypes, [t => t]),
- new TestGen(1, ValidFunctionTypes, [t => t], false),
- ]);
-}
-
-function InvalidTypes(size) {
- return Generate(size, [
- new TestGen(3, InvalidUnionTypes, [t => t]),
- new TestGen(1, InvalidFunctionTypes, [t => t], false),
- ]);
-}
« no previous file with comments | « test/cctest/test-parsing.cc ('k') | test/mjsunit/harmony/typesystem/testgen.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698