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

Side by Side Diff: test/mjsunit/harmony/typesystem/testgen.js

Issue 1810943002: Add parsing for tuple types (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@types
Patch Set: 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 var debug = false;
6
7 function CheckValid(type) {
8 if (debug) { print("V:", type); }
9 assertDoesNotThrow("'use types'; var x: " + type + ";");
10 }
11
12 function CheckInvalid(type) {
13 if (debug) { print("I:", type); }
14 assertThrows("'use types'; var x: " + type + ";", SyntaxError);
15 }
16
17 // Parameters:
18 // multiplicity: positive integer
19 // generator: (size: positive integer, ...params: any[]) => Iterator<SomeType>
20 // transformations: [false | ((t: SomeType) => OtherType)]
21 // params: any[]
22 //
23 // A "test generator" object will have its "generator" generate tests,
24 // will transform each generated test with all of its "transformations"
25 // and will yield the results. false transformations will be ignored.
26 class TestGen {
rossberg 2016/03/17 16:51:37 I assume this is unchanged?
nickie 2016/03/18 11:12:01 Yes, just deleted from simple-types.js and brought
27 constructor(multiplicity, generator, transformations, ...params) {
28 // Determines how often this generator will run, compared to other ones.
29 this.multiplicity = multiplicity;
30 // The generator function. It will be called with (size, ...params),
31 // for an appropriate size provided externally to method initialize.
32 this.generator = generator;
33 // The list of transformation functions, excluding false ones.
34 this.transformations = transformations.filter(f => f !== false);
35 // The optional parameters to be passed to the generator function.
36 this.params = params;
37 }
38 // Returns how many tests this test generator is expected to yield
39 // in a row.
40 weight() {
41 return this.multiplicity * this.transformations.length;
42 }
43 // Initialize the generator function.
44 initialize(size) {
45 this.factory = this.generator(size, ...this.params);
46 }
47 // Is the test generator exhausted?
48 exhausted() {
49 return this.factory === null;
50 }
51 // Return a generator that will yield up to weight tests.
52 // It returns an Iterator<OtherType>.
53 * [Symbol.iterator]() {
54 for (let i = 0; i < this.multiplicity; i++) {
55 let element = this.factory.next();
56 if (element.done) {
57 this.factory = null;
58 return;
59 }
60 for (let f of this.transformations) yield f(element.value);
61 }
62 }
63 }
64
65 // Parameters:
66 // size: positive integer
67 // generators: [false | string | TestGen]
68 //
69 // This generator function will yield up to size tests. It will iterate
70 // cyclically through the list of test generators. A string in this list
71 // behaves as a simple generator yielding just one test; a false value
72 // behaves as a generator yielding nothing. For every test generator in
73 // the list, this function will generate as many tests as its weight
74 // before proceeding to the next test generator. Once a generator is
75 // exhausted, it is ignored in subsequent iterations.
76 function* Generate(size, generators) {
77 let fixed = 0, flexible = 0;
78 for (let gen of generators) {
79 if (gen === false) continue;
80 if (typeof gen === "string") fixed++;
81 else flexible += gen.weight();
82 }
83 if (fixed + flexible == 0) throw "Empty list of test generators";
84 let remaining = 0;
85 for (let gen of generators) {
86 if (gen === false) continue;
87 if (typeof gen !== "string") {
88 let weight = 1 + gen.weight();
89 gen.initialize(Math.ceil(size * weight / flexible));
90 remaining++;
91 }
92 }
93 for (let once = true; true; once = false) {
94 if (remaining == 0) return;
95 for (let gen of generators) {
96 if (gen === false) continue;
97 if (typeof gen === "string") {
98 if (once) {
99 if (size-- <= 0) return; else yield gen;
100 }
101 continue;
102 }
103 if (gen.exhausted()) continue;
104 for (let test of gen) {
105 if (size-- <= 0) return; else yield test;
106 }
107 if (gen.exhausted()) remaining--;
108 }
109 }
110 }
111
112 // Parameters:
113 // size: positive integer
114 // generators: [string | TestGen]
115 //
116 // This function will generate all tests yielded by Generate and will
117 // discard the results. It will normally be called with test generators
118 // whose transformation functions test for validity (e.g. CheckValid or
119 // CheckInvalid) and do not return anything interesting.
120 function Test(size, generators) {
121 for (let attempt of Generate(size, generators)) continue;
122 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698