// 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 test program for testing file I/O.

// OtherResources=empty_file
// OtherResources=file_test.txt
// OtherResources=fixed_length_file
// OtherResources=read_as_text.dat
// OtherResources=readline_test1.dat

import 'dart:async';
import 'dart:convert';
import 'dart:collection';
import 'dart:io';

import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";
import "package:path/path.dart";

class MyListOfOneElement extends Object
    with ListMixin<int>
    implements List<int> {
  int _value;
  MyListOfOneElement(this._value);
  int get length => 1;
  operator [](int index) => _value;
  void set length(int index) {
    throw "Unsupported";
  }

  operator []=(int index, value) {
    if (index != 0) {
      throw "Unsupported";
    } else {
      _value = value;
    }
  }
}

class FileTest {
  static late Directory tempDirectory;
  static int numLiveAsyncTests = 0;

  static void asyncTestStarted() {
    asyncStart();
    ++numLiveAsyncTests;
  }

  static void asyncTestDone(String name) {
    asyncEnd();
    --numLiveAsyncTests;
    if (numLiveAsyncTests == 0) {
      deleteTempDirectory();
    }
  }

  static void createTempDirectory(Function doNext) {
    Directory.systemTemp.createTemp('dart_file').then((temp) {
      tempDirectory = temp;
      doNext();
    });
  }

  static void deleteTempDirectory() {
    tempDirectory.deleteSync(recursive: true);
  }

  // Test for file read functionality.
  static void testReadStream() {
    // Read a file and check part of it's contents.
    String filename = getFilename("file_test.txt");
    File file = new File(filename);
    Expect.isTrue('$file'.contains(file.path));
    var subscription;
    List<int> buffer = <int>[];
    subscription = file.openRead().listen((d) {
      buffer.addAll(d);
      if (buffer.length >= 12) {
        subscription.cancel();
        Expect.equals(47, buffer[0]); // represents '/' in the file.
        Expect.equals(47, buffer[1]); // represents '/' in the file.
        Expect.equals(32, buffer[2]); // represents ' ' in the file.
        Expect.equals(67, buffer[3]); // represents 'C' in the file.
        Expect.equals(111, buffer[4]); // represents 'o' in the file.
        Expect.equals(112, buffer[5]); // represents 'p' in the file.
        Expect.equals(121, buffer[6]); // represents 'y' in the file.
        Expect.equals(114, buffer[7]); // represents 'r' in the file.
        Expect.equals(105, buffer[8]); // represents 'i' in the file.
        Expect.equals(103, buffer[9]); // represents 'g' in the file.
        Expect.equals(104, buffer[10]); // represents 'h' in the file.
        Expect.equals(116, buffer[11]); // represents 't' in the file.
      }
    });
  }

  // Test for file read and write functionality.
  static void testReadWriteStream() {
    asyncTestStarted();

    // Read a file.
    String inFilename = getFilename("fixed_length_file");
    File file;
    int bytesRead;

    var file1 = new File(inFilename);
    List<int> buffer = <int>[];
    file1.openRead().listen((d) {
      buffer.addAll(d);
    }, onDone: () {
      Expect.equals(42, buffer.length);
      // Write the contents of the file just read into another file.
      String outFilename = tempDirectory.path + "/out_read_write_stream";
      var file2 = new File(outFilename);
      var output = file2.openWrite();
      output.add(buffer);
      output.flush().then((_) => output.close());
      output.done.then((_) {
        // Now read the contents of the file just written.
        List<int> buffer2 = <int>[];
        new File(outFilename).openRead().listen((d) {
          buffer2.addAll(d);
        }, onDone: () {
          Expect.equals(42, buffer2.length);
          // Now compare the two buffers to check if they are
          // identical.
          for (int i = 0; i < buffer.length; i++) {
            Expect.equals(buffer[i], buffer2[i]);
          }
          // Delete the output file.
          file2.deleteSync();
          Expect.isFalse(file2.existsSync());
          asyncTestDone("testReadWriteStream");
        });
      });
    });
  }

  // Test for file stream buffered handling of large files.
  static void testReadWriteStreamLargeFile() {
    // Create the test data - arbitrary binary data.
    List<int> buffer = new List<int>.filled(100000, 0);
    for (var i = 0; i < buffer.length; ++i) {
      buffer[i] = i % 256;
    }
    String filename = tempDirectory.path + "/out_read_write_stream_large_file";
    File file = new File(filename);
    IOSink output = file.openWrite();
    output.add(buffer);
    output.add(buffer);
    output.flush().then((_) => output.close());

    asyncTestStarted();
    output.done
        .then((_) {
          final input = file.openRead();
          int position = 0;
          final int expectedLength = 200000;

          // Start an independent asynchronous check on the length.
          Future lengthTest() {
            asyncTestStarted();
            return file.length().then((len) {
              Expect.equals(expectedLength, len);
              asyncTestDone('testReadWriteStreamLargeFile: length check');
            });
          }

          // Immediate read should read 0 bytes.
          Future contentTest() {
            asyncTestStarted();
            var completer = new Completer();
            input.listen((List<int> data) {
              for (int i = 0; i < data.length; ++i) {
                Expect.equals(buffer[(i + position) % buffer.length], data[i]);
              }
              position += data.length;
            }, onError: (error, trace) {
              print('Error on input in testReadWriteStreamLargeFile');
              print('with error $error');
              if (trace != null) print("StackTrace: $trace");
              throw error;
            }, onDone: () {
              Expect.equals(expectedLength, position);
              testPipe(file, buffer).then((_) {
                asyncTestDone('testReadWriteStreamLargeFile: main test');
              }).catchError((error, trace) {
                print('Exception while deleting ReadWriteStreamLargeFile file');
                print('Exception $error');
                if (trace != null) print("StackTrace: $trace");
                throw error;
              }).whenComplete(completer.complete);
            });
            return completer.future;
          }

          return Future.forEach<Function>(
              [lengthTest, contentTest], (test) => test());
        })
        .whenComplete(file.delete)
        .whenComplete(() {
          asyncTestDone('testReadWriteStreamLargeFile finished');
        });
  }

  static Future testPipe(File file, buffer) {
    String outputFilename = '${file.path}_copy';
    File outputFile = new File(outputFilename);
    var input = file.openRead();
    var output = outputFile.openWrite();
    Completer done = new Completer();
    input.cast<List<int>>().pipe(output).then((_) {
      var copy = outputFile.openRead();
      int position = 0;
      copy.listen((d) {
        for (int i = 0; i < d.length; i++) {
          Expect.equals(buffer[(position + i) % buffer.length], d[i]);
        }
        position += d.length;
      }, onDone: () {
        Expect.equals(2 * buffer.length, position);
        outputFile.delete().then((ignore) {
          done.complete();
        });
      });
    });
    return done.future;
  }

  static void testRead() {
    asyncStart();
    // Read a file and check part of it's contents.
    String filename = getFilename("file_test.txt");
    File file = new File(filename);
    file.open(mode: FileMode.read).then((RandomAccessFile file) {
      List<int> buffer = new List<int>.filled(10, 0);
      file.readInto(buffer, 0, 5).then((bytes_read) {
        Expect.equals(5, bytes_read);
        file.readInto(buffer, 5, 10).then((bytes_read) {
          Expect.equals(5, bytes_read);
          Expect.equals(47, buffer[0]); // represents '/' in the file.
          Expect.equals(47, buffer[1]); // represents '/' in the file.
          Expect.equals(32, buffer[2]); // represents ' ' in the file.
          Expect.equals(67, buffer[3]); // represents 'C' in the file.
          Expect.equals(111, buffer[4]); // represents 'o' in the file.
          Expect.equals(112, buffer[5]); // represents 'p' in the file.
          Expect.equals(121, buffer[6]); // represents 'y' in the file.
          Expect.equals(114, buffer[7]); // represents 'r' in the file.
          Expect.equals(105, buffer[8]); // represents 'i' in the file.
          Expect.equals(103, buffer[9]); // represents 'g' in the file.
          file.close().then((ignore) => asyncEnd());
        });
      });
    });
  }

