Chromium Code Reviews| OLD | NEW |
|---|---|
| (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 } | |
| OLD | NEW |