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();
  });
});