  static void testReadSync() {
    // Read a file and check part of it's contents.
    String filename = getFilename("file_test.txt");
    RandomAccessFile raf = (new File(filename)).openSync();
    List<int> buffer = new List<int>.filled(42, 0);
    int bytes_read = 0;
    bytes_read = raf.readIntoSync(buffer, 0, 12);
    Expect.equals(12, bytes_read);
    bytes_read = raf.readIntoSync(buffer, 12, 42);
    Expect.equals(30, bytes_read);
    Expect.equals(47, buffer[0]); // represents '/' in the file.
    Expect.equals(47, buffer[1]); // represents '/' in the file.
    Expect.equals(32, buffer[2]); // represents ' ' in the file.
    Expect.equals(67, buffer[3]); // represents 'C' in the file.
    Expect.equals(111, buffer[4]); // represents 'o' in the file.
    Expect.equals(112, buffer[5]); // represents 'p' in the file.
    Expect.equals(121, buffer[6]); // represents 'y' in the file.
    Expect.equals(114, buffer[7]); // represents 'r' in the file.
    Expect.equals(105, buffer[8]); // represents 'i' in the file.
    Expect.equals(103, buffer[9]); // represents 'g' in the file.
    Expect.equals(104, buffer[10]); // represents 'h' in the file.
    Expect.equals(116, buffer[11]); // represents 't' in the file.
    raf.closeSync();

    filename = getFilename("fixed_length_file");
    File file = new File(filename);
    int len = file.lengthSync();
    int read(int length) {
      var f = file.openSync();
      int res = f.readSync(length).length;
      f.closeSync();
      return res;
    }

    Expect.equals(0, read(0));
    Expect.equals(1, read(1));
    Expect.equals(len - 1, read(len - 1));
    Expect.equals(len, read(len));
    Expect.equals(len, read(len + 1));
    Expect.equals(len, read(len * 2));
    Expect.equals(len, read(len * 10));
  }

  // Test for file read and write functionality.
  static void testReadWrite() {
    asyncTestStarted();
    // Read a file.
    String inFilename = getFilename("fixed_length_file");
    final File file = new File(inFilename);
    file.open(mode: FileMode.read).then((openedFile) {
      List<int> buffer1 = new List<int>.filled(42, 0);
      openedFile.readInto(buffer1, 0, 42).then((bytes_read) {
        Expect.equals(42, bytes_read);
        openedFile.close().then((ignore) {
          // Write the contents of the file just read into another file.
          String outFilename = tempDirectory.path + "/out_read_write";
          final File file2 = new File(outFilename);
          file2.create().then((ignore) {
            file2.resolveSymbolicLinks().then((s) {
              Expect.isTrue(new File(s).existsSync());
              if (s[0] != '/' && s[0] != '\\' && s[1] != ':') {
                Expect.fail("Not a full path");
              }
              file2.open(mode: FileMode.write).then((openedFile2) {
                openedFile2.writeFrom(buffer1, 0, bytes_read).then((ignore) {
                  openedFile2.close().then((ignore) {
                    List<int> buffer2 = new List<int>.filled(bytes_read, 0);
                    final File file3 = new File(outFilename);
                    file3.open(mode: FileMode.read).then((openedFile3) {
                      openedFile3.readInto(buffer2, 0, 42).then((bytes_read) {
                        Expect.equals(42, bytes_read);
                        openedFile3.close().then((ignore) {
                          // Now compare the two buffers to check if they
                          // are identical.
                          Expect.equals(buffer1.length, buffer2.length);
                          for (int i = 0; i < buffer1.length; i++) {
                            Expect.equals(buffer1[i], buffer2[i]);
                          }
                          // Delete the output file.
                          final file4 = file3;
                          file4.delete().then((ignore) {
                            file4.exists().then((exists) {
                              Expect.isFalse(exists);
                              asyncTestDone("testReadWrite");
                            });
                          });
                        });
                      });
                    });
                  });
                });
              });
            });
          });
        });
      });
    });
  }

  static void testWriteAppend() {
    String content = "foobar";
    String filename = tempDirectory.path + "/write_append";
    File file = new File(filename);
    file.createSync();
    Expect.isTrue(new File(filename).existsSync());
    List<int> buffer = content.codeUnits;
    RandomAccessFile openedFile = file.openSync(mode: FileMode.write);
    openedFile.writeFromSync(buffer, 0, buffer.length);
    openedFile.closeSync();
    // Reopen the file in write mode to ensure that we overwrite the content.
    openedFile = (new File(filename)).openSync(mode: FileMode.write);
    openedFile.writeFromSync(buffer, 0, buffer.length);
    Expect.equals(content.length, openedFile.lengthSync());
    openedFile.closeSync();
    // Open the file in append mode and ensure that we do not overwrite
    // the existing content.
    openedFile = (new File(filename)).openSync(mode: FileMode.append);
    openedFile.writeFromSync(buffer, 2, buffer.length - 2);
    Expect.equals(content.length + content.length - 4, openedFile.lengthSync());
    Expect.equals(content + content.substring(2, content.length - 2),
        file.readAsStringSync());
    openedFile.closeSync();
    file.deleteSync();
  }

  static void testOutputStreamWriteAppend() {
    asyncTestStarted();
    String content = "foobar";
    String filename = tempDirectory.path + "/outstream_write_append";
    File file = new File(filename);
    file.createSync();
    List<int> buffer = content.codeUnits;
    var output = file.openWrite();
    output.add(buffer);
    output.close();
    output.done.then((_) {
      File file2 = new File(filename);
      var appendingOutput = file2.openWrite(mode: FileMode.append);
      appendingOutput.add(buffer);
      appendingOutput.close();
      appendingOutput.done.then((_) {
        File file3 = new File(filename);
        file3.open(mode: FileMode.read).then((RandomAccessFile openedFile) {
          openedFile.length().then((int length) {
            Expect.equals(content.length * 2, length);
            openedFile.close().then((ignore) {
              file3.delete().then((ignore) {
                asyncTestDone("testOutputStreamWriteAppend");
              });
            });
          });
        });
      });
    });
  }

  // Test for file read and write functionality.
  static void testOutputStreamWriteString() {
    asyncTestStarted();
    String content = "foobar";
    String filename = tempDirectory.path + "/outstream_write_string";
    File file = new File(filename);
    file.createSync();
    List<int> buffer = content.codeUnits;
    var output = file.openWrite();
    output.write("abcdABCD");
    output.encoding = utf8;
    output.write("abcdABCD");
    output.encoding = latin1;
    output.write("abcdABCD");
    output.encoding = ascii;
    output.write("abcdABCD");
    output.encoding = utf8;
    output.write("æøå");
    output.close();
    output.done.then((_) {
      RandomAccessFile raf = file.openSync();
      Expect.equals(38, raf.lengthSync());
      raf.close().then((ignore) {
        asyncTestDone("testOutputStreamWriteString");
      });
    });
  }

