// Copyright (C) 2023 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import {convertArgsToObject, convertArgsToTree} from './args_parser';

const args = [
  {key: 'simple_key', value: 'simple_value'},
  {key: 'thing.key', value: 'value'},
  {key: 'thing.point[0].x', value: 10},
  {key: 'thing.point[0].y', value: 20},
  {key: 'thing.point[1].x', value: 0},
  {key: 'thing.point[1].y', value: -10},
  {key: 'foo.bar.foo.bar', value: 'baz'},
];

describe('convertArgsToTree', () => {
  test('converts example arg set', () => {
    expect(convertArgsToTree(args))
      .toEqual(
        [
          {
            key: 'simple_key',
            value: {key: 'simple_key', value: 'simple_value'},
          },
          {
            key: 'thing',
            children: [
              {key: 'key', value: {key: 'thing.key', value: 'value'}},
              {
                key: 'point',
                children: [
                  {
                    key: 0,
                    children: [
                      {
                        key: 'x',
                        value: {key: 'thing.point[0].x', value: 10},
                      },
                      {
                        key: 'y',
                        value: {key: 'thing.point[0].y', value: 20},
                      },
                    ],
                  },
                  {
                    key: 1,
                    children: [
                      {
                        key: 'x',
                        value: {key: 'thing.point[1].x', value: 0},
                      },
                      {
                        key: 'y',
                        value: {key: 'thing.point[1].y', value: -10},
                      },
                    ],
                  },
                ],
              },
            ],
          },
          {
            key: 'foo',
            children: [
              {
                key: 'bar',
                children: [
                  {
                    key: 'foo',
                    children: [
                      {
                        key: 'bar',
                        value: {key: 'foo.bar.foo.bar', value: 'baz'},
                      },
                    ],
                  },
                ],
              },
            ],
          },
        ],
      );
  });

  test('handles value and children in same node', () => {
    const args = [
      {key: 'foo', value: 'foo'},
      {key: 'foo.bar', value: 'bar'},
    ];
    expect(convertArgsToTree(args)).toEqual([
      {
        key: 'foo',
        value: {key: 'foo', value: 'foo'},
        children: [
          {key: 'bar', value: {key: 'foo.bar', value: 'bar'}},
        ],
      },
    ]);
  });

  test('handles mixed key types', () => {
    const args = [
      {key: 'foo[0]', value: 'foo'},
      {key: 'foo.bar', value: 'bar'},
    ];
    expect(convertArgsToTree(args)).toEqual([
      {
        key: 'foo',
        children: [
          {key: 0, value: {key: 'foo[0]', value: 'foo'}},
          {key: 'bar', value: {key: 'foo.bar', value: 'bar'}},
        ],
      },
    ]);
  });

  test('picks latest where duplicate keys exist', () => {
    const args = [
      {key: 'foo', value: 'foo'},
      {key: 'foo', value: 'bar'},
    ];
    expect(convertArgsToTree(args)).toEqual([
      {key: 'foo', value: {key: 'foo', value: 'bar'}},
    ]);
  });

  test('handles sparse arrays', () => {
    const args = [
      {key: 'foo[12]', value: 'foo'},
    ];
    expect(convertArgsToTree(args)).toEqual([
      {
        key: 'foo',
        children: [
          {key: 12, value: {key: 'foo[12]', value: 'foo'}},
        ],
      },
    ]);
  });
});

describe('convertArgsToObject', () => {
  it('converts example arg set', () => {
    expect(convertArgsToObject(args)).toEqual({
      simple_key: 'simple_value',
      thing: {
        key: 'value',
        point: [
          {x: 10, y: 20},
          {x: 0, y: -10},
        ],
      },
      foo: {bar: {foo: {bar: 'baz'}}},
    });
  });

  test('throws on args containing a node with both value and children', () => {
    expect(() => {
      convertArgsToObject([
        {key: 'foo', value: 'foo'},
        {key: 'foo.bar', value: 'bar'},
      ]);
    }).toThrow();
  });

  test('throws on args containing mixed key types', () => {
    expect(() => {
      convertArgsToObject([
        {key: 'foo[0]', value: 'foo'},
        {key: 'foo.bar', value: 'bar'},
      ]);
    }).toThrow();
  });

  test('picks last one where duplicate keys exist', () => {
    const args = [
      {key: 'foo', value: 'foo'},
      {key: 'foo', value: 'bar'},
    ];
    expect(convertArgsToObject(args)).toEqual({foo: 'bar'});
  });

  test('handles sparse arrays', () => {
    const args = [
      {key: 'foo[3]', value: 'foo'},
    ];
    expect(convertArgsToObject(args)).toEqual({
      foo: [
        undefined,
        undefined,
        undefined,
        'foo',
      ],
    });
  });
});
