1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// Golden tests: every case here was generated by the Python engine
// (test/golden/*.json, produced by parser.py). The Dart engine must match.
import 'dart:convert';
import 'dart:io';
import 'package:railway_clean_ip_scanner/engine/vless_parser.dart';
import 'package:test/test.dart';
List<dynamic> _load(String name) {
final text = File('test/golden/$name').readAsStringSync();
return jsonDecode(text) as List<dynamic>;
}
void main() {
group('parse (golden from parser.py)', () {
for (final raw in _load('parse.json')) {
final c = raw as Map<String, dynamic>;
final input = c['input'] as String;
final expected = c['expected'] as Map<String, dynamic>?;
test(input.length > 80 ? input.substring(0, 80) : input, () {
final cfg = parse(input);
if (expected == null) {
expect(cfg, isNull);
return;
}
expect(cfg, isNotNull);
expect(cfg!.uuid, expected['uuid']);
expect(cfg.address, expected['address']);
expect(cfg.port, expected['port']);
expect(cfg.domain, expected['domain']);
expect(cfg.path, expected['path']);
expect(cfg.security, expected['security']);
expect(cfg.type, expected['type']);
expect(cfg.name, expected['name']);
});
}
});
group('split_candidates (golden)', () {
for (final raw in _load('split.json')) {
final c = raw as Map<String, dynamic>;
final input = c['input'] as String;
final expected = (c['expected'] as List<dynamic>).cast<String>();
test(jsonEncode(input).length > 60 ? jsonEncode(input).substring(0, 60) : jsonEncode(input), () {
expect(splitCandidates(input), equals(expected));
});
}
});
group('parse_first (golden)', () {
for (final raw in _load('parse_first.json')) {
final c = raw as Map<String, dynamic>;
final input = c['input'] as String;
test(jsonEncode(input).length > 60 ? jsonEncode(input).substring(0, 60) : jsonEncode(input), () {
final (cfg, found) = parseFirst(input);
expect(found, c['found']);
final expected = c['expected'] as Map<String, dynamic>?;
if (expected == null) {
expect(cfg, isNull);
} else {
expect(cfg, isNotNull);
expect(cfg!.domain, expected['domain']);
expect(cfg.name, expected['name']);
expect(cfg.address, expected['address']);
}
});
}
});
group('build_config_link (golden)', () {
for (final raw in _load('build.json')) {
final c = raw as Map<String, dynamic>;
test('build for ${c['ip']}', () {
final VlessConfig base;
if (c.containsKey('base_link')) {
final parsed = parse(c['base_link'] as String);
expect(parsed, isNotNull);
base = parsed!;
} else {
final f = c['base_fields'] as Map<String, dynamic>;
base = VlessConfig(
uuid: f['uuid'] as String,
address: f['address'] as String,
port: f['port'] as int,
domain: f['domain'] as String,
path: f['path'] as String,
security: f['security'] as String,
type: f['type'] as String,
name: f['name'] as String,
);
}
expect(buildConfigLink(base, c['ip'] as String), equals(c['expected']));
});
}
});
}