/*
 * Copyright (c) 2017, 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.
 */
/**
 * @assertion Stream<FileSystemEntity> list({
 *  bool recursive: false,
 *  bool followLinks: true
 *  })
 * Lists the sub-directories and files of this Directory. Optionally recurses
 * into sub-directories.
 *
 * If followLinks is false, then any symbolic links found are reported as Link
 * objects, rather than as directories or files, and are not recursed into.
 *
 * If followLinks is true, then working links are reported as directories or
 * files, depending on their type, and links to directories are recursed into.
 * Broken links are reported as Link objects. If a symbolic link makes a loop in
 * the file system, then a recursive listing will not follow a link twice in the
 * same recursive descent, but will report it as a Link the second time it is
 * seen.
 *
 * The result is a stream of FileSystemEntity objects for the directories,
 * files, and links.
 * @description Checks that this method lists the sub-directories of this
 * Directory
 * @author sgrekhov@unipro.ru
 */
import "dart:io";
import "../../../Utils/expect.dart";
import "../file_utils.dart";

List<String> setUp(Directory parent, List<String> directories) {
  List<String> created = new List<String>.empty(growable: true);
  directories.forEach((item) {
    Directory dir = new Directory(parent.path + Platform.pathSeparator + item);
    dir.createSync();
    created.add(dir.path);
  });
  return created;
}

main() async {
  await inSandbox(_main);
}

_main(Directory sandbox) async {
  Directory dir = getTempDirectorySync(parent: sandbox);
  List<String> expected = ["a", "b", "c", "d"];
  expected = setUp(dir, expected);

  asyncStart();
  List<String> found = new List<String>.empty(growable: true);
  await dir.list().forEach((entity) {
    found.add(entity.path);
  }).then((_) {
    Expect.setEquals(new Set.from(expected), new Set.from(found));
    asyncEnd();
  });
}
