// Copyright (c) 2019, 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.

// @dart = 2.9

import 'package:front_end/src/fasta/kernel/utils.dart' show serializeComponent;

import 'package:kernel/ast.dart' show Component;

import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;

import 'package:kernel/target/targets.dart' show NoneTarget, TargetFlags;

import 'incremental_suite.dart'
    show checkIsEqual, getOptions, normalCompilePlain;

Future<void> main() async {
  final Uri dart2jsUrl = Uri.base.resolve("pkg/compiler/bin/dart2js.dart");
  Stopwatch stopwatch = new Stopwatch()..start();
  Component compiledComponent = await normalCompilePlain(dart2jsUrl,
      options: getOptions()
        ..target = new NoneTarget(new TargetFlags())
        ..omitPlatform = false);
  print("Compiled dart2js in ${stopwatch.elapsedMilliseconds} ms");
  stopwatch.reset();

  List<int> bytes = serializeComponent(compiledComponent);
  print("Serialized dart2js in ${stopwatch.elapsedMilliseconds} ms");
  print("Output is ${bytes.length} bytes long.");
  print("");
  stopwatch.reset();

  print("Round-tripping with lazy disabled");
  roundTrip(
      new BinaryBuilder(bytes,
          disableLazyReading: true, disableLazyClassReading: true),
      bytes);

  print("Round-tripping with lazy enabled");
  roundTrip(
      new BinaryBuilder(bytes,
          disableLazyReading: false, disableLazyClassReading: false),
      bytes);

  print("OK");
}

void roundTrip(BinaryBuilder binaryBuilder, List<int> bytes) {
  Stopwatch stopwatch = new Stopwatch()..start();
  Component c = new Component();
  binaryBuilder.readComponent(c);
  List<int> bytesRoundTripped = serializeComponent(c);
  print("Loaded and serialized in ${stopwatch.elapsedMilliseconds} ms");
  stopwatch.reset();

  checkIsEqual(bytes, bytesRoundTripped);
  print("Checked equal in ${stopwatch.elapsedMilliseconds} ms");
  stopwatch.reset();
  print("");
}
