// Copyright (c) 2013, 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.
//
// Directory listing test that tests listSync on a missing directory.
//
// TODO(7157): Merge this test into directory_test.dart testListNonExistent()
// when it no longer crashes on Windows, when issue 7157 is resolved.

// @dart = 2.9

import "dart:io";

import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";

void testListNonExistent() {
  asyncStart();
  Directory.systemTemp.createTemp('dart_directory_list_nonexistent').then((d) {
    d.delete().then((ignore) {
      Expect.throws(() => d.listSync(), (e) => e is FileSystemException);
      Expect.throws(
          () => d.listSync(recursive: true), (e) => e is FileSystemException);
      asyncEnd();
    });
  });
}

void testListTooLongName() {
  asyncStart();
  Directory.systemTemp.createTemp('dart_directory_list_nonexistent').then((d) {
    var subDirName = 'subdir';
    var subDir = new Directory("${d.path}/$subDirName");
    subDir.create().then((ignore) {
      // Construct a long string of the form
      // 'tempdir/subdir/../subdir/../subdir'.
      var buffer = new StringBuffer();
      buffer.write(subDir.path);
      for (var i = 0; i < 1000; i++) {
        buffer.write("/../${subDirName}");
      }
      var long = new Directory("${buffer.toString()}");
      Expect.throws(() => long.listSync(), (e) => e is FileSystemException);
      Expect.throws(() => long.listSync(recursive: true),
          (e) => e is FileSystemException);
      d.deleteSync(recursive: true);
      asyncEnd();
    });
  });
}

void main() {
  testListNonExistent();
  testListTooLongName();
}
