| 76 | * Update the fixtures directory given the compilation results |
| 77 | */ |
| 78 | export async function update(results: TestResults): Promise<void> { |
| 79 | let deleted = 0; |
| 80 | let updated = 0; |
| 81 | let created = 0; |
| 82 | const failed = []; |
| 83 | for (const [basename, result] of results) { |
| 84 | if (result.unexpectedError != null) { |
| 85 | console.log( |
| 86 | chalk.red.inverse.bold(' FAILED ') + ' ' + chalk.dim(basename), |
| 87 | ); |
| 88 | failed.push([basename, result.unexpectedError]); |
| 89 | } else if (result.actual == null) { |
| 90 | // Input was deleted but the expect file still existed, remove it |
| 91 | console.log( |
| 92 | chalk.red.inverse.bold(' REMOVE ') + ' ' + chalk.dim(basename), |
| 93 | ); |
| 94 | try { |
| 95 | fs.unlinkSync(result.outputPath); |
| 96 | console.log(' remove ' + result.outputPath); |
| 97 | deleted++; |
| 98 | } catch (e) { |
| 99 | console.error( |
| 100 | '[Snap tester error]: failed to remove ' + result.outputPath, |
| 101 | ); |
| 102 | failed.push([basename, result.unexpectedError]); |
| 103 | } |
| 104 | } else if (result.actual !== result.expected) { |
| 105 | // Expected output has changed |
| 106 | console.log( |
| 107 | chalk.blue.inverse.bold(' UPDATE ') + ' ' + chalk.dim(basename), |
| 108 | ); |
| 109 | try { |
| 110 | fs.writeFileSync(result.outputPath, result.actual, 'utf8'); |
| 111 | } catch (e) { |
| 112 | if (e?.code === 'ENOENT') { |
| 113 | // May have failed to create nested dir, so make a directory and retry |
| 114 | fs.mkdirSync(path.dirname(result.outputPath), {recursive: true}); |
| 115 | fs.writeFileSync(result.outputPath, result.actual, 'utf8'); |
| 116 | } |
| 117 | } |
| 118 | if (result.expected == null) { |
| 119 | created++; |
| 120 | } else { |
| 121 | updated++; |
| 122 | } |
| 123 | } else { |
| 124 | // Expected output is current |
| 125 | console.log( |
| 126 | chalk.green.inverse.bold(' OKAY ') + ' ' + chalk.dim(basename), |
| 127 | ); |
| 128 | } |
| 129 | } |
| 130 | console.log( |
| 131 | `${deleted} Deleted, ${created} Created, ${updated} Updated, ${failed.length} Failed`, |
| 132 | ); |
| 133 | for (const [basename, errorMsg] of failed) { |
| 134 | console.log(`${chalk.red.bold('Fail:')} ${basename}\n${errorMsg}`); |
| 135 | } |