| import { assert, expect } from 'chai'; |
| import { Convert, DebugTrace } from './debug-trace'; |
| |
| describe('DebugTrace JSON parsing', () => { |
| it('converts a valid JSON string to a DebugTrace struct', () => { |
| const text = String.raw` |
| { |
| "version": "20220209", |
| "source": [ |
| "\t// first line", |
| "// \"second line\"", |
| "//\\\\//\\\\ third line" |
| ], |
| "slots": [ |
| { |
| "name": "SkVM_DebugTrace", |
| "columns": 1, |
| "rows": 2, |
| "index": 3, |
| "kind": 4, |
| "line": 5 |
| }, |
| { |
| "name": "Unit_Test", |
| "columns": 6, |
| "rows": 7, |
| "index": 8, |
| "kind": 9, |
| "line": 10, |
| "retval": 11 |
| } |
| ], |
| "functions": [{ "name": "void testFunc();" }], |
| "trace": [[2], [0, 5], [1, 10, 15], [3, 20]] |
| }`; |
| const trace: DebugTrace = Convert.toDebugTrace(text); |
| |
| assert.equal(trace.source.length, 3); |
| assert.equal(trace.slots.length, 2); |
| assert.equal(trace.functions.length, 1); |
| assert.equal(trace.trace.length, 4); |
| |
| assert.equal(trace.source[0], '\t// first line'); |
| assert.equal(trace.source[1], '// "second line"'); |
| assert.equal(trace.source[2], '//\\\\//\\\\ third line'); |
| |
| assert.equal(trace.slots[0].name, 'SkVM_DebugTrace'); |
| assert.equal(trace.slots[0].columns, 1); |
| assert.equal(trace.slots[0].rows, 2); |
| assert.equal(trace.slots[0].index, 3); |
| assert.equal(trace.slots[0].kind, 4); |
| assert.equal(trace.slots[0].line, 5); |
| assert.isUndefined(trace.slots[0].retval); |
| |
| assert.equal(trace.slots[1].name, 'Unit_Test'); |
| assert.equal(trace.slots[1].columns, 6); |
| assert.equal(trace.slots[1].rows, 7); |
| assert.equal(trace.slots[1].index, 8); |
| assert.equal(trace.slots[1].kind, 9); |
| assert.equal(trace.slots[1].line, 10); |
| assert.equal(trace.slots[1].retval, 11); |
| |
| assert.equal(trace.functions[0].name, 'void testFunc();'); |
| |
| // Verify that trailing zeros are re-added to the trace arrays. |
| assert.deepEqual(trace.trace[0], [2, 0, 0]); |
| assert.deepEqual(trace.trace[1], [0, 5, 0]); |
| assert.deepEqual(trace.trace[2], [1, 10, 15]); |
| assert.deepEqual(trace.trace[3], [3, 20, 0]); |
| }); |
| |
| it('throws when the version is mismatched', () => { |
| const text = String.raw` |
| { |
| "version": "987654321z", |
| "source": [], |
| "slots": [], |
| "functions": [], |
| "trace": [] |
| }`; |
| assert.throws(() => Convert.toDebugTrace(text), /Version mismatch.*987654321z.*/); |
| }); |
| |
| it('throws when parsing invalid JSON', () => { |
| // Some trailing bracket close characters have been removed, so the JSON isn't valid. |
| const text = String.raw` |
| { |
| "version": "20220209", |
| "source": [ |
| "\t// first line", |
| "// \"second line\"", |
| "//\\\\//\\\\ third line" |
| ], |
| "slots": [ |
| { |
| "name": "SkVM_DebugTrace", |
| "columns": 1, |
| "rows": 2, |
| "index": 3, |
| "kind": 4, |
| "line": 5 |
| }, |
| { |
| "name": "Unit_Test", |
| "columns": 6, |
| "rows": 7, |
| "index": 8, |
| "kind": 9, |
| "line": 10, |
| "retval": 11 |
| } |
| ], |
| "functions": [{ "name": "void testFunc();" }], |
| "trace": [[2], [0, 5], [1, 10, 15], [3, 20 |
| }`; |
| expect(() => { Convert.toDebugTrace(text); }).to.throw(); |
| }); |
| |
| it('throws when missing a key', () => { |
| // This is valid JSON, but it is missing a required key ("functions"). |
| const text = String.raw` |
| { |
| "version": "20220209", |
| "source": [ |
| "\t// first line", |
| "// \"second line\"", |
| "//\\\\//\\\\ third line" |
| ], |
| "slots": [ |
| { |
| "name": "SkVM_DebugTrace", |
| "columns": 1, |
| "rows": 2, |
| "index": 3, |
| "kind": 4, |
| "line": 5 |
| }, |
| { |
| "name": "Unit_Test", |
| "columns": 6, |
| "rows": 7, |
| "index": 8, |
| "kind": 9, |
| "line": 10, |
| "retval": 11 |
| } |
| ], |
| "trace": [[2], [0, 5], [1, 10, 15], [3, 20]] |
| }`; |
| expect(() => { Convert.toDebugTrace(text); }).to.throw(); |
| }); |
| |
| it('throws when finding an invalid key', () => { |
| // This is valid JSON, but it has an extra key we don't know about ("bogus"). |
| const text = String.raw` |
| { |
| "version": "20220209", |
| "source": [ |
| "\t// first line", |
| "// \"second line\"", |
| "//\\\\//\\\\ third line" |
| ], |
| "slots": [ |
| { |
| "name": "SkVM_DebugTrace", |
| "columns": 1, |
| "rows": 2, |
| "index": 3, |
| "kind": 4, |
| "line": 5 |
| }, |
| { |
| "name": "Unit_Test", |
| "columns": 6, |
| "rows": 7, |
| "index": 8, |
| "kind": 9, |
| "line": 10, |
| "retval": 11 |
| } |
| ], |
| "trace": [[2], [0, 5], [1, 10, 15], [3, 20]], |
| "bogus": [9999] |
| }`; |
| expect(() => { Convert.toDebugTrace(text); }).to.throw(); |
| }); |
| }); |