Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/base/test/common/jsonEdit.test.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
import assert from 'assert';
6
import { removeProperty, setProperty } from '../../common/jsonEdit.js';
7
import { Edit, FormattingOptions } from '../../common/jsonFormatter.js';
8
import { ensureNoDisposablesAreLeakedInTestSuite } from './utils.js';
9
10
suite('JSON - edits', () => {
11
12
ensureNoDisposablesAreLeakedInTestSuite();
13
14
function assertEdit(content: string, edits: Edit[], expected: string) {
15
assert(edits);
16
let lastEditOffset = content.length;
17
for (let i = edits.length - 1; i >= 0; i--) {
18
const edit = edits[i];
19
assert(edit.offset >= 0 && edit.length >= 0 && edit.offset + edit.length <= content.length);
20
assert(typeof edit.content === 'string');
21
assert(lastEditOffset >= edit.offset + edit.length); // make sure all edits are ordered
22
lastEditOffset = edit.offset;
23
content = content.substring(0, edit.offset) + edit.content + content.substring(edit.offset + edit.length);
24
}
25
assert.strictEqual(content, expected);
26
}
27
28
const formatterOptions: FormattingOptions = {
29
insertSpaces: true,
30
tabSize: 2,
31
eol: '\n'
32
};
33
34
test('set property', () => {
35
let content = '{\n "x": "y"\n}';
36
let edits = setProperty(content, ['x'], 'bar', formatterOptions);
37
assertEdit(content, edits, '{\n "x": "bar"\n}');
38
39
content = 'true';
40
edits = setProperty(content, [], 'bar', formatterOptions);
41
assertEdit(content, edits, '"bar"');
42
43
content = '{\n "x": "y"\n}';
44
edits = setProperty(content, ['x'], { key: true }, formatterOptions);
45
assertEdit(content, edits, '{\n "x": {\n "key": true\n }\n}');
46
content = '{\n "a": "b", "x": "y"\n}';
47
edits = setProperty(content, ['a'], null, formatterOptions);
48
assertEdit(content, edits, '{\n "a": null, "x": "y"\n}');
49
});
50
51
test('insert property', () => {
52
let content = '{}';
53
let edits = setProperty(content, ['foo'], 'bar', formatterOptions);
54
assertEdit(content, edits, '{\n "foo": "bar"\n}');
55
56
edits = setProperty(content, ['foo', 'foo2'], 'bar', formatterOptions);
57
assertEdit(content, edits, '{\n "foo": {\n "foo2": "bar"\n }\n}');
58
59
content = '{\n}';
60
edits = setProperty(content, ['foo'], 'bar', formatterOptions);
61
assertEdit(content, edits, '{\n "foo": "bar"\n}');
62
63
content = ' {\n }';
64
edits = setProperty(content, ['foo'], 'bar', formatterOptions);
65
assertEdit(content, edits, ' {\n "foo": "bar"\n }');
66
67
content = '{\n "x": "y"\n}';
68
edits = setProperty(content, ['foo'], 'bar', formatterOptions);
69
assertEdit(content, edits, '{\n "x": "y",\n "foo": "bar"\n}');
70
71
content = '{\n "x": "y"\n}';
72
edits = setProperty(content, ['e'], 'null', formatterOptions);
73
assertEdit(content, edits, '{\n "x": "y",\n "e": "null"\n}');
74
75
edits = setProperty(content, ['x'], 'bar', formatterOptions);
76
assertEdit(content, edits, '{\n "x": "bar"\n}');
77
78
content = '{\n "x": {\n "a": 1,\n "b": true\n }\n}\n';
79
edits = setProperty(content, ['x'], 'bar', formatterOptions);
80
assertEdit(content, edits, '{\n "x": "bar"\n}\n');
81
82
edits = setProperty(content, ['x', 'b'], 'bar', formatterOptions);
83
assertEdit(content, edits, '{\n "x": {\n "a": 1,\n "b": "bar"\n }\n}\n');
84
85
edits = setProperty(content, ['x', 'c'], 'bar', formatterOptions, () => 0);
86
assertEdit(content, edits, '{\n "x": {\n "c": "bar",\n "a": 1,\n "b": true\n }\n}\n');
87
88
edits = setProperty(content, ['x', 'c'], 'bar', formatterOptions, () => 1);
89
assertEdit(content, edits, '{\n "x": {\n "a": 1,\n "c": "bar",\n "b": true\n }\n}\n');
90
91
edits = setProperty(content, ['x', 'c'], 'bar', formatterOptions, () => 2);
92
assertEdit(content, edits, '{\n "x": {\n "a": 1,\n "b": true,\n "c": "bar"\n }\n}\n');
93
94
edits = setProperty(content, ['c'], 'bar', formatterOptions);
95
assertEdit(content, edits, '{\n "x": {\n "a": 1,\n "b": true\n },\n "c": "bar"\n}\n');
96
97
content = '{\n "a": [\n {\n } \n ] \n}';
98
edits = setProperty(content, ['foo'], 'bar', formatterOptions);
99
assertEdit(content, edits, '{\n "a": [\n {\n } \n ],\n "foo": "bar"\n}');
100
101
content = '';
102
edits = setProperty(content, ['foo', 0], 'bar', formatterOptions);
103
assertEdit(content, edits, '{\n "foo": [\n "bar"\n ]\n}');
104
105
content = '//comment';
106
edits = setProperty(content, ['foo', 0], 'bar', formatterOptions);
107
assertEdit(content, edits, '{\n "foo": [\n "bar"\n ]\n} //comment');
108
});
109
110
test('remove property', () => {
111
let content = '{\n "x": "y"\n}';
112
let edits = removeProperty(content, ['x'], formatterOptions);
113
assertEdit(content, edits, '{\n}');
114
115
content = '{\n "x": "y", "a": []\n}';
116
edits = removeProperty(content, ['x'], formatterOptions);
117
assertEdit(content, edits, '{\n "a": []\n}');
118
119
content = '{\n "x": "y", "a": []\n}';
120
edits = removeProperty(content, ['a'], formatterOptions);
121
assertEdit(content, edits, '{\n "x": "y"\n}');
122
});
123
124
test('insert item at 0', () => {
125
const content = '[\n 2,\n 3\n]';
126
const edits = setProperty(content, [0], 1, formatterOptions);
127
assertEdit(content, edits, '[\n 1,\n 2,\n 3\n]');
128
});
129
130
test('insert item at 0 in empty array', () => {
131
const content = '[\n]';
132
const edits = setProperty(content, [0], 1, formatterOptions);
133
assertEdit(content, edits, '[\n 1\n]');
134
});
135
136
test('insert item at an index', () => {
137
const content = '[\n 1,\n 3\n]';
138
const edits = setProperty(content, [1], 2, formatterOptions);
139
assertEdit(content, edits, '[\n 1,\n 2,\n 3\n]');
140
});
141
142
test('insert item at an index im empty array', () => {
143
const content = '[\n]';
144
const edits = setProperty(content, [1], 1, formatterOptions);
145
assertEdit(content, edits, '[\n 1\n]');
146
});
147
148
test('insert item at end index', () => {
149
const content = '[\n 1,\n 2\n]';
150
const edits = setProperty(content, [2], 3, formatterOptions);
151
assertEdit(content, edits, '[\n 1,\n 2,\n 3\n]');
152
});
153
154
test('insert item at end to empty array', () => {
155
const content = '[\n]';
156
const edits = setProperty(content, [-1], 'bar', formatterOptions);
157
assertEdit(content, edits, '[\n "bar"\n]');
158
});
159
160
test('insert item at end', () => {
161
const content = '[\n 1,\n 2\n]';
162
const edits = setProperty(content, [-1], 'bar', formatterOptions);
163
assertEdit(content, edits, '[\n 1,\n 2,\n "bar"\n]');
164
});
165
166
test('remove item in array with one item', () => {
167
const content = '[\n 1\n]';
168
const edits = setProperty(content, [0], undefined, formatterOptions);
169
assertEdit(content, edits, '[]');
170
});
171
172
test('remove item in the middle of the array', () => {
173
const content = '[\n 1,\n 2,\n 3\n]';
174
const edits = setProperty(content, [1], undefined, formatterOptions);
175
assertEdit(content, edits, '[\n 1,\n 3\n]');
176
});
177
178
test('remove last item in the array', () => {
179
const content = '[\n 1,\n 2,\n "bar"\n]';
180
const edits = setProperty(content, [2], undefined, formatterOptions);
181
assertEdit(content, edits, '[\n 1,\n 2\n]');
182
});
183
184
test('remove last item in the array if ends with comma', () => {
185
const content = '[\n 1,\n "foo",\n "bar",\n]';
186
const edits = setProperty(content, [2], undefined, formatterOptions);
187
assertEdit(content, edits, '[\n 1,\n "foo"\n]');
188
});
189
190
test('remove last item in the array if there is a comment in the beginning', () => {
191
const content = '// This is a comment\n[\n 1,\n "foo",\n "bar"\n]';
192
const edits = setProperty(content, [2], undefined, formatterOptions);
193
assertEdit(content, edits, '// This is a comment\n[\n 1,\n "foo"\n]');
194
});
195
196
});
197
198