  static void testReadWriteSync() {
    // Read a file.
    String inFilename = getFilename("fixed_length_file");
    RandomAccessFile file = (new File(inFilename)).openSync();
    List<int> buffer1 = new List<int>.filled(42, 0);
    int bytes_read = 0;
    int bytes_written = 0;
    bytes_read = file.readIntoSync(buffer1, 0, 42);
    Expect.equals(42, bytes_read);
    file.closeSync();
    // Write the contents of the file just read into another file.
    String outFilename = tempDirectory.path + "/out_read_write_sync";
    File outFile = new File(outFilename);
    outFile.createSync();
    String path = outFile.resolveSymbolicLinksSync();
    if (path[0] != '/' && path[0] != '\\' && path[1] != ':') {
      Expect.fail("Not a full path");
    }
    Expect.isTrue(new File(path).existsSync());
    RandomAccessFile openedFile = outFile.openSync(mode: FileMode.write);
    openedFile.writeFromSync(buffer1, 0, bytes_read);
    openedFile.closeSync();
    // Now read the contents of the file just written.
    List<int> buffer2 = new List<int>.filled(bytes_read, 0);
    openedFile = (new File(outFilename)).openSync();
    bytes_read = openedFile.readIntoSync(buffer2, 0, 42);
    Expect.equals(42, bytes_read);
    openedFile.closeSync();
    // Now compare the two buffers to check if they are identical.
    Expect.equals(buffer1.length, buffer2.length);
    for (int i = 0; i < buffer1.length; i++) {
      Expect.equals(buffer1[i], buffer2[i]);
    }
    // Delete the output file.
    outFile.deleteSync();
    Expect.isFalse(outFile.existsSync());
  }

  static void testReadWriteNoArgsSync() {
    // Read a file.
    String inFilename = getFilename("fixed_length_file");
    RandomAccessFile file = (new File(inFilename)).openSync();
    List<int> buffer1 = new List<int>.filled(42, 0);
    int bytes_read = 0;
    int bytes_written = 0;
    bytes_read = file.readIntoSync(buffer1);
    Expect.equals(42, bytes_read);
    file.closeSync();
    // Write the contents of the file just read into another file.
    String outFilename = tempDirectory.path + "/out_read_write_sync";
    File outFile = new File(outFilename);
    outFile.createSync();
    String path = outFile.resolveSymbolicLinksSync();
    if (path[0] != '/' && path[0] != '\\' && path[1] != ':') {
      Expect.fail("Not a full path");
    }
    Expect.isTrue(new File(path).existsSync());
    RandomAccessFile openedFile = outFile.openSync(mode: FileMode.write);
    openedFile.writeFromSync(buffer1);
    openedFile.closeSync();
    // Now read the contents of the file just written.
    List<int> buffer2 = new List<int>.filled(bytes_read, 0);
    openedFile = (new File(outFilename)).openSync();
    bytes_read = openedFile.readIntoSync(buffer2, 0);
    Expect.equals(42, bytes_read);
    openedFile.closeSync();
    // Now compare the two buffers to check if they are identical.
    Expect.equals(buffer1.length, buffer2.length);
    for (int i = 0; i < buffer1.length; i++) {
      Expect.equals(buffer1[i], buffer2[i]);
    }
    // Delete the output file.
    outFile.deleteSync();
    Expect.isFalse(outFile.existsSync());
  }

  static void testReadEmptyFileSync() {
    String fileName = tempDirectory.path + "/empty_file_sync";
    File file = new File(fileName);
    file.createSync();
    RandomAccessFile openedFile = file.openSync();
    Expect.equals(-1, openedFile.readByteSync());
    openedFile.closeSync();
    file.deleteSync();
  }

  static void testReadEmptyFile() {
    String fileName = tempDirectory.path + "/empty_file";
    File file = new File(fileName);
    asyncTestStarted();
    file.create().then((ignore) {
      file.open(mode: FileMode.read).then((RandomAccessFile openedFile) {
        var readByteFuture = openedFile.readByte();
        readByteFuture.then((int byte) {
          Expect.equals(-1, byte);
          openedFile.close().then((ignore) {
            asyncTestDone("testReadEmptyFile");
          });
        });
      });
    });
  }

  // Test for file write of different types of lists.
  static void testWriteVariousLists() {
    asyncTestStarted();
    final String fileName = "${tempDirectory.path}/testWriteVariousLists";
    final File file = new File(fileName);
    file.create().then((ignore) {
      file.open(mode: FileMode.write).then((RandomAccessFile openedFile) {
        // Write bytes from 0 to 7.
        openedFile.writeFromSync([0], 0, 1);
        openedFile.writeFromSync(const [1], 0, 1);
        openedFile.writeFromSync(new MyListOfOneElement(2), 0, 1);
        var x = -259;
        var y = 0;
        openedFile.writeFromSync([y - x], 0, 1);
        openedFile.writeFromSync([260], 0, 1); // 260 = 256 + 4 = 0x104.
        openedFile.writeFromSync(const [261], 0, 1);
        openedFile.writeFromSync(new MyListOfOneElement(262), 0, 1);
        x = 0;
        y = 263;
        openedFile.writeFrom([y - x], 0, 1).then((ignore) {
          openedFile.close().then((ignore) {
            // Check the written bytes.
            final File file2 = new File(fileName);
            var openedFile2 = file2.openSync();
            var length = openedFile2.lengthSync();
            Expect.equals(8, length);
            var data = new List<int>.filled(length, 0);
            openedFile2.readIntoSync(data, 0, length);
            for (var i = 0; i < data.length; i++) {
              Expect.equals(i, data[i]);
            }
            openedFile2.closeSync();
            file2.deleteSync();
            asyncTestDone("testWriteVariousLists");
          });
        });
      });
    });
  }

  static void testWriteFromOffset() {
    final tmp = tempDirectory.createTempSync('write_from_offset_test_');
    try {
      File f = new File('${tmp.path}/file')..createSync();
      f.writeAsStringSync('pre-existing content\n', flush: true);
      final raf = f.openSync(mode: FileMode.append);
      try {
        String truth = "Hello world";
        raf.writeFromSync(utf8.encode('Hello world'), 2, 5);
        raf.flushSync();
        Expect.equals(f.readAsStringSync(), 'pre-existing content\nllo');
      } finally {
        raf.closeSync();
      }
    } finally {
      tmp.deleteSync(recursive: true);
    }
  }

  static void testDirectory() {
    asyncTestStarted();
    var tempDir = tempDirectory.path;
    var file = new File("${tempDir}/testDirectory");
    file.create().then((ignore) {
      Directory d = file.parent;
      d.exists().then((xexists) {
        Expect.isTrue(xexists);
        Expect.isTrue(d.path.endsWith(tempDir));
        file.delete().then((ignore) => asyncTestDone("testDirectory"));
      });
    });
  }

  static void testDirectorySync() {
    var tempDir = tempDirectory.path;
    var file = new File("${tempDir}/testDirectorySync");
    // Non-existing file still provides the directory.
    Expect.equals("${tempDir}", file.parent.path);
    file.createSync();
    // Check that the path of the returned directory is the temp directory.
    Directory d = file.parent;
    Expect.isTrue(d.existsSync());
    Expect.isTrue(d.path.endsWith(tempDir));
    file.deleteSync();
    // The directory getter does not care about file or type of file
    // system entity.
    Expect.equals("${tempDir}", file.parent.path);
    file = new File("foo");
    Expect.equals(".", file.parent.path);
    file = new File(".");
    Expect.equals(".", file.parent.path);
  }

