ado-sync 0.1.29 → 0.1.31
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/README.md +469 -28
- package/dist/ai/summarizer.d.ts +73 -0
- package/dist/ai/summarizer.js +789 -0
- package/dist/ai/summarizer.js.map +1 -0
- package/dist/azure/test-cases.js +17 -2
- package/dist/azure/test-cases.js.map +1 -1
- package/dist/cli.js +29 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/parsers/csv.d.ts +13 -3
- package/dist/parsers/csv.js +87 -9
- package/dist/parsers/csv.js.map +1 -1
- package/dist/parsers/dart.d.ts +31 -0
- package/dist/parsers/dart.js +245 -0
- package/dist/parsers/dart.js.map +1 -0
- package/dist/parsers/excel.js +47 -8
- package/dist/parsers/excel.js.map +1 -1
- package/dist/parsers/javascript.d.ts +17 -7
- package/dist/parsers/javascript.js +20 -9
- package/dist/parsers/javascript.js.map +1 -1
- package/dist/parsers/swift.d.ts +34 -0
- package/dist/parsers/swift.js +250 -0
- package/dist/parsers/swift.js.map +1 -0
- package/dist/parsers/testcafe.d.ts +32 -0
- package/dist/parsers/testcafe.js +231 -0
- package/dist/parsers/testcafe.js.map +1 -0
- package/dist/sync/engine.d.ts +4 -1
- package/dist/sync/engine.js +48 -2
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync/writeback.d.ts +6 -7
- package/dist/sync/writeback.js +22 -7
- package/dist/sync/writeback.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/docs/advanced.md +140 -0
- package/docs/configuration.md +1 -1
- package/docs/publish-test-results.md +48 -16
- package/docs/spec-formats.md +549 -0
- package/package.json +3 -2
package/dist/parsers/csv.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csv.js","sourceRoot":"","sources":["../../src/parsers/csv.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyDH,oCAcC;
|
|
1
|
+
{"version":3,"file":"csv.js","sourceRoot":"","sources":["../../src/parsers/csv.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dart / Flutter test parser for azure-test-sync.
|
|
3
|
+
*
|
|
4
|
+
* Handles Flutter widget tests and unit tests written with the
|
|
5
|
+
* `flutter_test` / `test` packages.
|
|
6
|
+
*
|
|
7
|
+
* Detected test functions:
|
|
8
|
+
* testWidgets('title', (WidgetTester tester) async { ... })
|
|
9
|
+
* test('title', () { ... })
|
|
10
|
+
* testUI('title', () { ... }) ← integration_test alias
|
|
11
|
+
*
|
|
12
|
+
* Detected group blocks (used as the describe / suite equivalent):
|
|
13
|
+
* group('Group title', () { ... })
|
|
14
|
+
*
|
|
15
|
+
* Source mapping:
|
|
16
|
+
* /// Dart doc comment above testWidgets → TC Title (first non-numbered line)
|
|
17
|
+
* JSDoc /** ... * / doc comment → TC Title + Steps (same format)
|
|
18
|
+
* Numbered lines "N. text" → TC Steps (action)
|
|
19
|
+
* "N. Check: text" → TC Steps (expected result column)
|
|
20
|
+
* // @tags: smoke, regression → TC Tags (comma-separated list)
|
|
21
|
+
* // @smoke → TC Tag (single-word shorthand)
|
|
22
|
+
* // @{tagPrefix}:N → Azure TC ID (written back after push)
|
|
23
|
+
* {fileBasename} > {group} > {title} → automatedTestName
|
|
24
|
+
*
|
|
25
|
+
* ID writeback:
|
|
26
|
+
* Inserts / updates // @tc:12345 immediately above the testWidgets() / test() line.
|
|
27
|
+
*
|
|
28
|
+
* Path-based auto-tagging: directory segments starting with '@' become tags.
|
|
29
|
+
*/
|
|
30
|
+
import { LinkConfig, ParsedTest } from '../types';
|
|
31
|
+
export declare function parseDartFile(filePath: string, tagPrefix: string, linkConfigs?: LinkConfig[]): ParsedTest[];
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Dart / Flutter test parser for azure-test-sync.
|
|
4
|
+
*
|
|
5
|
+
* Handles Flutter widget tests and unit tests written with the
|
|
6
|
+
* `flutter_test` / `test` packages.
|
|
7
|
+
*
|
|
8
|
+
* Detected test functions:
|
|
9
|
+
* testWidgets('title', (WidgetTester tester) async { ... })
|
|
10
|
+
* test('title', () { ... })
|
|
11
|
+
* testUI('title', () { ... }) ← integration_test alias
|
|
12
|
+
*
|
|
13
|
+
* Detected group blocks (used as the describe / suite equivalent):
|
|
14
|
+
* group('Group title', () { ... })
|
|
15
|
+
*
|
|
16
|
+
* Source mapping:
|
|
17
|
+
* /// Dart doc comment above testWidgets → TC Title (first non-numbered line)
|
|
18
|
+
* JSDoc /** ... * / doc comment → TC Title + Steps (same format)
|
|
19
|
+
* Numbered lines "N. text" → TC Steps (action)
|
|
20
|
+
* "N. Check: text" → TC Steps (expected result column)
|
|
21
|
+
* // @tags: smoke, regression → TC Tags (comma-separated list)
|
|
22
|
+
* // @smoke → TC Tag (single-word shorthand)
|
|
23
|
+
* // @{tagPrefix}:N → Azure TC ID (written back after push)
|
|
24
|
+
* {fileBasename} > {group} > {title} → automatedTestName
|
|
25
|
+
*
|
|
26
|
+
* ID writeback:
|
|
27
|
+
* Inserts / updates // @tc:12345 immediately above the testWidgets() / test() line.
|
|
28
|
+
*
|
|
29
|
+
* Path-based auto-tagging: directory segments starting with '@' become tags.
|
|
30
|
+
*/
|
|
31
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
32
|
+
if (k2 === undefined) k2 = k;
|
|
33
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
34
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
35
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
36
|
+
}
|
|
37
|
+
Object.defineProperty(o, k2, desc);
|
|
38
|
+
}) : (function(o, m, k, k2) {
|
|
39
|
+
if (k2 === undefined) k2 = k;
|
|
40
|
+
o[k2] = m[k];
|
|
41
|
+
}));
|
|
42
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
43
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
44
|
+
}) : function(o, v) {
|
|
45
|
+
o["default"] = v;
|
|
46
|
+
});
|
|
47
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
48
|
+
var ownKeys = function(o) {
|
|
49
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
50
|
+
var ar = [];
|
|
51
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
52
|
+
return ar;
|
|
53
|
+
};
|
|
54
|
+
return ownKeys(o);
|
|
55
|
+
};
|
|
56
|
+
return function (mod) {
|
|
57
|
+
if (mod && mod.__esModule) return mod;
|
|
58
|
+
var result = {};
|
|
59
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
60
|
+
__setModuleDefault(result, mod);
|
|
61
|
+
return result;
|
|
62
|
+
};
|
|
63
|
+
})();
|
|
64
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
65
|
+
exports.parseDartFile = parseDartFile;
|
|
66
|
+
const fs = __importStar(require("fs"));
|
|
67
|
+
const path = __importStar(require("path"));
|
|
68
|
+
const shared_1 = require("./shared");
|
|
69
|
+
// ─── Test / group detection ────────────────────────────────────────────────────
|
|
70
|
+
const TEST_CALL_RE = /^(?:testWidgets|testUI|test)\s*\(/;
|
|
71
|
+
const TEST_TITLE_RE = /^(?:testWidgets|testUI|test)\s*\(\s*(['"`])((?:\\.|[^\\])*?)\1/;
|
|
72
|
+
const GROUP_TITLE_RE = /^group\s*\(\s*(['"`])((?:\\.|[^\\])*?)\1/;
|
|
73
|
+
// ─── Indentation helpers ──────────────────────────────────────────────────────
|
|
74
|
+
function getIndentLength(line) {
|
|
75
|
+
return (line.match(/^(\s*)/) ?? ['', ''])[1].length;
|
|
76
|
+
}
|
|
77
|
+
// ─── Enclosing group blocks ───────────────────────────────────────────────────
|
|
78
|
+
function findEnclosingGroups(lines, testLineIdx) {
|
|
79
|
+
const groups = [];
|
|
80
|
+
let targetIndent = getIndentLength(lines[testLineIdx]);
|
|
81
|
+
for (let i = testLineIdx - 1; i >= 0; i--) {
|
|
82
|
+
const line = lines[i];
|
|
83
|
+
const trimmed = line.trim();
|
|
84
|
+
if (!trimmed)
|
|
85
|
+
continue;
|
|
86
|
+
const lineIndent = getIndentLength(line);
|
|
87
|
+
if (lineIndent < targetIndent) {
|
|
88
|
+
const m = trimmed.match(GROUP_TITLE_RE);
|
|
89
|
+
if (m) {
|
|
90
|
+
groups.unshift(m[2].replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/\\`/g, '`'));
|
|
91
|
+
targetIndent = lineIndent;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return groups;
|
|
96
|
+
}
|
|
97
|
+
// ─── Doc comment extraction ───────────────────────────────────────────────────
|
|
98
|
+
/**
|
|
99
|
+
* Extract Dart doc comments above testWidgets() / test().
|
|
100
|
+
* Supports triple-slash (///) Dart idiomatic style and block (/* * /) style.
|
|
101
|
+
*/
|
|
102
|
+
function extractDocBefore(lines, testLineIdx) {
|
|
103
|
+
let i = testLineIdx - 1;
|
|
104
|
+
// Skip blank lines and regular single-line comments
|
|
105
|
+
while (i >= 0) {
|
|
106
|
+
const t = lines[i].trim();
|
|
107
|
+
if (t === '' || (t.startsWith('//') && !t.startsWith('///'))) {
|
|
108
|
+
i--;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
if (i < 0)
|
|
114
|
+
return [];
|
|
115
|
+
// /// triple-slash style (Dart idiomatic)
|
|
116
|
+
if (lines[i].trim().startsWith('///')) {
|
|
117
|
+
const docLines = [];
|
|
118
|
+
while (i >= 0 && lines[i].trim().startsWith('///')) {
|
|
119
|
+
docLines.unshift(lines[i].trim().replace(/^\/\/\/\s?/, ''));
|
|
120
|
+
i--;
|
|
121
|
+
}
|
|
122
|
+
return docLines.filter((l) => l !== '');
|
|
123
|
+
}
|
|
124
|
+
// /** ... */ block style
|
|
125
|
+
if (!lines[i].trim().endsWith('*/'))
|
|
126
|
+
return [];
|
|
127
|
+
const raw = [];
|
|
128
|
+
raw.unshift(lines[i]);
|
|
129
|
+
i--;
|
|
130
|
+
while (i >= 0) {
|
|
131
|
+
raw.unshift(lines[i]);
|
|
132
|
+
if (lines[i].trim().startsWith('/**') || lines[i].trim().startsWith('/*'))
|
|
133
|
+
break;
|
|
134
|
+
i--;
|
|
135
|
+
}
|
|
136
|
+
return raw
|
|
137
|
+
.map((l) => l
|
|
138
|
+
.replace(/^\s*\/\*\*?\s?/, '')
|
|
139
|
+
.replace(/\s*\*\/\s*$/, '')
|
|
140
|
+
.replace(/^\s*\*\s?/, '')
|
|
141
|
+
.trim())
|
|
142
|
+
.filter((l) => l !== '');
|
|
143
|
+
}
|
|
144
|
+
function extractCommentMetadataAbove(lines, testLineIdx, tagPrefix) {
|
|
145
|
+
const tags = [];
|
|
146
|
+
let azureId;
|
|
147
|
+
const idRe = new RegExp(`//\\s*@${tagPrefix}:(\\d+)`);
|
|
148
|
+
const tagsListRe = /\/\/\s*@tags?\s*:\s*(.+)/i;
|
|
149
|
+
const singleTagRe = /\/\/\s*@(\w+)\s*$/;
|
|
150
|
+
for (let i = testLineIdx - 1; i >= 0 && i >= testLineIdx - 25; i--) {
|
|
151
|
+
const trimmed = lines[i].trim();
|
|
152
|
+
if (trimmed === '')
|
|
153
|
+
break;
|
|
154
|
+
if (!trimmed.startsWith('//') && !trimmed.startsWith('*') && !trimmed.startsWith('/*'))
|
|
155
|
+
break;
|
|
156
|
+
const idMatch = trimmed.match(idRe);
|
|
157
|
+
if (idMatch && azureId === undefined) {
|
|
158
|
+
azureId = parseInt(idMatch[1], 10);
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
const tagsMatch = trimmed.match(tagsListRe);
|
|
162
|
+
if (tagsMatch) {
|
|
163
|
+
tags.push(...tagsMatch[1].split(',').map((t) => t.trim()).filter(Boolean));
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
const singleTag = trimmed.match(singleTagRe);
|
|
167
|
+
if (singleTag && singleTag[1] !== tagPrefix) {
|
|
168
|
+
tags.push(singleTag[1]);
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return { azureId, tags };
|
|
173
|
+
}
|
|
174
|
+
// ─── Doc → title + steps ─────────────────────────────────────────────────────
|
|
175
|
+
const NUMBERED_STEP_RE = /^\d+\.\s+(.+)$/;
|
|
176
|
+
const CHECK_RE = /^[Cc]heck:\s+(.+)$/;
|
|
177
|
+
const META_RE = /^(?:test\s+case|user\s+story)[\s:]/i;
|
|
178
|
+
function parseSummary(docLines, fallbackTitle) {
|
|
179
|
+
let title = '';
|
|
180
|
+
const steps = [];
|
|
181
|
+
for (const line of docLines) {
|
|
182
|
+
if (!line || META_RE.test(line))
|
|
183
|
+
continue;
|
|
184
|
+
const numMatch = NUMBERED_STEP_RE.exec(line);
|
|
185
|
+
if (numMatch) {
|
|
186
|
+
const content = numMatch[1].trim();
|
|
187
|
+
const checkMatch = CHECK_RE.exec(content);
|
|
188
|
+
if (checkMatch) {
|
|
189
|
+
steps.push({ keyword: 'Then', text: checkMatch[1].trim() });
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
steps.push({ keyword: 'Step', text: content });
|
|
193
|
+
}
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (!title)
|
|
197
|
+
title = line;
|
|
198
|
+
}
|
|
199
|
+
return { title: title || fallbackTitle, steps };
|
|
200
|
+
}
|
|
201
|
+
// ─── Public parser ────────────────────────────────────────────────────────────
|
|
202
|
+
function parseDartFile(filePath, tagPrefix, linkConfigs) {
|
|
203
|
+
const source = fs.readFileSync(filePath, 'utf8');
|
|
204
|
+
const lines = source.split('\n');
|
|
205
|
+
// Strip _test.dart / .dart suffixes for a clean base name
|
|
206
|
+
const fileBaseName = path.basename(filePath)
|
|
207
|
+
.replace(/_test\.dart$/, '')
|
|
208
|
+
.replace(/\.dart$/, '');
|
|
209
|
+
const pathTags = (0, shared_1.extractPathTags)(filePath);
|
|
210
|
+
const results = [];
|
|
211
|
+
for (let i = 0; i < lines.length; i++) {
|
|
212
|
+
const trimmed = lines[i].trim();
|
|
213
|
+
if (!TEST_CALL_RE.test(trimmed))
|
|
214
|
+
continue;
|
|
215
|
+
const testLineIdx = i;
|
|
216
|
+
const m = trimmed.match(TEST_TITLE_RE);
|
|
217
|
+
if (!m)
|
|
218
|
+
continue;
|
|
219
|
+
const callTitle = m[2]
|
|
220
|
+
.replace(/\\'/g, "'")
|
|
221
|
+
.replace(/\\"/g, '"')
|
|
222
|
+
.replace(/\\`/g, '`');
|
|
223
|
+
if (!callTitle)
|
|
224
|
+
continue;
|
|
225
|
+
const docLines = extractDocBefore(lines, testLineIdx);
|
|
226
|
+
const { azureId, tags: cTags } = extractCommentMetadataAbove(lines, testLineIdx, tagPrefix);
|
|
227
|
+
const groups = findEnclosingGroups(lines, testLineIdx);
|
|
228
|
+
const allTags = [...new Set([...pathTags, ...cTags])];
|
|
229
|
+
const { title, steps } = parseSummary(docLines, callTitle);
|
|
230
|
+
// automatedTestName mirrors Flutter test result format
|
|
231
|
+
const automatedTestName = [fileBaseName, ...groups, callTitle].join(' > ');
|
|
232
|
+
results.push({
|
|
233
|
+
filePath,
|
|
234
|
+
title,
|
|
235
|
+
steps,
|
|
236
|
+
tags: allTags,
|
|
237
|
+
azureId: azureId !== undefined && !isNaN(azureId) ? azureId : undefined,
|
|
238
|
+
line: testLineIdx + 1,
|
|
239
|
+
linkRefs: (0, shared_1.extractLinkRefs)(allTags, linkConfigs),
|
|
240
|
+
automatedTestName,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
return results;
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=dart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dart.js","sourceRoot":"","sources":["../../src/parsers/dart.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoLH,sCAsDC;AAxOD,uCAAyB;AACzB,2CAA6B;AAG7B,qCAA4D;AAE5D,kFAAkF;AAElF,MAAM,YAAY,GAAI,mCAAmC,CAAC;AAC1D,MAAM,aAAa,GAAG,gEAAgE,CAAC;AACvF,MAAM,cAAc,GAAG,0CAA0C,CAAC;AAElE,iFAAiF;AAEjF,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACtD,CAAC;AAED,iFAAiF;AAEjF,SAAS,mBAAmB,CAAC,KAAe,EAAE,WAAmB;IAC/D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,YAAY,GAAG,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAEvD,KAAK,IAAI,CAAC,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAM,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,UAAU,GAAG,YAAY,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACxC,IAAI,CAAC,EAAE,CAAC;gBACN,MAAM,CAAC,OAAO,CACZ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CACpE,CAAC;gBACF,YAAY,GAAG,UAAU,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,iFAAiF;AAEjF;;;GAGG;AACH,SAAS,gBAAgB,CAAC,KAAe,EAAE,WAAmB;IAC5D,IAAI,CAAC,GAAG,WAAW,GAAG,CAAC,CAAC;IAExB,oDAAoD;IACpD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACd,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAAC,CAAC,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QAChF,MAAM;IACR,CAAC;IAED,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAErB,0CAA0C;IAC1C,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5D,CAAC,EAAE,CAAC;QACN,CAAC;QACD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,yBAAyB;IACzB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAE/C,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC,EAAE,CAAC;IACJ,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACd,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM;QACjF,CAAC,EAAE,CAAC;IACN,CAAC;IAED,OAAO,GAAG;SACP,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACT,CAAC;SACE,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;SAC7B,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1B,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,IAAI,EAAE,CACV;SACA,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AAC7B,CAAC;AASD,SAAS,2BAA2B,CAClC,KAAe,EACf,WAAmB,EACnB,SAAiB;IAEjB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,OAA2B,CAAC;IAEhC,MAAM,IAAI,GAAS,IAAI,MAAM,CAAC,UAAU,SAAS,SAAS,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,2BAA2B,CAAC;IAC/C,MAAM,WAAW,GAAG,mBAAmB,CAAC;IAExC,KAAK,IAAI,CAAC,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,WAAW,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QACnE,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEhC,IAAI,OAAO,KAAK,EAAE;YAAE,MAAM;QAC1B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM;QAE9F,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,OAAO,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnC,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3E,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACxB,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,gFAAgF;AAEhF,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AAC1C,MAAM,QAAQ,GAAW,oBAAoB,CAAC;AAC9C,MAAM,OAAO,GAAY,qCAAqC,CAAC;AAE/D,SAAS,YAAY,CACnB,QAAkB,EAClB,aAAqB;IAErB,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAE1C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,OAAO,GAAM,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,UAAU,EAAE,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACjD,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,CAAC,KAAK;YAAE,KAAK,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,aAAa,EAAE,KAAK,EAAE,CAAC;AAClD,CAAC;AAED,iFAAiF;AAEjF,SAAgB,aAAa,CAC3B,QAAgB,EAChB,SAAiB,EACjB,WAA0B;IAE1B,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,KAAK,GAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,0DAA0D;IAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;SACzC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAE1B,MAAM,QAAQ,GAAG,IAAA,wBAAe,EAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,SAAS;QAE1C,MAAM,WAAW,GAAG,CAAC,CAAC;QACtB,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACvC,IAAI,CAAC,CAAC;YAAE,SAAS;QAEjB,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;aACnB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;aACpB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;aACpB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAExB,IAAI,CAAC,SAAS;YAAE,SAAS;QAEzB,MAAM,QAAQ,GAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACnE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,2BAA2B,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAC5F,MAAM,MAAM,GAAkB,mBAAmB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAEtE,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAE3D,uDAAuD;QACvD,MAAM,iBAAiB,GAAG,CAAC,YAAY,EAAE,GAAG,MAAM,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE3E,OAAO,CAAC,IAAI,CAAC;YACX,QAAQ;YACR,KAAK;YACL,KAAK;YACL,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,OAAO,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;YACvE,IAAI,EAAE,WAAW,GAAG,CAAC;YACrB,QAAQ,EAAE,IAAA,wBAAe,EAAC,OAAO,EAAE,WAAW,CAAC;YAC/C,iBAAiB;SAClB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/parsers/excel.js
CHANGED
|
@@ -160,6 +160,46 @@ function parseSheetXml(xml, sharedStrings) {
|
|
|
160
160
|
}
|
|
161
161
|
return rows;
|
|
162
162
|
}
|
|
163
|
+
// ─── Worksheet discovery ──────────────────────────────────────────────────────
|
|
164
|
+
/**
|
|
165
|
+
* Locate the first worksheet file inside an xlsx ZIP.
|
|
166
|
+
*
|
|
167
|
+
* Strategy (in order):
|
|
168
|
+
* 1. Try common names: sheet.xml, sheet1.xml (case-insensitive).
|
|
169
|
+
* 2. Read xl/_rels/workbook.xml.rels to find the relationship-mapped path.
|
|
170
|
+
* 3. Fall back to any file under xl/worksheets/.
|
|
171
|
+
*
|
|
172
|
+
* Returns the ZIP entry key (e.g. "xl/worksheets/sheet1.xml") or null.
|
|
173
|
+
*/
|
|
174
|
+
async function findFirstSheetPath(zip) {
|
|
175
|
+
// Fast path: common names used by ADO exports and most tools
|
|
176
|
+
for (const candidate of [
|
|
177
|
+
'xl/worksheets/sheet.xml',
|
|
178
|
+
'xl/worksheets/sheet1.xml',
|
|
179
|
+
'xl/worksheets/Sheet1.xml',
|
|
180
|
+
]) {
|
|
181
|
+
if (zip.file(candidate))
|
|
182
|
+
return candidate;
|
|
183
|
+
}
|
|
184
|
+
// Read workbook relationships to find the actual sheet path
|
|
185
|
+
const relsEntry = zip.file('xl/_rels/workbook.xml.rels');
|
|
186
|
+
if (relsEntry) {
|
|
187
|
+
const relsXml = await relsEntry.async('string');
|
|
188
|
+
// Match the first Relationship of type worksheet
|
|
189
|
+
const m = relsXml.match(/Type="[^"]*\/worksheet"[^>]*Target="([^"]+)"/);
|
|
190
|
+
if (m) {
|
|
191
|
+
// Target is relative to xl/; strip leading '../' or '/' if present
|
|
192
|
+
const target = m[1].replace(/^\.\.\//, '').replace(/^\//, '');
|
|
193
|
+
const fullPath = target.startsWith('xl/') ? target : `xl/${target}`;
|
|
194
|
+
if (zip.file(fullPath))
|
|
195
|
+
return fullPath;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Last-resort: scan all files under xl/worksheets/
|
|
199
|
+
const allFiles = Object.keys(zip.files);
|
|
200
|
+
const sheetFile = allFiles.find((f) => /^xl\/worksheets\/.+\.xml$/i.test(f) && !f.includes('_rels'));
|
|
201
|
+
return sheetFile ?? null;
|
|
202
|
+
}
|
|
163
203
|
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
164
204
|
async function parseExcelFile(filePath, tagPrefix, linkConfigs) {
|
|
165
205
|
const buffer = fs.readFileSync(filePath);
|
|
@@ -169,9 +209,9 @@ async function parseExcelFile(filePath, tagPrefix, linkConfigs) {
|
|
|
169
209
|
const sharedStrings = ssEntry
|
|
170
210
|
? parseSharedStrings(await ssEntry.async('string'))
|
|
171
211
|
: [];
|
|
172
|
-
// Find the worksheet XML
|
|
173
|
-
const
|
|
174
|
-
|
|
212
|
+
// Find the worksheet XML (handles non-standard sheet naming)
|
|
213
|
+
const sheetKey = await findFirstSheetPath(zip);
|
|
214
|
+
const sheetEntry = sheetKey ? zip.file(sheetKey) : null;
|
|
175
215
|
if (!sheetEntry)
|
|
176
216
|
throw new Error(`No worksheet found in ${filePath}`);
|
|
177
217
|
const xml = await sheetEntry.async('string');
|
|
@@ -197,9 +237,7 @@ async function parseExcelFile(filePath, tagPrefix, linkConfigs) {
|
|
|
197
237
|
async function writebackExcel(filePath, title, id) {
|
|
198
238
|
const buffer = fs.readFileSync(filePath);
|
|
199
239
|
const zip = await jszip_1.default.loadAsync(buffer);
|
|
200
|
-
const sheetKey = zip
|
|
201
|
-
zip.file('xl/worksheets/sheet1.xml') ? 'xl/worksheets/sheet1.xml' :
|
|
202
|
-
null;
|
|
240
|
+
const sheetKey = await findFirstSheetPath(zip);
|
|
203
241
|
if (!sheetKey)
|
|
204
242
|
throw new Error(`No worksheet found in ${filePath}`);
|
|
205
243
|
const ssEntry = zip.file('xl/sharedStrings.xml');
|
|
@@ -230,8 +268,9 @@ async function writebackExcel(filePath, title, id) {
|
|
|
230
268
|
const idMatch = getCellAtCol('A');
|
|
231
269
|
const titleVal = titleMatch ? cellValue(titleMatch[0], nsPrefix, sharedStrings) : '';
|
|
232
270
|
const stepVal = stepMatch ? cellValue(stepMatch[0], nsPrefix, sharedStrings) : '';
|
|
233
|
-
|
|
234
|
-
|
|
271
|
+
// Match title rows (non-empty title, no step number) by normalised title.
|
|
272
|
+
// Do NOT guard on existing ID — allows updating the ID when a deleted TC is re-created.
|
|
273
|
+
if (!titleVal || stepVal)
|
|
235
274
|
return open + content + close;
|
|
236
275
|
if (normalise(titleVal) !== title)
|
|
237
276
|
return open + content + close;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"excel.js","sourceRoot":"","sources":["../../src/parsers/excel.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"excel.js","sourceRoot":"","sources":["../../src/parsers/excel.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* JavaScript / TypeScript test parser for azure-test-sync.
|
|
3
3
|
*
|
|
4
|
-
* Supports Jest, Jasmine,
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* handles all of them.
|
|
4
|
+
* Supports Jest, Jasmine, WebdriverIO, Playwright Test, Puppeteer (Mocha/Jest),
|
|
5
|
+
* and Cypress. All frameworks share the same describe() / it() / test() API for
|
|
6
|
+
* test organisation, so a single parser handles all of them.
|
|
8
7
|
*
|
|
9
8
|
* Cucumber (.feature files) is already handled by the existing 'gherkin' type.
|
|
9
|
+
* TestCafe uses a fixture/test API and is handled by the separate 'testcafe' type.
|
|
10
10
|
*
|
|
11
11
|
* Detected test functions:
|
|
12
|
-
* it(title, fn)
|
|
13
|
-
* it.only / test.only
|
|
14
|
-
* xit / xtest
|
|
12
|
+
* it(title, fn) test(title, fn)
|
|
13
|
+
* it.only / test.only it.skip / test.skip
|
|
14
|
+
* xit / xtest (Jasmine skip — still synced to Azure)
|
|
15
15
|
* it.concurrent / test.concurrent
|
|
16
|
+
* test.fixme(title, fn) (Playwright — annotates test as fixme)
|
|
17
|
+
* test.fail(title, fn) (Playwright — marks test as expected to fail)
|
|
18
|
+
* specify(title, fn) specify.only / specify.skip (Cypress alias for it)
|
|
19
|
+
*
|
|
20
|
+
* Detected describe functions (for nesting):
|
|
21
|
+
* describe() describe.only() describe.skip() describe.concurrent()
|
|
22
|
+
* test.describe() (Playwright)
|
|
23
|
+
* test.describe.only() test.describe.skip()
|
|
24
|
+
* test.describe.parallel() test.describe.serial()
|
|
25
|
+
* context() context.only() context.skip() (Cypress alias for describe)
|
|
16
26
|
*
|
|
17
27
|
* Source mapping:
|
|
18
28
|
* JSDoc /** ... * / first non-numbered line → TC Title
|
|
@@ -2,18 +2,28 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* JavaScript / TypeScript test parser for azure-test-sync.
|
|
4
4
|
*
|
|
5
|
-
* Supports Jest, Jasmine,
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* handles all of them.
|
|
5
|
+
* Supports Jest, Jasmine, WebdriverIO, Playwright Test, Puppeteer (Mocha/Jest),
|
|
6
|
+
* and Cypress. All frameworks share the same describe() / it() / test() API for
|
|
7
|
+
* test organisation, so a single parser handles all of them.
|
|
9
8
|
*
|
|
10
9
|
* Cucumber (.feature files) is already handled by the existing 'gherkin' type.
|
|
10
|
+
* TestCafe uses a fixture/test API and is handled by the separate 'testcafe' type.
|
|
11
11
|
*
|
|
12
12
|
* Detected test functions:
|
|
13
|
-
* it(title, fn)
|
|
14
|
-
* it.only / test.only
|
|
15
|
-
* xit / xtest
|
|
13
|
+
* it(title, fn) test(title, fn)
|
|
14
|
+
* it.only / test.only it.skip / test.skip
|
|
15
|
+
* xit / xtest (Jasmine skip — still synced to Azure)
|
|
16
16
|
* it.concurrent / test.concurrent
|
|
17
|
+
* test.fixme(title, fn) (Playwright — annotates test as fixme)
|
|
18
|
+
* test.fail(title, fn) (Playwright — marks test as expected to fail)
|
|
19
|
+
* specify(title, fn) specify.only / specify.skip (Cypress alias for it)
|
|
20
|
+
*
|
|
21
|
+
* Detected describe functions (for nesting):
|
|
22
|
+
* describe() describe.only() describe.skip() describe.concurrent()
|
|
23
|
+
* test.describe() (Playwright)
|
|
24
|
+
* test.describe.only() test.describe.skip()
|
|
25
|
+
* test.describe.parallel() test.describe.serial()
|
|
26
|
+
* context() context.only() context.skip() (Cypress alias for describe)
|
|
17
27
|
*
|
|
18
28
|
* Source mapping:
|
|
19
29
|
* JSDoc /** ... * / first non-numbered line → TC Title
|
|
@@ -69,10 +79,11 @@ const fs = __importStar(require("fs"));
|
|
|
69
79
|
const path = __importStar(require("path"));
|
|
70
80
|
const shared_1 = require("./shared");
|
|
71
81
|
// ─── Test function detection ──────────────────────────────────────────────────
|
|
72
|
-
const TEST_FN_PREFIX = '(?:it|test|xit|xtest|it\\.only|test\\.only|it\\.skip|test\\.skip|it\\.concurrent|test\\.concurrent)';
|
|
82
|
+
const TEST_FN_PREFIX = '(?:it|test|xit|xtest|specify|it\\.only|test\\.only|specify\\.only|it\\.skip|test\\.skip|specify\\.skip|it\\.concurrent|test\\.concurrent|test\\.fixme|test\\.fail)';
|
|
73
83
|
const TEST_CALL_RE = new RegExp(`^${TEST_FN_PREFIX}\\s*\\(`);
|
|
74
84
|
const TEST_TITLE_RE = new RegExp(`^${TEST_FN_PREFIX}\\s*\\(\\s*(['"\`])((?:\\\\.|[^\\\\])*?)\\1`);
|
|
75
|
-
|
|
85
|
+
// context() and context.only/skip are Cypress aliases for describe()
|
|
86
|
+
const DESCRIBE_TITLE_RE = /^(?:describe(?:\.(?:only|skip|concurrent))?|context(?:\.(?:only|skip))?|test\.describe(?:\.(?:only|skip|parallel|serial|configure))?)\s*\(\s*(['"`])((?:\\.|[^\\])*?)\1/;
|
|
76
87
|
function isTestLine(trimmedLine) {
|
|
77
88
|
return TEST_CALL_RE.test(trimmedLine);
|
|
78
89
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"javascript.js","sourceRoot":"","sources":["../../src/parsers/javascript.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"javascript.js","sourceRoot":"","sources":["../../src/parsers/javascript.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swift / XCUITest parser for azure-test-sync.
|
|
3
|
+
*
|
|
4
|
+
* Handles iOS and macOS UI-automation tests written with Apple's XCTest framework.
|
|
5
|
+
* Tests are `func test*()` methods inside classes that extend `XCTestCase`.
|
|
6
|
+
*
|
|
7
|
+
* Detected test functions:
|
|
8
|
+
* func testUserCanLogin() { ... }
|
|
9
|
+
* func test_login_succeeds() { ... }
|
|
10
|
+
*
|
|
11
|
+
* Detected class blocks (used as the test group / describe equivalent):
|
|
12
|
+
* class LoginTests: XCTestCase { ... }
|
|
13
|
+
*
|
|
14
|
+
* Source mapping:
|
|
15
|
+
* /// Swift doc comment above func test* → TC Title (first non-numbered line)
|
|
16
|
+
* JSDoc /** ... * / doc comment above func test* → TC Title + Steps (same format)
|
|
17
|
+
* Numbered lines "N. text" → TC Steps (action)
|
|
18
|
+
* "N. Check: text" → TC Steps (expected result column)
|
|
19
|
+
* // @tags: smoke, regression → TC Tags (comma-separated list)
|
|
20
|
+
* // @smoke → TC Tag (single-word shorthand)
|
|
21
|
+
* // @{tagPrefix}:N comment above func → Azure TC ID (written back after push)
|
|
22
|
+
* {fileBasename} > {ClassName} > {method} → automatedTestName
|
|
23
|
+
*
|
|
24
|
+
* Method name → title fallback:
|
|
25
|
+
* "testUserCanLogin" → "User can login"
|
|
26
|
+
* "test_submit_form" → "Submit form"
|
|
27
|
+
*
|
|
28
|
+
* ID writeback:
|
|
29
|
+
* Inserts / updates // @tc:12345 immediately above the func test*() line.
|
|
30
|
+
*
|
|
31
|
+
* Path-based auto-tagging: directory segments starting with '@' become tags.
|
|
32
|
+
*/
|
|
33
|
+
import { LinkConfig, ParsedTest } from '../types';
|
|
34
|
+
export declare function parseSwiftFile(filePath: string, tagPrefix: string, linkConfigs?: LinkConfig[]): ParsedTest[];
|