mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
225 lines
5.1 KiB
Ruby
225 lines
5.1 KiB
Ruby
![]() |
# frozen_string_literal: true
|
|||
|
|
|||
|
require_relative "../spec_helper"
|
|||
|
|
|||
|
module SyntaxSuggest
|
|||
|
class FakeExit
|
|||
|
def initialize
|
|||
|
@called = false
|
|||
|
@value = nil
|
|||
|
end
|
|||
|
|
|||
|
def exit(value = nil)
|
|||
|
@called = true
|
|||
|
@value = value
|
|||
|
end
|
|||
|
|
|||
|
def called?
|
|||
|
@called
|
|||
|
end
|
|||
|
|
|||
|
attr_reader :value
|
|||
|
end
|
|||
|
|
|||
|
RSpec.describe Cli do
|
|||
|
it "parses valid code" do
|
|||
|
Dir.mktmpdir do |dir|
|
|||
|
dir = Pathname(dir)
|
|||
|
file = dir.join("script.rb")
|
|||
|
file.write("puts 'lol'")
|
|||
|
|
|||
|
io = StringIO.new
|
|||
|
exit_obj = FakeExit.new
|
|||
|
Cli.new(
|
|||
|
io: io,
|
|||
|
argv: [file.to_s],
|
|||
|
exit_obj: exit_obj
|
|||
|
).call
|
|||
|
|
|||
|
expect(exit_obj.called?).to be_truthy
|
|||
|
expect(exit_obj.value).to eq(0)
|
|||
|
expect(io.string.strip).to eq("Syntax OK")
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
it "parses invalid code" do
|
|||
|
file = fixtures_dir.join("this_project_extra_def.rb.txt")
|
|||
|
|
|||
|
io = StringIO.new
|
|||
|
exit_obj = FakeExit.new
|
|||
|
Cli.new(
|
|||
|
io: io,
|
|||
|
argv: [file.to_s],
|
|||
|
exit_obj: exit_obj
|
|||
|
).call
|
|||
|
|
|||
|
out = io.string
|
|||
|
debug_display(out)
|
|||
|
|
|||
|
expect(exit_obj.called?).to be_truthy
|
|||
|
expect(exit_obj.value).to eq(1)
|
|||
|
expect(out.strip).to include("❯ 36 def filename")
|
|||
|
end
|
|||
|
|
|||
|
it "parses valid code with flags" do
|
|||
|
Dir.mktmpdir do |dir|
|
|||
|
dir = Pathname(dir)
|
|||
|
file = dir.join("script.rb")
|
|||
|
file.write("puts 'lol'")
|
|||
|
|
|||
|
io = StringIO.new
|
|||
|
exit_obj = FakeExit.new
|
|||
|
cli = Cli.new(
|
|||
|
io: io,
|
|||
|
argv: ["--terminal", file.to_s],
|
|||
|
exit_obj: exit_obj
|
|||
|
)
|
|||
|
cli.call
|
|||
|
|
|||
|
expect(exit_obj.called?).to be_truthy
|
|||
|
expect(exit_obj.value).to eq(0)
|
|||
|
expect(cli.options[:terminal]).to be_truthy
|
|||
|
expect(io.string.strip).to eq("Syntax OK")
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
it "errors when no file given" do
|
|||
|
io = StringIO.new
|
|||
|
exit_obj = FakeExit.new
|
|||
|
cli = Cli.new(
|
|||
|
io: io,
|
|||
|
argv: ["--terminal"],
|
|||
|
exit_obj: exit_obj
|
|||
|
)
|
|||
|
cli.call
|
|||
|
|
|||
|
expect(exit_obj.called?).to be_truthy
|
|||
|
expect(exit_obj.value).to eq(1)
|
|||
|
expect(io.string.strip).to eq("No file given")
|
|||
|
end
|
|||
|
|
|||
|
it "errors when file does not exist" do
|
|||
|
io = StringIO.new
|
|||
|
exit_obj = FakeExit.new
|
|||
|
cli = Cli.new(
|
|||
|
io: io,
|
|||
|
argv: ["lol-i-d-o-not-ex-ist-yololo.txtblerglol"],
|
|||
|
exit_obj: exit_obj
|
|||
|
)
|
|||
|
cli.call
|
|||
|
|
|||
|
expect(exit_obj.called?).to be_truthy
|
|||
|
expect(exit_obj.value).to eq(1)
|
|||
|
expect(io.string.strip).to include("file not found:")
|
|||
|
end
|
|||
|
|
|||
|
# We cannot execute the parser here
|
|||
|
# because it calls `exit` and it will exit
|
|||
|
# our tests, however we can assert that the
|
|||
|
# parser has the right value for version
|
|||
|
it "-v version" do
|
|||
|
io = StringIO.new
|
|||
|
exit_obj = FakeExit.new
|
|||
|
parser = Cli.new(
|
|||
|
io: io,
|
|||
|
argv: ["-v"],
|
|||
|
exit_obj: exit_obj
|
|||
|
).parser
|
|||
|
|
|||
|
expect(parser.version).to include(SyntaxSuggest::VERSION.to_s)
|
|||
|
end
|
|||
|
|
|||
|
it "SYNTAX_SUGGEST_RECORD_DIR" do
|
|||
|
io = StringIO.new
|
|||
|
exit_obj = FakeExit.new
|
|||
|
cli = Cli.new(
|
|||
|
io: io,
|
|||
|
argv: [],
|
|||
|
env: {"SYNTAX_SUGGEST_RECORD_DIR" => "hahaha"},
|
|||
|
exit_obj: exit_obj
|
|||
|
).parse
|
|||
|
|
|||
|
expect(exit_obj.called?).to be_falsey
|
|||
|
expect(cli.options[:record_dir]).to eq("hahaha")
|
|||
|
end
|
|||
|
|
|||
|
it "--record-dir=<dir>" do
|
|||
|
io = StringIO.new
|
|||
|
exit_obj = FakeExit.new
|
|||
|
cli = Cli.new(
|
|||
|
io: io,
|
|||
|
argv: ["--record=lol"],
|
|||
|
exit_obj: exit_obj
|
|||
|
).parse
|
|||
|
|
|||
|
expect(exit_obj.called?).to be_falsey
|
|||
|
expect(cli.options[:record_dir]).to eq("lol")
|
|||
|
end
|
|||
|
|
|||
|
it "terminal default to respecting TTY" do
|
|||
|
io = StringIO.new
|
|||
|
exit_obj = FakeExit.new
|
|||
|
cli = Cli.new(
|
|||
|
io: io,
|
|||
|
argv: [],
|
|||
|
exit_obj: exit_obj
|
|||
|
).parse
|
|||
|
|
|||
|
expect(exit_obj.called?).to be_falsey
|
|||
|
expect(cli.options[:terminal]).to eq(SyntaxSuggest::DEFAULT_VALUE)
|
|||
|
end
|
|||
|
|
|||
|
it "--terminal" do
|
|||
|
io = StringIO.new
|
|||
|
exit_obj = FakeExit.new
|
|||
|
cli = Cli.new(
|
|||
|
io: io,
|
|||
|
argv: ["--terminal"],
|
|||
|
exit_obj: exit_obj
|
|||
|
).parse
|
|||
|
|
|||
|
expect(exit_obj.called?).to be_falsey
|
|||
|
expect(cli.options[:terminal]).to be_truthy
|
|||
|
end
|
|||
|
|
|||
|
it "--no-terminal" do
|
|||
|
io = StringIO.new
|
|||
|
exit_obj = FakeExit.new
|
|||
|
cli = Cli.new(
|
|||
|
io: io,
|
|||
|
argv: ["--no-terminal"],
|
|||
|
exit_obj: exit_obj
|
|||
|
).parse
|
|||
|
|
|||
|
expect(exit_obj.called?).to be_falsey
|
|||
|
expect(cli.options[:terminal]).to be_falsey
|
|||
|
end
|
|||
|
|
|||
|
it "--help outputs help" do
|
|||
|
io = StringIO.new
|
|||
|
exit_obj = FakeExit.new
|
|||
|
Cli.new(
|
|||
|
io: io,
|
|||
|
argv: ["--help"],
|
|||
|
exit_obj: exit_obj
|
|||
|
).call
|
|||
|
|
|||
|
expect(exit_obj.called?).to be_truthy
|
|||
|
expect(io.string).to include("Usage: syntax_suggest <file> [options]")
|
|||
|
end
|
|||
|
|
|||
|
it "<empty args> outputs help" do
|
|||
|
io = StringIO.new
|
|||
|
exit_obj = FakeExit.new
|
|||
|
Cli.new(
|
|||
|
io: io,
|
|||
|
argv: [],
|
|||
|
exit_obj: exit_obj
|
|||
|
).call
|
|||
|
|
|||
|
expect(exit_obj.called?).to be_truthy
|
|||
|
expect(io.string).to include("Usage: syntax_suggest <file> [options]")
|
|||
|
end
|
|||
|
end
|
|||
|
end
|