// Copyright (c) 2018, 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 'dart:io' show Platform, exit;

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

import 'package:kernel/text/ast_to_text.dart' show componentToString;

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

import '../incremental_suite.dart' show normalCompileToBytes;

main() async {
  List<int> bytes = await normalCompileToBytes(
      Platform.script.resolve("load_dill_twice_lib_1.dart"));

  Component c = new Component();
  new BinaryBuilder(bytes).readComponent(c);
  // Print once to lazy-load whatever it needs to lazy-load to print.
  // This *might* change the textual representation because references can be
  // created.
  componentToString(c);
  String loadedOnceString = componentToString(c);
  new BinaryBuilder(bytes).readComponent(c);
  String loadedTwiceString = componentToString(c);

  if (loadedOnceString != loadedTwiceString) {
    print("Loading the dill twice produces a different textual representation");
    List<String> linesOnce = loadedOnceString.split("\n");
    List<String> linesTwice = loadedTwiceString.split("\n");

    if (linesOnce.length != linesTwice.length) {
      print("Number of lines differ! "
          "(${linesOnce.length} vs ${linesTwice.length})");
    }

    // Do some simple and stupid diff.
    int i = 0;
    int j = 0;
    while (i < linesOnce.length || j < linesTwice.length) {
      if (i < linesOnce.length && j < linesTwice.length) {
        if (linesOnce[i] == linesTwice[j]) {
          i++;
          j++;
        } else {
          // Search for line from linesOnce in linesTwice
          bool good = false;
          for (int k = j + 1; k < linesTwice.length && k < j + 100; k++) {
            if (linesOnce[i] == linesTwice[k]) {
              // Inserted lines between j and k.
              for (int k2 = j; k2 < k; k2++) {
                print("+ ${linesTwice[k2]}");
              }
              i++;
              j = k + 1;
              good = true;
              break;
            }
          }
          if (!good) {
            // Assume lines deleted.
            print("- ${linesOnce[i]}");
            i++;
          }
        }
      } else if (i < linesOnce.length) {
        // Rest from linesOnce was deleted.
        for (; i < linesOnce.length; i++) {
          print("- ${linesOnce[i]}");
        }
      } else if (j < linesTwice.length) {
        // Rest from linesTwice was added.
        for (; j < linesTwice.length; j++) {
          print("+ ${linesTwice[j]}");
        }
      }
    }

    exit(1);
  }
  print("OK");
}
