// 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 {
    fs = await window.requestFileSystem(100);
  }

  if (FileSystem.supported) {
    await getFileSystem();

    test('fileDoesntExist', () async {
      try {
        var fileObj = await fs.root.getFile('file2');
        fail("file found");
      } on DomException catch (error) {
        expect(DomException.NOT_FOUND, error.name);
      }
    });

    test('fileCreate', () async {
      var fileObj = await fs.root.createFile('file4');
      expect(fileObj.name, equals('file4'));
      expect(fileObj.isFile, isTrue);

      var metadata = await fileObj.getMetadata();
      var changeTime = metadata.modificationTime;

      // Increased Windows buildbots can sometimes be particularly slow.
      expect(new DateTime.now().difference(changeTime).inMinutes < 4, isTrue);
      expect(metadata.size, equals(0));
    });
  }
}
