| 140 | * @returns boolean indicatig whether all tests passed |
| 141 | */ |
| 142 | export function report(results: TestResults): boolean { |
| 143 | const failures: Array<[string, TestResult]> = []; |
| 144 | for (const [basename, result] of results) { |
| 145 | if (result.actual === result.expected && result.unexpectedError == null) { |
| 146 | console.log( |
| 147 | chalk.green.inverse.bold(' PASS ') + ' ' + chalk.dim(basename), |
| 148 | ); |
| 149 | } else { |
| 150 | console.log(chalk.red.inverse.bold(' FAIL ') + ' ' + chalk.dim(basename)); |
| 151 | failures.push([basename, result]); |
| 152 | } |
| 153 | } |
| 154 | |
| 155 | if (failures.length !== 0) { |
| 156 | console.log('\n' + chalk.red.bold('Failures:') + '\n'); |
| 157 | |
| 158 | for (const [basename, result] of failures) { |
| 159 | console.log(chalk.red.bold('FAIL:') + ' ' + basename); |
| 160 | if (result.unexpectedError != null) { |
| 161 | console.log( |
| 162 | ` >> Unexpected error during test: \n${result.unexpectedError}`, |
| 163 | ); |
| 164 | } else { |
| 165 | if (result.expected == null) { |
| 166 | invariant(result.actual != null, '[Tester] Internal failure.'); |
| 167 | console.log( |
| 168 | chalk.red('[ expected fixture output is absent ]') + '\n', |
| 169 | ); |
| 170 | } else if (result.actual == null) { |
| 171 | invariant(result.expected != null, '[Tester] Internal failure.'); |
| 172 | console.log( |
| 173 | chalk.red(`[ fixture input for ${result.outputPath} is absent ]`) + |
| 174 | '\n', |
| 175 | ); |
| 176 | } else { |
| 177 | console.log(diff(result.expected, result.actual) + '\n'); |
| 178 | } |
| 179 | } |
| 180 | } |
| 181 | } |
| 182 | |
| 183 | console.log( |
| 184 | `${results.size} Tests, ${results.size - failures.length} Passed, ${ |
| 185 | failures.length |
| 186 | } Failed`, |
| 187 | ); |
| 188 | return failures.length === 0; |
| 189 | } |