  // Test for file length functionality.
  static void testLength() {
    asyncTestStarted();
    String filename = getFilename("fixed_length_file");
    File file = new File(filename);
    RandomAccessFile openedFile = file.openSync();
    openedFile.length().then((length) {
      Expect.equals(42, length);
      openedFile.close().then((ignore) => asyncTestDone("testLength"));
    });
    file.length().then((length) {
      Expect.equals(42, length);
    });
  }

  static void testLengthSync() {
    String filename = getFilename("fixed_length_file");
    File file = new File(filename);
    RandomAccessFile openedFile = file.openSync();
    Expect.equals(42, file.lengthSync());
    Expect.equals(42, openedFile.lengthSync());
    openedFile.closeSync();
  }

  static void testLengthSyncDirectory() {
    Directory tmp = tempDirectory.createTempSync('file_length_test_');
    String dirPath = '${tmp.path}/dir';
    new Directory(dirPath).createSync();
    try {
      new File(dirPath).lengthSync();
      Expect.fail('Expected operation to throw');
    } catch (e) {
      if (e is! FileSystemException) {
        print(e);
      }
      Expect.isTrue(e is FileSystemException);
    } finally {
      tmp.deleteSync(recursive: true);
    }
  }

  // Test for file position functionality.
  static void testPosition() {
    asyncTestStarted();
    String filename = getFilename("fixed_length_file");
    RandomAccessFile input = (new File(filename)).openSync();
    input.position().then((position) {
      Expect.equals(0, position);
      List<int> buffer = new List<int>.filled(100, 0);
      input.readInto(buffer, 0, 12).then((bytes_read) {
        input.position().then((position) {
          Expect.equals(12, position);
          input.readInto(buffer, 12, 18).then((bytes_read) {
            input.position().then((position) {
              Expect.equals(18, position);
              input.setPosition(8).then((ignore) {
                input.position().then((position) {
                  Expect.equals(8, position);
                  input.close().then((ignore) => asyncTestDone("testPosition"));
                });
              });
            });
          });
        });
      });
    });
  }

  static void testPositionSync() {
    String filename = getFilename("fixed_length_file");
    RandomAccessFile input = (new File(filename)).openSync();
    Expect.equals(0, input.positionSync());
    List<int> buffer = new List<int>.filled(100, 0);
    input.readIntoSync(buffer, 0, 12);
    Expect.equals(12, input.positionSync());
    input.readIntoSync(buffer, 12, 18);
    Expect.equals(18, input.positionSync());
    input.setPositionSync(8);
    Expect.equals(8, input.positionSync());
    input.closeSync();
  }

  static void testTruncate() {
    asyncTestStarted();
    File file = new File(tempDirectory.path + "/out_truncate");
    List<int> buffer = const [65, 65, 65, 65, 65, 65, 65, 65, 65, 65];
    file.open(mode: FileMode.write).then((RandomAccessFile openedFile) {
      openedFile.writeFrom(buffer, 0, 10).then((ignore) {
        openedFile.length().then((length) {
          Expect.equals(10, length);
          openedFile.truncate(5).then((ignore) {
            openedFile.length().then((length) {
              Expect.equals(5, length);
              openedFile.close().then((ignore) {
                file.delete().then((ignore) {
                  file.exists().then((exists) {
                    Expect.isFalse(exists);
                    asyncTestDone("testTruncate");
                  });
                });
              });
            });
          });
        });
      });
    });
  }

  static void testTruncateSync() {
    File file = new File(tempDirectory.path + "/out_truncate_sync");
    List<int> buffer = const [65, 65, 65, 65, 65, 65, 65, 65, 65, 65];
    RandomAccessFile openedFile = file.openSync(mode: FileMode.write);
    openedFile.writeFromSync(buffer, 0, 10);
    Expect.equals(10, openedFile.lengthSync());
    openedFile.truncateSync(5);
    Expect.equals(5, openedFile.lengthSync());
    bool exceptionCaught = false;
    bool wrongExceptionCaught = false;
    try {
      openedFile.truncateSync(-5);
    } on FileSystemException catch (ex) {
      exceptionCaught = true;
    } on Exception catch (ex) {
      wrongExceptionCaught = true;
    }
    Expect.equals(true, exceptionCaught);
    Expect.equals(true, !wrongExceptionCaught);
    openedFile.closeSync();
    file.deleteSync();
    Expect.isFalse(file.existsSync());
  }

  static testReadInto() async {
    asyncTestStarted();
    File file = new File(tempDirectory.path + "/out_read_into");

    var openedFile = await file.open(mode: FileMode.write);
    await openedFile.writeFrom(const [1, 2, 3]);

    await openedFile.setPosition(0);
    var list = [-1, -1, -1];
    Expect.equals(3, await openedFile.readInto(list));
    Expect.listEquals([1, 2, 3], list);

    read(start, end, length, expected) async {
      var list = [-1, -1, -1];
      await openedFile.setPosition(0);
      Expect.equals(length, await openedFile.readInto(list, start, end));
      Expect.listEquals(expected, list);
      return list;
    }

    await read(0, 3, 3, [1, 2, 3]);
    await read(0, 2, 2, [1, 2, -1]);
    await read(1, 2, 1, [-1, 1, -1]);
    await read(1, 3, 2, [-1, 1, 2]);
    await read(2, 3, 1, [-1, -1, 1]);
    await read(0, 0, 0, [-1, -1, -1]);

    await openedFile.close();

    asyncTestDone("testReadInto");
  }

  static void testReadIntoSync() {
    File file = new File(tempDirectory.path + "/out_read_into_sync");

    var openedFile = file.openSync(mode: FileMode.write);
    openedFile.writeFromSync(const [1, 2, 3]);

    openedFile.setPositionSync(0);
    var list = [-1, -1, -1];
    Expect.equals(3, openedFile.readIntoSync(list));
    Expect.listEquals([1, 2, 3], list);

    read(start, end, length, expected) {
      var list = [-1, -1, -1];
      openedFile.setPositionSync(0);
      Expect.equals(length, openedFile.readIntoSync(list, start, end));
      Expect.listEquals(expected, list);
      return list;
    }

    read(0, 3, 3, [1, 2, 3]);
    read(0, 2, 2, [1, 2, -1]);
    read(1, 2, 1, [-1, 1, -1]);
    read(1, 3, 2, [-1, 1, 2]);
    read(2, 3, 1, [-1, -1, 1]);
    read(0, 0, 0, [-1, -1, -1]);

    openedFile.closeSync();
  }

  static testWriteFrom() async {
    asyncTestStarted();
    File file = new File(tempDirectory.path + "/out_write_from");

    var buffer = const [1, 2, 3];
    var openedFile = await file.open(mode: FileMode.write);

    await openedFile.writeFrom(buffer);
    var result = []..addAll(buffer);
    ;

    write([start, end]) async {
      var returnValue = await openedFile.writeFrom(buffer, start, end);
      Expect.identical(openedFile, returnValue);
      result.addAll(buffer.sublist(start, end));
    }

    await write(0, 3);
    await write(0, 2);
    await write(1, 2);
    await write(1, 3);
    await write(2, 3);
    await write(0, 0);

    var bytesFromFile = await file.readAsBytes();
    Expect.listEquals(result, bytesFromFile);

    await openedFile.close();

    asyncTestDone("testWriteFrom");
  }

