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

// @dart = 2.9

import "package:expect/expect.dart";
import 'dart:async';
import 'dart:convert';
import 'unicode_tests.dart';
import "package:async_helper/async_helper.dart";

Stream<String> decode(List<int> bytes, int chunkSize) {
  var controller;
  controller = new StreamController<List<int>>(onListen: () {
    int i = 0;
    while (i < bytes.length) {
      List nextChunk = <int>[];
      for (int j = 0; j < chunkSize; j++) {
        if (i < bytes.length) {
          nextChunk.add(bytes[i]);
          i++;
        }
      }
      controller.add(nextChunk);
    }
    controller.close();
  });
  return controller.stream.transform(utf8.decoder);
}

testUnpaused(String expected, Stream stream) {
  asyncStart();
  stream.toList().then((list) {
    StringBuffer buffer = new StringBuffer();
    buffer.writeAll(list);
    Expect.stringEquals(expected, buffer.toString());
    asyncEnd();
  });
}

testWithPauses(String expected, Stream stream) {
  asyncStart();
  StringBuffer buffer = new StringBuffer();
  var sub;
  sub = stream.listen((x) {
    buffer.write(x);
    sub.pause(new Future.delayed(Duration.zero));
  }, onDone: () {
    Expect.stringEquals(expected, buffer.toString());
    asyncEnd();
  });
}

main() {
  for (var test in UNICODE_TESTS) {
    var bytes = test[0];
    var expected = test[1];
    testUnpaused(expected, decode(bytes, 1));
    testWithPauses(expected, decode(bytes, 1));
    testUnpaused(expected, decode(bytes, 2));
    testWithPauses(expected, decode(bytes, 2));
    testUnpaused(expected, decode(bytes, 3));
    testWithPauses(expected, decode(bytes, 3));
    testUnpaused(expected, decode(bytes, 4));
    testWithPauses(expected, decode(bytes, 4));
  }
}
