@descryy/runtime-test-runner 0.4.12 → 0.4.13
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/dist/bounded-file.d.ts +18 -0
- package/dist/bounded-file.d.ts.map +1 -0
- package/dist/bounded-file.js +77 -0
- package/dist/bounded-file.js.map +1 -0
- package/dist/child-environment.d.ts +12 -0
- package/dist/child-environment.d.ts.map +1 -0
- package/dist/child-environment.js +124 -0
- package/dist/child-environment.js.map +1 -0
- package/dist/coverage-capture.d.ts +23 -0
- package/dist/coverage-capture.d.ts.map +1 -0
- package/dist/coverage-capture.js +165 -0
- package/dist/coverage-capture.js.map +1 -0
- package/dist/executed-coverage.d.ts +45 -0
- package/dist/executed-coverage.d.ts.map +1 -0
- package/dist/executed-coverage.js +143 -0
- package/dist/executed-coverage.js.map +1 -0
- package/dist/go-cover-profile.d.ts +29 -0
- package/dist/go-cover-profile.d.ts.map +1 -0
- package/dist/go-cover-profile.js +162 -0
- package/dist/go-cover-profile.js.map +1 -0
- package/dist/go-test.d.ts +29 -2
- package/dist/go-test.d.ts.map +1 -1
- package/dist/go-test.js +149 -30
- package/dist/go-test.js.map +1 -1
- package/dist/graph-mapping.d.ts +1 -0
- package/dist/graph-mapping.d.ts.map +1 -1
- package/dist/graph-mapping.js +78 -1
- package/dist/graph-mapping.js.map +1 -1
- package/dist/index.d.ts +21 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/lexers/c-family.d.ts +4 -0
- package/dist/lexers/c-family.d.ts.map +1 -0
- package/dist/lexers/c-family.js +221 -0
- package/dist/lexers/c-family.js.map +1 -0
- package/dist/lexers/chars.d.ts +7 -0
- package/dist/lexers/chars.d.ts.map +1 -0
- package/dist/lexers/chars.js +49 -0
- package/dist/lexers/chars.js.map +1 -0
- package/dist/lexers/index.d.ts +7 -0
- package/dist/lexers/index.d.ts.map +1 -0
- package/dist/lexers/index.js +5 -0
- package/dist/lexers/index.js.map +1 -0
- package/dist/lexers/python.d.ts +3 -0
- package/dist/lexers/python.d.ts.map +1 -0
- package/dist/lexers/python.js +101 -0
- package/dist/lexers/python.js.map +1 -0
- package/dist/quality/annotations.d.ts +14 -0
- package/dist/quality/annotations.d.ts.map +1 -0
- package/dist/quality/annotations.js +147 -0
- package/dist/quality/annotations.js.map +1 -0
- package/dist/quality/assertion-kinds.d.ts +18 -0
- package/dist/quality/assertion-kinds.d.ts.map +1 -0
- package/dist/quality/assertion-kinds.js +25 -0
- package/dist/quality/assertion-kinds.js.map +1 -0
- package/dist/quality/chains.d.ts +25 -0
- package/dist/quality/chains.d.ts.map +1 -0
- package/dist/quality/chains.js +129 -0
- package/dist/quality/chains.js.map +1 -0
- package/dist/quality/common.d.ts +31 -0
- package/dist/quality/common.d.ts.map +1 -0
- package/dist/quality/common.js +211 -0
- package/dist/quality/common.js.map +1 -0
- package/dist/quality/csharp-family.d.ts +9 -0
- package/dist/quality/csharp-family.d.ts.map +1 -0
- package/dist/quality/csharp-family.js +560 -0
- package/dist/quality/csharp-family.js.map +1 -0
- package/dist/quality/detect.d.ts +3 -0
- package/dist/quality/detect.d.ts.map +1 -0
- package/dist/quality/detect.js +348 -0
- package/dist/quality/detect.js.map +1 -0
- package/dist/quality/durations.d.ts +4 -0
- package/dist/quality/durations.d.ts.map +1 -0
- package/dist/quality/durations.js +177 -0
- package/dist/quality/durations.js.map +1 -0
- package/dist/quality/expressions.d.ts +7 -0
- package/dist/quality/expressions.d.ts.map +1 -0
- package/dist/quality/expressions.js +123 -0
- package/dist/quality/expressions.js.map +1 -0
- package/dist/quality/facts.d.ts +5 -0
- package/dist/quality/facts.d.ts.map +1 -0
- package/dist/quality/facts.js +183 -0
- package/dist/quality/facts.js.map +1 -0
- package/dist/quality/failure-of.d.ts +4 -0
- package/dist/quality/failure-of.d.ts.map +1 -0
- package/dist/quality/failure-of.js +233 -0
- package/dist/quality/failure-of.js.map +1 -0
- package/dist/quality/frameworks.d.ts +5 -0
- package/dist/quality/frameworks.d.ts.map +1 -0
- package/dist/quality/frameworks.js +20 -0
- package/dist/quality/frameworks.js.map +1 -0
- package/dist/quality/go-family.d.ts +6 -0
- package/dist/quality/go-family.d.ts.map +1 -0
- package/dist/quality/go-family.js +393 -0
- package/dist/quality/go-family.js.map +1 -0
- package/dist/quality/index.d.ts +10 -0
- package/dist/quality/index.d.ts.map +1 -0
- package/dist/quality/index.js +19 -0
- package/dist/quality/index.js.map +1 -0
- package/dist/quality/java-family.d.ts +12 -0
- package/dist/quality/java-family.d.ts.map +1 -0
- package/dist/quality/java-family.js +529 -0
- package/dist/quality/java-family.js.map +1 -0
- package/dist/quality/js-assertions.d.ts +11 -0
- package/dist/quality/js-assertions.d.ts.map +1 -0
- package/dist/quality/js-assertions.js +297 -0
- package/dist/quality/js-assertions.js.map +1 -0
- package/dist/quality/js-family.d.ts +3 -0
- package/dist/quality/js-family.d.ts.map +1 -0
- package/dist/quality/js-family.js +470 -0
- package/dist/quality/js-family.js.map +1 -0
- package/dist/quality/python-family.d.ts +6 -0
- package/dist/quality/python-family.d.ts.map +1 -0
- package/dist/quality/python-family.js +786 -0
- package/dist/quality/python-family.js.map +1 -0
- package/dist/quality/scope.d.ts +26 -0
- package/dist/quality/scope.d.ts.map +1 -0
- package/dist/quality/scope.js +33 -0
- package/dist/quality/scope.js.map +1 -0
- package/dist/quality/selectors.d.ts +14 -0
- package/dist/quality/selectors.d.ts.map +1 -0
- package/dist/quality/selectors.js +137 -0
- package/dist/quality/selectors.js.map +1 -0
- package/dist/quality/statuses.d.ts +7 -0
- package/dist/quality/statuses.d.ts.map +1 -0
- package/dist/quality/statuses.js +143 -0
- package/dist/quality/statuses.js.map +1 -0
- package/dist/quality/stream.d.ts +23 -0
- package/dist/quality/stream.d.ts.map +1 -0
- package/dist/quality/stream.js +194 -0
- package/dist/quality/stream.js.map +1 -0
- package/dist/quality/types.d.ts +88 -0
- package/dist/quality/types.d.ts.map +1 -0
- package/dist/quality/types.js +2 -0
- package/dist/quality/types.js.map +1 -0
- package/dist/run-timeout.d.ts +25 -0
- package/dist/run-timeout.d.ts.map +1 -0
- package/dist/run-timeout.js +52 -0
- package/dist/run-timeout.js.map +1 -0
- package/dist/runner-wrappers.d.ts +74 -0
- package/dist/runner-wrappers.d.ts.map +1 -0
- package/dist/runner-wrappers.js +604 -0
- package/dist/runner-wrappers.js.map +1 -0
- package/dist/swift-xctest.d.ts +15 -2
- package/dist/swift-xctest.d.ts.map +1 -1
- package/dist/swift-xctest.js +143 -20
- package/dist/swift-xctest.js.map +1 -1
- package/dist/test-runner-collector.d.ts +56 -6
- package/dist/test-runner-collector.d.ts.map +1 -1
- package/dist/test-runner-collector.js +265 -113
- package/dist/test-runner-collector.js.map +1 -1
- package/dist/testgen/csharp-facts.d.ts +3 -0
- package/dist/testgen/csharp-facts.d.ts.map +1 -0
- package/dist/testgen/csharp-facts.js +306 -0
- package/dist/testgen/csharp-facts.js.map +1 -0
- package/dist/testgen/csharp-profile.d.ts +14 -0
- package/dist/testgen/csharp-profile.d.ts.map +1 -0
- package/dist/testgen/csharp-profile.js +233 -0
- package/dist/testgen/csharp-profile.js.map +1 -0
- package/dist/testgen/declarations.d.ts +10 -0
- package/dist/testgen/declarations.d.ts.map +1 -0
- package/dist/testgen/declarations.js +110 -0
- package/dist/testgen/declarations.js.map +1 -0
- package/dist/testgen/facts-common.d.ts +33 -0
- package/dist/testgen/facts-common.d.ts.map +1 -0
- package/dist/testgen/facts-common.js +76 -0
- package/dist/testgen/facts-common.js.map +1 -0
- package/dist/testgen/failure.d.ts +4 -0
- package/dist/testgen/failure.d.ts.map +1 -0
- package/dist/testgen/failure.js +106 -0
- package/dist/testgen/failure.js.map +1 -0
- package/dist/testgen/frameworks.d.ts +6 -0
- package/dist/testgen/frameworks.d.ts.map +1 -0
- package/dist/testgen/frameworks.js +516 -0
- package/dist/testgen/frameworks.js.map +1 -0
- package/dist/testgen/go-facts.d.ts +11 -0
- package/dist/testgen/go-facts.d.ts.map +1 -0
- package/dist/testgen/go-facts.js +237 -0
- package/dist/testgen/go-facts.js.map +1 -0
- package/dist/testgen/go-profile.d.ts +6 -0
- package/dist/testgen/go-profile.d.ts.map +1 -0
- package/dist/testgen/go-profile.js +155 -0
- package/dist/testgen/go-profile.js.map +1 -0
- package/dist/testgen/index.d.ts +28 -0
- package/dist/testgen/index.d.ts.map +1 -0
- package/dist/testgen/index.js +21 -0
- package/dist/testgen/index.js.map +1 -0
- package/dist/testgen/java-build.d.ts +13 -0
- package/dist/testgen/java-build.d.ts.map +1 -0
- package/dist/testgen/java-build.js +250 -0
- package/dist/testgen/java-build.js.map +1 -0
- package/dist/testgen/java-facts.d.ts +3 -0
- package/dist/testgen/java-facts.d.ts.map +1 -0
- package/dist/testgen/java-facts.js +349 -0
- package/dist/testgen/java-facts.js.map +1 -0
- package/dist/testgen/java-profile.d.ts +13 -0
- package/dist/testgen/java-profile.d.ts.map +1 -0
- package/dist/testgen/java-profile.js +194 -0
- package/dist/testgen/java-profile.js.map +1 -0
- package/dist/testgen/languages.d.ts +11 -0
- package/dist/testgen/languages.d.ts.map +1 -0
- package/dist/testgen/languages.js +63 -0
- package/dist/testgen/languages.js.map +1 -0
- package/dist/testgen/lexer.d.ts +19 -0
- package/dist/testgen/lexer.d.ts.map +1 -0
- package/dist/testgen/lexer.js +257 -0
- package/dist/testgen/lexer.js.map +1 -0
- package/dist/testgen/mutant-core.d.ts +19 -0
- package/dist/testgen/mutant-core.d.ts.map +1 -0
- package/dist/testgen/mutant-core.js +39 -0
- package/dist/testgen/mutant-core.js.map +1 -0
- package/dist/testgen/mutants-lang.d.ts +6 -0
- package/dist/testgen/mutants-lang.d.ts.map +1 -0
- package/dist/testgen/mutants-lang.js +291 -0
- package/dist/testgen/mutants-lang.js.map +1 -0
- package/dist/testgen/mutants.d.ts +9 -0
- package/dist/testgen/mutants.d.ts.map +1 -0
- package/dist/testgen/mutants.js +148 -0
- package/dist/testgen/mutants.js.map +1 -0
- package/dist/testgen/paths.d.ts +32 -0
- package/dist/testgen/paths.d.ts.map +1 -0
- package/dist/testgen/paths.js +211 -0
- package/dist/testgen/paths.js.map +1 -0
- package/dist/testgen/process.d.ts +19 -0
- package/dist/testgen/process.d.ts.map +1 -0
- package/dist/testgen/process.js +89 -0
- package/dist/testgen/process.js.map +1 -0
- package/dist/testgen/profile-failure.d.ts +7 -0
- package/dist/testgen/profile-failure.d.ts.map +1 -0
- package/dist/testgen/profile-failure.js +29 -0
- package/dist/testgen/profile-failure.js.map +1 -0
- package/dist/testgen/python-facts.d.ts +11 -0
- package/dist/testgen/python-facts.d.ts.map +1 -0
- package/dist/testgen/python-facts.js +380 -0
- package/dist/testgen/python-facts.js.map +1 -0
- package/dist/testgen/python-profile.d.ts +4 -0
- package/dist/testgen/python-profile.d.ts.map +1 -0
- package/dist/testgen/python-profile.js +344 -0
- package/dist/testgen/python-profile.js.map +1 -0
- package/dist/testgen/source-facts.d.ts +30 -0
- package/dist/testgen/source-facts.d.ts.map +1 -0
- package/dist/testgen/source-facts.js +497 -0
- package/dist/testgen/source-facts.js.map +1 -0
- package/dist/testgen/stubs.d.ts +4 -0
- package/dist/testgen/stubs.d.ts.map +1 -0
- package/dist/testgen/stubs.js +66 -0
- package/dist/testgen/stubs.js.map +1 -0
- package/dist/testgen/toolchain.d.ts +23 -0
- package/dist/testgen/toolchain.d.ts.map +1 -0
- package/dist/testgen/toolchain.js +201 -0
- package/dist/testgen/toolchain.js.map +1 -0
- package/dist/testgen/types.d.ts +67 -0
- package/dist/testgen/types.d.ts.map +1 -0
- package/dist/testgen/types.js +2 -0
- package/dist/testgen/types.js.map +1 -0
- package/dist/v8-coverage.d.ts +21 -0
- package/dist/v8-coverage.d.ts.map +1 -0
- package/dist/v8-coverage.js +217 -0
- package/dist/v8-coverage.js.map +1 -0
- package/dist/vitest-reporter.d.ts +46 -13
- package/dist/vitest-reporter.d.ts.map +1 -1
- package/dist/vitest-reporter.js +119 -26
- package/dist/vitest-reporter.js.map +1 -1
- package/dist/vitest-version.d.ts +21 -0
- package/dist/vitest-version.d.ts.map +1 -0
- package/dist/vitest-version.js +98 -0
- package/dist/vitest-version.js.map +1 -0
- package/package.json +14 -8
- package/reporters/junit/classes/DescryJUnitListener.class +0 -0
- package/reporters/junit/classes/META-INF/services/org.junit.platform.launcher.TestExecutionListener +1 -0
- package/reporters/minitest/descry_minitest_reporter.rb +150 -0
- package/reporters/phpunit/DescryPhpUnitExtension.php +209 -0
- package/reporters/pytest/descry_pytest_plugin.py +397 -0
- package/reporters/rspec/descry_rspec_formatter.rb +175 -0
- package/reporters/xunit/bin/Release/netstandard2.0/Descry.TestLogger.deps.json +203 -0
- package/reporters/xunit/bin/Release/netstandard2.0/Descry.TestLogger.dll +0 -0
- package/reporters/xunit/bin/Release/netstandard2.0/Descry.TestLogger.pdb +0 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { EXISTENCE, negate, STRONG, STRONG_VALUE, strongerOf, strongStatus, WEAK, weakerOf } from "./assertion-kinds.js";
|
|
2
|
+
import { isStatusSubject, statusFromTokens } from "./statuses.js";
|
|
3
|
+
import { isIdent, isPunct, splitTopLevel } from "./stream.js";
|
|
4
|
+
const NULL_LITERALS = new Set(["null", "nil", "None", "undefined", "nullptr"]);
|
|
5
|
+
export function isNullLiteralRange(stream, from, last) {
|
|
6
|
+
let start = from;
|
|
7
|
+
let end = last;
|
|
8
|
+
while (end > start && isPunct(stream, start, "(") && stream.match[start] === end) {
|
|
9
|
+
start += 1;
|
|
10
|
+
end -= 1;
|
|
11
|
+
}
|
|
12
|
+
const token = stream.toks[start];
|
|
13
|
+
return start === end && token !== undefined && token.kind === "identifier" && NULL_LITERALS.has(token.text);
|
|
14
|
+
}
|
|
15
|
+
export function isNullComparison(stream, fromIndex, lastIndex) {
|
|
16
|
+
let from = fromIndex;
|
|
17
|
+
let last = lastIndex;
|
|
18
|
+
while (last > from && isPunct(stream, from, "(") && stream.match[from] === last) {
|
|
19
|
+
from += 1;
|
|
20
|
+
last -= 1;
|
|
21
|
+
}
|
|
22
|
+
for (let index = from + 1; index < last; index += 1) {
|
|
23
|
+
const token = stream.toks[index];
|
|
24
|
+
if (token.kind === "punctuator" && (token.text === "(" || token.text === "[" || token.text === "{") && stream.match[index] > index) {
|
|
25
|
+
index = stream.match[index];
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const equality = token.kind === "punctuator" && (token.text === "==" || token.text === "===" || token.text === "!=" || token.text === "!==");
|
|
29
|
+
const identity = token.kind === "identifier" && token.text === "is";
|
|
30
|
+
if (!equality && !identity)
|
|
31
|
+
continue;
|
|
32
|
+
const rightFrom = identity && isIdent(stream, index + 1, "not") ? index + 2 : index + 1;
|
|
33
|
+
return isNullLiteralRange(stream, from, index - 1) || isNullLiteralRange(stream, rightFrom, last);
|
|
34
|
+
}
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
const EXISTENCE_PREDICATES = new Set(["isPresent", "exists", "isNotNull", "isNotEmpty"]);
|
|
38
|
+
const DEPTH_LIMIT = 48;
|
|
39
|
+
export function classifyNegatedBooleanExpression(stream, from, last) {
|
|
40
|
+
if (isNullComparison(stream, from, last))
|
|
41
|
+
return WEAK;
|
|
42
|
+
return negate(classifyBooleanExpression(stream, from, last));
|
|
43
|
+
}
|
|
44
|
+
export function classifyBooleanExpression(stream, fromIndex, lastIndex, depth = 0) {
|
|
45
|
+
if (depth > DEPTH_LIMIT)
|
|
46
|
+
return STRONG;
|
|
47
|
+
let from = fromIndex;
|
|
48
|
+
let last = lastIndex;
|
|
49
|
+
while (last > from && isPunct(stream, from, "(") && stream.match[from] === last) {
|
|
50
|
+
from += 1;
|
|
51
|
+
last -= 1;
|
|
52
|
+
}
|
|
53
|
+
if (last < from)
|
|
54
|
+
return WEAK;
|
|
55
|
+
const alternatives = splitTopLevel(stream, from, last, "||");
|
|
56
|
+
if (alternatives.length > 1)
|
|
57
|
+
return alternatives.map((part) => classifyBooleanExpression(stream, part[0], part[1], depth + 1)).reduce(weakerOf);
|
|
58
|
+
const conjuncts = splitTopLevel(stream, from, last, "&&");
|
|
59
|
+
if (conjuncts.length > 1)
|
|
60
|
+
return conjuncts.map((part) => classifyBooleanExpression(stream, part[0], part[1], depth + 1)).reduce(strongerOf);
|
|
61
|
+
if (isPunct(stream, from, "!") && from < last) {
|
|
62
|
+
if (isNullComparison(stream, from + 1, last))
|
|
63
|
+
return WEAK;
|
|
64
|
+
return negate(classifyBooleanExpression(stream, from + 1, last, depth + 1));
|
|
65
|
+
}
|
|
66
|
+
for (let index = from + 1; index < last; index += 1) {
|
|
67
|
+
const token = stream.toks[index];
|
|
68
|
+
if (token.kind === "punctuator" && (token.text === "(" || token.text === "[" || token.text === "{") && stream.match[index] > index) {
|
|
69
|
+
index = stream.match[index];
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (token.kind === "punctuator" && (token.text === "==" || token.text === "===" || token.text === "!=" || token.text === "!==" || token.text === "<" || token.text === ">" || token.text === "<=" || token.text === ">=")) {
|
|
73
|
+
if (token.text === "!=" || token.text === "!==")
|
|
74
|
+
return isNullLiteralRange(stream, from, index - 1) || isNullLiteralRange(stream, index + 1, last) ? WEAK : STRONG_VALUE;
|
|
75
|
+
if (token.text === "==" || token.text === "===") {
|
|
76
|
+
if (isStatusSubject(stream, from, index - 1)) {
|
|
77
|
+
const value = statusFromTokens(stream, index + 1, last);
|
|
78
|
+
if (value !== null)
|
|
79
|
+
return strongStatus(value);
|
|
80
|
+
}
|
|
81
|
+
if (isStatusSubject(stream, index + 1, last)) {
|
|
82
|
+
const value = statusFromTokens(stream, from, index - 1);
|
|
83
|
+
if (value !== null)
|
|
84
|
+
return strongStatus(value);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return STRONG_VALUE;
|
|
88
|
+
}
|
|
89
|
+
if (token.kind === "identifier" && token.text === "instanceof")
|
|
90
|
+
return STRONG_VALUE;
|
|
91
|
+
}
|
|
92
|
+
const head = stream.toks[from];
|
|
93
|
+
if (head.kind !== "identifier")
|
|
94
|
+
return STRONG;
|
|
95
|
+
let cursor = from;
|
|
96
|
+
let lastName = head.text;
|
|
97
|
+
let hasCall = false;
|
|
98
|
+
while (cursor <= last) {
|
|
99
|
+
const token = stream.toks[cursor];
|
|
100
|
+
if (token.kind === "identifier") {
|
|
101
|
+
lastName = token.text;
|
|
102
|
+
cursor += 1;
|
|
103
|
+
if (isPunct(stream, cursor, "(") && stream.match[cursor] > cursor) {
|
|
104
|
+
hasCall = true;
|
|
105
|
+
cursor = stream.match[cursor] + 1;
|
|
106
|
+
}
|
|
107
|
+
if (isPunct(stream, cursor, "."))
|
|
108
|
+
cursor += 1;
|
|
109
|
+
else
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
else
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
if (cursor <= last)
|
|
116
|
+
return STRONG;
|
|
117
|
+
if (!hasCall)
|
|
118
|
+
return WEAK;
|
|
119
|
+
if (EXISTENCE_PREDICATES.has(lastName))
|
|
120
|
+
return EXISTENCE;
|
|
121
|
+
return STRONG;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=expressions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expressions.js","sourceRoot":"","sources":["../../src/quality/expressions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { QualityRange, TestSourceFacts, Unsupported } from "./types.ts";
|
|
2
|
+
export declare const MAX_SOURCE_BYTES: number;
|
|
3
|
+
export declare function factsForUnguarded(source: string, range: QualityRange, framework: string | null): TestSourceFacts | Unsupported;
|
|
4
|
+
export declare function factsFor(source: string, range: QualityRange, framework: string | null): TestSourceFacts | Unsupported;
|
|
5
|
+
//# sourceMappingURL=facts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facts.d.ts","sourceRoot":"","sources":["../../src/quality/facts.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAqC,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEhH,eAAO,MAAM,gBAAgB,QAAkB,CAAC;AAmGhD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,eAAe,GAAG,WAAW,CAsC9H;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,eAAe,GAAG,WAAW,CAOrH"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { tokenizeCFamily, tokenizeJavaScript, tokenizePython } from "../lexers/index.js";
|
|
2
|
+
import { extractCSharp } from "./csharp-family.js";
|
|
3
|
+
import { QUALITY_FRAMEWORKS, isQualityFramework, languageOf } from "./frameworks.js";
|
|
4
|
+
import { extractGo } from "./go-family.js";
|
|
5
|
+
import { extractJava } from "./java-family.js";
|
|
6
|
+
import { extractJavaScript } from "./js-family.js";
|
|
7
|
+
import { extractPython } from "./python-family.js";
|
|
8
|
+
import { emptyFacts, finishFacts, newCollector } from "./scope.js";
|
|
9
|
+
import { buildStream, findRangeEnd, findRangeStart } from "./stream.js";
|
|
10
|
+
export const MAX_SOURCE_BYTES = 4 * 1024 * 1024;
|
|
11
|
+
const STREAM_CACHE_LIMIT = 3;
|
|
12
|
+
const STREAM_CACHE_MAX_CHARACTERS = 1024 * 1024;
|
|
13
|
+
const streamCache = new Map();
|
|
14
|
+
function streamFor(source, language) {
|
|
15
|
+
if (source.length > STREAM_CACHE_MAX_CHARACTERS)
|
|
16
|
+
return buildStream(source, tokensFor(source, language));
|
|
17
|
+
const key = `${language}\u0000${source}`;
|
|
18
|
+
const cached = streamCache.get(key);
|
|
19
|
+
if (cached !== undefined) {
|
|
20
|
+
streamCache.delete(key);
|
|
21
|
+
streamCache.set(key, cached);
|
|
22
|
+
return cached;
|
|
23
|
+
}
|
|
24
|
+
const built = buildStream(source, tokensFor(source, language));
|
|
25
|
+
streamCache.set(key, built);
|
|
26
|
+
if (streamCache.size > STREAM_CACHE_LIMIT)
|
|
27
|
+
streamCache.delete(streamCache.keys().next().value);
|
|
28
|
+
return built;
|
|
29
|
+
}
|
|
30
|
+
function tokensFor(source, language) {
|
|
31
|
+
if (language === "python")
|
|
32
|
+
return tokenizePython(source);
|
|
33
|
+
if (language === "javascript")
|
|
34
|
+
return tokenizeJavaScript(source);
|
|
35
|
+
return tokenizeCFamily(source, language === "csharp" ? "csharp" : language === "go" ? "go" : "java");
|
|
36
|
+
}
|
|
37
|
+
function sniffLanguage(source) {
|
|
38
|
+
if (/^\s*package\s+\w+\s*$/m.test(source) && (/\bfunc\s+(?:\(\s*\w+\s+\*?\w+\s*\)\s*)?(?:Test|Benchmark|Example)\w*\s*\(/.test(source) || /^\s*import\s+(?:\(|")/m.test(source)))
|
|
39
|
+
return "go";
|
|
40
|
+
if ((/^\s*using\s+[\w.]+\s*;/m.test(source) && /\bnamespace\b|\[\s*(?:Fact|Theory|Test|TestMethod|TestCase|TestClass)\b/.test(source)) || (/^\s*\[\s*(?:Fact|Theory|Test|TestMethod|TestCase|SetUp|TestInitialize)\b[^\]]*\]/m.test(source) && /\b(?:void|Task)\s+\w+\s*\(/.test(source)))
|
|
41
|
+
return "csharp";
|
|
42
|
+
if (/^\s*package\s+[\w.]+\s*;/m.test(source) || /^\s*import\s+(?:static\s+)?(?:org|java|javax|io|com)\.[\w.*]+\s*;/m.test(source) || (/^\s*@(?:Test|ParameterizedTest|RepeatedTest|BeforeEach|AfterEach|BeforeAll|AfterAll)\b/m.test(source) && /\bvoid\s+\w+\s*\(/.test(source)))
|
|
43
|
+
return "java";
|
|
44
|
+
if (/^\s*(?:import|from)\s+[\w.]+/m.test(source) && /\bdef\s+\w+\s*\(|^\s*class\s+\w+/m.test(source) && !/^\s*(?:import|export)\s.*\bfrom\s+['"]/m.test(source) && !/\brequire\(/.test(source))
|
|
45
|
+
return "python";
|
|
46
|
+
return "javascript";
|
|
47
|
+
}
|
|
48
|
+
function stringValues(stream) {
|
|
49
|
+
const values = new Set();
|
|
50
|
+
for (const token of stream.toks) {
|
|
51
|
+
if (token.kind !== "string")
|
|
52
|
+
continue;
|
|
53
|
+
const text = token.text;
|
|
54
|
+
if (text.length >= 2)
|
|
55
|
+
values.add(text.slice(1, -1));
|
|
56
|
+
}
|
|
57
|
+
return values;
|
|
58
|
+
}
|
|
59
|
+
function identifiersOf(stream) {
|
|
60
|
+
const names = new Set();
|
|
61
|
+
for (const token of stream.toks)
|
|
62
|
+
if (token.kind === "identifier")
|
|
63
|
+
names.add(token.text);
|
|
64
|
+
return names;
|
|
65
|
+
}
|
|
66
|
+
function inferFramework(language, stream) {
|
|
67
|
+
const names = identifiersOf(stream);
|
|
68
|
+
if (language === "javascript") {
|
|
69
|
+
const modules = stringValues(stream);
|
|
70
|
+
const found = new Set();
|
|
71
|
+
for (const module of modules) {
|
|
72
|
+
if (module === "vitest" || module.startsWith("vitest/"))
|
|
73
|
+
found.add("vitest");
|
|
74
|
+
else if (module === "@playwright/test")
|
|
75
|
+
found.add("playwright");
|
|
76
|
+
else if (module === "@jest/globals")
|
|
77
|
+
found.add("jest");
|
|
78
|
+
else if (module === "node:test")
|
|
79
|
+
found.add("node:test");
|
|
80
|
+
else if (module === "mocha" || module === "chai" || module === "cypress")
|
|
81
|
+
found.add("mocha");
|
|
82
|
+
}
|
|
83
|
+
if (found.size === 0) {
|
|
84
|
+
if (names.has("jest") && !names.has("vi"))
|
|
85
|
+
found.add("jest");
|
|
86
|
+
else if (names.has("vi") && !names.has("jest"))
|
|
87
|
+
found.add("vitest");
|
|
88
|
+
}
|
|
89
|
+
if (found.size === 1)
|
|
90
|
+
return [...found][0];
|
|
91
|
+
if (found.size > 1)
|
|
92
|
+
return { unsupported: `the JavaScript test framework is ambiguous (${[...found].sort().join(", ")}); pass the framework explicitly` };
|
|
93
|
+
return { unsupported: "no test framework could be identified from the imports of this JavaScript source; pass the framework explicitly" };
|
|
94
|
+
}
|
|
95
|
+
if (language === "python") {
|
|
96
|
+
if (names.has("pytest"))
|
|
97
|
+
return "pytest";
|
|
98
|
+
if (names.has("unittest") || names.has("TestCase"))
|
|
99
|
+
return "unittest";
|
|
100
|
+
return { unsupported: "no pytest or unittest marker found in this Python source; pass the framework explicitly" };
|
|
101
|
+
}
|
|
102
|
+
if (language === "java") {
|
|
103
|
+
if (names.has("junit") || names.has("jupiter"))
|
|
104
|
+
return "junit";
|
|
105
|
+
return { unsupported: "no JUnit import found in this Java source; pass the framework explicitly" };
|
|
106
|
+
}
|
|
107
|
+
if (language === "go") {
|
|
108
|
+
if (names.has("testing"))
|
|
109
|
+
return "go";
|
|
110
|
+
return { unsupported: 'this Go source does not import "testing"; pass the framework explicitly' };
|
|
111
|
+
}
|
|
112
|
+
if (names.has("Xunit") || names.has("NUnit") || names.has("VisualStudio") || names.has("Fact") || names.has("TestMethod"))
|
|
113
|
+
return "xunit";
|
|
114
|
+
return { unsupported: "no xUnit, NUnit or MSTest marker found in this C# source; pass the framework explicitly" };
|
|
115
|
+
}
|
|
116
|
+
function validRange(range) {
|
|
117
|
+
return (typeof range === "object" &&
|
|
118
|
+
range !== null &&
|
|
119
|
+
Number.isInteger(range.startLine) &&
|
|
120
|
+
Number.isInteger(range.endLine) &&
|
|
121
|
+
range.startLine >= 1 &&
|
|
122
|
+
range.endLine >= range.startLine);
|
|
123
|
+
}
|
|
124
|
+
export function factsForUnguarded(source, range, framework) {
|
|
125
|
+
if (typeof source !== "string")
|
|
126
|
+
return { unsupported: "the test source is not text" };
|
|
127
|
+
if (!validRange(range))
|
|
128
|
+
return { unsupported: "the line range is not a pair of integers with 1 <= startLine <= endLine" };
|
|
129
|
+
if (framework !== null && typeof framework !== "string")
|
|
130
|
+
return { unsupported: "the framework name is not text" };
|
|
131
|
+
if (framework !== null && !isQualityFramework(framework)) {
|
|
132
|
+
return { unsupported: `test framework "${framework}" is not covered by the test-quality catalog (covered: ${QUALITY_FRAMEWORKS.join(", ")})` };
|
|
133
|
+
}
|
|
134
|
+
if (source.length > MAX_SOURCE_BYTES)
|
|
135
|
+
return { unsupported: `the test source is larger than ${MAX_SOURCE_BYTES} characters` };
|
|
136
|
+
const text = source.charCodeAt(0) === 0xfeff ? source.slice(1) : source;
|
|
137
|
+
let resolved;
|
|
138
|
+
let language;
|
|
139
|
+
if (framework !== null) {
|
|
140
|
+
resolved = framework;
|
|
141
|
+
language = languageOf(resolved);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
language = sniffLanguage(text);
|
|
145
|
+
}
|
|
146
|
+
const stream = streamFor(text, language);
|
|
147
|
+
if (framework === null) {
|
|
148
|
+
const inferred = inferFramework(language, stream);
|
|
149
|
+
if (typeof inferred !== "string")
|
|
150
|
+
return inferred;
|
|
151
|
+
resolved = inferred;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
resolved = framework;
|
|
155
|
+
}
|
|
156
|
+
if (stream.toks.length === 0)
|
|
157
|
+
return emptyFacts(resolved);
|
|
158
|
+
const first = findRangeStart(stream, range.startLine);
|
|
159
|
+
const last = Math.min(findRangeEnd(stream, range.endLine), stream.toks.length - 1);
|
|
160
|
+
const out = newCollector();
|
|
161
|
+
const scope = { stream, first, last, startLine: range.startLine, endLine: range.endLine, framework: resolved, out };
|
|
162
|
+
if (language === "javascript")
|
|
163
|
+
extractJavaScript(scope);
|
|
164
|
+
else if (language === "python")
|
|
165
|
+
extractPython(scope);
|
|
166
|
+
else if (language === "java")
|
|
167
|
+
extractJava(scope);
|
|
168
|
+
else if (language === "go")
|
|
169
|
+
extractGo(scope);
|
|
170
|
+
else
|
|
171
|
+
extractCSharp(scope);
|
|
172
|
+
return finishFacts(resolved, out);
|
|
173
|
+
}
|
|
174
|
+
export function factsFor(source, range, framework) {
|
|
175
|
+
try {
|
|
176
|
+
return factsForUnguarded(source, range, framework);
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
180
|
+
return { unsupported: `the test source could not be analysed (${reason.slice(0, 200)})` };
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=facts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facts.js","sourceRoot":"","sources":["../../src/quality/facts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure-of.d.ts","sourceRoot":"","sources":["../../src/quality/failure-of.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAe,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA0ElF,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CA8BjE;AA6FD,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CA4B3D"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { classifyFailure, failureMessage } from "../testgen/failure.js";
|
|
2
|
+
const MESSAGE_LIMIT = 2048;
|
|
3
|
+
const SCAN_LIMIT = 64 * 1024;
|
|
4
|
+
const LINE_LIMIT = 4000;
|
|
5
|
+
const COLOUR_SEQUENCE = new RegExp(`${String.fromCharCode(27)}\\[[0-9;?]*[ -/]*[@-~]`, "g");
|
|
6
|
+
function isBag(value) {
|
|
7
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
8
|
+
}
|
|
9
|
+
function field(bag, key) {
|
|
10
|
+
try {
|
|
11
|
+
return bag[key];
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function text(value) {
|
|
18
|
+
return typeof value === "string" && value.trim() !== "" ? value : null;
|
|
19
|
+
}
|
|
20
|
+
function strip(value) {
|
|
21
|
+
return value.slice(0, SCAN_LIMIT).replace(COLOUR_SEQUENCE, "");
|
|
22
|
+
}
|
|
23
|
+
function cap(value) {
|
|
24
|
+
const trimmed = value.trim();
|
|
25
|
+
return trimmed.length <= MESSAGE_LIMIT ? trimmed : `${trimmed.slice(0, MESSAGE_LIMIT - 1)}…`;
|
|
26
|
+
}
|
|
27
|
+
function safeStringify(value) {
|
|
28
|
+
const seen = new WeakSet();
|
|
29
|
+
try {
|
|
30
|
+
const json = JSON.stringify(value, (_key, item) => {
|
|
31
|
+
if (typeof item === "bigint")
|
|
32
|
+
return `${item}n`;
|
|
33
|
+
if (typeof item === "function")
|
|
34
|
+
return `[Function ${item.name}]`;
|
|
35
|
+
if (typeof item === "symbol")
|
|
36
|
+
return item.toString();
|
|
37
|
+
if (typeof item === "object" && item !== null) {
|
|
38
|
+
if (seen.has(item))
|
|
39
|
+
return "[Circular]";
|
|
40
|
+
seen.add(item);
|
|
41
|
+
}
|
|
42
|
+
return item;
|
|
43
|
+
});
|
|
44
|
+
if (json !== undefined)
|
|
45
|
+
return cap(json);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return cap(String(Object.prototype.toString.call(value)));
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
return cap(String(value));
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return "[unprintable value]";
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const NOISE_PATH = /(?:^|[\\/])(?:node_modules|site-packages|dist-packages)(?:[\\/]|$)|^node:|^<frozen|[\\/]go[\\/]src[\\/]|[\\/]usr[\\/]local[\\/]go[\\/]|\/usr\/lib\/python/;
|
|
58
|
+
const JAVA_FRAMEWORK_FRAME = /^(?:org\.junit|junit\.framework|java\.|javax\.|jdk\.|sun\.|com\.sun\.|org\.mockito|org\.assertj|org\.hamcrest|org\.apache\.maven|org\.gradle|org\.testng|kotlin\.)/;
|
|
59
|
+
function location(file, line) {
|
|
60
|
+
const cleaned = file.replace(/^file:\/\//, "");
|
|
61
|
+
if (cleaned === "" || NOISE_PATH.test(cleaned) || !Number.isInteger(line) || line < 1)
|
|
62
|
+
return null;
|
|
63
|
+
return { file: cleaned, line };
|
|
64
|
+
}
|
|
65
|
+
const JS_FRAME = /\bat (?:[^\n]*? \()?((?:file:\/\/)?[^()\s]+?):(\d+):\d+\)?\s*$/;
|
|
66
|
+
const PYTHON_FRAME = /File "([^"]+)", line (\d+)/;
|
|
67
|
+
const PYTEST_SHORT = /^(\S+\.py):(\d+):/;
|
|
68
|
+
const JAVA_FRAME = /\bat ([\w.$<>]+)\(([\w$-]+\.(?:java|kt|scala|groovy)):(\d+)\)/;
|
|
69
|
+
const GO_FRAME = /(?:^|[\s\t(])((?:[\w.~\\/-]*[\\/])?[\w.-]+\.go):(\d+)(?::\d+)?(?::|\s|$)/;
|
|
70
|
+
const CSHARP_FRAME = /\bin (.+?):line (\d+)/;
|
|
71
|
+
export function firstFrame(source) {
|
|
72
|
+
const lines = strip(source).split("\n", LINE_LIMIT);
|
|
73
|
+
for (const raw of lines) {
|
|
74
|
+
const line = raw.trimEnd();
|
|
75
|
+
let found = null;
|
|
76
|
+
const js = JS_FRAME.exec(line);
|
|
77
|
+
if (js !== null)
|
|
78
|
+
found = location(js[1], Number(js[2]));
|
|
79
|
+
if (found === null) {
|
|
80
|
+
const python = PYTHON_FRAME.exec(line);
|
|
81
|
+
if (python !== null)
|
|
82
|
+
found = location(python[1], Number(python[2]));
|
|
83
|
+
}
|
|
84
|
+
if (found === null) {
|
|
85
|
+
const short = PYTEST_SHORT.exec(line.trim());
|
|
86
|
+
if (short !== null)
|
|
87
|
+
found = location(short[1], Number(short[2]));
|
|
88
|
+
}
|
|
89
|
+
if (found === null) {
|
|
90
|
+
const java = JAVA_FRAME.exec(line);
|
|
91
|
+
if (java !== null && !JAVA_FRAMEWORK_FRAME.test(java[1]))
|
|
92
|
+
found = location(java[2], Number(java[3]));
|
|
93
|
+
}
|
|
94
|
+
if (found === null) {
|
|
95
|
+
const csharp = CSHARP_FRAME.exec(line);
|
|
96
|
+
if (csharp !== null)
|
|
97
|
+
found = location(csharp[1], Number(csharp[2]));
|
|
98
|
+
}
|
|
99
|
+
if (found === null) {
|
|
100
|
+
const go = GO_FRAME.exec(line);
|
|
101
|
+
if (go !== null)
|
|
102
|
+
found = location(go[1], Number(go[2]));
|
|
103
|
+
}
|
|
104
|
+
if (found !== null)
|
|
105
|
+
return found;
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
const ASSERTION_MARKERS = /\bAssertion(?:Failed)?(?:Error|Exception)\b|\bComparisonFailure\b|\bMultipleFailuresError\b|\bAssertFailedException\b|Xunit\.Sdk\.\w+Exception|\bAssert\.\w+\(\) Failure|\bAssert\.\w*Exception\b|Error Trace:|(?:^|\n)\s*E?\s*assert\s|\b[Ee]xpected:\s*<[^>\n]*>\s*but was:\s*<[^>\n]*>|Expected:[^\n]*\n\s*But was:/;
|
|
110
|
+
const GO_COMPARISON = /\b(?:got|want|expected|actual)\b/i;
|
|
111
|
+
const GO_TIMEOUT = /panic: test timed out|test timed out after/;
|
|
112
|
+
const TIMEOUT_MARKERS = /\btime[ds]? ?out\b|\bTimeout\b|deadline exceeded|\bTimeoutException\b/i;
|
|
113
|
+
const PANIC_MARKERS = /(?:^|\n)\s*panic:|\bgoroutine \d+ \[/;
|
|
114
|
+
function gather(error) {
|
|
115
|
+
const messages = [];
|
|
116
|
+
const stacks = [];
|
|
117
|
+
let recognised = false;
|
|
118
|
+
const push = (target, value) => {
|
|
119
|
+
const candidate = text(value);
|
|
120
|
+
if (candidate !== null) {
|
|
121
|
+
recognised = true;
|
|
122
|
+
target.push(strip(candidate));
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
const failureType = text(field(error, "failureType"));
|
|
126
|
+
const code = text(field(error, "code"));
|
|
127
|
+
if (failureType !== null || code !== null)
|
|
128
|
+
recognised = true;
|
|
129
|
+
push(messages, field(error, "message"));
|
|
130
|
+
const cause = field(error, "cause");
|
|
131
|
+
if (isBag(cause)) {
|
|
132
|
+
push(messages, field(cause, "message"));
|
|
133
|
+
push(stacks, field(cause, "stack"));
|
|
134
|
+
push(messages, field(cause, "stack"));
|
|
135
|
+
}
|
|
136
|
+
else if (typeof cause === "string")
|
|
137
|
+
push(messages, cause);
|
|
138
|
+
const errors = field(error, "errors");
|
|
139
|
+
if (Array.isArray(errors)) {
|
|
140
|
+
for (const entry of errors.slice(0, 5)) {
|
|
141
|
+
if (!isBag(entry))
|
|
142
|
+
continue;
|
|
143
|
+
push(messages, field(entry, "message"));
|
|
144
|
+
push(stacks, field(entry, "stack"));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const lines = field(error, "messages");
|
|
148
|
+
if (Array.isArray(lines)) {
|
|
149
|
+
for (const entry of lines.slice(0, 5)) {
|
|
150
|
+
push(messages, entry);
|
|
151
|
+
push(stacks, entry);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
push(stacks, field(error, "stack"));
|
|
155
|
+
push(stacks, field(error, "trace"));
|
|
156
|
+
push(stacks, field(error, "output"));
|
|
157
|
+
const goStyle = failureType === "test" && typeof cause === "string";
|
|
158
|
+
return { messages, stacks, failureType, code, recognised, goStyle, source: error };
|
|
159
|
+
}
|
|
160
|
+
function decide(gathered, structuralAssertion) {
|
|
161
|
+
const body = gathered.messages.join("\n");
|
|
162
|
+
const everything = `${body}\n${gathered.stacks.join("\n")}`;
|
|
163
|
+
if (structuralAssertion)
|
|
164
|
+
return "assertion";
|
|
165
|
+
if (gathered.failureType !== null && /timeout/i.test(gathered.failureType))
|
|
166
|
+
return "timeout";
|
|
167
|
+
if (GO_TIMEOUT.test(everything))
|
|
168
|
+
return "timeout";
|
|
169
|
+
if (ASSERTION_MARKERS.test(everything))
|
|
170
|
+
return "assertion";
|
|
171
|
+
if (gathered.goStyle && GO_COMPARISON.test(body) && !PANIC_MARKERS.test(body))
|
|
172
|
+
return "assertion";
|
|
173
|
+
if (TIMEOUT_MARKERS.test(body))
|
|
174
|
+
return "timeout";
|
|
175
|
+
return gathered.recognised ? "error" : "unknown";
|
|
176
|
+
}
|
|
177
|
+
function fallbackMessage(source) {
|
|
178
|
+
try {
|
|
179
|
+
return cap(failureMessage(source));
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return "the failure payload could not be read";
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function messageOf(gathered) {
|
|
186
|
+
const first = gathered.messages[0];
|
|
187
|
+
if (first === undefined)
|
|
188
|
+
return fallbackMessage(gathered.source);
|
|
189
|
+
const lines = [];
|
|
190
|
+
for (const line of first.split("\n", LINE_LIMIT)) {
|
|
191
|
+
if (/^\s+at\s/.test(line))
|
|
192
|
+
break;
|
|
193
|
+
lines.push(line.trimEnd());
|
|
194
|
+
}
|
|
195
|
+
const body = lines.join("\n").trim();
|
|
196
|
+
return cap(body === "" ? first : body);
|
|
197
|
+
}
|
|
198
|
+
export function failureOf(error) {
|
|
199
|
+
try {
|
|
200
|
+
if (typeof error === "string") {
|
|
201
|
+
const cleaned = strip(error);
|
|
202
|
+
if (cleaned.trim() === "")
|
|
203
|
+
return { kind: "unknown", message: "", location: null };
|
|
204
|
+
const gathered = { messages: [cleaned], stacks: [cleaned], failureType: null, code: null, recognised: false, goStyle: false, source: {} };
|
|
205
|
+
const kind = decide(gathered, false);
|
|
206
|
+
return { kind, message: messageOf(gathered), location: firstFrame(cleaned) };
|
|
207
|
+
}
|
|
208
|
+
if (!isBag(error))
|
|
209
|
+
return { kind: "unknown", message: safeStringify(error), location: null };
|
|
210
|
+
const gathered = gather(error);
|
|
211
|
+
if (!gathered.recognised)
|
|
212
|
+
return { kind: "unknown", message: safeStringify(error), location: null };
|
|
213
|
+
let structural = false;
|
|
214
|
+
try {
|
|
215
|
+
structural = classifyFailure(error) === "assertion";
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
structural = false;
|
|
219
|
+
}
|
|
220
|
+
const kind = decide(gathered, structural);
|
|
221
|
+
let located = null;
|
|
222
|
+
for (const source of [...gathered.stacks, ...gathered.messages]) {
|
|
223
|
+
located = firstFrame(source);
|
|
224
|
+
if (located !== null)
|
|
225
|
+
break;
|
|
226
|
+
}
|
|
227
|
+
return { kind, message: messageOf(gathered), location: located };
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return { kind: "unknown", message: "the failure payload could not be read", location: null };
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=failure-of.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure-of.js","sourceRoot":"","sources":["../../src/quality/failure-of.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { QualityFramework, QualityLanguage } from "./types.ts";
|
|
2
|
+
export declare const QUALITY_FRAMEWORKS: readonly QualityFramework[];
|
|
3
|
+
export declare function isQualityFramework(name: string): name is QualityFramework;
|
|
4
|
+
export declare function languageOf(framework: QualityFramework): QualityLanguage;
|
|
5
|
+
//# sourceMappingURL=frameworks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frameworks.d.ts","sourceRoot":"","sources":["../../src/quality/frameworks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpE,eAAO,MAAM,kBAAkB,EAAE,SAAS,gBAAgB,EAAyG,CAAC;AAepK,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,gBAAgB,CAEzE;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,gBAAgB,GAAG,eAAe,CAEvE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const QUALITY_FRAMEWORKS = ["node:test", "jest", "vitest", "mocha", "playwright", "pytest", "unittest", "junit", "go", "xunit"];
|
|
2
|
+
const LANGUAGE_OF = {
|
|
3
|
+
"node:test": "javascript",
|
|
4
|
+
jest: "javascript",
|
|
5
|
+
vitest: "javascript",
|
|
6
|
+
mocha: "javascript",
|
|
7
|
+
playwright: "javascript",
|
|
8
|
+
pytest: "python",
|
|
9
|
+
unittest: "python",
|
|
10
|
+
junit: "java",
|
|
11
|
+
go: "go",
|
|
12
|
+
xunit: "csharp",
|
|
13
|
+
};
|
|
14
|
+
export function isQualityFramework(name) {
|
|
15
|
+
return QUALITY_FRAMEWORKS.includes(name);
|
|
16
|
+
}
|
|
17
|
+
export function languageOf(framework) {
|
|
18
|
+
return LANGUAGE_OF[framework];
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=frameworks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frameworks.js","sourceRoot":"","sources":["../../src/quality/frameworks.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAgC,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAEpK,MAAM,WAAW,GAAwD;IACvE,WAAW,EAAE,YAAY;IACzB,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,YAAY;IACnB,UAAU,EAAE,YAAY;IACxB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,MAAM;IACb,EAAE,EAAE,IAAI;IACR,KAAK,EAAE,QAAQ;CAChB,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAQ,kBAAwC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAA2B;IACpD,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC"}
|