blob: ca0cb31332008dcc6d49f6639b01466a2bae33f1 [file] [log] [blame]
// 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'],
});
});
});