Skip to content

Commit 0d4703f

Browse files
authored
Disable UpdateExpression from Chapter 3 (#76)
* Disable UpdateExpression from Chapter 3 This is not a specified operator in the documentation * move disalloed syntax to new file * fix tsc errors * Bump version
1 parent 2c8f5d1 commit 0d4703f

File tree

6 files changed

+72
-50
lines changed

6 files changed

+72
-50
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "js-slang",
3-
"version": "0.1.8",
3+
"version": "0.1.9",
44
"description": "Javascript-based interpreter for slang, written in Typescript",
55
"author": {
66
"name": "Source Academy",

src/__tests__/__snapshots__/block_scoping.ts.snap

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,5 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

3-
exports[`Cannot leave blank expressions in for loops 1`] = `"Line 2: For statement cannot have empty init expression."`;
4-
5-
exports[`Cannot leave blank expressions in for loops 2`] = `"Line 2: For statement cannot have empty test expression."`;
6-
7-
exports[`Cannot leave blank expressions in for loops 3`] = `"Line 2: For statement cannot have empty update expression."`;
8-
9-
exports[`Cannot leave blank expressions in for loops 4`] = `"Line 2: For statement cannot have empty init,test,update expressions."`;
10-
113
exports[`Cannot overwrite loop variables within a block 1`] = `"Line 5: Cannot assign new value to constant x"`;
124

135
exports[`const uses block scoping instead of function scoping 1`] = `
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`Cannot leave blank expressions in for loops 1`] = `"Line 2: For statement cannot have empty init expression."`;
4+
5+
exports[`Cannot leave blank expressions in for loops 2`] = `"Line 2: For statement cannot have empty test expression."`;
6+
7+
exports[`Cannot leave blank expressions in for loops 3`] = `"Line 2: For statement cannot have empty update expression."`;
8+
9+
exports[`Cannot leave blank expressions in for loops 4`] = `"Line 2: For statement cannot have empty init,test,update expressions."`;
10+
11+
exports[`Cannot use update expressions 1`] = `"Line 3: Update expressions are not allowed"`;

src/__tests__/block_scoping.ts

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -154,43 +154,3 @@ test("Cannot overwrite loop variables within a block", () => {
154154
});
155155
});
156156

157-
test("Cannot leave blank expressions in for loops", () => {
158-
const code = [
159-
`
160-
for(; i < 3; i++) {
161-
break;
162-
}
163-
`,
164-
`
165-
for(let i = 0; ; i++) {
166-
break;
167-
}
168-
`,
169-
`
170-
for(let i = 0; i < 3;) {
171-
break;
172-
}
173-
`,
174-
`
175-
for(;;) {
176-
break;
177-
}
178-
`
179-
];
180-
const scheduler = "preemptive";
181-
const promises = code.map(c => {
182-
const context = mockContext(3);
183-
return runInContext(c, context, { scheduler }).then(obj => ({
184-
context,
185-
obj
186-
}));
187-
});
188-
return Promise.all(promises).then(results => {
189-
results.map(res => {
190-
const { context, obj } = res;
191-
expect(obj.status).toBe("error");
192-
const errors = parseError(context.errors);
193-
expect(errors).toMatchSnapshot();
194-
});
195-
});
196-
});

src/__tests__/disallowed_syntax.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { mockContext } from '../mocks/context'
2+
import { parseError, runInContext } from '../index'
3+
4+
test("Cannot leave blank expressions in for loops", () => {
5+
const code = [
6+
`
7+
for(; i < 3; i = i + 1) {
8+
break;
9+
}
10+
`,
11+
`
12+
for(let i = 0; ; i = i + 1) {
13+
break;
14+
}
15+
`,
16+
`
17+
for(let i = 0; i < 3;) {
18+
break;
19+
}
20+
`,
21+
`
22+
for(;;) {
23+
break;
24+
}
25+
`
26+
];
27+
const scheduler = "preemptive";
28+
const promises = code.map(c => {
29+
const context = mockContext(3);
30+
return runInContext(c, context, { scheduler }).then(obj => ({
31+
context,
32+
obj
33+
}));
34+
});
35+
return Promise.all(promises).then(results => {
36+
results.map(res => {
37+
const { context, obj } = res;
38+
expect(obj.status).toBe("error");
39+
const errors = parseError(context.errors);
40+
expect(errors).toMatchSnapshot();
41+
});
42+
});
43+
});
44+
45+
test("Cannot use update expressions", () => {
46+
const code = `
47+
let x = 3;
48+
x++;
49+
x;
50+
`;
51+
const context = mockContext(3);
52+
const promise = runInContext(code, context, { scheduler: "preemptive" });
53+
return promise.then(obj => {
54+
expect(obj.status).toBe("error");
55+
const errors = parseError(context.errors);
56+
expect(errors).toMatchSnapshot();
57+
});
58+
});
59+

src/syntaxTypes.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ const syntaxTypes: { [nodeName: string]: number } = {
2929
ObjectExpression: 3,
3030
MemberExpression: 3,
3131
Property: 3,
32-
UpdateExpression: 3,
3332

3433
// Week 5
34+
UpdateExpression: 5,
3535
EmptyStatement: 5,
3636
// previously Week 10
3737
NewExpression: 10,

0 commit comments

Comments
 (0)