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

// @dart = 2.9

/// @assertion
/// Future<RandomAccessFile> writeString(
///     String string, {
///     Encoding encoding: utf8
/// })
/// Writes a string to the file using the given Encoding.
///
/// @description Checks that method writeString writes a string to the file using
/// the given Encoding ASCII.
/// @author ngl@unipro.ru

import "dart:async";
import "dart:io";
import "dart:convert";
import "../../../Utils/expect.dart";
import "../file_utils.dart";

check(String s) {
  File file = getTempFileSync();
  asyncStart();
  Future<RandomAccessFile> raFile = file.open(mode: FileMode.write);
  raFile.then((RandomAccessFile rf) {
    var f = rf.writeString(s, encoding: ascii);
    f.then((RandomAccessFile file) {
      var flen = file.lengthSync();
      rf.setPositionSync(0);
      List<int> l = file.readSync(flen);
      var ed = new AsciiCodec();
      String s1 = ed.decode(l);
      Expect.equals(s, s1);
      asyncEnd();
    }).whenComplete(() {
      rf.closeSync();
      file.deleteSync();
    });
  });
}

main() {
  check("");
  check("abc");
  check('abcdefjhigklmnopqrstuvwxyz1234567890');
}
