diff options
Diffstat (limited to 'test/misc')
-rw-r--r-- | test/misc/test_ruby_mode.rb | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/test/misc/test_ruby_mode.rb b/test/misc/test_ruby_mode.rb new file mode 100644 index 0000000000..64786b3408 --- /dev/null +++ b/test/misc/test_ruby_mode.rb @@ -0,0 +1,136 @@ +require 'test/unit' +require 'tempfile' +require 'mkmf' + +class TestRubyMode < Test::Unit::TestCase + MISCDIR = File.expand_path("../../../misc", __FILE__) + if emacs = find_executable0(ENV["EMACS"] || "emacs") + EMACS = %W"#{emacs} --quick --batch --load #{MISCDIR}/ruby-mode.el" + else + EMACS = nil + end +end + +class TestRubyMode + EVAL_OPT = "--eval" + EXPR_SAVE = "(save-buffer)" + EXPR_RUBYMODE = "(ruby-mode)" + EXPR_NOBACKUP = "(progn" \ + " (set (make-local-variable \'backup-inhibited) t)" \ + " (set-buffer-modified-p t)" \ + ")" + + def run_emacs(src, *exprs) + tmp = Tempfile.new(%w"ruby-mode.test. .rb") + tmp.puts(src) + tmp.close + exprs = exprs.map {|expr| [EVAL_OPT, expr]}.flatten + exprs.unshift(EVAL_OPT, EXPR_RUBYMODE) + exprs.unshift(EVAL_OPT, EXPR_NOBACKUP) + output = IO.popen([*EMACS, tmp.path, *exprs, err:[:child, :out]], "r") {|e| e.read} + tmp.open + result = tmp.read + tmp.close! + return result, output + end + + class TestIndent < self + EXPR_INDENT = "(indent-region (point-min) (point-max))" + + def assert_indent(expected, source, *message) + if space = expected[/\A\n?(\s*\|)/, 1] + space = /^#{Regexp.quote(space)}/m + expected.gsub!(space, '') + source.gsub!(space, '') + end + result, output = run_emacs(source, EXPR_INDENT, EXPR_SAVE) + assert_match(/^Wrote /, output) + assert_equal(expected, result, *message) + end + + def test_simple + assert_indent(' + |if foo + | bar + |end + |zot + |', ' + |if foo + |bar + | end + | zot + |') + end + + def test_keyword_label + assert_indent(' + |bar(class: XXX) do + | foo + |end + |bar + |', ' + |bar(class: XXX) do + | foo + | end + | bar + |') + end + + def test_method_with_question_mark + assert_indent(' + |if x.is_a?(XXX) + | foo + |end + |', ' + |if x.is_a?(XXX) + | foo + | end + |') + end + + def test_expr_in_regexp + assert_indent(' + |if /#{foo}/ =~ s + | x = 1 + |end + |', ' + |if /#{foo}/ =~ s + | x = 1 + | end + |') + end + + def test_singleton_class + assert_indent(' + |class<<bar + | foo + |end + |', ' + |class<<bar + |foo + | end + |') + end + + def test_array_literal + assert_indent(' + |foo = [ + | bar + |] + |', ' + |foo = [ + | bar + | ] + |') + assert_indent(' + |foo do + | [bar] + |end + |', ' + |foo do + |[bar] + | end + |') + end + end +end if TestRubyMode::EMACS |