// 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:async';
import 'dart:io';
import 'package:kernel/binary/ast_from_binary.dart';
import 'package:kernel/binary/ast_to_binary.dart';
import 'package:kernel/binary/loader.dart';
import 'package:kernel/kernel.dart';

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

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

void main(List<String> args) {
  if (args.length != 1) {
    print(usage);
    exit(1);
  }
  testRoundTrip(new File(args[0]).readAsBytesSync());
}

void testRoundTrip(List<int> bytes) {
  var loader = new BinaryLoader(new Repository());
  var program = new BinaryBuilder(loader, bytes).readProgramFile();
  new BinaryPrinterWithExpectedOutput(bytes).writeProgramFile(program);
}

class DummyStreamConsumer extends StreamConsumer<List<int>> {
  @override
  Future addStream(Stream<List<int>> stream) async => null;

  @override
  Future close() async => null;
}

/// Variant of the binary serializer that compares the output against an
/// existing buffer.
///
/// As opposed to comparing binary files directly, when this fails, the stack
/// trace shows what the serializer was doing when the output started to differ.
class BinaryPrinterWithExpectedOutput extends BinaryPrinter {
  final List<int> expectedBytes;
  int offset = 0;

  static const int eof = -1;

  BinaryPrinterWithExpectedOutput(this.expectedBytes)
      : super(new IOSink(new DummyStreamConsumer()));

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

  @override
  void writeByte(int byte) {
    if (offset == expectedBytes.length || expectedBytes[offset] != byte) {
      int expected =
          (offset >= expectedBytes.length) ? eof : expectedBytes[offset];
      throw 'At offset $offset: '
          'Expected ${show(expected)} but found ${show(byte)}';
    }
    ++offset;
  }

  @override
  void writeBytes(List<int> bytes) {
    bytes.forEach(writeByte);
  }
}
