diff --git a/spec/folding/basic_spec.rb b/spec/folding/basic_spec.rb new file mode 100644 index 00000000..b3e2406f --- /dev/null +++ b/spec/folding/basic_spec.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'Basic folding' do + def self.it_folds_lines(content, lines, tags = nil) + it("folds #{lines} lines on \n#{content}", tags) do + expect(content).to fold_lines(lines, tags) + end + end + + it_folds_lines(<<~EOF, 2) + defmodule M do + end + "not in fold" + EOF + + it_folds_lines(<<~EOF, 4) + defmodule M do + def some_func do + end + end + "not in fold" + EOF + + it_folds_lines(<<~EOF, 2, on_line: 2) + defmodule M do + def some_func do + end + end + "not in fold" + EOF + + it_folds_lines(<<~EOF, 2) + if true do + end + "not in fold" + EOF + + it_folds_lines(<<~EOF, 3, on_line: 3) + if true do + nil + else + nil + end + "not in fold" + EOF + + it_folds_lines(<<~EOF, 5, skip: "broken") + if true do + nil + else + nil + end + "not in fold" + EOF +end + diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index cd02e09e..42291a77 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -61,6 +61,18 @@ def syntax(content, pattern) syngroups.gsub!(/["'\[\]]/, '').split(', ') end + def fold_and_delete(content, opts) + start_line = opts[:on_line] + with_file content do + @vim.command("set foldmethod=syntax") + + @vim.normal("zO") + @vim.normal("#{start_line}G") + @vim.normal("zc") + @vim.normal("dd") + end + end + private def with_file(content = nil) @@ -193,6 +205,31 @@ def self.new end end +RSpec::Matchers.define :fold_lines do |lines, opts| + buffer = Buffer.new(VIM, :ex) + opts ||= {} + start_line = opts[:on_line] ||= 1 + + after = nil + + match do |code| + after = buffer.fold_and_delete(code, opts) + + code.lines.count - after.lines.count == lines + end + + failure_message do |code| + <<~EOF + expected + #{code} + to fold #{lines} lines at line #{start_line}, + but after folding at line #{start_line} and deleting a line I got + #{after} + back + EOF + end +end + Vimrunner::RSpec.configure do |config| config.reuse_server = true