| // 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. | 
 |  | 
 | // @dart = 2.9 | 
 |  | 
 | 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) {}); | 
 | } |