@libraz/coverwise 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +119 -0
- package/README.npm.md +119 -0
- package/dist/coverwise.js +2 -0
- package/dist/coverwise.wasm +0 -0
- package/dist/js/constraint.d.ts +78 -0
- package/dist/js/constraint.d.ts.map +1 -0
- package/dist/js/constraint.js +213 -0
- package/dist/js/constraint.js.map +1 -0
- package/dist/js/index.d.ts +94 -0
- package/dist/js/index.d.ts.map +1 -0
- package/dist/js/index.js +164 -0
- package/dist/js/index.js.map +1 -0
- package/dist/js/pure/adapter.d.ts +40 -0
- package/dist/js/pure/adapter.d.ts.map +1 -0
- package/dist/js/pure/adapter.js +207 -0
- package/dist/js/pure/adapter.js.map +1 -0
- package/dist/js/pure/index.d.ts +83 -0
- package/dist/js/pure/index.d.ts.map +1 -0
- package/dist/js/pure/index.js +132 -0
- package/dist/js/pure/index.js.map +1 -0
- package/dist/js/types.d.ts +132 -0
- package/dist/js/types.d.ts.map +1 -0
- package/dist/js/types.js +3 -0
- package/dist/js/types.js.map +1 -0
- package/dist/src/ts/algo/greedy.d.ts +9 -0
- package/dist/src/ts/algo/greedy.d.ts.map +1 -0
- package/dist/src/ts/algo/greedy.js +137 -0
- package/dist/src/ts/algo/greedy.js.map +1 -0
- package/dist/src/ts/algo/index.d.ts +2 -0
- package/dist/src/ts/algo/index.d.ts.map +1 -0
- package/dist/src/ts/algo/index.js +2 -0
- package/dist/src/ts/algo/index.js.map +1 -0
- package/dist/src/ts/core/coverage-engine.d.ts +40 -0
- package/dist/src/ts/core/coverage-engine.d.ts.map +1 -0
- package/dist/src/ts/core/coverage-engine.js +366 -0
- package/dist/src/ts/core/coverage-engine.js.map +1 -0
- package/dist/src/ts/core/generator.d.ts +6 -0
- package/dist/src/ts/core/generator.d.ts.map +1 -0
- package/dist/src/ts/core/generator.js +394 -0
- package/dist/src/ts/core/generator.js.map +1 -0
- package/dist/src/ts/core/index.d.ts +3 -0
- package/dist/src/ts/core/index.d.ts.map +1 -0
- package/dist/src/ts/core/index.js +3 -0
- package/dist/src/ts/core/index.js.map +1 -0
- package/dist/src/ts/model/boundary.d.ts +29 -0
- package/dist/src/ts/model/boundary.d.ts.map +1 -0
- package/dist/src/ts/model/boundary.js +102 -0
- package/dist/src/ts/model/boundary.js.map +1 -0
- package/dist/src/ts/model/constraint-ast.d.ts +152 -0
- package/dist/src/ts/model/constraint-ast.d.ts.map +1 -0
- package/dist/src/ts/model/constraint-ast.js +384 -0
- package/dist/src/ts/model/constraint-ast.js.map +1 -0
- package/dist/src/ts/model/constraint-parser.d.ts +49 -0
- package/dist/src/ts/model/constraint-parser.d.ts.map +1 -0
- package/dist/src/ts/model/constraint-parser.js +831 -0
- package/dist/src/ts/model/constraint-parser.js.map +1 -0
- package/dist/src/ts/model/error.d.ts +19 -0
- package/dist/src/ts/model/error.d.ts.map +1 -0
- package/dist/src/ts/model/error.js +19 -0
- package/dist/src/ts/model/error.js.map +1 -0
- package/dist/src/ts/model/generate-options.d.ts +82 -0
- package/dist/src/ts/model/generate-options.d.ts.map +1 -0
- package/dist/src/ts/model/generate-options.js +52 -0
- package/dist/src/ts/model/generate-options.js.map +1 -0
- package/dist/src/ts/model/index.d.ts +6 -0
- package/dist/src/ts/model/index.d.ts.map +1 -0
- package/dist/src/ts/model/index.js +6 -0
- package/dist/src/ts/model/index.js.map +1 -0
- package/dist/src/ts/model/parameter.d.ts +65 -0
- package/dist/src/ts/model/parameter.d.ts.map +1 -0
- package/dist/src/ts/model/parameter.js +157 -0
- package/dist/src/ts/model/parameter.js.map +1 -0
- package/dist/src/ts/model/test-case.d.ts +67 -0
- package/dist/src/ts/model/test-case.d.ts.map +1 -0
- package/dist/src/ts/model/test-case.js +28 -0
- package/dist/src/ts/model/test-case.js.map +1 -0
- package/dist/src/ts/util/bitset.d.ts +14 -0
- package/dist/src/ts/util/bitset.d.ts.map +1 -0
- package/dist/src/ts/util/bitset.js +66 -0
- package/dist/src/ts/util/bitset.js.map +1 -0
- package/dist/src/ts/util/combinatorics.d.ts +4 -0
- package/dist/src/ts/util/combinatorics.d.ts.map +1 -0
- package/dist/src/ts/util/combinatorics.js +60 -0
- package/dist/src/ts/util/combinatorics.js.map +1 -0
- package/dist/src/ts/util/index.d.ts +5 -0
- package/dist/src/ts/util/index.d.ts.map +1 -0
- package/dist/src/ts/util/index.js +7 -0
- package/dist/src/ts/util/index.js.map +1 -0
- package/dist/src/ts/util/rng.d.ts +13 -0
- package/dist/src/ts/util/rng.d.ts.map +1 -0
- package/dist/src/ts/util/rng.js +112 -0
- package/dist/src/ts/util/rng.js.map +1 -0
- package/dist/src/ts/util/string_util.d.ts +3 -0
- package/dist/src/ts/util/string_util.d.ts.map +1 -0
- package/dist/src/ts/util/string_util.js +25 -0
- package/dist/src/ts/util/string_util.js.map +1 -0
- package/dist/src/ts/validator/constraint-validator.d.ts +34 -0
- package/dist/src/ts/validator/constraint-validator.d.ts.map +1 -0
- package/dist/src/ts/validator/constraint-validator.js +51 -0
- package/dist/src/ts/validator/constraint-validator.js.map +1 -0
- package/dist/src/ts/validator/coverage-validator.d.ts +42 -0
- package/dist/src/ts/validator/coverage-validator.d.ts.map +1 -0
- package/dist/src/ts/validator/coverage-validator.js +230 -0
- package/dist/src/ts/validator/coverage-validator.js.map +1 -0
- package/dist/src/ts/validator/index.d.ts +3 -0
- package/dist/src/ts/validator/index.d.ts.map +1 -0
- package/dist/src/ts/validator/index.js +3 -0
- package/dist/src/ts/validator/index.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/// Adapter between public API types and internal TS engine types.
|
|
2
|
+
import { createGenerateOptions, createWeightConfig, } from '../../src/ts/model/generate-options.js';
|
|
3
|
+
import { Parameter as InternalParameter, UNASSIGNED } from '../../src/ts/model/parameter.js';
|
|
4
|
+
import { uncoveredTupleToString as internalUncoveredToString } from '../../src/ts/model/test-case.js';
|
|
5
|
+
/**
|
|
6
|
+
* Convert a JS value (string, number, or boolean) to a string representation.
|
|
7
|
+
*
|
|
8
|
+
* Mirrors the C++ JsValueToString logic:
|
|
9
|
+
* - string -> as-is
|
|
10
|
+
* - number -> integer-like numbers drop the ".0"
|
|
11
|
+
* - boolean -> "true" / "false"
|
|
12
|
+
*/
|
|
13
|
+
function valueToString(v) {
|
|
14
|
+
if (typeof v === 'string') {
|
|
15
|
+
return v;
|
|
16
|
+
}
|
|
17
|
+
if (typeof v === 'boolean') {
|
|
18
|
+
return v ? 'true' : 'false';
|
|
19
|
+
}
|
|
20
|
+
// number
|
|
21
|
+
if (Number.isInteger(v) && Math.abs(v) <= 1e15) {
|
|
22
|
+
return v.toString();
|
|
23
|
+
}
|
|
24
|
+
return v.toString();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Convert public Parameter[] to internal Parameter[].
|
|
28
|
+
*
|
|
29
|
+
* Normalizes all values to strings, extracts invalid flags and aliases
|
|
30
|
+
* from ParameterValue objects.
|
|
31
|
+
*/
|
|
32
|
+
export function toInternalParams(params) {
|
|
33
|
+
const result = [];
|
|
34
|
+
for (const pub of params) {
|
|
35
|
+
const values = [];
|
|
36
|
+
const invalidFlags = [];
|
|
37
|
+
const aliases = [];
|
|
38
|
+
let hasInvalid = false;
|
|
39
|
+
let hasAliases = false;
|
|
40
|
+
for (const item of pub.values) {
|
|
41
|
+
if (typeof item === 'object' && item !== null && 'value' in item) {
|
|
42
|
+
// ParameterValue object form
|
|
43
|
+
const pv = item;
|
|
44
|
+
values.push(valueToString(pv.value));
|
|
45
|
+
const isInvalid = pv.invalid ?? false;
|
|
46
|
+
invalidFlags.push(isInvalid);
|
|
47
|
+
if (isInvalid) {
|
|
48
|
+
hasInvalid = true;
|
|
49
|
+
}
|
|
50
|
+
const valueAliases = pv.aliases ?? [];
|
|
51
|
+
aliases.push(valueAliases);
|
|
52
|
+
if (valueAliases.length > 0) {
|
|
53
|
+
hasAliases = true;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
// Scalar value
|
|
58
|
+
values.push(valueToString(item));
|
|
59
|
+
invalidFlags.push(false);
|
|
60
|
+
aliases.push([]);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const param = new InternalParameter(pub.name, values);
|
|
64
|
+
if (hasInvalid) {
|
|
65
|
+
param.setInvalid(invalidFlags);
|
|
66
|
+
}
|
|
67
|
+
if (hasAliases) {
|
|
68
|
+
param.setAliases(aliases);
|
|
69
|
+
}
|
|
70
|
+
result.push(param);
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Convert a public TestCase (key-value map) to an internal TestCase (index array).
|
|
76
|
+
*/
|
|
77
|
+
export function toInternalTestCase(tc, params) {
|
|
78
|
+
const values = new Array(params.length).fill(UNASSIGNED);
|
|
79
|
+
for (let i = 0; i < params.length; ++i) {
|
|
80
|
+
const paramName = params[i].name;
|
|
81
|
+
if (paramName in tc) {
|
|
82
|
+
const valStr = valueToString(tc[paramName]);
|
|
83
|
+
values[i] = params[i].findValueIndex(valStr);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return { values };
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Convert a full GenerateInput to internal GenerateOptions.
|
|
90
|
+
*/
|
|
91
|
+
export function toInternalOptions(input, params) {
|
|
92
|
+
const weights = createWeightConfig();
|
|
93
|
+
if (input.weights) {
|
|
94
|
+
for (const paramName of Object.keys(input.weights)) {
|
|
95
|
+
const paramWeights = input.weights[paramName];
|
|
96
|
+
weights.entries[paramName] = {};
|
|
97
|
+
for (const valueName of Object.keys(paramWeights)) {
|
|
98
|
+
weights.entries[paramName][valueName] = paramWeights[valueName];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const subModels = (input.subModels ?? []).map((sm) => ({
|
|
103
|
+
parameterNames: sm.parameters,
|
|
104
|
+
strength: sm.strength,
|
|
105
|
+
}));
|
|
106
|
+
const seeds = (input.seeds ?? []).map((tc) => toInternalTestCase(tc, params));
|
|
107
|
+
return createGenerateOptions({
|
|
108
|
+
parameters: params.map((p) => ({ name: p.name, values: p.values })),
|
|
109
|
+
constraintExpressions: input.constraints ?? [],
|
|
110
|
+
strength: input.strength ?? 2,
|
|
111
|
+
seed: input.seed ?? 0,
|
|
112
|
+
maxTests: input.maxTests ?? 0,
|
|
113
|
+
seeds,
|
|
114
|
+
subModels,
|
|
115
|
+
weights,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Convert an internal TestCase (index array) to a public TestCase (key-value map).
|
|
120
|
+
*
|
|
121
|
+
* Uses displayName for alias rotation, matching the WASM TestCaseToJS behavior.
|
|
122
|
+
*/
|
|
123
|
+
export function toPublicTestCase(tc, params, rotation) {
|
|
124
|
+
const result = {};
|
|
125
|
+
for (let i = 0; i < params.length && i < tc.values.length; ++i) {
|
|
126
|
+
if (tc.values[i] !== UNASSIGNED) {
|
|
127
|
+
result[params[i].name] = params[i].displayName(tc.values[i], rotation);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Convert an internal UncoveredTuple to a public UncoveredTuple (with display string).
|
|
134
|
+
*/
|
|
135
|
+
function toPublicUncoveredTuple(ut) {
|
|
136
|
+
return {
|
|
137
|
+
tuple: ut.tuple,
|
|
138
|
+
params: ut.params,
|
|
139
|
+
reason: ut.reason,
|
|
140
|
+
display: internalUncoveredToString(ut),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Convert an internal GenerateResult to a public GenerateResult.
|
|
145
|
+
*/
|
|
146
|
+
export function toPublicResult(result, params, strength) {
|
|
147
|
+
const tests = result.tests.map((tc, i) => toPublicTestCase(tc, params, i));
|
|
148
|
+
const negativeTests = result.negativeTests.map((tc, i) => toPublicTestCase(tc, params, i));
|
|
149
|
+
const uncovered = result.uncovered.map(toPublicUncoveredTuple);
|
|
150
|
+
const suggestions = result.suggestions.map((s, i) => ({
|
|
151
|
+
description: s.description,
|
|
152
|
+
testCase: toPublicTestCase(s.testCase, params, i),
|
|
153
|
+
}));
|
|
154
|
+
const pubResult = {
|
|
155
|
+
tests,
|
|
156
|
+
negativeTests,
|
|
157
|
+
coverage: result.coverage,
|
|
158
|
+
uncovered,
|
|
159
|
+
stats: {
|
|
160
|
+
totalTuples: result.stats.totalTuples,
|
|
161
|
+
coveredTuples: result.stats.coveredTuples,
|
|
162
|
+
testCount: result.stats.testCount,
|
|
163
|
+
},
|
|
164
|
+
suggestions,
|
|
165
|
+
warnings: result.warnings,
|
|
166
|
+
strength,
|
|
167
|
+
};
|
|
168
|
+
if (result.classCoverage) {
|
|
169
|
+
pubResult.classCoverage = {
|
|
170
|
+
totalClassTuples: result.classCoverage.totalClassTuples,
|
|
171
|
+
coveredClassTuples: result.classCoverage.coveredClassTuples,
|
|
172
|
+
classCoverageRatio: result.classCoverage.classCoverageRatio,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
return pubResult;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Convert an internal CoverageReport to a public CoverageReport.
|
|
179
|
+
*/
|
|
180
|
+
export function toPublicCoverageReport(report) {
|
|
181
|
+
return {
|
|
182
|
+
totalTuples: report.totalTuples,
|
|
183
|
+
coveredTuples: report.coveredTuples,
|
|
184
|
+
coverageRatio: report.coverageRatio,
|
|
185
|
+
uncovered: report.uncovered.map(toPublicUncoveredTuple),
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Convert an internal ModelStats to a public ModelStats.
|
|
190
|
+
*/
|
|
191
|
+
export function toPublicModelStats(stats) {
|
|
192
|
+
return {
|
|
193
|
+
parameterCount: stats.parameterCount,
|
|
194
|
+
totalValues: stats.totalValues,
|
|
195
|
+
strength: stats.strength,
|
|
196
|
+
totalTuples: stats.totalTuples,
|
|
197
|
+
estimatedTests: stats.estimatedTests,
|
|
198
|
+
subModelCount: stats.subModelCount,
|
|
199
|
+
constraintCount: stats.constraintCount,
|
|
200
|
+
parameters: stats.parameters.map((p) => ({
|
|
201
|
+
name: p.name,
|
|
202
|
+
valueCount: p.valueCount,
|
|
203
|
+
invalidCount: p.invalidCount,
|
|
204
|
+
})),
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../js/pure/adapter.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAGlE,OAAO,EACL,qBAAqB,EACrB,kBAAkB,GAEnB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,SAAS,IAAI,iBAAiB,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAM7F,OAAO,EAAE,sBAAsB,IAAI,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAatG;;;;;;;GAOG;AACH,SAAS,aAAa,CAAC,CAA4B;IACjD,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAC9B,CAAC;IACD,SAAS;IACT,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QAC/C,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtB,CAAC;IACD,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAyB;IACxD,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAc,EAAE,CAAC;QACnC,MAAM,OAAO,GAAe,EAAE,CAAC;QAC/B,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAC9B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;gBACjE,6BAA6B;gBAC7B,MAAM,EAAE,GAAG,IAAsB,CAAC;gBAClC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrC,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC;gBACtC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC7B,IAAI,SAAS,EAAE,CAAC;oBACd,UAAU,GAAG,IAAI,CAAC;gBACpB,CAAC;gBACD,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC;gBACtC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC3B,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,UAAU,GAAG,IAAI,CAAC;gBACpB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,eAAe;gBACf,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAiC,CAAC,CAAC,CAAC;gBAC9D,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,EAAkB,EAClB,MAA2B;IAE3B,MAAM,MAAM,GAAa,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjC,IAAI,SAAS,IAAI,EAAE,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAoB,EACpB,MAA2B;IAE3B,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC9C,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;YAChC,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBAClD,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACrD,cAAc,EAAE,EAAE,CAAC,UAAU;QAC7B,QAAQ,EAAE,EAAE,CAAC,QAAQ;KACtB,CAAC,CAAC,CAAC;IAEJ,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAE9E,OAAO,qBAAqB,CAAC;QAC3B,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACnE,qBAAqB,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;QAC9C,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC;QAC7B,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC;QACrB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC;QAC7B,KAAK;QACL,SAAS;QACT,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,EAAoB,EACpB,MAA2B,EAC3B,QAAgB;IAEhB,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;QAC/D,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;YAChC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,EAA0B;IACxD,OAAO;QACL,KAAK,EAAE,EAAE,CAAC,KAAK;QACf,MAAM,EAAE,EAAE,CAAC,MAAM;QACjB,MAAM,EAAE,EAAE,CAAC,MAAM;QACjB,OAAO,EAAE,yBAAyB,CAAC,EAAE,CAAC;KACvC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,MAA8B,EAC9B,MAA2B,EAC3B,QAAgB;IAEhB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3F,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAE/D,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAA2B;KAC5E,CAAC,CAAC,CAAC;IAEJ,MAAM,SAAS,GAAyB;QACtC,KAAK;QACL,aAAa;QACb,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS;QACT,KAAK,EAAE;YACL,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW;YACrC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa;YACzC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS;SAClC;QACD,WAAW;QACX,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ;KACT,CAAC;IAEF,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,SAAS,CAAC,aAAa,GAAG;YACxB,gBAAgB,EAAE,MAAM,CAAC,aAAa,CAAC,gBAAgB;YACvD,kBAAkB,EAAE,MAAM,CAAC,aAAa,CAAC,kBAAkB;YAC3D,kBAAkB,EAAE,MAAM,CAAC,aAAa,CAAC,kBAAkB;SAC5D,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA8B;IACnE,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,sBAAsB,CAAC;KACxD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAyB;IAC1D,OAAO;QACL,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,YAAY,EAAE,CAAC,CAAC,YAAY;SAC7B,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
export type { Condition, ConditionStart, Constraint } from '../constraint.js';
|
|
2
|
+
export { allOf, anyOf, not, when } from '../constraint.js';
|
|
3
|
+
export type { ClassCoverage, CoverageReport, CoverwiseError, ExtendInput, GenerateInput, GenerateResult, GenerateStats, ModelStats, Parameter, ParameterValue, ParamStats, SubModel, Suggestion, TestCase, UncoveredTuple, WeightConfig, } from '../types.js';
|
|
4
|
+
import type { CoverageReport, ExtendInput, GenerateInput, GenerateResult, ModelStats, Parameter, TestCase } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Generate a covering array. One function, sensible defaults.
|
|
7
|
+
*
|
|
8
|
+
* Unlike the WASM version, this is fully synchronous and requires no init() call.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* const result = generate({
|
|
12
|
+
* parameters: [
|
|
13
|
+
* { name: "os", values: ["win", "mac", "linux"] },
|
|
14
|
+
* { name: "browser", values: ["chrome", "firefox", "safari"] },
|
|
15
|
+
* ],
|
|
16
|
+
* });
|
|
17
|
+
* // result.tests: [{ os: "win", browser: "chrome" }, ...]
|
|
18
|
+
* // result.coverage: 1.0
|
|
19
|
+
*/
|
|
20
|
+
export declare function generate(input: GenerateInput): GenerateResult;
|
|
21
|
+
/**
|
|
22
|
+
* Analyze t-wise coverage of an existing test suite.
|
|
23
|
+
* Use this to check coverage of manually written tests.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* const report = analyzeCoverage(
|
|
27
|
+
* [{ name: "os", values: ["win", "mac"] }, ...],
|
|
28
|
+
* [{ os: "win", browser: "chrome" }, ...],
|
|
29
|
+
* );
|
|
30
|
+
* // report.uncovered: [{ tuple: ["os=mac", "browser=chrome"], ... }]
|
|
31
|
+
*/
|
|
32
|
+
export declare function analyzeCoverage(parameters: Parameter[], tests: TestCase[], strength?: number): CoverageReport;
|
|
33
|
+
/**
|
|
34
|
+
* Extend an existing test suite with additional tests to improve coverage.
|
|
35
|
+
*
|
|
36
|
+
* mode: "strict" (default) keeps existing tests as-is.
|
|
37
|
+
* Only "strict" mode is supported (existing tests are kept as-is).
|
|
38
|
+
*/
|
|
39
|
+
export declare function extendTests(existing: TestCase[], input: ExtendInput): GenerateResult;
|
|
40
|
+
/**
|
|
41
|
+
* Get model statistics without running generation.
|
|
42
|
+
*/
|
|
43
|
+
export declare function estimateModel(input: GenerateInput): ModelStats;
|
|
44
|
+
/**
|
|
45
|
+
* Class-based wrapper around the coverwise API.
|
|
46
|
+
* Provides the same functionality as the free functions in an object-oriented style.
|
|
47
|
+
*
|
|
48
|
+
* Unlike the WASM version, create() is synchronous (returned as a resolved Promise
|
|
49
|
+
* for API compatibility).
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* const cw = await Coverwise.create();
|
|
53
|
+
* const result = cw.generate({ parameters: [...] });
|
|
54
|
+
*/
|
|
55
|
+
export declare class Coverwise {
|
|
56
|
+
/**
|
|
57
|
+
* Create a Coverwise instance.
|
|
58
|
+
* Returns immediately (no WASM loading needed).
|
|
59
|
+
*/
|
|
60
|
+
static create(): Promise<Coverwise>;
|
|
61
|
+
/**
|
|
62
|
+
* Generate a covering array. One function, sensible defaults.
|
|
63
|
+
*/
|
|
64
|
+
generate(input: GenerateInput): GenerateResult;
|
|
65
|
+
/**
|
|
66
|
+
* Analyze t-wise coverage of an existing test suite.
|
|
67
|
+
*/
|
|
68
|
+
analyzeCoverage(parameters: Parameter[], tests: TestCase[], strength?: number): CoverageReport;
|
|
69
|
+
/**
|
|
70
|
+
* Extend an existing test suite with additional tests to improve coverage.
|
|
71
|
+
*/
|
|
72
|
+
extendTests(existing: TestCase[], input: ExtendInput): GenerateResult;
|
|
73
|
+
/**
|
|
74
|
+
* Get model statistics without running generation.
|
|
75
|
+
*/
|
|
76
|
+
estimateModel(input: GenerateInput): ModelStats;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* No-op init for backward compatibility.
|
|
80
|
+
* The pure TS version requires no initialization.
|
|
81
|
+
*/
|
|
82
|
+
export declare function init(): Promise<void>;
|
|
83
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../js/pure/index.ts"],"names":[],"mappings":"AAOA,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,YAAY,EACV,aAAa,EACb,cAAc,EACd,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,EACd,aAAa,EACb,UAAU,EACV,SAAS,EACT,cAAc,EACd,UAAU,EACV,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,cAAc,EACd,YAAY,GACb,MAAM,aAAa,CAAC;AAarB,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,EACd,UAAU,EACV,SAAS,EACT,QAAQ,EACT,MAAM,aAAa,CAAC;AAarB;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CAU7D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,SAAS,EAAE,EACvB,KAAK,EAAE,QAAQ,EAAE,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,cAAc,CAWhB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,cAAc,CAUpF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,CAK9D;AAID;;;;;;;;;;GAUG;AACH,qBAAa,SAAS;IACpB;;;OAGG;WACU,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC;IAIzC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc;IAI9C;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc;IAI9F;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,cAAc;IAIrE;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU;CAGhD;AAED;;;GAGG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAG"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/// Pure TypeScript entry point for coverwise.
|
|
2
|
+
///
|
|
3
|
+
/// Provides the same API as the WASM-backed default export but runs
|
|
4
|
+
/// entirely in TypeScript — no WASM compilation or init() call required.
|
|
5
|
+
export { allOf, anyOf, not, when } from '../constraint.js';
|
|
6
|
+
// --- Internal imports ---
|
|
7
|
+
import { estimateModel as internalEstimateModel, extend as internalExtend, generate as internalGenerate, } from '../../src/ts/core/generator.js';
|
|
8
|
+
import { annotateClassCoverage, validateCoverage as internalValidateCoverage, } from '../../src/ts/validator/coverage-validator.js';
|
|
9
|
+
import { toInternalOptions, toInternalParams, toInternalTestCase, toPublicCoverageReport, toPublicModelStats, toPublicResult, } from './adapter.js';
|
|
10
|
+
// --- Core API ---
|
|
11
|
+
/**
|
|
12
|
+
* Generate a covering array. One function, sensible defaults.
|
|
13
|
+
*
|
|
14
|
+
* Unlike the WASM version, this is fully synchronous and requires no init() call.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* const result = generate({
|
|
18
|
+
* parameters: [
|
|
19
|
+
* { name: "os", values: ["win", "mac", "linux"] },
|
|
20
|
+
* { name: "browser", values: ["chrome", "firefox", "safari"] },
|
|
21
|
+
* ],
|
|
22
|
+
* });
|
|
23
|
+
* // result.tests: [{ os: "win", browser: "chrome" }, ...]
|
|
24
|
+
* // result.coverage: 1.0
|
|
25
|
+
*/
|
|
26
|
+
export function generate(input) {
|
|
27
|
+
const params = toInternalParams(input.parameters);
|
|
28
|
+
const opts = toInternalOptions(input, params);
|
|
29
|
+
const result = internalGenerate(opts);
|
|
30
|
+
const strength = input.strength ?? 2;
|
|
31
|
+
// Annotate equivalence class coverage if applicable.
|
|
32
|
+
annotateClassCoverage(result, params, strength);
|
|
33
|
+
return toPublicResult(result, params, strength);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Analyze t-wise coverage of an existing test suite.
|
|
37
|
+
* Use this to check coverage of manually written tests.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* const report = analyzeCoverage(
|
|
41
|
+
* [{ name: "os", values: ["win", "mac"] }, ...],
|
|
42
|
+
* [{ os: "win", browser: "chrome" }, ...],
|
|
43
|
+
* );
|
|
44
|
+
* // report.uncovered: [{ tuple: ["os=mac", "browser=chrome"], ... }]
|
|
45
|
+
*/
|
|
46
|
+
export function analyzeCoverage(parameters, tests, strength) {
|
|
47
|
+
const s = strength ?? 2;
|
|
48
|
+
const params = toInternalParams(parameters);
|
|
49
|
+
const internalTests = tests.map((tc) => toInternalTestCase(tc, params));
|
|
50
|
+
const report = internalValidateCoverage(params, internalTests, s);
|
|
51
|
+
const result = toPublicCoverageReport(report);
|
|
52
|
+
// When there are no tuples, coverage is vacuously 1.0.
|
|
53
|
+
if (result.totalTuples === 0) {
|
|
54
|
+
result.coverageRatio = 1.0;
|
|
55
|
+
}
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Extend an existing test suite with additional tests to improve coverage.
|
|
60
|
+
*
|
|
61
|
+
* mode: "strict" (default) keeps existing tests as-is.
|
|
62
|
+
* Only "strict" mode is supported (existing tests are kept as-is).
|
|
63
|
+
*/
|
|
64
|
+
export function extendTests(existing, input) {
|
|
65
|
+
const params = toInternalParams(input.parameters);
|
|
66
|
+
const opts = toInternalOptions(input, params);
|
|
67
|
+
const internalExisting = existing.map((tc) => toInternalTestCase(tc, params));
|
|
68
|
+
const strength = input.strength ?? 2;
|
|
69
|
+
const result = internalExtend(internalExisting, opts);
|
|
70
|
+
annotateClassCoverage(result, params, strength);
|
|
71
|
+
return toPublicResult(result, params, strength);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get model statistics without running generation.
|
|
75
|
+
*/
|
|
76
|
+
export function estimateModel(input) {
|
|
77
|
+
const params = toInternalParams(input.parameters);
|
|
78
|
+
const opts = toInternalOptions(input, params);
|
|
79
|
+
const stats = internalEstimateModel(opts);
|
|
80
|
+
return toPublicModelStats(stats);
|
|
81
|
+
}
|
|
82
|
+
// --- Class-based API ---
|
|
83
|
+
/**
|
|
84
|
+
* Class-based wrapper around the coverwise API.
|
|
85
|
+
* Provides the same functionality as the free functions in an object-oriented style.
|
|
86
|
+
*
|
|
87
|
+
* Unlike the WASM version, create() is synchronous (returned as a resolved Promise
|
|
88
|
+
* for API compatibility).
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* const cw = await Coverwise.create();
|
|
92
|
+
* const result = cw.generate({ parameters: [...] });
|
|
93
|
+
*/
|
|
94
|
+
export class Coverwise {
|
|
95
|
+
/**
|
|
96
|
+
* Create a Coverwise instance.
|
|
97
|
+
* Returns immediately (no WASM loading needed).
|
|
98
|
+
*/
|
|
99
|
+
static async create() {
|
|
100
|
+
return new Coverwise();
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Generate a covering array. One function, sensible defaults.
|
|
104
|
+
*/
|
|
105
|
+
generate(input) {
|
|
106
|
+
return generate(input);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Analyze t-wise coverage of an existing test suite.
|
|
110
|
+
*/
|
|
111
|
+
analyzeCoverage(parameters, tests, strength) {
|
|
112
|
+
return analyzeCoverage(parameters, tests, strength);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Extend an existing test suite with additional tests to improve coverage.
|
|
116
|
+
*/
|
|
117
|
+
extendTests(existing, input) {
|
|
118
|
+
return extendTests(existing, input);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get model statistics without running generation.
|
|
122
|
+
*/
|
|
123
|
+
estimateModel(input) {
|
|
124
|
+
return estimateModel(input);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* No-op init for backward compatibility.
|
|
129
|
+
* The pure TS version requires no initialization.
|
|
130
|
+
*/
|
|
131
|
+
export async function init() { }
|
|
132
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../js/pure/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
export interface ParameterValue {
|
|
2
|
+
value: string | number | boolean;
|
|
3
|
+
invalid?: boolean;
|
|
4
|
+
aliases?: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface Parameter {
|
|
7
|
+
name: string;
|
|
8
|
+
values: (string | number | boolean | ParameterValue)[];
|
|
9
|
+
}
|
|
10
|
+
export interface SubModel {
|
|
11
|
+
parameters: string[];
|
|
12
|
+
strength: number;
|
|
13
|
+
}
|
|
14
|
+
export interface WeightConfig {
|
|
15
|
+
[parameterName: string]: {
|
|
16
|
+
[value: string]: number;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface GenerateInput {
|
|
20
|
+
parameters: Parameter[];
|
|
21
|
+
constraints?: string[];
|
|
22
|
+
strength?: number;
|
|
23
|
+
seed?: number;
|
|
24
|
+
weights?: WeightConfig;
|
|
25
|
+
seeds?: TestCase[];
|
|
26
|
+
maxTests?: number;
|
|
27
|
+
subModels?: SubModel[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A test case as a readable key-value map.
|
|
31
|
+
* e.g. { os: "win", browser: "chrome", arch: "x64" }
|
|
32
|
+
*/
|
|
33
|
+
export interface TestCase {
|
|
34
|
+
[parameterName: string]: string | number | boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* A human-readable uncovered tuple with context.
|
|
38
|
+
*/
|
|
39
|
+
export interface UncoveredTuple {
|
|
40
|
+
/** e.g. ["os=win", "browser=safari"] */
|
|
41
|
+
tuple: string[];
|
|
42
|
+
/** Parameter names involved. */
|
|
43
|
+
params: string[];
|
|
44
|
+
/** Why this tuple is uncovered. */
|
|
45
|
+
reason: string;
|
|
46
|
+
/** Human-readable display string. */
|
|
47
|
+
display: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Statistics for evaluation and comparison.
|
|
51
|
+
*/
|
|
52
|
+
export interface GenerateStats {
|
|
53
|
+
totalTuples: number;
|
|
54
|
+
coveredTuples: number;
|
|
55
|
+
testCount: number;
|
|
56
|
+
}
|
|
57
|
+
export interface GenerateResult {
|
|
58
|
+
tests: TestCase[];
|
|
59
|
+
negativeTests?: TestCase[];
|
|
60
|
+
coverage: number;
|
|
61
|
+
/** Uncovered tuples with context. Empty when coverage is 1.0. */
|
|
62
|
+
uncovered: UncoveredTuple[];
|
|
63
|
+
/** Statistics for evaluation and comparison. */
|
|
64
|
+
stats: GenerateStats;
|
|
65
|
+
/** Actionable suggestions with proposed test cases. */
|
|
66
|
+
suggestions: Array<{
|
|
67
|
+
description: string;
|
|
68
|
+
testCase: Record<string, string>;
|
|
69
|
+
}>;
|
|
70
|
+
/** Warnings (e.g. performance degradation). */
|
|
71
|
+
warnings: string[];
|
|
72
|
+
/** Strength used for generation. */
|
|
73
|
+
strength: number;
|
|
74
|
+
/** Equivalence class coverage (present when parameters have equivalence classes). */
|
|
75
|
+
classCoverage?: {
|
|
76
|
+
totalClassTuples: number;
|
|
77
|
+
coveredClassTuples: number;
|
|
78
|
+
classCoverageRatio: number;
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
export interface CoverageReport {
|
|
82
|
+
totalTuples: number;
|
|
83
|
+
coveredTuples: number;
|
|
84
|
+
coverageRatio: number;
|
|
85
|
+
/** Every uncovered tuple with context. */
|
|
86
|
+
uncovered: UncoveredTuple[];
|
|
87
|
+
}
|
|
88
|
+
export interface ExtendInput extends GenerateInput {
|
|
89
|
+
/** How to handle existing tests. */
|
|
90
|
+
mode?: 'strict';
|
|
91
|
+
}
|
|
92
|
+
export interface ModelStats {
|
|
93
|
+
parameterCount: number;
|
|
94
|
+
totalValues: number;
|
|
95
|
+
strength: number;
|
|
96
|
+
totalTuples: number;
|
|
97
|
+
estimatedTests: number;
|
|
98
|
+
subModelCount: number;
|
|
99
|
+
constraintCount: number;
|
|
100
|
+
parameters: Array<{
|
|
101
|
+
name: string;
|
|
102
|
+
valueCount: number;
|
|
103
|
+
invalidCount: number;
|
|
104
|
+
}>;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Structured error with context.
|
|
108
|
+
* Errors are always explanatory — never just a code.
|
|
109
|
+
*/
|
|
110
|
+
export interface CoverwiseError {
|
|
111
|
+
code: 'CONSTRAINT_ERROR' | 'INSUFFICIENT_COVERAGE' | 'INVALID_INPUT' | 'TUPLE_EXPLOSION';
|
|
112
|
+
message: string;
|
|
113
|
+
detail?: string;
|
|
114
|
+
}
|
|
115
|
+
/** Per-parameter statistics. */
|
|
116
|
+
export interface ParamStats {
|
|
117
|
+
name: string;
|
|
118
|
+
valueCount: number;
|
|
119
|
+
invalidCount: number;
|
|
120
|
+
}
|
|
121
|
+
/** Equivalence class coverage metrics. */
|
|
122
|
+
export interface ClassCoverage {
|
|
123
|
+
totalClassTuples: number;
|
|
124
|
+
coveredClassTuples: number;
|
|
125
|
+
classCoverageRatio: number;
|
|
126
|
+
}
|
|
127
|
+
/** Actionable suggestion with a proposed test case. */
|
|
128
|
+
export interface Suggestion {
|
|
129
|
+
description: string;
|
|
130
|
+
testCase: Record<string, string>;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../js/types.ts"],"names":[],"mappings":"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"}
|
package/dist/js/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../js/types.ts"],"names":[],"mappings":"AAAA,kDAAkD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ConstraintNode } from '../model/constraint-ast.js';
|
|
2
|
+
import type { TestCase } from '../model/test-case.js';
|
|
3
|
+
import type { Rng } from '../util/rng.js';
|
|
4
|
+
export type ScoreFn = (partial: TestCase, paramIndex: number, valueIndex: number) => number;
|
|
5
|
+
export interface GreedyParam {
|
|
6
|
+
readonly size: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function greedyConstruct(params: readonly GreedyParam[], scoreFn: ScoreFn, constraints: readonly ConstraintNode[], rng: Rng, allowedValues?: boolean[][], weights?: number[][]): TestCase;
|
|
9
|
+
//# sourceMappingURL=greedy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"greedy.d.ts","sourceRoot":"","sources":["../../../../src/ts/algo/greedy.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,cAAc,EAAoB,MAAM,4BAA4B,CAAC;AAEnF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAG1C,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;AAG5F,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AA6DD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,SAAS,cAAc,EAAE,EACtC,GAAG,EAAE,GAAG,EACR,aAAa,GAAE,OAAO,EAAE,EAAO,EAC/B,OAAO,GAAE,MAAM,EAAE,EAAO,GACvB,QAAQ,CAkFV"}
|