arblant
Railynx / test / parser_golden_test.dart
parser_golden_test.dart97 lines · 3.3 KB
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']));
      });
    }
  });
}