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

import "dart:typed_data";
import "package:expect/expect.dart";

void main() {
  test([1, 2, 3, 4], [5, 6], 2, [1, 2, 5, 6]);
  test([1, 2, 3, 4], [5, 6], 0, [5, 6, 3, 4]);
  test([1, 2, 3, 4], [5, 6], 1, [1, 5, 6, 4]);
  test([1, 2, 3, 4], [], 2, [1, 2, 3, 4]);
  test([1, 2, 3, 4], [5, 6], 2, [1, 2, 5, 6]);
  test([1, 2, 3, 4], [5, 6], 2, [1, 2, 5, 6]);
  test([1, 2, 3, 4], [5, 6], 2, [1, 2, 5, 6]);
  test([], [], 0, []);
  test([1], [2], 0, [2]);

  // Other (non-list) iterables.
  test([1, 2, 3, 4], new Iterable.generate(2, (x) => x + 7), 1, [1, 7, 8, 4]);
  test([1, 2, 3, 4], [9, 9, 5, 6].skip(2), 1, [1, 5, 6, 4]);
  test([1, 2, 3, 4], [5, 6, 9, 9].take(2), 1, [1, 5, 6, 4]);
  test([1, 2, 3, 4], [9, 5, 9, 6, 9, 9].where((x) => x != 9), 1, [1, 5, 6, 4]);
  test([1, 2, 3, 4], new Set.from([5, 6]), 1, [1, 5, 6, 4]);

  // Other types of lists.
  test(new Uint8List(4), [5, 6], 1, [0, 5, 6, 0]);
  test(new Uint8List(4), [-5, 6], 1, [0, 256 - 5, 6, 0]);

  // Over-long iterables. Updates until end, then throws.
  testThrows([], [1], 0);
  testThrows([2], [1], 1);
  testThrows([2], [1], 1);
  testThrows([1, 2, 3, 4], [5, 6, 7, 8], 2, [1, 2, 5, 6]);

  // Throwing iterable.
  Expect.throws(() {
    Iterable<int> throwingIterable() sync* {
      yield 1;
      throw "2";
    }

    List.writeIterable([1, 2, 3], 1, throwingIterable());
  }, (e) => e == "2");

  // Bad start index.
  testThrows([1, 2], [1], -1);
  testThrows([1, 2], [1], 2);

  // Working at a supertype is practical and useful.
  test<Object>(<int>[1, 2, 3, 4], <num>[5, 6], 1, [1, 5, 6, 4]);

  var d = new D();
  test<Object>(<B>[null], <C>[d], 0, [d]);
}

testThrows<T>(list, iterable, start, [expect]) {
  Expect.throws(() {
    List.writeIterable<T>(list, start, iterable);
  });
  if (expect != null) {
    Expect.listEquals(expect, list);
  }
}

test<T>(List<T> list, Iterable<T> iterable, int start, List expect) {
  List.writeIterable<T>(list, start, iterable);
  Expect.listEquals(expect, list);
}

class B {}

class C {}

class D implements B, C {}
