interact.select_file
opens the home directory by default
local prompt
within_command_line interact.select_file, (command_line) ->
  prompt = tostring command_line.prompt
assert.same '~/', prompt
typing a path opens the closest parent
prompts = {}
within_command_line interact.select_file, (command_line) ->
  command_line\write tostring tmpdir
  table.insert prompts, tostring command_line.prompt
assert.same {tostring(tmpdir.parent) .. '/'}, prompts
typing "/" after a directory name opens the directory
local prompt
within_command_line interact.select_file, (command_line) ->
  command_line\write tostring(tmpdir) .. '/'
  prompt = tostring command_line.prompt
assert.same tostring(tmpdir) .. '/', prompt
typing "../" switches to the parent of the current directory
prompts = {}
within_command_line interact.select_file, (command_line) ->
  command_line\write tostring(tmpdir) .. '/'
  table.insert prompts, tostring command_line.prompt
  command_line\write '../'
  table.insert prompts, tostring command_line.prompt
assert.same {tostring(tmpdir) .. '/', tostring(tmpdir.parent) .. '/'}, prompts
typing "/" without any preceeding text changes to home directory
local prompt
within_command_line interact.select_file, (command_line) ->
  command_line\write '/'
  prompt = tostring command_line.prompt
assert.same '/', prompt
shows files matching entered text in the current directory
files = { 'ab1', 'ab2', 'bc1' }
for f in *files
  f = tmpdir / f
  f.contents = 'a'
local items, items2
within_command_line interact.select_file, (command_line) ->
  command_line\write tostring(tmpdir) .. '/'
  items = list_items command_line, 2
  command_line\write 'ab'
  items2 = list_items command_line, 2
assert.same files, items
assert.same {'ab1', 'ab2'}, items2
(when config.hidden_file_extensions is set)
local files
before_each ->
  config.reset!
  config.hidden_file_extensions = {'a'}
  files = { 'x.a', 'x.b', 'x.c' }
  for f in *files
    f = tmpdir / f
    f.contents = 'x'
does not show hidden files in list
local items
within_command_line interact.select_file, (command_line) ->
  command_line\write tostring(tmpdir) .. '/'
  items = list_items command_line, 2
assert.same { 'x.b', 'x.c' }, items
shows a hidden file after its exact name is entered
local items, statuses
within_command_line interact.select_file, (command_line) ->
  command_line\write tostring(tmpdir) .. '/'
  command_line\write 'x.a'
  items = list_items command_line, 2
  statuses = list_items command_line, 3
assert.same { 'x.a' }, items
assert.same { '[hidden]' }, statuses
 
(in subtree mode)
shows files and directories in the subtree
files = { 'ab1', 'ab2/', 'ab2/xy', 'ef/', 'ef/gh/', 'ef/gh/ab4'}
for name in *files
  f = tmpdir / name
  if name\ends_with '/'
    f\mkdir!
  else
    f.contents = 'a'
local items, items2
within_command_line (-> interact.select_file(path: tostring(tmpdir) .. '/', show_subtree: true)), (command_line) ->
  items = list_items command_line, 2
  command_line\write 'ab'
  items2 = list_items command_line, 2
  table.sort items
  table.sort items2
assert.same files, items
assert.same {'ab1', 'ab2/', 'ab2/xy','ef/gh/ab4'}, items2
 
 
interact.select_directory
shows only sub directories including "./", but no files
files = { 'ab1', 'ab2', 'bc1' }
directories = { 'dir1', 'dir2' }
for f in *files
  f = tmpdir / f
  f.contents = 'a'
for d in *directories
  f = tmpdir / d
  f\mkdir!
local items
within_command_line interact.select_directory, (command_line) ->
  command_line\write tostring(tmpdir) .. '/'
  items = list_items command_line, 2
assert.same { './', 'dir1/', 'dir2/' }, items
typing a path opens the closest parent
prompts = {}
within_command_line interact.select_file, (command_line) ->
  command_line\write tostring(tmpdir)
  table.insert prompts, tostring command_line.prompt
assert.same {tostring(tmpdir.parent) .. '/'}, prompts
typing "/" after a directory name opens the directory
local prompt
within_command_line interact.select_file, (command_line) ->
  command_line\write tostring(tmpdir) .. '/'
  prompt = tostring command_line.prompt
assert.same tostring(tmpdir) .. '/', prompt
typing a trailing "/~/" jumps to the home directory
prompts = {}
within_command_line interact.select_file, (command_line) ->
  command_line\write tostring(tmpdir) .. '/'
  table.insert prompts, tostring command_line.prompt
  command_line\write '~/'
  table.insert prompts, tostring command_line.prompt
assert.same {tostring(tmpdir) .. '/', '~/'}, prompts
typing "../" switches to the parent of the current directory
prompts = {}
within_command_line interact.select_file, (command_line) ->
  command_line\write tostring(tmpdir) .. '/'
  table.insert prompts, tostring command_line.prompt
  command_line\write tostring(tmpdir) .. '../'
  table.insert prompts, tostring command_line.prompt
assert.same {tostring(tmpdir) .. '/', tostring(tmpdir.parent) .. '/'}, prompts
typing "/" without any preceeding text changes to home directory
local prompt
within_command_line interact.select_file, (command_line) ->
  command_line\write '/'
  prompt = tostring command_line.prompt
assert.same '/', prompt
shows files matching entered text in the current directory
files = { 'ab1', 'ab2', 'bc1' }
for f in *files
  f = tmpdir / f
  f.contents = 'a'
local items, items2
within_command_line interact.select_file, (command_line) ->
  command_line\write tostring(tmpdir) .. '/'
  items = list_items command_line, 2
  command_line\write 'ab'
  items2 = list_items command_line, 2
assert.same files, items
assert.same {'ab1', 'ab2'}, items2
(for directory names ending with ~)
before_each -> File.mkdir tmpdir / 'subdir~'
typing subdir~/ switches to the directory
prompts = {}
within_command_line interact.select_file, (command_line) ->
  command_line\write tostring(tmpdir) .. '/subdir~/'
  table.insert prompts, tostring command_line.prompt
assert.same {tostring(tmpdir) .. '/subdir~/'}, prompts