  static void testWriteFromSync() {
    File file = new File(tempDirectory.path + "/out_write_from_sync");

    var buffer = const [1, 2, 3];
    var openedFile = file.openSync(mode: FileMode.write);

    openedFile.writeFromSync(buffer);
    var result = []..addAll(buffer);
    ;

    write([start, end]) {
      openedFile.writeFromSync(buffer, start, end);
      result.addAll(buffer.sublist(start, end));
    }

    write(0, 3);
    write(0, 2);
    write(1, 2);
    write(1, 3);
    write(2, 3);

    var bytesFromFile = file.readAsBytesSync();
    Expect.listEquals(result, bytesFromFile);

    openedFile.closeSync();
  }

  // Tests exception handling after file was closed.
  static void testCloseException() {
    bool exceptionCaught = false;
    bool wrongExceptionCaught = false;
    File input = new File(tempDirectory.path + "/out_close_exception");
    RandomAccessFile openedFile = input.openSync(mode: FileMode.write);
    openedFile.closeSync();
    try {
      openedFile.readByteSync();
    } on FileSystemException catch (ex) {
      exceptionCaught = true;
    } on Exception catch (ex) {
      wrongExceptionCaught = true;
    }
    Expect.equals(true, exceptionCaught);
    Expect.equals(true, !wrongExceptionCaught);
    exceptionCaught = false;
    try {
      openedFile.writeByteSync(1);
    } on FileSystemException catch (ex) {
      exceptionCaught = true;
    } on Exception catch (ex) {
      wrongExceptionCaught = true;
    }
    Expect.equals(true, exceptionCaught);
    Expect.equals(true, !wrongExceptionCaught);
    exceptionCaught = false;
    try {
      openedFile.writeStringSync("Test");
    } on FileSystemException catch (ex) {
      exceptionCaught = true;
    } on Exception catch (ex) {
      wrongExceptionCaught = true;
    }
    Expect.equals(true, exceptionCaught);
    Expect.equals(true, !wrongExceptionCaught);
    exceptionCaught = false;
    try {
      List<int> buffer = new List<int>.filled(100, 0);
      openedFile.readIntoSync(buffer, 0, 10);
    } on FileSystemException catch (ex) {
      exceptionCaught = true;
    } on Exception catch (ex) {
      wrongExceptionCaught = true;
    }
    Expect.equals(true, exceptionCaught);
    Expect.equals(true, !wrongExceptionCaught);
    exceptionCaught = false;
    try {
      List<int> buffer = new List<int>.filled(100, 0);
      openedFile.writeFromSync(buffer, 0, 10);
    } on FileSystemException catch (ex) {
      exceptionCaught = true;
    } on Exception catch (ex) {
      wrongExceptionCaught = true;
    }
    Expect.equals(true, exceptionCaught);
    Expect.equals(true, !wrongExceptionCaught);
    exceptionCaught = false;
    try {
      openedFile.positionSync();
    } on FileSystemException catch (ex) {
      exceptionCaught = true;
    } on Exception catch (ex) {
      wrongExceptionCaught = true;
    }
    Expect.equals(true, exceptionCaught);
    Expect.equals(true, !wrongExceptionCaught);
    exceptionCaught = false;
    try {
      openedFile.lengthSync();
    } on FileSystemException catch (ex) {
      exceptionCaught = true;
    } on Exception catch (ex) {
      wrongExceptionCaught = true;
    }
    Expect.equals(true, exceptionCaught);
    Expect.equals(true, !wrongExceptionCaught);
    exceptionCaught = false;
    try {
      openedFile.flushSync();
    } on FileSystemException catch (ex) {
      exceptionCaught = true;
    } on Exception catch (ex) {
      wrongExceptionCaught = true;
    }
    Expect.equals(true, exceptionCaught);
    Expect.equals(true, !wrongExceptionCaught);
    input.deleteSync();
  }

  // Tests stream exception handling after file was closed.
  static void testCloseExceptionStream() {
    asyncTestStarted();
    List<int> buffer = new List<int>.filled(42, 0);
    File file = new File(tempDirectory.path + "/out_close_exception_stream");
    file.createSync();
    var output = file.openWrite();
    output.close();
    Expect.throws(() {
      output.add(buffer);
    });
    output.done.then((_) {
      file.deleteSync();
      asyncTestDone("testCloseExceptionStream");
    });
  }

  // Tests buffer out of bounds exception.
  static void testBufferOutOfBoundsException() {
    bool exceptionCaught = false;
    bool wrongExceptionCaught = false;
    File file = new File(tempDirectory.path + "/out_buffer_out_of_bounds");
    RandomAccessFile openedFile = file.openSync(mode: FileMode.write);
    try {
      List<int> buffer = new List<int>.filled(10, 0);
      openedFile.readIntoSync(buffer, 0, 12);
    } on RangeError catch (ex) {
      exceptionCaught = true;
    } on Exception catch (ex) {
      wrongExceptionCaught = true;
    }
    Expect.equals(true, exceptionCaught);
    Expect.equals(true, !wrongExceptionCaught);
    exceptionCaught = false;
    try {
      List<int> buffer = new List<int>.filled(10, 0);
      openedFile.readIntoSync(buffer, 6, 12);
    } on RangeError catch (ex) {
      exceptionCaught = true;
    } on Exception catch (ex) {
      wrongExceptionCaught = true;
    }
    Expect.equals(true, exceptionCaught);
    Expect.equals(true, !wrongExceptionCaught);
    exceptionCaught = false;
    try {
      List<int> buffer = new List<int>.filled(10, 0);
      openedFile.readIntoSync(buffer, -1, 1);
    } on RangeError catch (ex) {
      exceptionCaught = true;
    } on Exception catch (ex) {
      wrongExceptionCaught = true;
    }
    Expect.equals(true, exceptionCaught);
    Expect.equals(true, !wrongExceptionCaught);
    exceptionCaught = false;
    try {
      List<int> buffer = new List<int>.filled(10, 0);
      openedFile.readIntoSync(buffer, 0, -1);
    } on RangeError catch (ex) {
      exceptionCaught = true;
    } on Exception catch (ex) {
      wrongExceptionCaught = true;
    }
    Expect.equals(true, exceptionCaught);
    Expect.equals(true, !wrongExceptionCaught);
    exceptionCaught = false;
    try {
      List<int> buffer = new List<int>.filled(10, 0);
      openedFile.writeFromSync(buffer, 0, 12);
    } on RangeError catch (ex) {
      exceptionCaught = true;
    } on Exception catch (ex) {
      wrongExceptionCaught = true;
    }
    Expect.equals(true, exceptionCaught);
    Expect.equals(true, !wrongExceptionCaught);
    exceptionCaught = false;
    try {
      List<int> buffer = new List<int>.filled(10, 0);
      openedFile.writeFromSync(buffer, 6, 12);
    } on RangeError catch (ex) {
      exceptionCaught = true;
    } on Exception catch (ex) {
      wrongExceptionCaught = true;
    }
    Expect.equals(true, exceptionCaught);
    Expect.equals(true, !wrongExceptionCaught);
    exceptionCaught = false;
    try {
      List<int> buffer = new List<int>.filled(10, 0);
      openedFile.writeFromSync(buffer, -1, 1);
    } on RangeError catch (ex) {
      exceptionCaught = true;
    } on Exception catch (ex) {
      wrongExceptionCaught = true;
    }
    Expect.equals(true, exceptionCaught);
    Expect.equals(true, !wrongExceptionCaught);
    exceptionCaught = false;
    try {
      List<int> buffer = new List<int>.filled(10, 0);
      openedFile.writeFromSync(buffer, 0, -1);
    } on RangeError catch (ex) {
      exceptionCaught = true;
    } on Exception catch (ex) {
      wrongExceptionCaught = true;
    }
    Expect.equals(true, exceptionCaught);
    Expect.equals(true, !wrongExceptionCaught);
    openedFile.closeSync();
    file.deleteSync();
  }

