import { assert } from 'chai';
import { convertResponseToDataTable, shortenName } from './binary-page-sk';
import { TreeMapDataTableRow } from '../rpc_types';

describe('Binary Page Static Methods', () => {
  describe('shortenName()', () => {
    it('returns the last segment (the file name)', () => {
      const test = (name: string, input: string, expected: string) => {
        const actual = shortenName(input);
        assert.equal(actual, expected, name);
      };

      test('empty string is unchanged', '', '');
      test('no slashes means unchanged', 'alpha', 'alpha');
      test('filepath returns last segment', 'alpha/beta/gamma.cc', 'gamma.cc');
      test('function is unchanged', 'OT::OffsetTo<>::sanitize<>()', 'OT::OffsetTo<>::sanitize<>()');
      test('Symbol with a period but no slashes is unchanged', 'foo.bar()', 'foo.bar()');
    });
  });

  describe('convertResponseToDataTable()', () => {
    it('shortens file names', () => {
      const inputs: TreeMapDataTableRow[] = [
        { name: 'ROOT', parent: '', size: 0 },
        { name: 'third_party', parent: 'ROOT', size: 0 },
        { name: 'third_party/externals', parent: 'third_party', size: 0 },
        {
          name: 'third_party/externals/harfbuzz',
          parent: 'third_party/externals',
          size: 0,
        },
        {
          name: 'third_party/externals/harfbuzz/src',
          parent: 'third_party/externals/harfbuzz',
          size: 0,
        },
        {
          name: 'third_party/externals/harfbuzz/src/hb-ot-layout.cc',
          parent: 'third_party/externals/harfbuzz/src',
          size: 0,
        },
        {
          name: 'OT::OffsetTo<>::sanitize<>()',
          parent: 'third_party/externals/harfbuzz/src/hb-ot-layout.cc',
          size: 11221,
        },
        {
          name: 'OT::ArrayOf<>::sanitize<>()',
          parent: 'third_party/externals/harfbuzz/src/hb-ot-layout.cc',
          size: 6835,
        },
      ];

      const expectedRows = [
        ['Name', 'Parent', 'Size'],
        ['ROOT', '', 0],
        ['third_party', 'ROOT', 0],
        ['third_party/externals', 'third_party', 0],
        ['third_party/externals/harfbuzz', 'third_party/externals', 0],
        ['third_party/externals/harfbuzz/src', 'third_party/externals/harfbuzz', 0],
        ['hb-ot-layout.cc', 'third_party/externals/harfbuzz/src', 0], // This was shortened
        ['OT::OffsetTo<>::sanitize<>()', 'hb-ot-layout.cc', 11221], // As were these usages
        ['OT::ArrayOf<>::sanitize<>()', 'hb-ot-layout.cc', 6835],
      ];
      const actualRows = convertResponseToDataTable(inputs);
      assert.sameDeepOrderedMembers(actualRows, expectedRows);
    });

    it('does not shorten file names if there are duplicates', () => {
      const inputs: TreeMapDataTableRow[] = [
        { name: 'ROOT', parent: '', size: 0 },
        { name: 'third_party', parent: 'ROOT', size: 0 },
        { name: 'third_party/externals', parent: 'third_party', size: 0 },
        {
          name: 'third_party/externals/harfbuzz',
          parent: 'third_party/externals',
          size: 0,
        },
        {
          name: 'third_party/externals/harfbuzz/src',
          parent: 'third_party/externals/harfbuzz',
          size: 0,
        },
        {
          name: 'third_party/externals/harfbuzz/src/hb-ot-layout.cc',
          parent: 'third_party/externals/harfbuzz/src',
          size: 0,
        },
        {
          name: 'OT::OffsetTo<>::sanitize<>()',
          parent: 'third_party/externals/harfbuzz/src/hb-ot-layout.cc',
          size: 11221,
        },
        {
          name: 'OT::ArrayOf<>::sanitize<>()',
          parent: 'third_party/externals/harfbuzz/src/hb-ot-layout.cc',
          size: 6835,
        },
        {
          name: 'third_party/hb-ot-layout.cc',
          parent: 'third_party',
          size: 117,
        },
        {
          name: 'Merbulate()',
          parent: 'third_party/hb-ot-layout.cc',
          size: 65,
        },
      ];

      const expectedRows = [
        ['Name', 'Parent', 'Size'],
        ['ROOT', '', 0],
        ['third_party', 'ROOT', 0],
        ['third_party/externals', 'third_party', 0],
        ['third_party/externals/harfbuzz', 'third_party/externals', 0],
        ['third_party/externals/harfbuzz/src', 'third_party/externals/harfbuzz', 0],
        ['hb-ot-layout.cc', 'third_party/externals/harfbuzz/src', 0], // This was shortened
        ['OT::OffsetTo<>::sanitize<>()', 'hb-ot-layout.cc', 11221], // As were these usages
        ['OT::ArrayOf<>::sanitize<>()', 'hb-ot-layout.cc', 6835],
        // This file was a duplicate and not shortened
        ['third_party/hb-ot-layout.cc', 'third_party', 117],
        // neither were symbols belonging to it
        ['Merbulate()', 'third_party/hb-ot-layout.cc', 65],
      ];
      const actualRows = convertResponseToDataTable(inputs);
      assert.sameDeepOrderedMembers(actualRows, expectedRows);
    });
  });
});
