Skip to content

Commit ab7f3bc

Browse files
committed
testing harness for pretty print
1 parent ab61f23 commit ab7f3bc

File tree

1 file changed

+63
-6
lines changed

1 file changed

+63
-6
lines changed

packages/deparser/test-utils/index.ts

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ type ParseErrorType =
2525
| 'REPARSE_FAILED'
2626
| 'AST_MISMATCH'
2727
| 'UNEXPECTED_ERROR'
28-
| 'INVALID_DEPARSED_SQL';
28+
| 'INVALID_DEPARSED_SQL'
29+
| 'PRETTY_INVALID_DEPARSED_SQL'
30+
| 'PRETTY_REPARSE_FAILED'
31+
| 'PRETTY_AST_MISMATCH';
2932

3033
interface ParseError extends Error {
3134
type: ParseErrorType;
@@ -71,6 +74,12 @@ function getErrorMessage(type: ParseErrorType): string {
7174
return 'Unexpected error during parse/deparse cycle';
7275
case 'INVALID_DEPARSED_SQL':
7376
return 'Invalid deparsed SQL';
77+
case 'PRETTY_INVALID_DEPARSED_SQL':
78+
return 'Invalid deparsed SQL (pretty)';
79+
case 'PRETTY_REPARSE_FAILED':
80+
return 'Reparse failed - no statements returned (pretty)';
81+
case 'PRETTY_AST_MISMATCH':
82+
return 'AST mismatch after parse/deparse cycle (pretty)';
7483
}
7584
}
7685

@@ -112,27 +121,30 @@ export class TestUtils {
112121
if (tree.stmts) {
113122
for (const stmt of tree.stmts) {
114123
if (stmt.stmt) {
115-
const outSql = deparse(stmt.stmt);
124+
const outSql1 = deparse(stmt.stmt, { pretty: false });
125+
const outSql2 = deparse(stmt.stmt, { pretty: true });
116126

117127
// console.log(`\n🔍 DEBUGGING SQL COMPARISON for test: ${testName}`);
118128
// console.log(`📥 INPUT SQL: ${sql}`);
119129
// console.log(`📤 DEPARSED SQL: ${outSql}`);
120130
// console.log(`🔄 SQL MATCH: ${sql.trim() === outSql.trim() ? '✅ EXACT MATCH' : '❌ DIFFERENT'}`);
121131

132+
// Test non-pretty version first
122133
let reparsed;
123134
try {
124-
reparsed = await parse(outSql);
135+
reparsed = await parse(outSql1);
125136
} catch (parseErr) {
126137
throw createParseError(
127138
'INVALID_DEPARSED_SQL',
128139
testName,
129140
sql,
130-
outSql,
141+
outSql1,
131142
cleanTree([stmt]),
132143
undefined,
133144
parseErr instanceof Error ? parseErr.message : String(parseErr)
134145
);
135146
}
147+
136148
const originalClean = cleanTree([stmt]);
137149
const reparsedClean = cleanTree(reparsed.stmts || []);
138150

@@ -145,13 +157,41 @@ export class TestUtils {
145157
}
146158

147159
if (!reparsed.stmts) {
148-
throw createParseError('REPARSE_FAILED', testName, sql, outSql, originalClean);
160+
throw createParseError('REPARSE_FAILED', testName, sql, outSql1, originalClean);
149161
}
150162

151163
try {
152164
expect(reparsedClean).toEqual(originalClean);
153165
} catch (err) {
154-
throw createParseError('AST_MISMATCH', testName, sql, outSql, originalClean, reparsedClean);
166+
throw createParseError('AST_MISMATCH', testName, sql, outSql1, originalClean, reparsedClean);
167+
}
168+
169+
// Test pretty version if non-pretty succeeded
170+
let prettyReparsed;
171+
try {
172+
prettyReparsed = await parse(outSql2);
173+
} catch (parseErr) {
174+
throw createParseError(
175+
'PRETTY_INVALID_DEPARSED_SQL',
176+
testName,
177+
sql,
178+
outSql2,
179+
cleanTree([stmt]),
180+
undefined,
181+
parseErr instanceof Error ? parseErr.message : String(parseErr)
182+
);
183+
}
184+
185+
const prettyReparsedClean = cleanTree(prettyReparsed.stmts || []);
186+
187+
if (!prettyReparsed.stmts) {
188+
throw createParseError('PRETTY_REPARSE_FAILED', testName, sql, outSql2, originalClean);
189+
}
190+
191+
try {
192+
expect(prettyReparsedClean).toEqual(originalClean);
193+
} catch (err) {
194+
throw createParseError('PRETTY_AST_MISMATCH', testName, sql, outSql2, originalClean, prettyReparsedClean);
155195
}
156196
}
157197
}
@@ -185,6 +225,23 @@ export class TestUtils {
185225
`\nDIFF (what's missing from actual vs expected):`,
186226
diff(parseError.originalAst, parseError.reparsedAst) || 'No diff available'
187227
);
228+
} else if (parseError.type === 'PRETTY_INVALID_DEPARSED_SQL') {
229+
errorMessages.push(
230+
`\n❌ PRETTY DEPARSER GENERATED INVALID SQL:`,
231+
`ORIGINAL AST:`,
232+
JSON.stringify(parseError.originalAst, null, 2),
233+
`\nPARSE ERROR: ${parseError.parseError}`
234+
);
235+
} else if (parseError.type === 'PRETTY_AST_MISMATCH') {
236+
errorMessages.push(
237+
`\n❌ PRETTY AST COMPARISON:`,
238+
`EXPECTED AST:`,
239+
JSON.stringify(parseError.originalAst, null, 2),
240+
`\nACTUAL AST:`,
241+
JSON.stringify(parseError.reparsedAst, null, 2),
242+
`\nDIFF (what's missing from actual vs expected):`,
243+
diff(parseError.originalAst, parseError.reparsedAst) || 'No diff available'
244+
);
188245
} else if (parseError.originalAst) {
189246
errorMessages.push(`❌ AST: ${JSON.stringify(parseError.originalAst, null, 2)}`);
190247
}

0 commit comments

Comments
 (0)