@vibe-validate/extractors 0.16.0 → 0.17.0-rc.5

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.
Files changed (163) hide show
  1. package/dist/extractor-registry.d.ts +104 -0
  2. package/dist/extractor-registry.d.ts.map +1 -0
  3. package/dist/extractor-registry.js +278 -0
  4. package/dist/extractor-registry.js.map +1 -0
  5. package/dist/extractors/ava/index.d.ts +23 -0
  6. package/dist/extractors/ava/index.d.ts.map +1 -0
  7. package/dist/extractors/ava/index.js +507 -0
  8. package/dist/extractors/ava/index.js.map +1 -0
  9. package/dist/extractors/ava/index.test.d.ts +7 -0
  10. package/dist/extractors/ava/index.test.d.ts.map +1 -0
  11. package/dist/extractors/ava/index.test.js +408 -0
  12. package/dist/extractors/ava/index.test.js.map +1 -0
  13. package/dist/extractors/eslint/index.d.ts +18 -0
  14. package/dist/extractors/eslint/index.d.ts.map +1 -0
  15. package/dist/extractors/eslint/index.js +206 -0
  16. package/dist/extractors/eslint/index.js.map +1 -0
  17. package/dist/extractors/eslint/index.test.d.ts +9 -0
  18. package/dist/extractors/eslint/index.test.d.ts.map +1 -0
  19. package/dist/extractors/eslint/index.test.js +191 -0
  20. package/dist/extractors/eslint/index.test.js.map +1 -0
  21. package/dist/extractors/generic/index.d.ts +30 -0
  22. package/dist/extractors/generic/index.d.ts.map +1 -0
  23. package/dist/extractors/generic/index.js +140 -0
  24. package/dist/extractors/generic/index.js.map +1 -0
  25. package/dist/extractors/generic/index.test.d.ts +7 -0
  26. package/dist/extractors/generic/index.test.d.ts.map +1 -0
  27. package/dist/extractors/generic/index.test.js +61 -0
  28. package/dist/extractors/generic/index.test.js.map +1 -0
  29. package/dist/extractors/jasmine/index.d.ts +17 -0
  30. package/dist/extractors/jasmine/index.d.ts.map +1 -0
  31. package/dist/extractors/jasmine/index.js +242 -0
  32. package/dist/extractors/jasmine/index.js.map +1 -0
  33. package/dist/extractors/jasmine/index.test.d.ts +7 -0
  34. package/dist/extractors/jasmine/index.test.d.ts.map +1 -0
  35. package/dist/extractors/jasmine/index.test.js +318 -0
  36. package/dist/extractors/jasmine/index.test.js.map +1 -0
  37. package/dist/extractors/jest/index.d.ts +17 -0
  38. package/dist/extractors/jest/index.d.ts.map +1 -0
  39. package/dist/extractors/jest/index.js +273 -0
  40. package/dist/extractors/jest/index.js.map +1 -0
  41. package/dist/extractors/jest/index.test.d.ts +9 -0
  42. package/dist/extractors/jest/index.test.d.ts.map +1 -0
  43. package/dist/extractors/jest/index.test.js +338 -0
  44. package/dist/extractors/jest/index.test.js.map +1 -0
  45. package/dist/extractors/junit/index.d.ts +18 -0
  46. package/dist/extractors/junit/index.d.ts.map +1 -0
  47. package/dist/extractors/junit/index.js +259 -0
  48. package/dist/extractors/junit/index.js.map +1 -0
  49. package/dist/extractors/junit/index.test.d.ts +7 -0
  50. package/dist/extractors/junit/index.test.d.ts.map +1 -0
  51. package/dist/extractors/junit/index.test.js +341 -0
  52. package/dist/extractors/junit/index.test.js.map +1 -0
  53. package/dist/extractors/maven-checkstyle/index.d.ts +23 -0
  54. package/dist/extractors/maven-checkstyle/index.d.ts.map +1 -0
  55. package/dist/extractors/maven-checkstyle/index.js +263 -0
  56. package/dist/extractors/maven-checkstyle/index.js.map +1 -0
  57. package/dist/extractors/maven-checkstyle/index.test.d.ts +2 -0
  58. package/dist/extractors/maven-checkstyle/index.test.d.ts.map +1 -0
  59. package/dist/extractors/maven-checkstyle/index.test.js +197 -0
  60. package/dist/extractors/maven-checkstyle/index.test.js.map +1 -0
  61. package/dist/extractors/maven-compiler/index.d.ts +23 -0
  62. package/dist/extractors/maven-compiler/index.d.ts.map +1 -0
  63. package/dist/extractors/maven-compiler/index.js +271 -0
  64. package/dist/extractors/maven-compiler/index.js.map +1 -0
  65. package/dist/extractors/maven-compiler/index.test.d.ts +2 -0
  66. package/dist/extractors/maven-compiler/index.test.d.ts.map +1 -0
  67. package/dist/extractors/maven-compiler/index.test.js +189 -0
  68. package/dist/extractors/maven-compiler/index.test.js.map +1 -0
  69. package/dist/extractors/maven-surefire/index.d.ts +23 -0
  70. package/dist/extractors/maven-surefire/index.d.ts.map +1 -0
  71. package/dist/extractors/maven-surefire/index.js +292 -0
  72. package/dist/extractors/maven-surefire/index.js.map +1 -0
  73. package/dist/extractors/maven-surefire/index.test.d.ts +2 -0
  74. package/dist/extractors/maven-surefire/index.test.d.ts.map +1 -0
  75. package/dist/extractors/maven-surefire/index.test.js +163 -0
  76. package/dist/extractors/maven-surefire/index.test.js.map +1 -0
  77. package/dist/extractors/mocha/index.d.ts +17 -0
  78. package/dist/extractors/mocha/index.d.ts.map +1 -0
  79. package/dist/extractors/mocha/index.js +241 -0
  80. package/dist/extractors/mocha/index.js.map +1 -0
  81. package/dist/extractors/mocha/index.test.d.ts +7 -0
  82. package/dist/extractors/mocha/index.test.d.ts.map +1 -0
  83. package/dist/extractors/mocha/index.test.js +300 -0
  84. package/dist/extractors/mocha/index.test.js.map +1 -0
  85. package/dist/extractors/playwright/index.d.ts +17 -0
  86. package/dist/extractors/playwright/index.d.ts.map +1 -0
  87. package/dist/extractors/playwright/index.js +320 -0
  88. package/dist/extractors/playwright/index.js.map +1 -0
  89. package/dist/extractors/playwright/index.test.d.ts +7 -0
  90. package/dist/extractors/playwright/index.test.d.ts.map +1 -0
  91. package/dist/extractors/playwright/index.test.js +274 -0
  92. package/dist/extractors/playwright/index.test.js.map +1 -0
  93. package/dist/extractors/tap/index.d.ts +23 -0
  94. package/dist/extractors/tap/index.d.ts.map +1 -0
  95. package/dist/extractors/tap/index.js +352 -0
  96. package/dist/extractors/tap/index.js.map +1 -0
  97. package/dist/extractors/tap/index.test.d.ts +7 -0
  98. package/dist/extractors/tap/index.test.d.ts.map +1 -0
  99. package/dist/extractors/tap/index.test.js +100 -0
  100. package/dist/extractors/tap/index.test.js.map +1 -0
  101. package/dist/extractors/typescript/index.d.ts +17 -0
  102. package/dist/extractors/typescript/index.d.ts.map +1 -0
  103. package/dist/extractors/typescript/index.js +150 -0
  104. package/dist/extractors/typescript/index.js.map +1 -0
  105. package/dist/extractors/typescript/index.test.d.ts +9 -0
  106. package/dist/extractors/typescript/index.test.d.ts.map +1 -0
  107. package/dist/extractors/typescript/index.test.js +177 -0
  108. package/dist/extractors/typescript/index.test.js.map +1 -0
  109. package/dist/extractors/vitest/index.d.ts +17 -0
  110. package/dist/extractors/vitest/index.d.ts.map +1 -0
  111. package/dist/extractors/vitest/index.js +564 -0
  112. package/dist/extractors/vitest/index.js.map +1 -0
  113. package/dist/extractors/vitest/index.test.d.ts +9 -0
  114. package/dist/extractors/vitest/index.test.d.ts.map +1 -0
  115. package/dist/extractors/vitest/index.test.js +373 -0
  116. package/dist/extractors/vitest/index.test.js.map +1 -0
  117. package/dist/index.d.ts +27 -11
  118. package/dist/index.d.ts.map +1 -1
  119. package/dist/index.js +27 -11
  120. package/dist/index.js.map +1 -1
  121. package/dist/maven-checkstyle-extractor.d.ts +20 -0
  122. package/dist/maven-checkstyle-extractor.d.ts.map +1 -0
  123. package/dist/maven-checkstyle-extractor.js +193 -0
  124. package/dist/maven-checkstyle-extractor.js.map +1 -0
  125. package/dist/maven-compiler-extractor.d.ts +20 -0
  126. package/dist/maven-compiler-extractor.d.ts.map +1 -0
  127. package/dist/maven-compiler-extractor.js +218 -0
  128. package/dist/maven-compiler-extractor.js.map +1 -0
  129. package/dist/maven-surefire-extractor.d.ts +20 -0
  130. package/dist/maven-surefire-extractor.d.ts.map +1 -0
  131. package/dist/maven-surefire-extractor.js +228 -0
  132. package/dist/maven-surefire-extractor.js.map +1 -0
  133. package/dist/maven-utils.d.ts +24 -0
  134. package/dist/maven-utils.d.ts.map +1 -0
  135. package/dist/maven-utils.js +36 -0
  136. package/dist/maven-utils.js.map +1 -0
  137. package/dist/plugin-loader.d.ts +82 -0
  138. package/dist/plugin-loader.d.ts.map +1 -0
  139. package/dist/plugin-loader.js +200 -0
  140. package/dist/plugin-loader.js.map +1 -0
  141. package/dist/sandbox.d.ts +161 -0
  142. package/dist/sandbox.d.ts.map +1 -0
  143. package/dist/sandbox.js +254 -0
  144. package/dist/sandbox.js.map +1 -0
  145. package/dist/sandbox.test.d.ts +8 -0
  146. package/dist/sandbox.test.d.ts.map +1 -0
  147. package/dist/sandbox.test.js +395 -0
  148. package/dist/sandbox.test.js.map +1 -0
  149. package/dist/sandboxed-extractor.d.ts +46 -0
  150. package/dist/sandboxed-extractor.d.ts.map +1 -0
  151. package/dist/sandboxed-extractor.js +172 -0
  152. package/dist/sandboxed-extractor.js.map +1 -0
  153. package/dist/sandboxed-extractor.test.d.ts +5 -0
  154. package/dist/sandboxed-extractor.test.d.ts.map +1 -0
  155. package/dist/sandboxed-extractor.test.js +346 -0
  156. package/dist/sandboxed-extractor.test.js.map +1 -0
  157. package/dist/smart-extractor.d.ts +22 -10
  158. package/dist/smart-extractor.d.ts.map +1 -1
  159. package/dist/smart-extractor.js +116 -163
  160. package/dist/smart-extractor.js.map +1 -1
  161. package/dist/types.d.ts +94 -0
  162. package/dist/types.d.ts.map +1 -1
  163. package/package.json +2 -1
