mirror of
https://github.com/samsonjs/csc360-a1-shell.git
synced 2026-04-27 14:57:43 +00:00
Add a few tests
This commit is contained in:
parent
9f0eb1378b
commit
e7b73fa309
1 changed files with 97 additions and 0 deletions
97
ruby/test.rb
Executable file
97
ruby/test.rb
Executable file
|
|
@ -0,0 +1,97 @@
|
||||||
|
#!/usr/bin/env ruby -w
|
||||||
|
|
||||||
|
require 'minitest/autorun'
|
||||||
|
|
||||||
|
class ShellTest < Minitest::Test
|
||||||
|
TRIVIAL_SHELL_SCRIPT = "#!/bin/sh\ntrue".freeze
|
||||||
|
|
||||||
|
def setup
|
||||||
|
FileUtils.mkdir_p('test_bin')
|
||||||
|
end
|
||||||
|
|
||||||
|
def teardown
|
||||||
|
FileUtils.rm_rf('test_bin')
|
||||||
|
end
|
||||||
|
|
||||||
|
def unique_shell_script(code)
|
||||||
|
"#!/bin/sh\necho '#{code}'"
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_expands_environment_variables
|
||||||
|
assert_equal ENV['HOME'], `./a1 -c 'echo $HOME'`.chomp
|
||||||
|
assert system("./a1 -c 'echo $HOME' >/dev/null")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_fails_on_unknown_variables
|
||||||
|
assert_equal false, system("./a1 -c 'echo $DEFINITELY_DOES_NOT_EXIST' 2>/dev/null")
|
||||||
|
end
|
||||||
|
|
||||||
|
#################################
|
||||||
|
### Execution and job control ###
|
||||||
|
#################################
|
||||||
|
|
||||||
|
def test_background_job
|
||||||
|
output = `./a1 -c 'bg echo hello'`
|
||||||
|
assert output.match?(/\ABackground job 1 \(pid \d+\)\nhello\n\z/m), "'#{output}' is unexpected"
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_resolves_executables_with_absolute_paths
|
||||||
|
assert_equal '/usr/bin/which', `./a1 -c '/usr/bin/which -a which'`.chomp
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_resolves_executables_with_relative_paths
|
||||||
|
File.write('test_bin/something', TRIVIAL_SHELL_SCRIPT)
|
||||||
|
File.chmod(0o755, 'test_bin/something')
|
||||||
|
assert system('./a1 -c ./test_bin/something')
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_resolves_executables_in_absolute_paths
|
||||||
|
assert_equal '/usr/bin/which', `./a1 -c 'which -a which'`.chomp
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_resolves_executables_in_relative_paths
|
||||||
|
code = rand(1_000_000).to_s
|
||||||
|
File.write('test_bin/definitely_executable', unique_shell_script(code))
|
||||||
|
File.chmod(0o755, 'test_bin/definitely_executable')
|
||||||
|
actual = `PATH="./test_bin:$PATH" ./a1 -c definitely_executable`.chomp
|
||||||
|
assert_equal code, actual
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_does_not_resolve_non_executable_files_in_path
|
||||||
|
File.write('test_bin/definitely_not_executable', TRIVIAL_SHELL_SCRIPT)
|
||||||
|
File.chmod(0o644, 'test_bin/definitely_not_executable')
|
||||||
|
actual = system('PATH="./test_bin:$PATH" ./a1 -c definitely_not_executable 2>/dev/null')
|
||||||
|
assert_equal false, actual
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_refreshes_readline_after_bg_execution
|
||||||
|
skip 'unimplemented'
|
||||||
|
end
|
||||||
|
|
||||||
|
#########################
|
||||||
|
### Built-in commands ###
|
||||||
|
#########################
|
||||||
|
|
||||||
|
def test_builtin_cd_no_args
|
||||||
|
skip 'cannot easily implement without sequencing with ; or &&'
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_builtin_cd
|
||||||
|
skip 'cannot easily implement without sequencing with ; or &&'
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_builtin_cd_dash
|
||||||
|
skip 'cannot easily implement without sequencing with ; or &&'
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_builtin_cd_parent
|
||||||
|
skip 'cannot easily implement without sequencing with ; or &&'
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_builtin_pwd
|
||||||
|
assert_equal Dir.pwd, `./a1 -c pwd`.chomp
|
||||||
|
|
||||||
|
shell_path = File.expand_path('a1', __dir__)
|
||||||
|
assert_equal '/usr/bin', `cd /usr/bin && '#{shell_path}' -c pwd`.chomp
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Reference in a new issue