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

library fileapi;

import 'dart:async';
import 'dart:html';

import 'package:async_helper/async_helper.dart';
import 'package:async_helper/async_minitest.dart';

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

late FileSystem fs;

main() async {
  getFileSystem() async {
    return await window.requestFileSystem(100).then((FileSystem fileSystem) {
      fs = fileSystem;
    });
  }

  // Do the boilerplate to get several files and directories created to then
  // test the functions that use those items.
  Future doDirSetup(String testName) async {
    await getFileSystem();

    var file = await fs.root.createFile('file_$testName') as FileEntry;
    var dir = await fs.root.createDirectory('dir_$testName') as DirectoryEntry;
    return new Future.value(new FileAndDir(file, dir));
  }

  if (FileSystem.supported) {
    test('copy_move', () async {
      var fileAndDir = await doDirSetup('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('getParent');
      entry = await fileAndDir.file.getParent();
      expect(entry.name, '');
      expect(entry.isDirectory, true, reason: "Expected Directory");

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

      try {
        entry = await fs.root.getFile('file4');
        fail("File file4 should not exist.");
      } catch (error) {
        expect(error is DomException, true,
            reason: "Not DomException - not exist");
        expect(DomException.NOT_FOUND, error.name);
      }

      // remove
      fileAndDir = await doDirSetup('remove');
      expect('file_remove', fileAndDir.file.name);
      await fileAndDir.file.remove();
      try {
        var entry = await fileAndDir.dir.getFile(fileAndDir.file.name);
        fail("file not removed");
      } catch (error) {
        expect(error is DomException, true,
            reason: "Not DomException - removed");
        expect(DomException.NOT_FOUND, error.name);
      }
    });
  }
}
