Path: blob/main/src/vs/base/test/common/jsonEdit.test.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/4import assert from 'assert';5import { removeProperty, setProperty } from '../../common/jsonEdit.js';6import { Edit, FormattingOptions } from '../../common/jsonFormatter.js';7import { ensureNoDisposablesAreLeakedInTestSuite } from './utils.js';89suite('JSON - edits', () => {1011ensureNoDisposablesAreLeakedInTestSuite();1213function assertEdit(content: string, edits: Edit[], expected: string) {14assert(edits);15let lastEditOffset = content.length;16for (let i = edits.length - 1; i >= 0; i--) {17const edit = edits[i];18assert(edit.offset >= 0 && edit.length >= 0 && edit.offset + edit.length <= content.length);19assert(typeof edit.content === 'string');20assert(lastEditOffset >= edit.offset + edit.length); // make sure all edits are ordered21lastEditOffset = edit.offset;22content = content.substring(0, edit.offset) + edit.content + content.substring(edit.offset + edit.length);23}24assert.strictEqual(content, expected);25}2627const formatterOptions: FormattingOptions = {28insertSpaces: true,29tabSize: 2,30eol: '\n'31};3233test('set property', () => {34let content = '{\n "x": "y"\n}';35let edits = setProperty(content, ['x'], 'bar', formatterOptions);36assertEdit(content, edits, '{\n "x": "bar"\n}');3738content = 'true';39edits = setProperty(content, [], 'bar', formatterOptions);40assertEdit(content, edits, '"bar"');4142content = '{\n "x": "y"\n}';43edits = setProperty(content, ['x'], { key: true }, formatterOptions);44assertEdit(content, edits, '{\n "x": {\n "key": true\n }\n}');45content = '{\n "a": "b", "x": "y"\n}';46edits = setProperty(content, ['a'], null, formatterOptions);47assertEdit(content, edits, '{\n "a": null, "x": "y"\n}');48});4950test('insert property', () => {51let content = '{}';52let edits = setProperty(content, ['foo'], 'bar', formatterOptions);53assertEdit(content, edits, '{\n "foo": "bar"\n}');5455edits = setProperty(content, ['foo', 'foo2'], 'bar', formatterOptions);56assertEdit(content, edits, '{\n "foo": {\n "foo2": "bar"\n }\n}');5758content = '{\n}';59edits = setProperty(content, ['foo'], 'bar', formatterOptions);60assertEdit(content, edits, '{\n "foo": "bar"\n}');6162content = ' {\n }';63edits = setProperty(content, ['foo'], 'bar', formatterOptions);64assertEdit(content, edits, ' {\n "foo": "bar"\n }');6566content = '{\n "x": "y"\n}';67edits = setProperty(content, ['foo'], 'bar', formatterOptions);68assertEdit(content, edits, '{\n "x": "y",\n "foo": "bar"\n}');6970content = '{\n "x": "y"\n}';71edits = setProperty(content, ['e'], 'null', formatterOptions);72assertEdit(content, edits, '{\n "x": "y",\n "e": "null"\n}');7374edits = setProperty(content, ['x'], 'bar', formatterOptions);75assertEdit(content, edits, '{\n "x": "bar"\n}');7677content = '{\n "x": {\n "a": 1,\n "b": true\n }\n}\n';78edits = setProperty(content, ['x'], 'bar', formatterOptions);79assertEdit(content, edits, '{\n "x": "bar"\n}\n');8081edits = setProperty(content, ['x', 'b'], 'bar', formatterOptions);82assertEdit(content, edits, '{\n "x": {\n "a": 1,\n "b": "bar"\n }\n}\n');8384edits = setProperty(content, ['x', 'c'], 'bar', formatterOptions, () => 0);85assertEdit(content, edits, '{\n "x": {\n "c": "bar",\n "a": 1,\n "b": true\n }\n}\n');8687edits = setProperty(content, ['x', 'c'], 'bar', formatterOptions, () => 1);88assertEdit(content, edits, '{\n "x": {\n "a": 1,\n "c": "bar",\n "b": true\n }\n}\n');8990edits = setProperty(content, ['x', 'c'], 'bar', formatterOptions, () => 2);91assertEdit(content, edits, '{\n "x": {\n "a": 1,\n "b": true,\n "c": "bar"\n }\n}\n');9293edits = setProperty(content, ['c'], 'bar', formatterOptions);94assertEdit(content, edits, '{\n "x": {\n "a": 1,\n "b": true\n },\n "c": "bar"\n}\n');9596content = '{\n "a": [\n {\n } \n ] \n}';97edits = setProperty(content, ['foo'], 'bar', formatterOptions);98assertEdit(content, edits, '{\n "a": [\n {\n } \n ],\n "foo": "bar"\n}');99100content = '';101edits = setProperty(content, ['foo', 0], 'bar', formatterOptions);102assertEdit(content, edits, '{\n "foo": [\n "bar"\n ]\n}');103104content = '//comment';105edits = setProperty(content, ['foo', 0], 'bar', formatterOptions);106assertEdit(content, edits, '{\n "foo": [\n "bar"\n ]\n} //comment');107});108109test('remove property', () => {110let content = '{\n "x": "y"\n}';111let edits = removeProperty(content, ['x'], formatterOptions);112assertEdit(content, edits, '{\n}');113114content = '{\n "x": "y", "a": []\n}';115edits = removeProperty(content, ['x'], formatterOptions);116assertEdit(content, edits, '{\n "a": []\n}');117118content = '{\n "x": "y", "a": []\n}';119edits = removeProperty(content, ['a'], formatterOptions);120assertEdit(content, edits, '{\n "x": "y"\n}');121});122123test('insert item at 0', () => {124const content = '[\n 2,\n 3\n]';125const edits = setProperty(content, [0], 1, formatterOptions);126assertEdit(content, edits, '[\n 1,\n 2,\n 3\n]');127});128129test('insert item at 0 in empty array', () => {130const content = '[\n]';131const edits = setProperty(content, [0], 1, formatterOptions);132assertEdit(content, edits, '[\n 1\n]');133});134135test('insert item at an index', () => {136const content = '[\n 1,\n 3\n]';137const edits = setProperty(content, [1], 2, formatterOptions);138assertEdit(content, edits, '[\n 1,\n 2,\n 3\n]');139});140141test('insert item at an index im empty array', () => {142const content = '[\n]';143const edits = setProperty(content, [1], 1, formatterOptions);144assertEdit(content, edits, '[\n 1\n]');145});146147test('insert item at end index', () => {148const content = '[\n 1,\n 2\n]';149const edits = setProperty(content, [2], 3, formatterOptions);150assertEdit(content, edits, '[\n 1,\n 2,\n 3\n]');151});152153test('insert item at end to empty array', () => {154const content = '[\n]';155const edits = setProperty(content, [-1], 'bar', formatterOptions);156assertEdit(content, edits, '[\n "bar"\n]');157});158159test('insert item at end', () => {160const content = '[\n 1,\n 2\n]';161const edits = setProperty(content, [-1], 'bar', formatterOptions);162assertEdit(content, edits, '[\n 1,\n 2,\n "bar"\n]');163});164165test('remove item in array with one item', () => {166const content = '[\n 1\n]';167const edits = setProperty(content, [0], undefined, formatterOptions);168assertEdit(content, edits, '[]');169});170171test('remove item in the middle of the array', () => {172const content = '[\n 1,\n 2,\n 3\n]';173const edits = setProperty(content, [1], undefined, formatterOptions);174assertEdit(content, edits, '[\n 1,\n 3\n]');175});176177test('remove last item in the array', () => {178const content = '[\n 1,\n 2,\n "bar"\n]';179const edits = setProperty(content, [2], undefined, formatterOptions);180assertEdit(content, edits, '[\n 1,\n 2\n]');181});182183test('remove last item in the array if ends with comma', () => {184const content = '[\n 1,\n "foo",\n "bar",\n]';185const edits = setProperty(content, [2], undefined, formatterOptions);186assertEdit(content, edits, '[\n 1,\n "foo"\n]');187});188189test('remove last item in the array if there is a comment in the beginning', () => {190const content = '// This is a comment\n[\n 1,\n "foo",\n "bar"\n]';191const edits = setProperty(content, [2], undefined, formatterOptions);192assertEdit(content, edits, '// This is a comment\n[\n 1,\n "foo"\n]');193});194195});196197198