blob: 853cc77250ccd89c696febd0cae39122ba081349 [file] [log] [blame]
// Copyright (c) 2016, 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:expect/expect.dart";
import "package:async_helper/async_helper.dart";
class A {
const A();
}
class B extends A {
const B();
}
/// Stream which emits an error if it's not canceled at the correct time.
///
/// Must be canceled after at most [maxEvents] events.
Stream makeStream(int maxEvents) {
var c;
int event = 0;
bool canceled = false;
c = new StreamController(onListen: () {
new Timer.periodic(const Duration(milliseconds: 10), (t) {
if (canceled) {
t.cancel();
return;
}
if (event == maxEvents) {
c.addError("NOT CANCELED IN TIME: $maxEvents");
c.close();
t.cancel();
} else {
c.add(event++);
}
});
}, onCancel: () {
canceled = true;
});
return c.stream;
}
main() {
asyncStart();
tests().then((_) {
asyncEnd();
});
}
tests() async {
await expectThrowsAsync(makeStream(4).take(5).toList(), "5/4");
await expectThrowsAsync(makeStream(0).take(1).toList(), "1/0");
Expect.listEquals([0, 1, 2, 3, 4], await makeStream(5).take(5).toList());
Expect.listEquals([0, 1, 2, 3], await makeStream(5).take(4).toList());
Expect.listEquals([0], await makeStream(5).take(1).toList());
Expect.listEquals([], await makeStream(5).take(0).toList());
Expect.listEquals([], await makeStream(0).take(0).toList());
// Regression for https://github.com/dart-lang/sdk/issues/30305
Expect.equals('result', await makeStream(5).take(0).drain('result'));
}
Future expectThrowsAsync(Future computation, String name) {
return computation.then((_) {
Expect.fail("$name: Did not throw");
}, onError: (e, s) {});
}