summaryrefslogtreecommitdiff
path: root/spec/syntax_suggest/unit/capture_code_context_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/syntax_suggest/unit/capture_code_context_spec.rb')
-rw-r--r--spec/syntax_suggest/unit/capture_code_context_spec.rb229
1 files changed, 229 insertions, 0 deletions
diff --git a/spec/syntax_suggest/unit/capture_code_context_spec.rb b/spec/syntax_suggest/unit/capture_code_context_spec.rb
new file mode 100644
index 0000000000..d9379d0ce7
--- /dev/null
+++ b/spec/syntax_suggest/unit/capture_code_context_spec.rb
@@ -0,0 +1,229 @@
+# frozen_string_literal: true
+
+require_relative "../spec_helper"
+
+module SyntaxSuggest
+ RSpec.describe CaptureCodeContext do
+ it "capture_before_after_kws two" do
+ source = <<~EOM
+ class OH
+
+ def hello
+
+ def hai
+ end
+ end
+ EOM
+
+ code_lines = CleanDocument.new(source: source).call.lines
+ block = CodeBlock.new(lines: code_lines[2])
+
+ display = CaptureCodeContext.new(
+ blocks: [block],
+ code_lines: code_lines
+ )
+ display.capture_before_after_kws(block)
+ expect(display.sorted_lines.join).to eq(<<~EOM.indent(2))
+ def hello
+ def hai
+ end
+ EOM
+ end
+
+ it "capture_before_after_kws" do
+ source = <<~EOM
+ def sit
+ end
+
+ def bark
+
+ def eat
+ end
+ EOM
+
+ code_lines = CleanDocument.new(source: source).call.lines
+ block = CodeBlock.new(lines: code_lines[3])
+
+ display = CaptureCodeContext.new(
+ blocks: [block],
+ code_lines: code_lines
+ )
+
+ lines = display.capture_before_after_kws(block).sort
+ expect(lines.join).to eq(<<~EOM)
+ def sit
+ end
+ def bark
+ def eat
+ end
+ EOM
+ end
+
+ it "handles ambiguous end" do
+ source = <<~EOM
+ def call # 0
+ print "lol" # 1
+ end # one # 2
+ end # two # 3
+ EOM
+
+ code_lines = CleanDocument.new(source: source).call.lines
+ code_lines[0..2].each(&:mark_invisible)
+ block = CodeBlock.new(lines: code_lines)
+
+ display = CaptureCodeContext.new(
+ blocks: [block],
+ code_lines: code_lines
+ )
+ lines = display.call
+
+ lines = lines.sort.map(&:original)
+
+ expect(lines.join).to eq(<<~EOM)
+ def call # 0
+ end # one # 2
+ end # two # 3
+ EOM
+ end
+
+ it "shows ends of captured block" do
+ lines = fixtures_dir.join("rexe.rb.txt").read.lines
+ lines.delete_at(148 - 1)
+ source = lines.join
+
+ code_lines = CleanDocument.new(source: source).call.lines
+
+ code_lines[0..75].each(&:mark_invisible)
+ code_lines[77..].each(&:mark_invisible)
+ expect(code_lines.join.strip).to eq("class Lookups")
+
+ block = CodeBlock.new(lines: code_lines[76..149])
+
+ display = CaptureCodeContext.new(
+ blocks: [block],
+ code_lines: code_lines
+ )
+ lines = display.call
+
+ lines = lines.sort.map(&:original)
+ expect(lines.join).to include(<<~EOM.indent(2))
+ class Lookups
+ def format_requires
+ end
+ EOM
+ end
+
+ it "shows ends of captured block" do
+ source = <<~EOM
+ class Dog
+ def bark
+ puts "woof"
+ end
+ EOM
+
+ code_lines = CleanDocument.new(source: source).call.lines
+ block = CodeBlock.new(lines: code_lines)
+ code_lines[1..].each(&:mark_invisible)
+
+ expect(block.to_s.strip).to eq("class Dog")
+
+ display = CaptureCodeContext.new(
+ blocks: [block],
+ code_lines: code_lines
+ )
+ lines = display.call.sort.map(&:original)
+ expect(lines.join).to eq(<<~EOM)
+ class Dog
+ def bark
+ end
+ EOM
+ end
+
+ it "captures surrounding context on falling indent" do
+ source = <<~EOM
+ class Blerg
+ end
+
+ class OH
+
+ def hello
+ it "foo" do
+ end
+ end
+
+ class Zerg
+ end
+ EOM
+ code_lines = CleanDocument.new(source: source).call.lines
+ block = CodeBlock.new(lines: code_lines[6])
+
+ expect(block.to_s.strip).to eq('it "foo" do')
+
+ display = CaptureCodeContext.new(
+ blocks: [block],
+ code_lines: code_lines
+ )
+ lines = display.call.sort.map(&:original)
+ expect(lines.join).to eq(<<~EOM)
+ class OH
+ def hello
+ it "foo" do
+ end
+ end
+ EOM
+ end
+
+ it "captures surrounding context on same indent" do
+ source = <<~EOM
+ class Blerg
+ end
+ class OH
+
+ def nope
+ end
+
+ def lol
+ end
+
+ end # here
+
+ def haha
+ end
+
+ def nope
+ end
+ end
+
+ class Zerg
+ end
+ EOM
+
+ code_lines = CleanDocument.new(source: source).call.lines
+ block = CodeBlock.new(lines: code_lines[7..10])
+ expect(block.to_s).to eq(<<~EOM.indent(2))
+ def lol
+ end
+
+ end # here
+ EOM
+
+ code_context = CaptureCodeContext.new(
+ blocks: [block],
+ code_lines: code_lines
+ )
+
+ lines = code_context.call
+ out = DisplayCodeWithLineNumbers.new(
+ lines: lines
+ ).call
+
+ expect(out).to eq(<<~EOM.indent(2))
+ 3 class OH
+ 8 def lol
+ 9 end
+ 11 end # here
+ 18 end
+ EOM
+ end
+ end
+end