// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library kernel.round_trip;

import 'dart:io';
import 'package:kernel/binary/ast_from_binary.dart';
import 'package:kernel/binary/ast_to_binary.dart';
import 'binary/utils.dart';

const String usage = '''
Usage: round_trip.dart FILE.dill [sdk.dill]

Deserialize and serialize the given component and check that the resulting byte
sequence is identical to the original.
''';

void main(List<String> args) async {
  if (args.length == 1) {
    await testRoundTrip(new File(args[0]).readAsBytesSync(), null);
  } else if (args.length == 2) {
    await testRoundTrip(new File(args[0]).readAsBytesSync(),
        new File(args[1]).readAsBytesSync());
  } else {
    print(usage);
    exit(1);
  }
}

Future<void> testRoundTrip(List<int> bytes, List<int>? sdkBytes) async {
  var component = new Component();
  if (sdkBytes != null) {
    var sdk = new Component(nameRoot: component.root);
    new BinaryBuilder(sdkBytes).readSingleFileComponent(sdk);
  }
  new BinaryBuilder(bytes).readSingleFileComponent(component);
  ByteSink sink = new ByteSink();
  new BinaryPrinter(sink).writeComponentFile(component);
  List<int> writtenBytes = sink.builder.takeBytes();
  if (bytes.length != writtenBytes.length) {
    throw "Byte-lengths differ: ${bytes.length} vs ${writtenBytes.length}";
  }
  for (int i = 0; i < bytes.length; i++) {
    if (bytes[i] != writtenBytes[i]) {
      throw "Byte differs at index $i: "
          "${show(bytes[i])} vs ${show(writtenBytes[i])}";
    }
  }
  print("OK");
}

String show(int byte) {
  return '$byte (0x${byte.toRadixString(16).padLeft(2, "0")})';
}
