Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

A smattering of bug fixes and features #180

Merged
merged 5 commits into from
Nov 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/processor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,9 @@ export class Processor {
parseJSONC(sample.content, errors);
if (errors.length) {
const errorsTxt = errors.map(e => printParseErrorCode(e.error));
fail(`Invalid JSONC: ${errorsTxt}`);
const warning =
sample.prefixesLength > 0 ? ' (prefixes are active, try adding a reset)' : '';
fail(`Invalid JSONC${warning}: ${errorsTxt}`);
}
} else if (language === null && id.endsWith('-output')) {
// Verify the output of a previous code sample.
Expand Down
42 changes: 37 additions & 5 deletions src/test/__snapshots__/asciidoc.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -350,7 +350,7 @@ exports[`checker asciidoc checker snapshots "./src/test/inputs/program-listing.a
"logs": [
"---- BEGIN FILE ./src/test/inputs/program-listing.asciidoc
",
"Found 4 code samples in ./src/test/inputs/program-listing.asciidoc",
"Found 5 code samples in ./src/test/inputs/program-listing.asciidoc",
"BEGIN #././src/test/inputs/program-listing.asciidoc:4 (--filter program-listing-4)
",
"Node session matched program listing.",
Expand Down Expand Up @@ -382,16 +382,23 @@ END #././src/test/inputs/program-listing.asciidoc:24 (--- ms)
+ 'Capuchin'",
"
END #././src/test/inputs/program-listing.asciidoc:40 (--- ms)
",
"BEGIN #././src/test/inputs/program-listing.asciidoc:49 (--filter program-listing-49)
",
"Node session matched program listing.",
"
END #././src/test/inputs/program-listing.asciidoc:49 (--- ms)
",
"---- END FILE ./src/test/inputs/program-listing.asciidoc
",
],
"statuses": [
"1/1: ././src/test/inputs/program-listing.asciidoc",
"1/1: ././src/test/inputs/program-listing.asciidoc: 1/4 ././src/test/inputs/program-listing.asciidoc:4",
"1/1: ././src/test/inputs/program-listing.asciidoc: 2/4 ././src/test/inputs/program-listing.asciidoc:17",
"1/1: ././src/test/inputs/program-listing.asciidoc: 3/4 ././src/test/inputs/program-listing.asciidoc:24",
"1/1: ././src/test/inputs/program-listing.asciidoc: 4/4 ././src/test/inputs/program-listing.asciidoc:40",
"1/1: ././src/test/inputs/program-listing.asciidoc: 1/5 ././src/test/inputs/program-listing.asciidoc:4",
"1/1: ././src/test/inputs/program-listing.asciidoc: 2/5 ././src/test/inputs/program-listing.asciidoc:17",
"1/1: ././src/test/inputs/program-listing.asciidoc: 3/5 ././src/test/inputs/program-listing.asciidoc:24",
"1/1: ././src/test/inputs/program-listing.asciidoc: 4/5 ././src/test/inputs/program-listing.asciidoc:40",
"1/1: ././src/test/inputs/program-listing.asciidoc: 5/5 ././src/test/inputs/program-listing.asciidoc:49",
],
}
`;
Expand Down Expand Up @@ -1388,6 +1395,31 @@ const loc = place.latLng;",
"targetFilename": null,
"tsOptions": {},
},
{
"auxiliaryFiles": [],
"checkJS": false,
"content": "<pre data-type="programlisting">&gt; <strong>console.log('hello'); console.log('goodbye');</strong>
hello
goodbye</pre>",
"descriptor": "./program-listing.asciidoc:49",
"id": "program-listing-49",
"isTSX": false,
"language": "node",
"lineNumber": 48,
"nodeModules": [],
"prefixes": [
{
"id": "program-listing-17",
},
],
"prefixesLength": 0,
"replacementId": undefined,
"sectionHeader": null,
"skip": false,
"sourceFile": "program-listing.asciidoc",
"targetFilename": null,
"tsOptions": {},
},
]
`;

Expand Down
8 changes: 8 additions & 0 deletions src/test/inputs/program-listing.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,11 @@ Here's another one with a failure:
&gt; <strong>/123/.monkey</strong>
"Capuchi"</pre>
++++

Here's one where there's console output but not a useful REPL response:

++++
<pre data-type="programlisting">&gt; <strong>console.log('hello'); console.log('goodbye');</strong>
hello
goodbye</pre>
++++
10 changes: 6 additions & 4 deletions src/ts-checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -605,12 +605,12 @@ async function uncachedCheckTs(
config: ConfigBundle,
): Promise<CheckTsResult> {
const {id, content} = sample;
const fileName = id + (sample.isTSX ? '.tsx' : `.${sample.language}`);
const fileName = sample.targetFilename || id + (sample.isTSX ? '.tsx' : `.${sample.language}`);
const tsFile = writeTempFile(fileName, content);
const sampleDir = getTempDir();
for (const auxFile of sample.auxiliaryFiles) {
const destFile = sampleDir + '/' + auxFile.filename;
fs.writeFileSync(destFile, auxFile.content, 'utf-8');
const {filename, content} = auxFile;
writeTempFile(filename, content);
}

const options: ts.CompilerOptions = {
Expand Down Expand Up @@ -787,7 +787,9 @@ export async function checkProgramListing(
});
});

if (!_.isEqual(replOutput, expectedOutputs)) {
if (_.isEqual(replOutput.slice(0, -1), expectedOutputs) && replOutput.at(-1) === 'undefined') {
// special case to allow commands that console.log instead of evaluating to anything.
} else if (!_.isEqual(replOutput, expectedOutputs)) {
// TODO: report exact mismatched spans
let message = `Node session did not match program listing.`;
if (replOutput.length === expectedOutputs.length) {
Expand Down
9 changes: 8 additions & 1 deletion src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,16 @@ export function getTempDir(): string {
return _tmpDir;
}

/** Write a temp file; return the absolute path to it. */
/**
* Write a temp file; return the absolute path to it.
* If fileName has slashes in it then directories will be created.
*/
export function writeTempFile(fileName: string, content: string): string {
const tmpDir = getTempDir();
if (fileName.includes('/')) {
const dir = fileName.split('/').slice(0, -1).join('/');
fs.mkdirSync(tmpDir + '/' + dir, {recursive: true});
}
const path = tmpDir + '/' + fileName;
fs.writeFileSync(path, content, 'utf8');
return path;
Expand Down