|  | // Copyright (c) 2013, 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 "package:expect/expect.dart"; | 
|  | import 'dart:convert'; | 
|  |  | 
|  | class MySink extends ChunkedConversionSink<String> { | 
|  | final Function _add; | 
|  | final Function _close; | 
|  |  | 
|  | MySink(this._add, this._close); | 
|  |  | 
|  | void add(x) { | 
|  | _add(x); | 
|  | } | 
|  |  | 
|  | void close() { | 
|  | _close(); | 
|  | } | 
|  | } | 
|  |  | 
|  | main() { | 
|  | // Make sure the UTF-8 decoder works eagerly. | 
|  | late String lastString; | 
|  | bool isClosed = false; | 
|  | var sink = new MySink((x) => lastString = x, () => isClosed = true); | 
|  | var byteSink = new Utf8Decoder().startChunkedConversion(sink); | 
|  | byteSink.add("abc".codeUnits); | 
|  | Expect.equals("abc", lastString); | 
|  | byteSink.add([0x61, 0xc3]); // 'a' followed by first part of Î. | 
|  | Expect.equals("a", lastString); | 
|  | byteSink.add([0x8e]); // second part of Î. | 
|  | Expect.equals("Î", lastString); | 
|  | Expect.isFalse(isClosed); | 
|  | byteSink.close(); | 
|  | Expect.isTrue(isClosed); | 
|  | } |