@@ -0,0 +1,292 @@
1
+ /**
2
+ * Maven Surefire/Failsafe Test Extractor Plugin
3
+ *
4
+ * Extracts test failures from Maven Surefire and Failsafe plugin output.
5
+ * Supports JUnit 4, JUnit 5, and AssertJ assertion failures.
6
+ *
7
+ * @package @vibe-validate/extractors
8
+ */
9
+ import { MAX_ERRORS_IN_ARRAY } from '../../result-schema.js';
10
+ /* eslint-disable sonarjs/slow-regex -- All regexes safe: Maven Surefire output is structured with limited line length */
11
+ const SUREFIRE_PATTERNS = {
12
+ // [ERROR] Tests run: 12, Failures: 8, Errors: 3, Skipped: 1
13
+ testSummary: /^\[ERROR\]\s+Tests run:\s+(\d+),\s+Failures:\s+(\d+),\s+Errors:\s+(\d+)/,
14
+ // [ERROR] com.example.FooTest.testBar:42 Expected 5 but was 3
15
+ errorShort: /^\[ERROR\]\s+([^:]+)\.([^:]+):(\d+)\s+(\w+(?:Error|Exception|Failure))?\s*(.+)$/,
16
+ // [ERROR] com.example.FooTest.testBar -- Time elapsed: 0.123 s <<< FAILURE!
17
+ errorHeader: /^\[ERROR\]\s+([^.]+)\.([^\s]+)\s+.*<<<\s+(FAILURE|ERROR)!/,
18
+ // Exception type line
19
+ exceptionType: /^([\w.]+(?:Error|Exception|AssertionError|AssertionFailedError)):\s*(.*)$/,
20
+ // "at package.Class.method(File.java:123)"
21
+ stackTraceLine: /^\s+at\s+([^(]+)\(([^:]+):(\d+)\)/,
22
+ };
23
+ /* eslint-enable sonarjs/slow-regex */
24
+ /**
25
+ * Detects if output is from Maven Surefire/Failsafe
26
+ */
27
+ export function detectMavenSurefire(output) {
28
+ const lines = output.split('\n');
29
+ let score = 0;
30
+ const foundPatterns = [];
31
+ for (const line of lines) {
32
+ if (line.includes('maven-surefire-plugin') || line.includes('maven-failsafe-plugin')) {
33
+ score += 40;
34
+ foundPatterns.push('Maven test plugin reference');
35
+ }
36
+ if (SUREFIRE_PATTERNS.testSummary.exec(line)) {
37
+ score += 40;
38
+ foundPatterns.push('Test summary (Tests run, Failures, Errors)');
39
+ }
40
+ if (line.includes('<<< FAILURE!') || line.includes('<<< ERROR!')) {
41
+ score += 20;
42
+ foundPatterns.push('Test failure markers');
43
+ }
44
+ if (line.includes('[ERROR] Failures:') || line.includes('[ERROR] Errors:')) {
45
+ score += 15;
46
+ foundPatterns.push('Test failure section headers');
47
+ }
48
+ if (/AssertionError|AssertionFailedError/.exec(line)) {
49
+ score += 10;
50
+ foundPatterns.push('JUnit assertion errors');
51
+ }
52
+ }
53
+ // Determine reason based on score
54
+ let reason;
55
+ if (score >= 70) {
56
+ reason = 'Maven Surefire/Failsafe test output detected';
57
+ }
58
+ else if (score >= 40) {
59
+ reason = 'Possible Maven test output';
60
+ }
61
+ else {
62
+ reason = 'Not Maven test output';
63
+ }
64
+ return {
65
+ confidence: Math.min(score, 100),
66
+ patterns: foundPatterns,
67
+ reason,
68
+ };
69
+ }
70
+ /**
71
+ * Extracts test failures from Maven Surefire/Failsafe output
72
+ */
73
+ // eslint-disable-next-line sonarjs/cognitive-complexity -- Complexity 43 acceptable for Maven Surefire parser (handles multiple test output formats with state machine)
74
+ export function extractMavenSurefire(output, command) {
75
+ const detection = detectMavenSurefire(output);
76
+ if (detection.confidence < 40) {
77
+ return {
78
+ summary: 'Not Maven test output',
79
+ totalErrors: 0,
80
+ errors: [],
81
+ metadata: {
82
+ detection: {
83
+ extractor: 'maven-surefire',
84
+ confidence: detection.confidence,
85
+ patterns: detection.patterns,
86
+ reason: detection.reason,
87
+ },
88
+ confidence: detection.confidence,
89
+ completeness: 100,
90
+ issues: [],
91
+ },
92
+ };
93
+ }
94
+ const failures = [];
95
+ const lines = output.split('\n');
96
+ // Extract test summary for metadata
97
+ let totalFailures = 0;
98
+ let totalErrors = 0;
99
+ for (const line of lines) {
100
+ const summaryMatch = SUREFIRE_PATTERNS.testSummary.exec(line);
101
+ if (summaryMatch) {
102
+ // totalTests would be summaryMatch[1] if needed
103
+ totalFailures = Number.parseInt(summaryMatch[2], 10);
104
+ totalErrors = Number.parseInt(summaryMatch[3], 10);
105
+ }
106
+ }
107
+ // Parse failure details
108
+ let currentFailure = null;
109
+ let inStackTrace = false;
110
+ for (const line of lines) {
111
+ // Check for error header: [ERROR] Class.method -- Time elapsed: ... <<< FAILURE!
112
+ const headerMatch = SUREFIRE_PATTERNS.errorHeader.exec(line);
113
+ if (headerMatch) {
114
+ // Save previous failure if exists
115
+ if (currentFailure?.testClass && currentFailure?.testMethod) {
116
+ failures.push(currentFailure);
117
+ }
118
+ const [, testClass, testMethod, errorType] = headerMatch;
119
+ currentFailure = {
120
+ testClass: testClass.trim(),
121
+ testMethod: testMethod.trim(),
122
+ errorType: errorType,
123
+ message: '',
124
+ stackTrace: [],
125
+ };
126
+ inStackTrace = false;
127
+ continue;
128
+ }
129
+ // Check for short error format: [ERROR] Class.method:line Message
130
+ const shortMatch = SUREFIRE_PATTERNS.errorShort.exec(line);
131
+ if (shortMatch && !currentFailure) {
132
+ const [, fullMethod, testMethod, lineStr, exceptionType, message] = shortMatch;
133
+ const testClass = fullMethod.substring(0, fullMethod.lastIndexOf('.'));
134
+ failures.push({
135
+ testClass,
136
+ testMethod,
137
+ line: Number.parseInt(lineStr, 10),
138
+ errorType: 'FAILURE',
139
+ exceptionType: exceptionType ?? undefined,
140
+ message: message.trim(),
141
+ });
142
+ continue;
143
+ }
144
+ // Parse exception type and message
145
+ if (currentFailure && !currentFailure.message) {
146
+ const exceptionMatch = SUREFIRE_PATTERNS.exceptionType.exec(line);
147
+ if (exceptionMatch) {
148
+ const [, exceptionType, message] = exceptionMatch;
149
+ currentFailure.exceptionType = exceptionType;
150
+ currentFailure.message = message.trim();
151
+ inStackTrace = true;
152
+ continue;
153
+ }
154
+ }
155
+ // Parse stack trace
156
+ if (currentFailure && inStackTrace) {
157
+ const stackMatch = SUREFIRE_PATTERNS.stackTraceLine.exec(line);
158
+ if (stackMatch) {
159
+ const [, method, file, lineStr] = stackMatch;
160
+ // Extract file and line from first stack frame
161
+ if (!currentFailure.file && file.endsWith('.java')) {
162
+ currentFailure.file = file;
163
+ currentFailure.line = Number.parseInt(lineStr, 10);
164
+ }
165
+ currentFailure.stackTrace = currentFailure.stackTrace ?? [];
166
+ currentFailure.stackTrace.push(` at ${method}(${file}:${lineStr})`);
167
+ // Limit stack trace depth
168
+ if (currentFailure.stackTrace.length >= 3) {
169
+ inStackTrace = false;
170
+ }
171
+ }
172
+ }
173
+ // End of error block
174
+ if (line.trim() === '' && currentFailure) {
175
+ inStackTrace = false;
176
+ }
177
+ }
178
+ // Save last failure
179
+ if (currentFailure?.testClass && currentFailure?.testMethod) {
180
+ failures.push(currentFailure);
181
+ }
182
+ // Convert to FormattedError format
183
+ const errors = failures.slice(0, MAX_ERRORS_IN_ARRAY).map((f) => {
184
+ const testId = `${f.testClass}.${f.testMethod}`;
185
+ let message = f.message ?? 'Test failed';
186
+ // Include exception type if available
187
+ if (f.exceptionType && !message.includes(f.exceptionType)) {
188
+ message = `${f.exceptionType}: ${message}`;
189
+ }
190
+ // Add stack trace preview (first line only)
191
+ if (f.stackTrace && f.stackTrace.length > 0) {
192
+ message += `\n${f.stackTrace[0]}`;
193
+ }
194
+ return {
195
+ file: f.file ?? `${f.testClass.replaceAll('.', '/')}.java`,
196
+ line: f.line,
197
+ message: `Test: ${testId}\n${message}`,
198
+ };
199
+ });
200
+ const failureCount = totalFailures ?? failures.filter((f) => f.errorType === 'FAILURE').length;
201
+ const errorCount = totalErrors ?? failures.filter((f) => f.errorType === 'ERROR').length;
202
+ const summary = `${failureCount + errorCount} test failure(s): ${failureCount} failures, ${errorCount} errors`;
203
+ // Generate guidance
204
+ const guidance = failures.length > 0
205
+ ? `Fix test failures. Run ${command ?? 'mvn test'} to see full details.`
206
+ : undefined;
207
+ // Create error summary
208
+ const errorSummary = errors.length > 0
209
+ ? errors.map((e, i) => `[Test ${i + 1}/${errors.length}] ${e.file}:${e.line ?? '?'}\n${e.message}`).join('\n\n')
210
+ : undefined;
211
+ return {
212
+ summary,
213
+ totalErrors: failures.length,
214
+ errors,
215
+ guidance,
216
+ errorSummary,
217
+ metadata: {
218
+ detection: {
219
+ extractor: 'maven-surefire',
220
+ confidence: detection.confidence,
221
+ patterns: detection.patterns,
222
+ reason: detection.reason,
223
+ },
224
+ confidence: 95,
225
+ completeness: 90,
226
+ issues: failures.length > 20 ? ['Many test failures - output may be truncated'] : [],
227
+ },
228
+ };
229
+ }
230
+ /**
231
+ * Maven Surefire/Failsafe Extractor Plugin
232
+ */
233
+ const mavenSurefireExtractor = {
234
+ metadata: {
235
+ name: 'maven-surefire',
236
+ version: '1.0.0',
237
+ author: 'Jeff Dutton <jeff@duckcreek.com>',
238
+ description: 'Extracts test failures from Maven Surefire and Failsafe plugin output',
239
+ repository: 'https://github.com/jdutton/vibe-validate',
240
+ tags: ['maven', 'java', 'junit', 'testing', 'surefire', 'failsafe'],
241
+ },
242
+ hints: {
243
+ required: ['[ERROR]', 'Tests run:'],
244
+ anyOf: ['FAILURE!', 'ERROR!', 'maven-surefire-plugin', 'maven-failsafe-plugin'],
245
+ },
246
+ priority: 65,
247
+ detect: detectMavenSurefire,
248
+ extract: extractMavenSurefire,
249
+ samples: [
250
+ {
251
+ name: 'basic-assertion-failure',
252
+ description: 'Simple JUnit assertion failure',
253
+ input: `[ERROR] Tests run: 1, Failures: 1, Errors: 0
254
+ [ERROR] com.example.FooTest.testBar -- Time elapsed: 0.123 s <<< FAILURE!
255
+ java.lang.AssertionError: Expected 5 but was 3
256
+ \tat com.example.FooTest.testBar(FooTest.java:42)
257
+ \tat java.base/java.lang.reflect.Method.invoke(Method.java:565)`,
258
+ expected: {
259
+ totalErrors: 1,
260
+ },
261
+ },
262
+ {
263
+ name: 'null-pointer-exception',
264
+ description: 'NullPointerException during test',
265
+ input: `[ERROR] Tests run: 1, Failures: 0, Errors: 1
266
+ [ERROR] com.example.FooTest.testNull -- Time elapsed: 0.01 s <<< ERROR!
267
+ java.lang.NullPointerException: Cannot invoke "String.length()" because "value" is null
268
+ \tat com.example.FooTest.testNull(FooTest.java:77)`,
269
+ expected: {
270
+ totalErrors: 1,
271
+ },
272
+ },
273
+ {
274
+ name: 'assertj-failure',
275
+ description: 'AssertJ assertion with multi-line message',
276
+ input: `[ERROR] Tests run: 1, Failures: 1, Errors: 0
277
+ [ERROR] com.example.Test.testAssertJ -- <<< FAILURE!
278
+ java.lang.AssertionError:
279
+
280
+ Expecting actual:
281
+ "Hello World"
282
+ to contain:
283
+ "Goodbye"
284
+ \tat com.example.Test.testAssertJ(Test.java:25)`,
285
+ expected: {
286
+ totalErrors: 1,
287
+ },
288
+ },
289
+ ],
290
+ };
291
+ export default mavenSurefireExtractor;
292
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extractors/maven-surefire/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAuB7D,yHAAyH;AACzH,MAAM,iBAAiB,GAAG;IACxB,4DAA4D;IAC5D,WAAW,EAAE,yEAAyE;IAEtF,8DAA8D;IAC9D,UAAU,EACR,iFAAiF;IAEnF,4EAA4E;IAC5E,WAAW,EAAE,2DAA2D;IAExE,sBAAsB;IACtB,aAAa,EAAE,2EAA2E;IAE1F,2CAA2C;IAC3C,cAAc,EAAE,mCAAmC;CACpD,CAAC;AACF,sCAAsC;AAEtC;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;YACrF,KAAK,IAAI,EAAE,CAAC;YACZ,aAAa,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,KAAK,IAAI,EAAE,CAAC;YACZ,aAAa,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACjE,KAAK,IAAI,EAAE,CAAC;YACZ,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC3E,KAAK,IAAI,EAAE,CAAC;YACZ,aAAa,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,qCAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrD,KAAK,IAAI,EAAE,CAAC;YACZ,aAAa,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,IAAI,MAAc,CAAC;IACnB,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAChB,MAAM,GAAG,8CAA8C,CAAC;IAC1D,CAAC;SAAM,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QACvB,MAAM,GAAG,4BAA4B,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,uBAAuB,CAAC;IACnC,CAAC;IAED,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;QAChC,QAAQ,EAAE,aAAa;QACvB,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,wKAAwK;AACxK,MAAM,UAAU,oBAAoB,CAClC,MAAc,EACd,OAAgB;IAEhB,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE9C,IAAI,SAAS,CAAC,UAAU,GAAG,EAAE,EAAE,CAAC;QAC9B,OAAO;YACL,OAAO,EAAE,uBAAuB;YAChC,WAAW,EAAE,CAAC;YACd,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE;gBACR,SAAS,EAAE;oBACT,SAAS,EAAE,gBAAgB;oBAC3B,UAAU,EAAE,SAAS,CAAC,UAAU;oBAChC,QAAQ,EAAE,SAAS,CAAC,QAAQ;oBAC5B,MAAM,EAAE,SAAS,CAAC,MAAM;iBACzB;gBACD,UAAU,EAAE,SAAS,CAAC,UAAU;gBAChC,YAAY,EAAE,GAAG;gBACjB,MAAM,EAAE,EAAE;aACX;SACF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEjC,oCAAoC;IACpC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,IAAI,YAAY,EAAE,CAAC;YACjB,gDAAgD;YAChD,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrD,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,IAAI,cAAc,GAAgC,IAAI,CAAC;IACvD,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAEzB,iFAAiF;QACjF,MAAM,WAAW,GAAG,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,WAAW,EAAE,CAAC;YAChB,kCAAkC;YAClC,IAAI,cAAc,EAAE,SAAS,IAAI,cAAc,EAAE,UAAU,EAAE,CAAC;gBAC5D,QAAQ,CAAC,IAAI,CAAC,cAA6B,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,GAAG,WAAW,CAAC;YACzD,cAAc,GAAG;gBACf,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE;gBAC3B,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE;gBAC7B,SAAS,EAAE,SAAgC;gBAC3C,OAAO,EAAE,EAAE;gBACX,UAAU,EAAE,EAAE;aACf,CAAC;YACF,YAAY,GAAG,KAAK,CAAC;YACrB,SAAS;QACX,CAAC;QAED,kEAAkE;QAClE,MAAM,UAAU,GAAG,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,UAAU,IAAI,CAAC,cAAc,EAAE,CAAC;YAClC,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,GAAG,UAAU,CAAC;YAC/E,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YAEvE,QAAQ,CAAC,IAAI,CAAC;gBACZ,SAAS;gBACT,UAAU;gBACV,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;gBAClC,SAAS,EAAE,SAAS;gBACpB,aAAa,EAAE,aAAa,IAAI,SAAS;gBACzC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;aACxB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,mCAAmC;QACnC,IAAI,cAAc,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;YAC9C,MAAM,cAAc,GAAG,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClE,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,GAAG,cAAc,CAAC;gBAClD,cAAc,CAAC,aAAa,GAAG,aAAa,CAAC;gBAC7C,cAAc,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;gBACxC,YAAY,GAAG,IAAI,CAAC;gBACpB,SAAS;YACX,CAAC;QACH,CAAC;QAED,oBAAoB;QACpB,IAAI,cAAc,IAAI,YAAY,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/D,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,UAAU,CAAC;gBAE7C,+CAA+C;gBAC/C,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBACnD,cAAc,CAAC,IAAI,GAAG,IAAI,CAAC;oBAC3B,cAAc,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACrD,CAAC;gBAED,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,UAAU,IAAI,EAAE,CAAC;gBAC5D,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,MAAM,IAAI,IAAI,IAAI,OAAO,GAAG,CAAC,CAAC;gBAErE,0BAA0B;gBAC1B,IAAI,cAAc,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;oBAC1C,YAAY,GAAG,KAAK,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,cAAc,EAAE,CAAC;YACzC,YAAY,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,cAAc,EAAE,SAAS,IAAI,cAAc,EAAE,UAAU,EAAE,CAAC;QAC5D,QAAQ,CAAC,IAAI,CAAC,cAA6B,CAAC,CAAC;IAC/C,CAAC;IAED,mCAAmC;IACnC,MAAM,MAAM,GAAqB,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAChF,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;QAChD,IAAI,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,aAAa,CAAC;QAEzC,sCAAsC;QACtC,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC;YAC1D,OAAO,GAAG,GAAG,CAAC,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;QAC7C,CAAC;QAED,4CAA4C;QAC5C,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,OAAO,IAAI,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACpC,CAAC;QAED,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO;YAC1D,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,SAAS,MAAM,KAAK,OAAO,EAAE;SACvC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,aAAa,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAC/F,MAAM,UAAU,GAAG,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IAEzF,MAAM,OAAO,GAAG,GAAG,YAAY,GAAG,UAAU,qBAAqB,YAAY,cAAc,UAAU,SAAS,CAAC;IAE/G,oBAAoB;IACpB,MAAM,QAAQ,GACZ,QAAQ,CAAC,MAAM,GAAG,CAAC;QACjB,CAAC,CAAC,0BAA0B,OAAO,IAAI,UAAU,uBAAuB;QACxE,CAAC,CAAC,SAAS,CAAC;IAEhB,uBAAuB;IACvB,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC;QACpC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QAChH,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACL,OAAO;QACP,WAAW,EAAE,QAAQ,CAAC,MAAM;QAC5B,MAAM;QACN,QAAQ;QACR,YAAY;QACZ,QAAQ,EAAE;YACR,SAAS,EAAE;gBACT,SAAS,EAAE,gBAAgB;gBAC3B,UAAU,EAAE,SAAS,CAAC,UAAU;gBAChC,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,MAAM,EAAE,SAAS,CAAC,MAAM;aACzB;YACD,UAAU,EAAE,EAAE;YACd,YAAY,EAAE,EAAE;YAChB,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,8CAA8C,CAAC,CAAC,CAAC,CAAC,EAAE;SACrF;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,sBAAsB,GAAoB;IAC9C,QAAQ,EAAE;QACR,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,OAAO;QAChB,MAAM,EAAE,kCAAkC;QAC1C,WAAW,EAAE,uEAAuE;QACpF,UAAU,EAAE,0CAA0C;QACtD,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC;KACpE;IAED,KAAK,EAAE;QACL,QAAQ,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC;QACnC,KAAK,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,uBAAuB,EAAE,uBAAuB,CAAC;KAChF;IAED,QAAQ,EAAE,EAAE;IAEZ,MAAM,EAAE,mBAAmB;IAC3B,OAAO,EAAE,oBAAoB;IAE7B,OAAO,EAAE;QACP;YACE,IAAI,EAAE,yBAAyB;YAC/B,WAAW,EAAE,gCAAgC;YAC7C,KAAK,EAAE;;;;gEAImD;YAC1D,QAAQ,EAAE;gBACR,WAAW,EAAE,CAAC;aACf;SACF;QACD;YACE,IAAI,EAAE,wBAAwB;YAC9B,WAAW,EAAE,kCAAkC;YAC/C,KAAK,EAAE;;;mDAGsC;YAC7C,QAAQ,EAAE;gBACR,WAAW,EAAE,CAAC;aACf;SACF;QACD;YACE,IAAI,EAAE,iBAAiB;YACvB,WAAW,EAAE,2CAA2C;YACxD,KAAK,EAAE;;;;;;;;gDAQmC;YAC1C,QAAQ,EAAE;gBACR,WAAW,EAAE,CAAC;aACf;SACF;KACF;CACF,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../src/extractors/maven-surefire/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,163 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import mavenSurefireExtractor from './index.js';
3
+ describe('Maven Surefire Extractor Plugin', () => {
4
+ describe('metadata', () => {
5
+ it('should have correct plugin metadata', () => {
6
+ expect(mavenSurefireExtractor.metadata.name).toBe('maven-surefire');
7
+ expect(mavenSurefireExtractor.metadata.version).toBe('1.0.0');
8
+ expect(mavenSurefireExtractor.metadata.tags).toContain('maven');
9
+ expect(mavenSurefireExtractor.metadata.tags).toContain('junit');
10
+ });
11
+ it('should have hints for fast filtering', () => {
12
+ expect(mavenSurefireExtractor.hints).toBeDefined();
13
+ expect(mavenSurefireExtractor.hints?.required).toContain('[ERROR]');
14
+ expect(mavenSurefireExtractor.hints?.required).toContain('Tests run:');
15
+ expect(mavenSurefireExtractor.hints?.anyOf).toBeDefined();
16
+ });
17
+ });
18
+ describe('detect', () => {
19
+ it('should detect Maven Surefire output with high confidence', () => {
20
+ const output = `[INFO] Running tests...
21
+ [ERROR] Tests run: 10, Failures: 3, Errors: 1, Skipped: 0
22
+ [ERROR] com.example.FooTest.testBar -- Time elapsed: 0.123 s <<< FAILURE!
23
+ java.lang.AssertionError: Expected 5 but was 3`;
24
+ const result = mavenSurefireExtractor.detect(output);
25
+ expect(result.confidence).toBeGreaterThanOrEqual(70);
26
+ expect(result.patterns).toContain('Test summary (Tests run, Failures, Errors)');
27
+ expect(result.patterns).toContain('Test failure markers');
28
+ expect(result.reason).toContain('Maven Surefire');
29
+ });
30
+ it('should detect JUnit assertion errors', () => {
31
+ const output = `[ERROR] Tests run: 5, Failures: 2, Errors: 0
32
+ [ERROR] testFoo -- Time elapsed: 0.1 s <<< FAILURE!
33
+ org.opentest4j.AssertionFailedError: expected: "foo" but was: "bar"`;
34
+ const result = mavenSurefireExtractor.detect(output);
35
+ expect(result.confidence).toBeGreaterThanOrEqual(70);
36
+ expect(result.patterns).toContain('JUnit assertion errors');
37
+ });
38
+ it('should have low confidence for non-Surefire output', () => {
39
+ const output = `Some random output
40
+ No test markers here`;
41
+ const result = mavenSurefireExtractor.detect(output);
42
+ expect(result.confidence).toBeLessThan(40);
43
+ });
44
+ });
45
+ describe('extract', () => {
46
+ it('should extract test summary', () => {
47
+ const output = `[ERROR] Tests run: 10, Failures: 3, Errors: 1, Skipped: 1`;
48
+ const result = mavenSurefireExtractor.extract(output);
49
+ expect(result.summary).toContain('3 failures, 1 errors');
50
+ });
51
+ it('should extract test failures with stack traces', () => {
52
+ const output = `[ERROR] Tests run: 1, Failures: 1, Errors: 0
53
+ [ERROR] com.example.FooTest.testBar -- Time elapsed: 0.123 s <<< FAILURE!
54
+ java.lang.AssertionError: Expected 5 but was 3
55
+ \tat com.example.FooTest.testBar(FooTest.java:42)
56
+ \tat java.base/java.lang.reflect.Method.invoke(Method.java:565)`;
57
+ const result = mavenSurefireExtractor.extract(output);
58
+ expect(result.totalErrors).toBeGreaterThan(0);
59
+ if (result.errors.length > 0) {
60
+ expect(result.errors[0].file).toContain('FooTest.java');
61
+ expect(result.errors[0].message).toContain('testBar');
62
+ }
63
+ });
64
+ it('should extract NullPointerException errors', () => {
65
+ const output = `[ERROR] Tests run: 1, Failures: 0, Errors: 1
66
+ [ERROR] com.example.FooTest.testNull -- Time elapsed: 0.01 s <<< ERROR!
67
+ java.lang.NullPointerException: Cannot invoke "String.length()" because "value" is null
68
+ \tat com.example.FooTest.testNull(FooTest.java:77)`;
69
+ const result = mavenSurefireExtractor.extract(output);
70
+ expect(result.totalErrors).toBeGreaterThan(0);
71
+ if (result.errors.length > 0) {
72
+ expect(result.errors[0].message).toContain('NullPointerException');
73
+ expect(result.errors[0].line).toBe(77);
74
+ }
75
+ });
76
+ it('should limit errors to MAX_ERRORS_IN_ARRAY', () => {
77
+ // Create 15 test failures
78
+ const failures = Array.from({ length: 15 }, (_, i) => `[ERROR] com.example.Test.test${i} -- Time elapsed: 0.1 s <<< FAILURE!\njava.lang.AssertionError: Test ${i} failed`).join('\n\n');
79
+ const output = `[ERROR] Tests run: 15, Failures: 15, Errors: 0\n${failures}`;
80
+ const result = mavenSurefireExtractor.extract(output);
81
+ expect(result.totalErrors).toBe(15); // All counted
82
+ expect(result.errors.length).toBeLessThanOrEqual(10); // Array limited
83
+ });
84
+ it('should provide guidance', () => {
85
+ const output = `[ERROR] Tests run: 5, Failures: 2, Errors: 0
86
+ [ERROR] com.example.Test.testFoo -- <<< FAILURE!`;
87
+ const result = mavenSurefireExtractor.extract(output);
88
+ expect(result.guidance).toContain('Fix test failures');
89
+ expect(result.guidance).toContain('mvn test');
90
+ });
91
+ it('should extract exception types correctly', () => {
92
+ const output = `[ERROR] Tests run: 1, Failures: 0, Errors: 1
93
+ [ERROR] com.example.Test.testException -- <<< ERROR!
94
+ java.lang.IllegalArgumentException: Invalid format: expected 'XXX' but got 'invalid'
95
+ \tat com.example.Test.testException(Test.java:50)`;
96
+ const result = mavenSurefireExtractor.extract(output);
97
+ expect(result.totalErrors).toBeGreaterThan(0);
98
+ if (result.errors.length > 0) {
99
+ expect(result.errors[0].message).toContain('IllegalArgumentException');
100
+ expect(result.errors[0].message).toContain('Invalid format');
101
+ }
102
+ });
103
+ it('should handle AssertJ assertion errors', () => {
104
+ const output = `[ERROR] Tests run: 1, Failures: 1, Errors: 0
105
+ [ERROR] com.example.Test.testAssertJ -- <<< FAILURE!
106
+ java.lang.AssertionError:
107
+
108
+ Expecting actual:
109
+ "Hello World"
110
+ to contain:
111
+ "Goodbye"
112
+ \tat com.example.Test.testAssertJ(Test.java:25)`;
113
+ const result = mavenSurefireExtractor.extract(output);
114
+ expect(result.totalErrors).toBeGreaterThan(0);
115
+ if (result.errors.length > 0) {
116
+ expect(result.errors[0].message).toContain('AssertionError');
117
+ // Line number extraction is best-effort from stack traces
118
+ if (result.errors[0].line) {
119
+ expect(result.errors[0].line).toBe(25);
120
+ }
121
+ }
122
+ });
123
+ it('should return low confidence for non-test output', () => {
124
+ const output = `[INFO] Building project...
125
+ [INFO] Success!`;
126
+ const result = mavenSurefireExtractor.extract(output);
127
+ expect(result.totalErrors).toBe(0);
128
+ expect(result.summary).toContain('Not Maven test output');
129
+ expect(result.metadata?.detection?.confidence).toBeLessThan(40);
130
+ });
131
+ });
132
+ describe('samples', () => {
133
+ it('should have test samples', () => {
134
+ expect(mavenSurefireExtractor.samples).toBeDefined();
135
+ expect(mavenSurefireExtractor.samples.length).toBeGreaterThan(0);
136
+ });
137
+ it('should validate basic-assertion-failure sample', () => {
138
+ const sample = mavenSurefireExtractor.samples?.find((s) => s.name === 'basic-assertion-failure');
139
+ expect(sample).toBeDefined();
140
+ if (sample && 'input' in sample && sample.input) {
141
+ const result = mavenSurefireExtractor.extract(sample.input);
142
+ expect(result.totalErrors).toBe(sample.expected.totalErrors);
143
+ }
144
+ });
145
+ it('should validate null-pointer-exception sample', () => {
146
+ const sample = mavenSurefireExtractor.samples?.find((s) => s.name === 'null-pointer-exception');
147
+ expect(sample).toBeDefined();
148
+ if (sample && 'input' in sample && sample.input) {
149
+ const result = mavenSurefireExtractor.extract(sample.input);
150
+ expect(result.totalErrors).toBe(sample.expected.totalErrors);
151
+ }
152
+ });
153
+ it('should validate assertj-failure sample', () => {
154
+ const sample = mavenSurefireExtractor.samples?.find((s) => s.name === 'assertj-failure');
155
+ expect(sample).toBeDefined();
156
+ if (sample && 'input' in sample && sample.input) {
157
+ const result = mavenSurefireExtractor.extract(sample.input);
158
+ expect(result.totalErrors).toBe(sample.expected.totalErrors);
159
+ }
160
+ });
161
+ });
162
+ });
163
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/extractors/maven-surefire/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Mocha Error Extractor Plugin
3
+ *
4
+ * Parses and formats Mocha test output for LLM consumption.
5
+ *
6
+ * @package @vibe-validate/extractors
7
+ */
8
+ import type { ExtractorPlugin } from '../../types.js';
9
+ /**
10
+ * Mocha Error Extractor Plugin
11
+ *
12
+ * Extracts Mocha test framework errors with 85% confidence.
13
+ * Parses test hierarchies, error types, and stack traces.
14
+ */
15
+ declare const mochaPlugin: ExtractorPlugin;
16
+ export default mochaPlugin;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extractors/mocha/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,gBAAgB,CAAC;AAgPxB;;;;;GAKG;AACH,QAAA,MAAM,WAAW,EAAE,eAiBlB,CAAC;AAEF,eAAe,WAAW,CAAC"}