import 'dart:convert'; import 'dart:io'; import 'models.g.dart'; void main() { final fixtures = jsonDecode(File.fromUri(Platform.script.resolve('../fixtures.json')).readAsStringSync()) as Map; final cases = fixtures['valid'] as List; for (final fixture in cases) { final value = fixture['value']; final decoded = switch (fixture['model']) { 'UUID' || 'Instant' || 'Locale' => value as String, 'Revision' => value as int, 'LocalizedMessage' => LocalizedMessage.fromJson(value).toJson(), 'ErrorData' => ErrorData.fromJson(value).toJson(), 'HttpProblem' => HttpProblem.fromJson(value).toJson(), 'ErrorMessagePayload' => ErrorMessagePayload.fromJson(value).toJson(), 'CommandRejection' => CommandRejection.fromJson(value).toJson(), 'CatalogPage' => CatalogPage.fromJson(value).toJson(), 'CatalogResponse' => CatalogResponse.fromJson(value).toJson(), _ => throw StateError('Missing fixture decoder: ${fixture['model']}'), }; if (jsonEncode(_canonical(value)) != jsonEncode(_canonical(decoded))) { throw StateError('JSON changed: ${fixture['name']}'); } } print('${cases.length} shared Dart JSON round trips verified.'); } dynamic _canonical(dynamic value) { if (value is List) return value.map(_canonical).toList(); if (value is Map) { final keys = value.keys.cast().toList()..sort(); return {for (final key in keys) key: _canonical(value[key])}; } return value; }