/**
 * Copyright (c) HashiCorp, Inc.
 * SPDX-License-Identifier: MPL-2.0
 */

import { module, test } from 'qunit';
import pathToTree from 'vault/lib/path-to-tree';

module('Unit | Lib | path to tree', function () {
  const tests = [
    [
      'basic',
      ['one', 'one/two', 'one/two/three/four/five'],
      {
        one: {
          two: {
            three: {
              four: {
                five: null,
              },
            },
          },
        },
      },
    ],
    [
      'multiple leaves on a level',
      ['one', 'two', 'three/four/five', 'three/four/six', 'three/four/six/one'],
      {
        one: null,
        three: {
          four: {
            five: null,
            six: {
              one: null,
            },
          },
        },
        two: null,
      },
    ],
    [
      'leaves with shared prefix',
      ['ns1', 'ns1a', 'ns1a/ns2/ns3', 'ns1a/ns2a/ns3'],
      {
        ns1: null,
        ns1a: {
          ns2: {
            ns3: null,
          },
          ns2a: {
            ns3: null,
          },
        },
      },
    ],
    [
      'leaves with nested number and shared prefix',
      ['ns1', 'ns1a', 'ns1a/99999/five9s', 'ns1a/999/ns3', 'ns1a/9999/ns3'],
      {
        ns1: null,
        ns1a: {
          999: {
            ns3: null,
          },
          9999: {
            ns3: null,
          },
          99999: {
            five9s: null,
          },
        },
      },
    ],
    [
      'sorting lexicographically',
      [
        '99',
        'bat',
        'bat/bird',
        'animal/flying/birds',
        'animal/walking/dogs',
        'animal/walking/cats',
        '1/thing',
      ],
      {
        1: {
          thing: null,
        },
        99: null,
        animal: {
          flying: {
            birds: null,
          },
          walking: {
            cats: null,
            dogs: null,
          },
        },
        bat: {
          bird: null,
        },
      },
    ],
  ];

  tests.forEach(function ([name, input, expected]) {
    test(`pathToTree: ${name}`, function (assert) {
      const output = pathToTree(input);
      assert.deepEqual(output, expected, 'has expected data');
    });
  });
});
