// 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:expect/legacy/async_minitest.dart'; // ignore: deprecated_member_use

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

main() async {
  // Do the boilerplate to get several files and directories created to then
  // test the functions that use those items.
  Future doDirSetup(String testName) async {
    final fs = await window.requestFileSystem(100);
    // Prepend this file name to prevent collisions among tests running on the
    // same browser.
    const prefix = 'fileapi_directory_reader_';
    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));
  }

  if (FileSystem.supported) {
    test('readEntries', () async {
      var fileAndDir = await doDirSetup('readEntries');
      var reader = await fileAndDir.dir.createReader();
      var entries = await reader.readEntries();
      expect(entries is List, true);
    });
  }
}