  static void testOpenDirectoryAsFile() {
    var f = new File('.');
    var future = f.open(mode: FileMode.read);
    future
        .then((r) => Expect.fail('Directory opened as file'))
        .catchError((e) {});
  }

  static void testOpenDirectoryAsFileSync() {
    var f = new File('.');
    try {
      f.openSync();
      Expect.fail("Expected exception opening directory as file");
    } catch (e) {
      Expect.isTrue(e is FileSystemException);
    }
  }

  static void testReadAsBytes() {
    asyncTestStarted();
    var name = getFilename("fixed_length_file");
    var f = new File(name);
    f.readAsBytes().then((bytes) {
      Expect.isTrue(new String.fromCharCodes(bytes).endsWith("42 bytes."));
      Expect.equals(42, bytes.length);
      asyncTestDone("testReadAsBytes");
    });
  }

  static void testReadAsBytesEmptyFile() {
    asyncTestStarted();
    var name = getFilename("empty_file");
    var f = new File(name);
    f.readAsBytes().then((bytes) {
      Expect.equals(0, bytes.length);
      asyncTestDone("testReadAsBytesEmptyFile");
    });
  }

  static void testReadAsBytesSync() {
    var name = getFilename("fixed_length_file");
    var bytes = new File(name).readAsBytesSync();
    Expect.isTrue(new String.fromCharCodes(bytes).endsWith("42 bytes."));
    Expect.equals(bytes.length, 42);
  }

  static void testReadAsBytesSyncEmptyFile() {
    var name = getFilename("empty_file");
    var bytes = new File(name).readAsBytesSync();
    Expect.equals(bytes.length, 0);
  }

  static void testReadAsText() {
    asyncTestStarted();
    var name = getFilename("fixed_length_file");
    var f = new File(name);
    f.readAsString(encoding: utf8).then((text) {
      Expect.isTrue(text.endsWith("42 bytes."));
      Expect.equals(42, text.length);
      var name = getFilename("read_as_text.dat");
      var f = new File(name);
      f.readAsString(encoding: utf8).then((text) {
        Expect.equals(6, text.length);
        var expected = [955, 120, 46, 32, 120, 10];
        Expect.listEquals(expected, text.codeUnits);
        f.readAsString(encoding: latin1).then((text) {
          Expect.equals(7, text.length);
          var expected = [206, 187, 120, 46, 32, 120, 10];
          Expect.listEquals(expected, text.codeUnits);
          var readAsStringFuture = f.readAsString(encoding: ascii);
          readAsStringFuture.then((text) {
            Expect.fail("Non-ascii char should cause error");
          }).catchError((e) {
            asyncTestDone("testReadAsText");
          });
        });
      });
    });
  }

  static void testReadAsTextEmptyFile() {
    asyncTestStarted();
    var name = getFilename("empty_file");
    var f = new File(name);
    f.readAsString(encoding: utf8).then((text) {
      Expect.equals(0, text.length);
      asyncTestDone("testReadAsTextEmptyFile");
      return true;
    });
  }

  static void testReadAsTextSync() {
    var name = getFilename("fixed_length_file");
    var text = new File(name).readAsStringSync();
    Expect.isTrue(text.endsWith("42 bytes."));
    Expect.equals(42, text.length);
    name = getFilename("read_as_text.dat");
    text = new File(name).readAsStringSync();
    Expect.equals(6, text.length);
    var expected = [955, 120, 46, 32, 120, 10];
    Expect.listEquals(expected, text.codeUnits);
    // First character is not ASCII. The default ASCII decoder will throw.
    Expect.throws(() => new File(name).readAsStringSync(encoding: ascii),
        (e) => e is FileSystemException);
    // We can use an ASCII decoder that inserts the replacement character.
    var lenientAscii = const AsciiCodec(allowInvalid: true);
    text = new File(name).readAsStringSync(encoding: lenientAscii);
    // Default replacement character is the Unicode replacement character.
    expected = [
      unicodeReplacementCharacterRune,
      unicodeReplacementCharacterRune,
      120,
      46,
      32,
      120,
      10
    ];
    Expect.listEquals(expected, text.codeUnits);
    text = new File(name).readAsStringSync(encoding: latin1);
    expected = [206, 187, 120, 46, 32, 120, 10];
    Expect.equals(7, text.length);
    Expect.listEquals(expected, text.codeUnits);
  }

  static void testReadAsTextSyncEmptyFile() {
    var name = getFilename("empty_file");
    var text = new File(name).readAsStringSync();
    Expect.equals(0, text.length);
  }

  static void testReadAsLines() {
    asyncTestStarted();
    var name = getFilename("fixed_length_file");
    var f = new File(name);
    f.readAsLines(encoding: utf8).then((lines) {
      Expect.equals(1, lines.length);
      var line = lines[0];
      Expect.isTrue(line.endsWith("42 bytes."));
      Expect.equals(42, line.length);
      asyncTestDone("testReadAsLines");
    });
  }

  static void testReadAsLinesSync() {
    var name = getFilename("fixed_length_file");
    var lines = new File(name).readAsLinesSync();
    Expect.equals(1, lines.length);
    var line = lines[0];
    Expect.isTrue(line.endsWith("42 bytes."));
    Expect.equals(42, line.length);
    name = getFilename("readline_test1.dat");
    lines = new File(name).readAsLinesSync();
    Expect.equals(10, lines.length);
  }

  static void testReadAsErrors() {
    asyncTestStarted();
    var f = new File('.');
    Expect.throws(f.readAsBytesSync, (e) => e is FileSystemException);
    Expect.throws(f.readAsStringSync, (e) => e is FileSystemException);
    Expect.throws(f.readAsLinesSync, (e) => e is FileSystemException);
    var readAsBytesFuture = f.readAsBytes();
    readAsBytesFuture
        .then((bytes) => Expect.fail("no bytes expected"))
        .catchError((e) {
      var readAsStringFuture = f.readAsString(encoding: utf8);
      readAsStringFuture
          .then((text) => Expect.fail("no text expected"))
          .catchError((e) {
        var readAsLinesFuture = f.readAsLines(encoding: utf8);
        readAsLinesFuture
            .then((lines) => Expect.fail("no lines expected"))
            .catchError((e) {
          asyncTestDone("testReadAsLines");
        });
      });
    });
  }

  static void testLastModified() {
    asyncTestStarted();
    new File(Platform.executable).lastModified().then((modified) {
      Expect.isTrue(modified is DateTime);
      Expect.isTrue(modified.isBefore(new DateTime.now()));
      asyncTestDone("testLastModified");
    });
  }

  static void testLastAccessed() {
    asyncTestStarted();
    new File(Platform.executable).lastAccessed().then((accessed) {
      Expect.isTrue(accessed is DateTime);
      Expect.isTrue(accessed.isBefore(new DateTime.now()));
      asyncTestDone("testLastAccessed");
    });
  }

