<!DOCTYPE html>
<meta charset=utf-8>
<title>Entries API: FileSystemDirectoryEntry.getFile() manual test</title>
<link rel=help href="https://wicg.github.io/entries-api/#dom-filesystemdirectoryentry-getfile">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support.js"></script>

<script>
entry_test((t, entry) => {
  assert_idl_attribute(entry, 'getFile', 'FileSystemDirectoryEntry has getFile');
  assert_equals(typeof entry.getFile, 'function', 'getFile() is a method');

  t.done();
}, 'FileSystemDirectoryEntry - getFile()');

INVALID_PATHS.forEach(path => {
  entry_test((t, entry) => {
    entry.getFile(
      path,
      {},
      t.unreached_func('getFile should fail'),
      t.step_func(error => {
        assert_equals(error.name, 'TypeMismatchError',
                      'getFile() should fail if given invalid path');
        t.done();
      }));
  }, 'FileSystemDirectoryEntry.getFile() - invalid path: ' + JSON.stringify(path));
});

EMPTY_PATHS.forEach(path => {
  entry_test((t, entry) => {
    entry.getFile(
      path,
      {},
      t.unreached_func('getFile should fail'),
      t.step_func(error => {
        assert_equals(error.name, 'TypeMismatchError',
                      'getFile() on empty path should fail because the ' +
                      'path resolves to the directory itself');
        t.done();
      }));
  }, 'FileSystemDirectoryEntry.getFile() - empty path: ' + JSON.stringify(path) || 'undefined');
});

FILE_PATHS.forEach(path => {
  entry_test((t, entry) => {
    entry.getFile(
      path,
      {create: true},
      t.unreached_func('getFile should fail'),
      t.step_func(error => {
        assert_equals(error.name, 'SecurityError',
                      'getFile() should fail with security error if ' +
                      'create option is set');
        t.done();
      }));
  }, 'FileSystemDirectoryEntry.getFile() - {create:true}: ' + path);
});

NOT_FOUND_PATHS.forEach(path => {
  entry_test((t, entry) => {
    entry.getFile(
      path,
      {},
      t.unreached_func('getFile should fail'),
      t.step_func(error => {
        assert_equals(error.name, 'NotFoundError',
                      'getFile() should fail with not found');
        t.done();
      }));
  }, 'FileSystemDirectoryEntry.getFile() - not found: ' + path);
});

DIR_PATHS.concat(['/', '.']).forEach(path => {
  entry_test((t, entry) => {
    entry.getFile(
      path,
      {},
      t.unreached_func('getFile should fail'),
      t.step_func(error => {
        assert_equals(error.name, 'TypeMismatchError',
                      'getFile() should fail if type is directory');
        t.done();
      }));
  }, 'FileSystemDirectoryEntry.getFile() - directory: ' + path);
});

FILE_PATHS.forEach(path => {
  entry_test((t, entry) => {
    entry.getFile(
      path,
      {},
      t.step_func(e => {
        assert_true(e.isFile);
        assert_false(e.isDirectory);
        assert_equals(e.name, 'file.txt');
        t.done();
      }),
      t.unreached_func('getFile should not fail')
    );
  }, 'FileSystemDirectoryEntry.getFile() - file: ' + path);
});

entry_test((t, entry) => {
  entry.getFile(FILE_PATHS[0], {}, t.step_func(e1 => {
    entry.getFile(FILE_PATHS[0], {}, t.step_func(e2 => {
      assert_equals(e1.name, e2.name, 'names should match');
      assert_equals(e1.fullPath, e2.fullPath, 'names should match');
      assert_not_equals(e1, e2, 'objects should be distinct');
      t.done();
    }), t.unreached_func('getFile should not fail'));
  }), t.unreached_func('getFile should not fail'));
}, 'FileSystemDirectoryEntry.getFile() - object identity');
</script>
