@@ -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
3033interface 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