// Copyright (c) 2020, 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 'dart:async';
import 'dart:html';

import 'package:expect/legacy/async_minitest.dart'; // ignore: deprecated_member_use

class FileAndDir {
  FileEntry file;
  DirectoryEntry dir;
  FileAndDir(this.file, this.dir);
}

main() {
  if (!FileSystem.supported) return;
  // Prepend this file name to prevent collisions among tests running on the
  // same browser.
  const prefix = 'fileapi_entry_';

  // Do the boilerplate to get several files and directories created to then
  // test the functions that use those items.
  Future doDirSetup(FileSystem fs, String testName) async {
    var file =
        await fs.root!.createFile('${prefix}file_$testName') as FileEntry;
    var dir =
        await fs.root!.createDirectory('${prefix}dir_$testName')
            as DirectoryEntry;
    return new Future.value(new FileAndDir(file, dir));
  }

  test('copy_move', () async {
    final fs = await window.requestFileSystem(100);
    var fileAndDir = await doDirSetup(fs, 'copyTo');
    var entry = await fileAndDir.file.copyTo(
      fileAndDir.dir,
      name: 'copiedFile',
    );
    expect(entry.isFile, true, reason: "Expected File");
    expect(entry.name, 'copiedFile');

    // getParent
    fileAndDir = await doDirSetup(fs, 'getParent');
    entry = await fileAndDir.file.getParent();
    expect(entry.name, '');
    expect(entry.isDirectory, true, reason: "Expected Directory");

    // moveTo
    fileAndDir = await doDirSetup(fs, 'moveTo');
    entry = await fileAndDir.file.moveTo(fileAndDir.dir, name: 'movedFile');
    expect(entry.name, 'movedFile');
    expect(entry.fullPath, '/${prefix}dir_moveTo/movedFile');

    try {
      entry = await fs.root!.getFile('${prefix}file4');
      fail("File ${prefix}file4 should not exist.");
    } on DomException catch (error) {
      expect(DomException.NOT_FOUND, error.name);
    }

    // remove
    fileAndDir = await doDirSetup(fs, 'remove');
    expect('${prefix}file_remove', fileAndDir.file.name);
    await fileAndDir.file.remove();
    try {
      await fileAndDir.dir.getFile(fileAndDir.file.name);
      fail("file not removed");
    } on DomException catch (error) {
      expect(DomException.NOT_FOUND, error.name);
    }
  });
}
