豆豆友情提示:这是一个非官方 GitHub 代理镜像,主要用于网络测试或访问加速。请勿在此进行登录、注册或处理任何敏感信息。进行这些操作请务必访问官方网站 github.com。 Raw 内容也通过此代理提供。
Skip to content

Commit 8963a8c

Browse files
Natallia HarshunovaDevtools-frontend LUCI CQ
authored andcommitted
Migrate chromium unittest
http/tests/devtools/components/json-balanced-tokenizer.js Fixed: 466795159 Change-Id: I67424de2f291cfda534f5e09dcee7533290890ad Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/7452247 Reviewed-by: Nikolay Vitkov <nvitkov@chromium.org> Commit-Queue: Natallia Harshunova <nharshunova@chromium.org>
1 parent 883e1a2 commit 8963a8c

File tree

3 files changed

+205
-1
lines changed

3 files changed

+205
-1
lines changed

front_end/models/text_utils/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,6 @@ ts_library("unittests") {
7070
deps = [
7171
":bundle",
7272
"../../core/platform:bundle",
73+
"../../testing",
7374
]
7475
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
Title: TextUtils BalancedJSONTokenizer matches quotes
2+
Content:
3+
Parsing {"odd back slashes with text around":"tes\\\"t"}
4+
{"odd back slashes with text around":"tes\\\"t"}
5+
Parsing {"escaped double quotes":"\"test\""}
6+
{"escaped double quotes":"\"test\""}
7+
Parsing {"escaped back slash before double quote":"test\\"}
8+
{"escaped back slash before double quote":"test\\"}
9+
Parsing {"1":2}
10+
{"1":2}
11+
Parsing {"":""}
12+
{"":""}
13+
Parsing {"nested brackets":{}}
14+
{"nested brackets":{}}
15+
Parsing {"nested brackets with double quotes":{"":""}}
16+
{"nested brackets with double quotes":{"":""}}
17+
Parsing {"etc":{"\\":"\""}}
18+
{"etc":{"\\":"\""}}
19+
Parsing {"etc":{"\\\\":"\\"}}
20+
{"etc":{"\\\\":"\\"}}
21+
Parsing {"etc":{"\\\\\"":"\\\\\""}}
22+
{"etc":{"\\\\\"":"\\\\\""}}
23+
=== end content
24+
25+
Title: TextUtils BalancedJSONTokenizer matches sequence using one shot
26+
Content:
27+
Parsing {"one":"one"}
28+
{"one":"one"}
29+
Parsing [{"one":"one"},{"two":"two"}]
30+
[{"one":"one"}
31+
Parsing [{"one":"one"},{"two":"two"},{"three":"three"}]
32+
[{"one":"one"}
33+
=== end content
34+
35+
Title: TextUtils BalancedJSONTokenizer matches sequence using multiple
36+
Content:
37+
Parsing {"one":"one"}
38+
{"one":"one"}
39+
Parsing [{"one":"one"},{"two":"two"}]
40+
[{"one":"one"},{"two":"two"}
41+
Parsing [{"one":"one"},{"two":"two"},{"three":"three"}]
42+
[{"one":"one"},{"two":"two"},{"three":"three"}
43+
=== end content
44+
45+
Title: TextUtils BalancedJSONTokenizer incremental writes
46+
Content:
47+
Running at once:
48+
[{"odd back slashes with text around":"tes\\\"t"},{"escaped double quotes":"\"test\""},{"escaped back slash before double quote":"test\\"},{"1":2},{"":""},{"nested brackets":{}},{"nested brackets with double quotes":{"":""}},{"etc":{"\\":"\""}},{"etc":{"\\\\":"\\"}},{"etc":{"\\\\\"":"\\\\\""}}
49+
Running by 3:
50+
[{"odd back slashes with text around":"tes\\\"t"}
51+
,{"escaped double quotes":"\"test\""}
52+
,{"escaped back slash before double quote":"test\\"}
53+
,{"1":2}
54+
,{"":""}
55+
,{"nested brackets":{}}
56+
,{"nested brackets with double quotes":{"":""}}
57+
,{"etc":{"\\":"\""}}
58+
,{"etc":{"\\\\":"\\"}}
59+
,{"etc":{"\\\\\"":"\\\\\""}}
60+
Running by 15:
61+
[{"odd back slashes with text around":"tes\\\"t"}
62+
,{"escaped double quotes":"\"test\""}
63+
,{"escaped back slash before double quote":"test\\"},{"1":2}
64+
,{"":""}
65+
,{"nested brackets":{}}
66+
,{"nested brackets with double quotes":{"":""}}
67+
,{"etc":{"\\":"\""}}
68+
,{"etc":{"\\\\":"\\"}}
69+
,{"etc":{"\\\\\"":"\\\\\""}}
70+
Running by 50:
71+
[{"odd back slashes with text around":"tes\\\"t"}
72+
,{"escaped double quotes":"\"test\""}
73+
,{"escaped back slash before double quote":"test\\"},{"1":2}
74+
,{"":""},{"nested brackets":{}}
75+
,{"nested brackets with double quotes":{"":""}},{"etc":{"\\":"\""}}
76+
,{"etc":{"\\\\":"\\"}},{"etc":{"\\\\\"":"\\\\\""}}
77+
=== end content
78+
79+
Title: TextUtils BalancedJSONTokenizer garbage after object
80+
Content:
81+
Parsing [{a: 'b'}], {'x': {a: 'b'}}
82+
[{a: 'b'}
83+
=== end content

front_end/models/text_utils/TextUtils.test.ts

Lines changed: 121 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5+
import {SnapshotTester} from '../../testing/SnapshotTester.js';
6+
57
import * as TextUtils from './text_utils.js';
68

79
type SplitByRegexExpected = Array<[string, number, number]>;
@@ -449,7 +451,7 @@ describe('TextUtils', () => {
449451
});
450452
});
451453

452-
describe('BalancedJSONTokenizer', () => {
454+
describe('BalancedJSONTokenizer', function() {
453455
it('can be instantiated successfully', () => {
454456
const callback = () => {};
455457
const findMultiple = false;
@@ -529,6 +531,124 @@ describe('TextUtils', () => {
529531
assert.deepEqual(callbackResults, [], 'callback had unexpected results');
530532
assert.strictEqual(tokenizer.remainder(), ']]', 'remainder was incorrect');
531533
});
534+
535+
const snapshotTester = new SnapshotTester(this, import.meta);
536+
537+
it('matches quotes', function() {
538+
const testStrings = [
539+
{'odd back slashes with text around': 'tes\\"t'},
540+
{'escaped double quotes': '"test"'},
541+
{'escaped back slash before double quote': 'test\\'},
542+
{1: 2},
543+
{'': ''},
544+
{'nested brackets': {}},
545+
{'nested brackets with double quotes': {'': ''}},
546+
{etc: {'\\': '"'}},
547+
{etc: {'\\\\': '\\'}},
548+
{etc: {'\\\\"': '\\\\"'}},
549+
];
550+
const results: string[] = [];
551+
const callback = (str: string) => results.push(str);
552+
553+
for (const testString of testStrings) {
554+
const jsonString = JSON.stringify(testString);
555+
results.push('Parsing ' + jsonString);
556+
const tokenizer = new TextUtils.TextUtils.BalancedJSONTokenizer(callback);
557+
const result = tokenizer.write(jsonString);
558+
assert.isTrue(result, `tokenizer.write() returned ${result}, true expected`);
559+
}
560+
snapshotTester.assert(this, results.join('\n'));
561+
});
562+
563+
it('matches sequence using one shot', function() {
564+
const testData = [
565+
{one: 'one'},
566+
[{one: 'one'}, {two: 'two'}],
567+
[{one: 'one'}, {two: 'two'}, {three: 'three'}],
568+
];
569+
const results: string[] = [];
570+
const callback = (str: string) => results.push(str);
571+
572+
for (const data of testData) {
573+
const jsonString = JSON.stringify(data);
574+
results.push('Parsing ' + jsonString);
575+
const tokenizer = new TextUtils.TextUtils.BalancedJSONTokenizer(callback);
576+
const result = tokenizer.write(jsonString);
577+
assert.isDefined(result, `tokenizer.write() returned ${result}, true expected`);
578+
}
579+
snapshotTester.assert(this, results.join('\n'));
580+
});
581+
582+
it('matches sequence using multiple', function() {
583+
const testData = [
584+
{one: 'one'},
585+
[{one: 'one'}, {two: 'two'}],
586+
[{one: 'one'}, {two: 'two'}, {three: 'three'}],
587+
];
588+
const results: string[] = [];
589+
const callback = (str: string) => results.push(str);
590+
591+
for (const data of testData) {
592+
const jsonString = JSON.stringify(data);
593+
results.push('Parsing ' + jsonString);
594+
const tokenizer = new TextUtils.TextUtils.BalancedJSONTokenizer(callback, true);
595+
const result = tokenizer.write(jsonString);
596+
const expectedResult = !(data instanceof Array);
597+
assert.strictEqual(result, expectedResult, `tokenizer.write() returned ${result}, ${expectedResult} expected`);
598+
}
599+
snapshotTester.assert(this, results.join('\n'));
600+
});
601+
602+
it('incremental writes', function() {
603+
const testStrings = [
604+
{'odd back slashes with text around': 'tes\\"t'},
605+
{'escaped double quotes': '"test"'},
606+
{'escaped back slash before double quote': 'test\\'},
607+
{1: 2},
608+
{'': ''},
609+
{'nested brackets': {}},
610+
{'nested brackets with double quotes': {'': ''}},
611+
{etc: {'\\': '"'}},
612+
{etc: {'\\\\': '\\'}},
613+
{etc: {'\\\\"': '\\\\"'}},
614+
];
615+
const results: string[] = [];
616+
const callback = (str: string) => results.push(str);
617+
const jsonString = JSON.stringify(testStrings);
618+
let tokenizer = new TextUtils.TextUtils.BalancedJSONTokenizer(callback, true);
619+
620+
results.push('Running at once:');
621+
const result = tokenizer.write(jsonString);
622+
assert.isDefined(result, `tokenizer.write() returned ${result}, false expected`);
623+
if (result) {
624+
assert.fail(`tokenizer.write() returned ${result}, false expected`);
625+
}
626+
627+
for (const sample of [3, 15, 50]) {
628+
tokenizer = new TextUtils.TextUtils.BalancedJSONTokenizer(callback, true);
629+
results.push('Running by ' + sample + ':');
630+
for (let i = 0; i < jsonString.length; i += sample) {
631+
const result = tokenizer.write(jsonString.substring(i, i + sample));
632+
const expectedResult = (i + sample < jsonString.length);
633+
assert.strictEqual(
634+
!!result, expectedResult, `tokenizer.write() returned ${result}, ${expectedResult} expected`);
635+
}
636+
}
637+
snapshotTester.assert(this, results.join('\n'));
638+
});
639+
640+
it('garbage after object', function() {
641+
const testString = '[{a: \'b\'}], {\'x\': {a: \'b\'}}';
642+
const results: string[] = [];
643+
const callback = (str: string) => results.push(str);
644+
645+
results.push('Parsing ' + testString);
646+
const tokenizer = new TextUtils.TextUtils.BalancedJSONTokenizer(callback, true);
647+
const result = tokenizer.write(testString);
648+
assert.isFalse(result, `tokenizer.write() returned ${result}, false expected`);
649+
650+
snapshotTester.assert(this, results.join('\n'));
651+
});
532652
});
533653

534654
describe('isMinified', () => {

0 commit comments

Comments
 (0)