// 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.

// Test that 79cc54e51924cd5a6bdc2bd1771f2d0ee7af8899 works as intended.

import 'dart:convert';

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

Uri uri1 = Uri.parse("foo://lib1.dart");
Uri uri2 = Uri.parse("foo://lib2.dart");

main() {
  Library library1 = new Library(uri1)..fileUri = uri1;
  Library library2 = new Library(uri2)..fileUri = uri2;
  Procedure p1 = new Procedure(new Name("p1"), ProcedureKind.Method,
      new FunctionNode(new ReturnStatement()))
    ..fileUri = uri2;
  Procedure p2 = new Procedure(new Name("p2"), ProcedureKind.Method,
      new FunctionNode(new ReturnStatement()))
    ..fileUri = uri1;
  library1.addProcedure(p1);
  library2.addProcedure(p2);

  Component component = new Component(libraries: [library1, library2])
    ..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak);
  component.uriToSource[uri1] = new Source(
      [42, 2 * 42], const Utf8Encoder().convert("source #1"), uri1, uri1);
  component.uriToSource[uri2] = new Source(
      [43, 3 * 43], const Utf8Encoder().convert("source #2"), uri1, uri1);
  expectSource(serialize(component), true, true);

  Component cPartial1 = new Component(nameRoot: component.root)
    ..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak)
    ..libraries.add(library1);
  cPartial1.uriToSource[uri1] = new Source(
      [42, 2 * 42], const Utf8Encoder().convert("source #1"), uri1, uri1);
  cPartial1.uriToSource[uri2] =
      new Source([43, 3 * 43], const <int>[], uri1, uri1);
  List<int> partial1Serialized = serialize(cPartial1);
  expectSource(partial1Serialized, true, false);

  Component cPartial2 = new Component(nameRoot: component.root)
    ..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak)
    ..libraries.add(library2);
  cPartial2.uriToSource[uri1] =
      new Source([42, 2 * 42], const <int>[], uri1, uri1);
  cPartial2.uriToSource[uri2] = new Source(
      [43, 3 * 43], const Utf8Encoder().convert("source #2"), uri1, uri1);
  List<int> partial2Serialized = serialize(cPartial2);
  expectSource(partial2Serialized, false, true);

  List<int> combined = new List<int>();
  combined.addAll(partial1Serialized);
  combined.addAll(partial2Serialized);
  expectSource(combined, true, true);
}

void expectSource(List<int> data, bool expect1, bool expect2) {
  BinaryBuilder builder = new BinaryBuilder(data);
  Component tmp = new Component();
  builder.readComponent(tmp);
  if (tmp.uriToSource[uri1] == null) throw "No data for $uri1";
  if (tmp.uriToSource[uri2] == null) throw "No data for $uri2";
  if (expect1 && tmp.uriToSource[uri1].source.isEmpty) {
    throw "No data for $uri1";
  }
  if (!expect1 && tmp.uriToSource[uri1].source.isNotEmpty) {
    throw "Unexpected data for $uri1";
  }
  if (expect2 && tmp.uriToSource[uri2].source.isEmpty) {
    throw "No data data for $uri2";
  }
  if (!expect2 && tmp.uriToSource[uri2].source.isNotEmpty) {
    throw "Unexpected data for $uri2";
  }
}

List<int> serialize(Component c) {
  SimpleSink sink = new SimpleSink();
  BinaryPrinter printerWhole = new BinaryPrinter(sink);
  printerWhole.writeComponentFile(c);
  List<int> result = new List<int>();
  for (List<int> chunk in sink.chunks) {
    result.addAll(chunk);
  }
  return result;
}

class SimpleSink implements Sink<List<int>> {
  final List<List<int>> chunks = <List<int>>[];

  @override
  void add(List<int> chunk) {
    chunks.add(chunk);
  }

  @override
  void close() {}
}
