def test_cmdline(str, expected) result = KernAux.cmdline str assert_true result.instance_of? Array assert_true result.frozen? result.each do |item| assert_true item.instance_of? String assert_true item.frozen? end assert_equal result, expected end assert 'default' do test_cmdline 'foo bar\\ baz "car cdr"', ['foo', 'bar baz', 'car cdr'] end assert 'when str is empty' do test_cmdline '', [] end assert 'when str has invalid type' do assert_raise TypeError, 'Integer cannot be converted to String' do KernAux.cmdline 123 end end assert 'when str has EOL after backslash' do assert_raise KernAux::CmdlineError, 'EOL after backslash' do KernAux.cmdline '\\' end end assert 'when str has EOL after backslash inside quote' do assert_raise KernAux::CmdlineError, 'EOL after backslash inside quote' do KernAux.cmdline '"\\' end end assert 'when str has unescaped quotation mark' do assert_raise KernAux::CmdlineError, 'unescaped quotation mark' do KernAux.cmdline 'foo"' end end assert 'when str has EOL inside quote' do assert_raise KernAux::CmdlineError, 'EOL inside quote' do KernAux.cmdline '"' end end assert 'when there are not too many args' do test_cmdline 'a ' * 256, ['a'] * 256 end assert 'when there are too many args' do assert_raise KernAux::CmdlineError, 'too many args' do KernAux.cmdline 'a ' * 257 end end assert 'when args don\'t cause buffer overflow' do test_cmdline 'a' * 4095, ['a' * 4095] end assert 'when args cause buffer overflow' do assert_raise KernAux::CmdlineError, 'buffer overflow' do KernAux.cmdline 'a' * 4096 end end