common/exercises/forth/canonical-data.json in trackler-2.0.8.17 vs common/exercises/forth/canonical-data.json in trackler-2.0.8.18
- old
+ new
@@ -1,327 +1,313 @@
{
- "#": [
+ "exercise": "forth",
+ "version": "1.0.0",
+ "comments": [
"The cases are split into multiple sections, all with the same structure.",
"In all cases, the `expected` key is the resulting stack",
"after executing the Forth program contained in the `input` key."
],
- "parsing and numbers": {
- "cases": [
- {
- "description": "empty input results in empty stack",
- "input": [],
- "expected": []
- },
- {
- "description": "numbers just get pushed onto the stack",
- "input": [
- "1 2 3 4 5"
- ],
- "expected": [1, 2, 3, 4, 5]
- },
- {
- "description": "all non-word characters are separators",
- "input": [
- "1\u00002\u00133\n4\r5 6\t7"
- ],
- "expected": [1, 2, 3, 4, 5, 6, 7]
- }
- ]
- },
- "addition": {
- "cases": [
- {
- "description": "can add two numbers",
- "input": [
- "1 2 +"
- ],
- "expected": [3]
- },
- {
- "description": "errors if there is nothing on the stack",
- "input": [
- "+"
- ],
- "expected": null
- },
- {
- "description": "errors if there is only one value on the stack",
- "input": [
- "1 +"
- ],
- "expected": null
- }
- ]
- },
- "subtraction": {
- "cases": [
- {
- "description": "can subtract two numbers",
- "input": [
- "3 4 -"
- ],
- "expected": [-1]
- },
- {
- "description": "errors if there is nothing on the stack",
- "input": [
- "-"
- ],
- "expected": null
- },
- {
- "description": "errors if there is only one value on the stack",
- "input": [
- "1 -"
- ],
- "expected": null
- }
- ]
- },
- "multiplication": {
- "cases": [
- {
- "description": "can multiply two numbers",
- "input": [
- "2 4 *"
- ],
- "expected": [8]
- },
- {
- "description": "errors if there is nothing on the stack",
- "input": [
- "*"
- ],
- "expected": null
- },
- {
- "description": "errors if there is only one value on the stack",
- "input": [
- "1 *"
- ],
- "expected": null
- }
- ]
- },
- "division": {
- "cases": [
- {
- "description": "can divide two numbers",
- "input": [
- "12 3 /"
- ],
- "expected": [4]
- },
- {
- "description": "performs integer division",
- "input": [
- "8 3 /"
- ],
- "expected": [2]
- },
- {
- "description": "errors if dividing by zero",
- "input": [
- "4 0 /"
- ],
- "expected": null
- },
- {
- "description": "errors if there is nothing on the stack",
- "input": [
- "/"
- ],
- "expected": null
- },
- {
- "description": "errors if there is only one value on the stack",
- "input": [
- "1 /"
- ],
- "expected": null
- }
- ]
- },
- "combined arithmetic": {
- "cases": [
- {
- "description": "addition and subtraction",
- "input": [
- "1 2 + 4 -"
- ],
- "expected": [-1]
- },
- {
- "description": "multiplication and division",
- "input": [
- "2 4 * 3 /"
- ],
- "expected": [2]
- }
- ]
- },
- "dup": {
- "cases": [
- {
- "description": "copies the top value on the stack",
- "input": [
- "1 DUP"
- ],
- "expected": [1, 1]
- },
- {
- "description": "is case-insensitive",
- "input": [
- "1 2 Dup"
- ],
- "expected": [1, 2, 2]
- },
- {
- "description": "errors if there is nothing on the stack",
- "input": [
- "dup"
- ],
- "expected": null
- }
- ]
- },
- "drop": {
- "cases": [
- {
- "description": "removes the top value on the stack if it is the only one",
- "input": [
- "1 drop"
- ],
- "expected": []
- },
- {
- "description": "removes the top value on the stack if it is not the only one",
- "input": [
- "1 2 drop"
- ],
- "expected": [1]
- },
- {
- "description": "errors if there is nothing on the stack",
- "input": [
- "drop"
- ],
- "expected": null
- }
- ]
- },
- "swap": {
- "cases": [
- {
- "description": "swaps the top two values on the stack if they are the only ones",
- "input": [
- "1 2 swap"
- ],
- "expected": [2, 1]
- },
- {
- "description": "swaps the top two values on the stack if they are not the only ones",
- "input": [
- "1 2 3 swap"
- ],
- "expected": [1, 3, 2]
- },
- {
- "description": "errors if there is nothing on the stack",
- "input": [
- "swap"
- ],
- "expected": null
- },
- {
- "description": "errors if there is only one value on the stack",
- "input": [
- "1 swap"
- ],
- "expected": null
- }
- ]
- },
- "over": {
- "cases": [
- {
- "description": "copies the second element if there are only two",
- "input": [
- "1 2 over"
- ],
- "expected": [1, 2, 1]
- },
- {
- "description": "copies the second element if there are more than two",
- "input": [
- "1 2 3 over"
- ],
- "expected": [1, 2, 3, 2]
- },
- {
- "description": "errors if there is nothing on the stack",
- "input": [
- "over"
- ],
- "expected": null
- },
- {
- "description": "errors if there is only one value on the stack",
- "input": [
- "1 over"
- ],
- "expected": null
- }
- ]
- },
- "user-defined words": {
- "cases": [
- {
- "description": "can consist of built-in words",
- "input": [
- ": dup-twice dup dup ;",
- "1 dup-twice"
- ],
- "expected": [1, 1, 1]
- },
- {
- "description": "execute in the right order",
- "input": [
- ": countup 1 2 3 ;",
- "countup"
- ],
- "expected": [1, 2, 3]
- },
- {
- "description": "can override other user-defined words",
- "input": [
- ": foo dup ;",
- ": foo dup dup ;",
- "1 foo"
- ],
- "expected": [1, 1, 1]
- },
- {
- "description": "can override built-in words",
- "input": [
- ": swap dup ;",
- "1 swap"
- ],
- "expected": [1, 1]
- },
- {
- "description": "cannot redefine numbers",
- "input": [
- ": 1 2 ;"
- ],
- "expected": null
- },
- {
- "description": "errors if executing a non-existent word",
- "input": [
- "foo"
- ],
- "expected": null
- }
- ]
- }
+ "cases": [
+ {
+ "description": "parsing and numbers",
+ "cases": [
+ {
+ "description": "empty input results in empty stack",
+ "property": "evaluate",
+ "input": [],
+ "expected": []
+ },
+ {
+ "description": "numbers just get pushed onto the stack",
+ "property": "evaluate",
+ "input": ["1 2 3 4 5"],
+ "expected": [1, 2, 3, 4, 5]
+ },
+ {
+ "description": "all non-word characters are separators",
+ "property": "evaluate",
+ "input": ["1\u00002\u00133\n4\r5 6\t7"],
+ "expected": [1, 2, 3, 4, 5, 6, 7]
+ }
+ ]
+ },
+ {
+ "description": "addition",
+ "cases": [
+ {
+ "description": "can add two numbers",
+ "property": "evaluate",
+ "input": ["1 2 +"],
+ "expected": [3]
+ },
+ {
+ "description": "errors if there is nothing on the stack",
+ "property": "evaluate",
+ "input": ["+"],
+ "expected": null
+ },
+ {
+ "description": "errors if there is only one value on the stack",
+ "property": "evaluate",
+ "input": ["1 +"],
+ "expected": null
+ }
+ ]
+ },
+ {
+ "description": "subtraction",
+ "cases": [
+ {
+ "description": "can subtract two numbers",
+ "property": "evaluate",
+ "input": ["3 4 -"],
+ "expected": [-1]
+ },
+ {
+ "description": "errors if there is nothing on the stack",
+ "property": "evaluate",
+ "input": ["-"],
+ "expected": null
+ },
+ {
+ "description": "errors if there is only one value on the stack",
+ "property": "evaluate",
+ "input": ["1 -"],
+ "expected": null
+ }
+ ]
+ },
+ {
+ "description": "multiplication",
+ "cases": [
+ {
+ "description": "can multiply two numbers",
+ "property": "evaluate",
+ "input": ["2 4 *"],
+ "expected": [8]
+ },
+ {
+ "description": "errors if there is nothing on the stack",
+ "property": "evaluate",
+ "input": ["*"],
+ "expected": null
+ },
+ {
+ "description": "errors if there is only one value on the stack",
+ "property": "evaluate",
+ "input": ["1 *"],
+ "expected": null
+ }
+ ]
+ },
+ {
+ "description": "division",
+ "cases": [
+ {
+ "description": "can divide two numbers",
+ "property": "evaluate",
+ "input": ["12 3 /"],
+ "expected": [4]
+ },
+ {
+ "description": "performs integer division",
+ "property": "evaluate",
+ "input": ["8 3 /"],
+ "expected": [2]
+ },
+ {
+ "description": "errors if dividing by zero",
+ "property": "evaluate",
+ "input": ["4 0 /"],
+ "expected": null
+ },
+ {
+ "description": "errors if there is nothing on the stack",
+ "property": "evaluate",
+ "input": ["/"],
+ "expected": null
+ },
+ {
+ "description": "errors if there is only one value on the stack",
+ "property": "evaluate",
+ "input": ["1 /"],
+ "expected": null
+ }
+ ]
+ },
+ {
+ "description": "combined arithmetic",
+ "cases": [
+ {
+ "description": "addition and subtraction",
+ "property": "evaluate",
+ "input": ["1 2 + 4 -"],
+ "expected": [-1]
+ },
+ {
+ "description": "multiplication and division",
+ "property": "evaluate",
+ "input": ["2 4 * 3 /"],
+ "expected": [2]
+ }
+ ]
+ },
+ {
+ "description": "dup",
+ "cases": [
+ {
+ "description": "copies the top value on the stack",
+ "property": "evaluate",
+ "input": ["1 DUP"],
+ "expected": [1, 1]
+ },
+ {
+ "description": "is case-insensitive",
+ "property": "evaluate",
+ "input": ["1 2 Dup"],
+ "expected": [1, 2, 2]
+ },
+ {
+ "description": "errors if there is nothing on the stack",
+ "property": "evaluate",
+ "input": ["dup"],
+ "expected": null
+ }
+ ]
+ },
+ {
+ "description": "drop",
+ "cases": [
+ {
+ "description": "removes the top value on the stack if it is the only one",
+ "property": "evaluate",
+ "input": ["1 drop"],
+ "expected": []
+ },
+ {
+ "description": "removes the top value on the stack if it is not the only one",
+ "property": "evaluate",
+ "input": ["1 2 drop"],
+ "expected": [1]
+ },
+ {
+ "description": "errors if there is nothing on the stack",
+ "property": "evaluate",
+ "input": ["drop"],
+ "expected": null
+ }
+ ]
+ },
+ {
+ "description": "swap",
+ "cases": [
+ {
+ "description": "swaps the top two values on the stack if they are the only ones",
+ "property": "evaluate",
+ "input": ["1 2 swap"],
+ "expected": [2, 1]
+ },
+ {
+ "description": "swaps the top two values on the stack if they are not the only ones",
+ "property": "evaluate",
+ "input": ["1 2 3 swap"],
+ "expected": [1, 3, 2]
+ },
+ {
+ "description": "errors if there is nothing on the stack",
+ "property": "evaluate",
+ "input": ["swap"],
+ "expected": null
+ },
+ {
+ "description": "errors if there is only one value on the stack",
+ "property": "evaluate",
+ "input": ["1 swap"],
+ "expected": null
+ }
+ ]
+ },
+ {
+ "description": "over",
+ "cases": [
+ {
+ "description": "copies the second element if there are only two",
+ "property": "evaluate",
+ "input": ["1 2 over"],
+ "expected": [1, 2, 1]
+ },
+ {
+ "description": "copies the second element if there are more than two",
+ "property": "evaluate",
+ "input": ["1 2 3 over"],
+ "expected": [1, 2, 3, 2]
+ },
+ {
+ "description": "errors if there is nothing on the stack",
+ "property": "evaluate",
+ "input": ["over"],
+ "expected": null
+ },
+ {
+ "description": "errors if there is only one value on the stack",
+ "property": "evaluate",
+ "input": ["1 over"],
+ "expected": null
+ }
+ ]
+ },
+ {
+ "description": "user-defined words",
+ "cases": [
+ {
+ "description": "can consist of built-in words",
+ "property": "evaluate",
+ "input": [
+ ": dup-twice dup dup ;",
+ "1 dup-twice"
+ ],
+ "expected": [1, 1, 1]
+ },
+ {
+ "description": "execute in the right order",
+ "property": "evaluate",
+ "input": [
+ ": countup 1 2 3 ;",
+ "countup"
+ ],
+ "expected": [1, 2, 3]
+ },
+ {
+ "description": "can override other user-defined words",
+ "property": "evaluate",
+ "input": [
+ ": foo dup ;",
+ ": foo dup dup ;",
+ "1 foo"
+ ],
+ "expected": [1, 1, 1]
+ },
+ {
+ "description": "can override built-in words",
+ "property": "evaluate",
+ "input": [
+ ": swap dup ;",
+ "1 swap"
+ ],
+ "expected": [1, 1]
+ },
+ {
+ "description": "cannot redefine numbers",
+ "property": "evaluate",
+ "input": [": 1 2 ;"],
+ "expected": null
+ },
+ {
+ "description": "errors if executing a non-existent word",
+ "property": "evaluate",
+ "input": ["foo"],
+ "expected": null
+ }
+ ]
+ }
+ ]
}