  static void testDoubleAsyncOperation() {
    asyncTestStarted();
    var file = new File(Platform.executable).openSync();
    var completer = new Completer();
    int done = 0;
    bool error = false;
    void getLength() {
      Future<int?>.value(file.length()).catchError((e) {
        error = true;
      }).whenComplete(() {
        if (++done == 2) {
          asyncTestDone("testDoubleAsyncOperation");
          Expect.isTrue(error);
          file.lengthSync();
          file.closeSync();
        }
      });
    }

    getLength();
    getLength();
    Expect.throws(() => file.lengthSync());
  }

  static void testLastModifiedSync() {
    var modified = new File(Platform.executable).lastModifiedSync();
    Expect.isTrue(modified is DateTime);
    Expect.isTrue(modified.isBefore(new DateTime.now()));
  }

  static void testLastAccessedSync() {
    var accessed = new File(Platform.executable).lastAccessedSync();
    Expect.isTrue(accessed is DateTime);
    Expect.isTrue(accessed.isBefore(new DateTime.now()));
  }

  static void testLastModifiedSyncDirectory() {
    Directory tmp = tempDirectory.createTempSync('file_last_modified_test_');
    String dirPath = '${tmp.path}/dir';
    new Directory(dirPath).createSync();
    try {
      new File(dirPath).lastModifiedSync();
      Expect.fail('Expected operation to throw');
    } catch (e) {
      if (e is! FileSystemException) {
        print(e);
      }
      Expect.isTrue(e is FileSystemException);
    } finally {
      tmp.deleteSync(recursive: true);
    }
  }

  static void testLastAccessedSyncDirectory() {
    Directory tmp = tempDirectory.createTempSync('file_last_accessed_test_');
    String dirPath = '${tmp.path}/dir';
    new Directory(dirPath).createSync();
    try {
      new File(dirPath).lastAccessedSync();
      Expect.fail('Expected operation to throw');
    } catch (e) {
      if (e is! FileSystemException) {
        print(e);
      }
      Expect.isTrue(e is FileSystemException);
    } finally {
      tmp.deleteSync(recursive: true);
    }
  }

  static void testSetLastModifiedSync() {
    String newFilePath = '${tempDirectory.path}/set_last_modified_sync_test';
    File file = new File(newFilePath);
    file.createSync();
    DateTime modifiedTime = new DateTime(2016, 1, 1);
    file.setLastModifiedSync(modifiedTime);
    FileStat stat = file.statSync();
    Expect.equals(2016, stat.modified.year);
    Expect.equals(1, stat.modified.month);
    Expect.equals(1, stat.modified.day);
  }

  static testSetLastModified() async {
    asyncTestStarted();
    String newFilePath = '${tempDirectory.path}/set_last_modified_test';
    File file = new File(newFilePath);
    file.createSync();
    DateTime modifiedTime = new DateTime(2016, 1, 1);
    await file.setLastModified(modifiedTime);
    FileStat stat = await file.stat();
    Expect.equals(2016, stat.modified.year);
    Expect.equals(1, stat.modified.month);
    Expect.equals(1, stat.modified.day);
    asyncTestDone("testSetLastModified");
  }

  static void testSetLastModifiedSyncDirectory() {
    Directory tmp = tempDirectory.createTempSync('file_last_modified_test_');
    String dirPath = '${tmp.path}/dir';
    new Directory(dirPath).createSync();
    try {
      DateTime modifiedTime = new DateTime(2016, 1, 1);
      new File(dirPath).setLastModifiedSync(modifiedTime);
      Expect.fail('Expected operation to throw');
    } catch (e) {
      if (e is! FileSystemException) {
        print(e);
      }
      Expect.isTrue(e is FileSystemException);
    } finally {
      tmp.deleteSync(recursive: true);
    }
  }

  static void testSetLastAccessedSync() {
    String newFilePath = '${tempDirectory.path}/set_last_accessed_sync_test';
    File file = new File(newFilePath);
    file.createSync();
    DateTime accessedTime = new DateTime(2016, 1, 1);
    file.setLastAccessedSync(accessedTime);
    FileStat stat = file.statSync();
    Expect.equals(2016, stat.accessed.year);
    Expect.equals(1, stat.accessed.month);
    Expect.equals(1, stat.accessed.day);
  }

  static testSetLastAccessed() async {
    asyncTestStarted();
    String newFilePath = '${tempDirectory.path}/set_last_accessed_test';
    File file = new File(newFilePath);
    file.createSync();
    DateTime accessedTime = new DateTime(2016, 1, 1);
    await file.setLastAccessed(accessedTime);
    FileStat stat = await file.stat();
    Expect.equals(2016, stat.accessed.year);
    Expect.equals(1, stat.accessed.month);
    Expect.equals(1, stat.accessed.day);
    asyncTestDone("testSetLastAccessed");
  }

  static void testSetLastAccessedSyncDirectory() {
    Directory tmp = tempDirectory.createTempSync('file_last_accessed_test_');
    String dirPath = '${tmp.path}/dir';
    new Directory(dirPath).createSync();
    try {
      DateTime accessedTime = new DateTime(2016, 1, 1);
      new File(dirPath).setLastAccessedSync(accessedTime);
      Expect.fail('Expected operation to throw');
    } catch (e) {
      if (e is! FileSystemException) {
        print(e);
      }
      Expect.isTrue(e is FileSystemException);
    } finally {
      tmp.deleteSync(recursive: true);
    }
  }

  // Test that opens the same file for writing then for appending to test
  // that the file is not truncated when opened for appending.
  static void testAppend() {
    asyncTestStarted();
    var file = new File('${tempDirectory.path}/out_append');
    file.open(mode: FileMode.write).then((openedFile) {
      openedFile.writeString("asdf").then((ignore) {
        openedFile.close().then((ignore) {
          file.open(mode: FileMode.append).then((openedFile) {
            openedFile.length().then((length) {
              Expect.equals(4, length);
              openedFile.writeString("asdf").then((ignore) {
                openedFile.length().then((length) {
                  Expect.equals(8, length);
                  openedFile.close().then((ignore) {
                    file.delete().then((ignore) {
                      file.exists().then((exists) {
                        Expect.isFalse(exists);
                        asyncTestDone("testAppend");
                      });
                    });
                  });
                });
              });
            });
          });
        });
      });
    });
  }

  static void testAppendSync() {
    var file = new File('${tempDirectory.path}/out_append_sync');
    var openedFile = file.openSync(mode: FileMode.write);
    openedFile.writeStringSync("asdf");
    Expect.equals(4, openedFile.lengthSync());
    openedFile.closeSync();
    openedFile = file.openSync(mode: FileMode.write);
    openedFile.setPositionSync(4);
    openedFile.writeStringSync("asdf");
    Expect.equals(8, openedFile.lengthSync());
    openedFile.closeSync();
    file.deleteSync();
    Expect.isFalse(file.existsSync());
  }

