library fileapi; import 'package:unittest/unittest.dart'; import 'package:unittest/html_individual_config.dart'; import 'dart:html'; import 'dart:async'; class FileAndDir { FileEntry file; DirectoryEntry dir; FileAndDir(this.file, this.dir); } FileSystem fs; main() { useHtmlIndividualConfiguration(); group('supported', () { test('supported', () { expect(FileSystem.supported, true); }); }); getFileSystem() { return window.requestFileSystem(100).then((FileSystem fileSystem) { fs = fileSystem; }); } group('unsupported_throws', () { test('requestFileSystem', () { var expectation = FileSystem.supported ? returnsNormally : throws; expect(() { window.requestFileSystem(100); }, expectation); }); }); group('getDirectory', () { if (FileSystem.supported) { test('getFileSystem', getFileSystem); test('directoryDoesntExist', () { return fs.root.getDirectory('directory2').catchError((error) { expect(error.code, equals(DomException.NOT_FOUND)); }, test: (e) => e is DomError); }); test('directoryCreate', () { return fs.root.createDirectory('directory3').then((DirectoryEntry e) { expect(e.name, equals('directory3')); }); }); } }); group('getFile', () { if (FileSystem.supported) { test('getFileSystem', getFileSystem); test('fileDoesntExist', () { return fs.root.getFile('file2').catchError((error) { expect(error.code, equals(DomException.NOT_FOUND)); }, test: (e) => e is DomError); }); test('fileCreate', () { return fs.root.createFile('file4').then((FileEntry e) { expect(e.name, equals('file4')); expect(e.isFile, isTrue); return e.getMetadata(); }).then((Metadata metadata) { var changeTime = metadata.modificationTime; // Upped because our Windows buildbots can sometimes be particularly // slow. expect( new DateTime.now().difference(changeTime).inMinutes, lessThan(4)); expect(metadata.size, equals(0)); }); }); } }); // Do the boilerplate to get several files and directories created to then // test the functions that use those items. Future doDirSetup(String testName) { return fs.root.createFile('file_$testName').then((FileEntry file) { return fs.root .createDirectory('dir_$testName') .then((DirectoryEntry dir) { return new Future.value(new FileAndDir(file, dir)); }); }); } group('directoryReader', () { if (FileSystem.supported) { test('getFileSystem', getFileSystem); test('readEntries', () { return doDirSetup('readEntries').then((fileAndDir) { var reader = fileAndDir.dir.createReader(); return reader.readEntries(); }).then((entries) { expect(entries is List, true); }); }); } }); group('entry', () { if (FileSystem.supported) { test('getFileSystem', getFileSystem); test('copyTo', () { return doDirSetup('copyTo').then((fileAndDir) { return fileAndDir.file.copyTo(fileAndDir.dir, name: 'copiedFile'); }).then((entry) { expect(entry.isFile, true); expect(entry.name, 'copiedFile'); }); }); test('getParent', () { return doDirSetup('getParent').then((fileAndDir) { return fileAndDir.file.getParent(); }).then((entry) { expect(entry.name, ''); expect(entry.isFile, false); }); }); test('moveTo', () { return doDirSetup('moveTo').then((fileAndDir) { return fileAndDir.file.moveTo(fileAndDir.dir, name: 'movedFile'); }).then((entry) { expect(entry.name, 'movedFile'); expect(entry.fullPath, '/dir_moveTo/movedFile'); return fs.root.getFile('file4'); }).catchError((error) { expect(error.code, equals(DomException.NOT_FOUND)); }, test: (e) => e is DomError); }); test('remove', () { return doDirSetup('remove').then((fileAndDir) { return fileAndDir.file.remove().then((_) {}); }); }); } }); group('fileEntry', () { if (FileSystem.supported) { test('getFileSystem', getFileSystem); test('createWriter', () { return doDirSetup('createWriter').then((fileAndDir) { return fileAndDir.file.createWriter(); }).then((writer) { expect(writer.position, 0); expect(writer.readyState, FileWriter.INIT); expect(writer.length, 0); }); }); test('file', () { return doDirSetup('file').then((fileAndDir) { return fileAndDir.file.file().then((fileObj) { expect(fileObj.name, fileAndDir.file.name); expect(fileObj.relativePath, ''); expect( new DateTime.now() .difference(fileObj.lastModifiedDate) .inSeconds, lessThan(60)); }); }); }); } }); }