|  | // 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. | 
|  |  | 
|  | // @dart = 2.9 | 
|  |  | 
|  | import "dart:async"; | 
|  | import "dart:io"; | 
|  |  | 
|  | import "package:async_helper/async_helper.dart"; | 
|  | import "package:expect/expect.dart"; | 
|  |  | 
|  | class FutureExpect { | 
|  | static Future isTrue(Future<bool> result) => | 
|  | result.then((value) => Expect.isTrue(value)); | 
|  | static Future isFalse(Future<bool> result) => | 
|  | result.then((value) => Expect.isFalse(value)); | 
|  | static Future equals(expected, Future result) => | 
|  | result.then((value) => Expect.equals(expected, value)); | 
|  | static Future listEquals(expected, Future result) => | 
|  | result.then((value) => Expect.listEquals(expected, value)); | 
|  | static Future throws(Future result) => result.then((value) { | 
|  | throw new ExpectException( | 
|  | "FutureExpect.throws received $value instead of an exception"); | 
|  | }, onError: (_) => null); | 
|  | } | 
|  |  | 
|  | Future testFileExistsCreate() { | 
|  | return Directory.systemTemp.createTemp('dart_file_system_async').then((temp) { | 
|  | var x = '${temp.path}${Platform.pathSeparator}x'; | 
|  | var y = '${temp.path}${Platform.pathSeparator}y'; | 
|  | return new Link(y) | 
|  | .create(x) | 
|  | .then((link) => Expect.equals(y, link.path)) | 
|  | .then((_) => FutureExpect.isFalse(new File(y).exists())) | 
|  | .then((_) => FutureExpect.isFalse(new File(x).exists())) | 
|  | .then((_) => FutureExpect.isTrue(FileSystemEntity.isLink(y))) | 
|  | .then((_) => FutureExpect.isFalse(FileSystemEntity.isLink(x))) | 
|  | .then((_) => FutureExpect.equals( | 
|  | FileSystemEntityType.notFound, FileSystemEntity.type(y))) | 
|  | .then((_) => FutureExpect.equals( | 
|  | FileSystemEntityType.notFound, FileSystemEntity.type(x))) | 
|  | .then((_) => FutureExpect.equals(FileSystemEntityType.link, | 
|  | FileSystemEntity.type(y, followLinks: false))) | 
|  | .then((_) => FutureExpect.equals(FileSystemEntityType.notFound, | 
|  | FileSystemEntity.type(x, followLinks: false))) | 
|  | .then((_) => FutureExpect.equals(x, new Link(y).target())) | 
|  | .then((_) => new File(y).create()) | 
|  | .then((yFile) => Expect.equals(y, yFile.path)) | 
|  | .then((_) => FutureExpect.isTrue(new File(y).exists())) | 
|  | .then((_) => FutureExpect.isTrue(new File(x).exists())) | 
|  | .then((_) => FutureExpect.isTrue(FileSystemEntity.isLink(y))) | 
|  | .then((_) => FutureExpect.isFalse(FileSystemEntity.isLink(x))) | 
|  | .then((_) => FutureExpect.isTrue(FileSystemEntity.isFile(y))) | 
|  | .then((_) => FutureExpect.isTrue(FileSystemEntity.isFile(x))) | 
|  | .then((_) => FutureExpect.equals( | 
|  | FileSystemEntityType.file, FileSystemEntity.type(y))) | 
|  | .then((_) => FutureExpect.equals( | 
|  | FileSystemEntityType.file, FileSystemEntity.type(x))) | 
|  | .then((_) => FutureExpect.equals(FileSystemEntityType.link, | 
|  | FileSystemEntity.type(y, followLinks: false))) | 
|  | .then((_) => FutureExpect.equals(FileSystemEntityType.file, | 
|  | FileSystemEntity.type(x, followLinks: false))) | 
|  | .then((_) => FutureExpect.equals(x, new Link(y).target())) | 
|  | .then((_) => new File(x).delete()) | 
|  | .then((xDeletedFile) => Expect.equals(x, xDeletedFile.path)) | 
|  | .then((_) => new Directory(x).create()) | 
|  | .then((xCreatedDirectory) => Expect.equals(x, xCreatedDirectory.path)) | 
|  | .then((_) => FutureExpect.isTrue(FileSystemEntity.isLink(y))) | 
|  | .then((_) => FutureExpect.isFalse(FileSystemEntity.isLink(x))) | 
|  | .then((_) => FutureExpect.isTrue(FileSystemEntity.isDirectory(y))) | 
|  | .then((_) => FutureExpect.isTrue(FileSystemEntity.isDirectory(x))) | 
|  | .then((_) => FutureExpect.equals( | 
|  | FileSystemEntityType.directory, FileSystemEntity.type(y))) | 
|  | .then((_) => FutureExpect.equals( | 
|  | FileSystemEntityType.directory, FileSystemEntity.type(x))) | 
|  | .then((_) => FutureExpect.equals(FileSystemEntityType.link, | 
|  | FileSystemEntity.type(y, followLinks: false))) | 
|  | .then((_) => FutureExpect.equals(FileSystemEntityType.directory, | 
|  | FileSystemEntity.type(x, followLinks: false))) | 
|  | .then((_) => FutureExpect.equals(x, new Link(y).target())) | 
|  | .then((_) => new Link(y).delete()) | 
|  | .then((_) => FutureExpect.isFalse(FileSystemEntity.isLink(y))) | 
|  | .then((_) => FutureExpect.isFalse(FileSystemEntity.isLink(x))) | 
|  | .then((_) => FutureExpect.equals( | 
|  | FileSystemEntityType.notFound, FileSystemEntity.type(y))) | 
|  | .then((_) => FutureExpect.equals( | 
|  | FileSystemEntityType.directory, FileSystemEntity.type(x))) | 
|  | .then((_) => FutureExpect.throws(new Link(y).target())) | 
|  | .then((_) => temp.delete(recursive: true)); | 
|  | }); | 
|  | } | 
|  |  | 
|  | Future testFileDelete() { | 
|  | return Directory.systemTemp.createTemp('dart_file_system_async').then((temp) { | 
|  | var x = '${temp.path}${Platform.pathSeparator}x'; | 
|  | var y = '${temp.path}${Platform.pathSeparator}y'; | 
|  | return new File(x) | 
|  | .create() | 
|  | .then((_) => new Link(y).create(x)) | 
|  | .then((_) => FutureExpect.isTrue(new File(x).exists())) | 
|  | .then((_) => FutureExpect.isTrue(new File(y).exists())) | 
|  | .then((_) => new File(y).delete()) | 
|  | .then((_) => FutureExpect.isTrue(new File(x).exists())) | 
|  | .then((_) => FutureExpect.isFalse(new File(y).exists())) | 
|  | .then((_) => new Link(y).create(x)) | 
|  | .then((_) => FutureExpect.isTrue(new File(x).exists())) | 
|  | .then((_) => FutureExpect.isTrue(new File(y).exists())) | 
|  | .then((_) => new File(y).delete()) | 
|  | .then((_) => FutureExpect.isTrue(new File(x).exists())) | 
|  | .then((_) => FutureExpect.isFalse(new File(y).exists())) | 
|  | .then((_) => temp.delete(recursive: true)); | 
|  | }); | 
|  | } | 
|  |  | 
|  | Future testFileWriteRead() { | 
|  | return Directory.systemTemp.createTemp('dart_file_system_async').then((temp) { | 
|  | var x = '${temp.path}${Platform.pathSeparator}x'; | 
|  | var y = '${temp.path}${Platform.pathSeparator}y'; | 
|  | var data = "asdf".codeUnits; | 
|  | return new File(x) | 
|  | .create() | 
|  | .then((_) => new Link(y).create(x)) | 
|  | .then((_) => | 
|  | (new File(y).openWrite(mode: FileMode.write)..add(data)).close()) | 
|  | .then((_) => FutureExpect.listEquals(data, new File(y).readAsBytes())) | 
|  | .then((_) => FutureExpect.listEquals(data, new File(x).readAsBytes())) | 
|  | .then((_) => temp.delete(recursive: true)); | 
|  | }); | 
|  | } | 
|  |  | 
|  | Future testDirectoryExistsCreate() { | 
|  | return Directory.systemTemp.createTemp('dart_file_system_async').then((temp) { | 
|  | var x = '${temp.path}${Platform.pathSeparator}x'; | 
|  | var y = '${temp.path}${Platform.pathSeparator}y'; | 
|  | return new Link(y) | 
|  | .create(x) | 
|  | .then((_) => FutureExpect.isFalse(new Directory(x).exists())) | 
|  | .then((_) => FutureExpect.isFalse(new Directory(y).exists())) | 
|  | .then((_) => FutureExpect.throws(new Directory(y).create())) | 
|  | .then((_) => temp.delete(recursive: true)); | 
|  | }); | 
|  | } | 
|  |  | 
|  | Future testDirectoryDelete() { | 
|  | return Directory.systemTemp.createTemp('dart_file_system_async').then((temp) { | 
|  | return Directory.systemTemp | 
|  | .createTemp('dart_file_system_async') | 
|  | .then((temp2) { | 
|  | var y = '${temp.path}${Platform.pathSeparator}y'; | 
|  | var x = '${temp2.path}${Platform.pathSeparator}x'; | 
|  | var link = new Directory(y); | 
|  | return new File(x) | 
|  | .create() | 
|  | .then((_) => new Link(y).create(temp2.path)) | 
|  | .then((_) => FutureExpect.isTrue(link.exists())) | 
|  | .then((_) => FutureExpect.isTrue(temp2.exists())) | 
|  | .then((_) => link.delete()) | 
|  | .then((_) => FutureExpect.isFalse(link.exists())) | 
|  | .then((_) => FutureExpect.isTrue(temp2.exists())) | 
|  | .then((_) => new Link(y).create(temp2.path)) | 
|  | .then((_) => FutureExpect.isTrue(link.exists())) | 
|  | .then((_) => temp.delete(recursive: true)) | 
|  | .then((_) => FutureExpect.isFalse(link.exists())) | 
|  | .then((_) => FutureExpect.isFalse(temp.exists())) | 
|  | .then((_) => FutureExpect.isTrue(temp2.exists())) | 
|  | .then((_) => FutureExpect.isTrue(new File(x).exists())) | 
|  | .then((_) => temp2.delete(recursive: true)); | 
|  | }); | 
|  | }); | 
|  | } | 
|  |  | 
|  | Future testDirectoryListing() { | 
|  | return Directory.systemTemp.createTemp('dart_file_system_async').then((temp) { | 
|  | return Directory.systemTemp | 
|  | .createTemp('dart_file_system_async_links') | 
|  | .then((temp2) { | 
|  | var sep = Platform.pathSeparator; | 
|  | var y = '${temp.path}${sep}y'; | 
|  | var x = '${temp2.path}${sep}x'; | 
|  | return new File(x) | 
|  | .create() | 
|  | .then((_) => new Link(y).create(temp2.path)) | 
|  | .then((_) => | 
|  | temp.list(recursive: true).singleWhere((entry) => entry is File)) | 
|  | .then((file) => Expect.isTrue(file.path.endsWith('$y${sep}x'))) | 
|  | .then((_) => temp | 
|  | .list(recursive: true) | 
|  | .singleWhere((entry) => entry is Directory)) | 
|  | .then((dir) => Expect.isTrue(dir.path.endsWith('y'))) | 
|  | .then((_) => temp.delete(recursive: true)) | 
|  | .then((_) => temp2.delete(recursive: true)); | 
|  | }); | 
|  | }); | 
|  | } | 
|  |  | 
|  | Future testDirectoryListingBrokenLink() { | 
|  | return Directory.systemTemp.createTemp('dart_file_system_async').then((temp) { | 
|  | var x = '${temp.path}${Platform.pathSeparator}x'; | 
|  | var link = '${temp.path}${Platform.pathSeparator}link'; | 
|  | var doesNotExist = 'this_thing_does_not_exist'; | 
|  | bool sawFile = false; | 
|  | bool sawLink = false; | 
|  | return new File(x) | 
|  | .create() | 
|  | .then((_) => new Link(link).create(doesNotExist)) | 
|  | .then((_) => temp.list(recursive: true).forEach((entity) { | 
|  | if (entity is File) { | 
|  | Expect.isFalse(sawFile); | 
|  | sawFile = true; | 
|  | Expect.isTrue(entity.path.endsWith(x)); | 
|  | } else { | 
|  | Expect.isTrue(entity is Link); | 
|  | Expect.isFalse(sawLink); | 
|  | sawLink = true; | 
|  | Expect.isTrue(entity.path.endsWith(link)); | 
|  | } | 
|  | })) | 
|  | .then((_) => temp.delete(recursive: true)); | 
|  | }); | 
|  | } | 
|  |  | 
|  | main() { | 
|  | // Links on Windows are tested by windows_file_system_[async_]links_test. | 
|  | if (Platform.operatingSystem != 'windows') { | 
|  | asyncStart(); | 
|  | testFileExistsCreate() | 
|  | .then((_) => testFileDelete()) | 
|  | .then((_) => testFileWriteRead()) | 
|  | .then((_) => testDirectoryExistsCreate()) | 
|  | .then((_) => testDirectoryDelete()) | 
|  | .then((_) => testDirectoryListing()) | 
|  | .then((_) => testDirectoryListingBrokenLink()) | 
|  | .then((_) => asyncEnd()); | 
|  | } | 
|  | } |