// Copyright (c) 2017, 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:async";

import "package:test/test.dart";
import "package:async/async.dart";

void main() {
  group("collectBytes", () {
    test("simple list and overflow", () {
      var result = collectBytes(Stream.fromIterable([
        [0],
        [1],
        [2],
        [256]
      ]));
      expect(result, completion([0, 1, 2, 0]));
    });

    test("no events", () {
      var result = collectBytes(Stream.fromIterable([]));
      expect(result, completion([]));
    });

    test("empty events", () {
      var result = collectBytes(Stream.fromIterable([[], []]));
      expect(result, completion([]));
    });

    test("error event", () {
      var result = collectBytes(Stream.fromIterable(
          Iterable.generate(3, (n) => n == 2 ? throw "badness" : [n])));
      expect(result, throwsA("badness"));
    });
  });

  group("collectBytes", () {
    test("simple list and overflow", () {
      var result = collectBytesCancelable(Stream.fromIterable([
        [0],
        [1],
        [2],
        [256]
      ]));
      expect(result.value, completion([0, 1, 2, 0]));
    });

    test("no events", () {
      var result = collectBytesCancelable(Stream.fromIterable([]));
      expect(result.value, completion([]));
    });

    test("empty events", () {
      var result = collectBytesCancelable(Stream.fromIterable([[], []]));
      expect(result.value, completion([]));
    });

    test("error event", () {
      var result = collectBytesCancelable(Stream.fromIterable(
          Iterable.generate(3, (n) => n == 2 ? throw "badness" : [n])));
      expect(result.value, throwsA("badness"));
    });

    test("cancelled", () async {
      var sc = StreamController<List<int>>();
      var result = collectBytesCancelable(sc.stream);
      // Value never completes.
      result.value.whenComplete(expectAsync0(() {}, count: 0));

      expect(sc.hasListener, isTrue);
      sc.add([1, 2]);
      await nextTimerTick();
      expect(sc.hasListener, isTrue);
      sc.add([3, 4]);
      await nextTimerTick();
      expect(sc.hasListener, isTrue);
      result.cancel();
      expect(sc.hasListener, isFalse); // Cancelled immediately.
      var replacement = await result.valueOrCancellation();
      expect(replacement, isNull);
      await nextTimerTick();
      sc.close();
      await nextTimerTick();
    });
  });
}

Future nextTimerTick() => Future(() {});
