summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/misc/test_ruby_mode.rb136
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