local tmp_root, subdir1, subdir2

items = (explorer) ->
  names = [row.path for row in *explorer\display_items!]
  table.sort names, (a, b) -> a < b

before_each ->
  tmp_root = File.tmpdir!
  subdir1 = tmp_root .. 'subdir1/'
  subdir2 = tmp_root .. 'subdir2/'

  f1 = tmp_root .. 'file1'
  f2 = tmp_root .. 'file2'
  f3 = subdir1 .. 'file3'

displays the file path

e = DirectoryExplorer tmp_root
assert.same tmp_root.path .. File.separator, e\display_path!.text

for_path returns a list of explorers from root to given path

deep_dir = tmp_root .. 'a/b/c'
es = DirectoryExplorer.for_path deep_dir.path, root: tmp_root
assert.same 4, #es
assert.same deep_dir\relative_to_parent(tmp_root) .. File.separator, es[4]\display_path!.text


jumps to root for "/"

e = DirectoryExplorer (tmp_root .. 'sub/')
assert.same {File '/'}, [explorer.file for explorer in *e\parse('/').jump_to_absolute]

returns a new absolute list of explorers

e = DirectoryExplorer tmp_root, root: tmp_root
assert.same {tmp_root, subdir1}, [explorer.file for explorer in *e\parse('subdir1/').jump_to_absolute]

jumps to absolute path for "/path"

e = DirectoryExplorer subdir1
explorers = e\parse(subdir2.path .. '/').jump_to_absolute
assert.same subdir2.path, explorers[#explorers].file.path


lists all files and directories including current directory

e = DirectoryExplorer tmp_root
assert.same {'./', 'file1', 'file2', 'subdir1/', 'subdir2/'}, items e

(.. files_only = true)

shows files and directories but not current directory

e = DirectoryExplorer tmp_root, files_only: true
assert.same {'file1', 'file2', 'subdir1/', 'subdir2/'}, items e

(.. directories_only = true)

shows directories including current directory

e = DirectoryExplorer tmp_root, directories_only: true
assert.same {'./', 'subdir1/', 'subdir2/'}, items e

(.. recursive listing)

shows contents of entire subtree

e = DirectoryExplorer tmp_root
e\actions!.toggle_subtree.handler e
contents = {
  './', 'file1', 'file2', 'subdir1/', 'subdir1/file3', 'subdir2/'
assert.same contents, items e

changing recursive mode updates all explorers in path

(subdir1 .. 'a/b')\mkdir_p!
explorers = DirectoryExplorer.for_path subdir1.path, root: tmp_root
inner = explorers[2]
outer = explorers[1]

inner\actions!.toggle_subtree.handler inner
assert.same 4, #items inner
assert.same 8, #items outer

inner\actions!.toggle_subtree.handler inner
assert.same 3, #items inner
assert.same 5, #items outer