  static void testWriteStringUtf8() {
    asyncTestStarted();
    var file = new File('${tempDirectory.path}/out_write_string');
    var string = new String.fromCharCodes([0x192]);
    file.open(mode: FileMode.write).then((openedFile) {
      openedFile.writeString(string).then((_) {
        openedFile.length().then((l) {
          Expect.equals(2, l);
          openedFile.close().then((_) {
            file.open(mode: FileMode.append).then((openedFile) {
              openedFile.setPosition(2).then((_) {
                openedFile.writeString(string).then((_) {
                  openedFile.length().then((l) {
                    Expect.equals(4, l);
                    openedFile.close().then((_) {
                      file.readAsString().then((readBack) {
                        Expect.stringEquals(readBack, '$string$string');
                        file.delete().then((_) {
                          file.exists().then((e) {
                            Expect.isFalse(e);
                            asyncTestDone("testWriteStringUtf8");
                          });
                        });
                      });
                    });
                  });
                });
              });
            });
          });
        });
      });
    });
  }

  static void testWriteStringUtf8Sync() {
    var file = new File('${tempDirectory.path}/out_write_string_sync');
    var string = new String.fromCharCodes([0x192]);
    var openedFile = file.openSync(mode: FileMode.write);
    openedFile.writeStringSync(string);
    Expect.equals(2, openedFile.lengthSync());
    openedFile.closeSync();
    openedFile = file.openSync(mode: FileMode.append);
    openedFile.setPositionSync(2);
    openedFile.writeStringSync(string);
    Expect.equals(4, openedFile.lengthSync());
    openedFile.closeSync();
    var readBack = file.readAsStringSync();
    Expect.stringEquals(readBack, '$string$string');
    file.deleteSync();
    Expect.isFalse(file.existsSync());
  }

  static void testRename({required bool targetExists}) {
    lift(Function f) => (futureValue) => futureValue.then((value) => f(value));
    asyncTestStarted();

    String source = join(tempDirectory.path, 'rename_${targetExists}_source');
    String dest = join(tempDirectory.path, 'rename_${targetExists}_dest');
    var file = new File(source);
    var newfile = new File(dest);
    file
        .create()
        .then((_) => targetExists ? newfile.create() : new Future.value(null))
        .then((_) => file.rename(dest))
        .then((_) => lift(Expect.isFalse)(file.exists()))
        .then((_) => lift(Expect.isTrue)(newfile.exists()))
        .then((_) => newfile.delete())
        .then((_) => lift(Expect.isFalse)(newfile.exists()))
        .then((_) {
      if (Platform.operatingSystem != "windows") {
        Future<File?>.value(new Link(source)
            .create(dest)
            .then((_) => file.rename("xxx"))
            .then((_) {
          throw "Rename of broken link succeeded";
        })).catchError((e) {
          Expect.isTrue(e is FileSystemException);
          asyncTestDone("testRename$targetExists");
        });
      } else {
        asyncTestDone("testRename$targetExists");
      }
    });
  }

  static void testRenameSync({required bool targetExists}) {
    String source = join(tempDirectory.path, 'rename_source');
    String dest = join(tempDirectory.path, 'rename_dest');
    var file = new File(source);
    var newfile = new File(dest);
    file.createSync();
    if (targetExists) {
      newfile.createSync();
    }
    var result = file.renameSync(dest);
    Expect.isFalse(file.existsSync());
    Expect.isTrue(newfile.existsSync());
    Expect.equals(result.path, newfile.path);
    newfile.deleteSync();
    Expect.isFalse(newfile.existsSync());
    if (Platform.operatingSystem != "windows") {
      var brokenLink = new Link(source);
      brokenLink.createSync(dest);
      Expect.throws(() => file.renameSync('xxx'));
      brokenLink.deleteSync();
    }
  }

  static void testAbsolute() {
    var currentDirectory = Directory.current;
    Directory.current = tempDirectory;
    var file = File("temp.txt");
    Expect.isFalse(file.isAbsolute);
    file.writeAsStringSync("content");

    var absFile = file.absolute;
    Expect.isTrue(absFile.isAbsolute);
    Expect.isTrue(absFile.path.startsWith(tempDirectory.path));

    Expect.equals("content", absFile.readAsStringSync());

    // An empty file path should be accepted.
    File('').absolute;

    if (Platform.isWindows &&
        tempDirectory.path.startsWith(RegExp(r"^[a-zA-Z]:"))) {
      var driveRelativeFile = File(absFile.path.substring(2));
      Expect.isFalse(driveRelativeFile.isAbsolute);
      Expect.equals("content", driveRelativeFile.readAsStringSync());

      var absFile3 = driveRelativeFile.absolute;
      Expect.isTrue(absFile3.isAbsolute);
      Expect.equals(absFile.path, absFile3.path);
      Expect.equals("content", absFile3.readAsStringSync());

      // Convert CWD from X:\path to \\localhost\X$\path.
      var uncPath = r"\\localhost\" +
          tempDirectory.path[0] +
          r"$" +
          tempDirectory.path.substring(2);
      Directory.current = uncPath;
      Expect.equals("content", file.readAsStringSync());

      var absFile4 = file.absolute;
      Expect.isTrue(absFile4.isAbsolute);
      Expect.equals("content", absFile4.readAsStringSync());

      Expect.equals("content", driveRelativeFile.readAsStringSync());

      var absFile5 = driveRelativeFile.absolute;
      Expect.isTrue(absFile5.isAbsolute);
      Expect.isTrue(absFile5.path.startsWith(uncPath));
      Expect.equals("content", absFile5.readAsStringSync());
    }
    file.deleteSync();
    Directory.current = currentDirectory;
  }

  static String getFilename(String path) {
    return Platform.script.resolve(path).toFilePath();
  }

  // Main test entrypoint.
  static testMain() {
    asyncStart();

    testRead();
    testReadSync();
    testReadStream();
    testLengthSync();
    testPositionSync();
    testOpenDirectoryAsFile();
    testOpenDirectoryAsFileSync();
    testReadAsBytesSync();
    testReadAsBytesSyncEmptyFile();
    testReadAsTextSync();
    testReadAsTextSyncEmptyFile();
    testReadAsLinesSync();
    testLastModifiedSync();
    testLastAccessedSync();

    createTempDirectory(() {
      testLength();
      testLengthSyncDirectory();
      testReadWrite();
      testReadWriteSync();
      testReadWriteNoArgsSync();
      testReadWriteStream();
      testReadEmptyFileSync();
      testReadEmptyFile();
      testReadWriteStreamLargeFile();
      testReadAsBytes();
      testReadAsBytesEmptyFile();
      testReadAsText();
      testReadAsTextEmptyFile();
      testReadAsLines();
      testReadAsErrors();
      testPosition();
      testTruncate();
      testTruncateSync();
      testReadInto();
      testReadIntoSync();
      testWriteFrom();
      testWriteFromSync();
      testCloseException();
      testCloseExceptionStream();
      testBufferOutOfBoundsException();
      testAppend();
      testAppendSync();
      testWriteAppend();
      testOutputStreamWriteAppend();
      testOutputStreamWriteString();
      testWriteVariousLists();
      testWriteFromOffset();
      testDirectory();
      testDirectorySync();
      testWriteStringUtf8();
      testWriteStringUtf8Sync();
      testRename(targetExists: false);
      testRenameSync(targetExists: false);
      testRename(targetExists: true);
      testRenameSync(targetExists: true);
      testLastModified();
      testLastAccessed();
      testLastModifiedSyncDirectory();
      testLastAccessedSyncDirectory();
      testSetLastModified();
      testSetLastModifiedSync();
      testSetLastModifiedSyncDirectory();
      testSetLastAccessed();
      testSetLastAccessedSync();
      testSetLastAccessedSyncDirectory();
      testDoubleAsyncOperation();
      testAbsolute();
      asyncEnd();
    });
  }
}

main() {
  FileTest.testMain();
}
