// 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);
    }
  });
}
