Skip to content

Commit 780396b

Browse files
committed
wip
1 parent 4badcda commit 780396b

File tree

10 files changed

+188
-6
lines changed

10 files changed

+188
-6
lines changed

Dockerfile.development

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
ARG RUBY_VERSION=
22
FROM ruby:$RUBY_VERSION
33

4-
RUN apt-get update && apt-get install less -y
4+
RUN apt-get update && apt-get install apt-transport-https netcat less -y
55
RUN groupadd --gid 1000 ruby && useradd --uid 1000 --gid ruby --shell /bin/bash --create-home ruby
66
RUN mkdir /app /vendor && chown -R ruby:ruby /app /vendor
77

docker-compose.override.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,6 @@ services:
1212
<<: *app
1313
ruby-2-2:
1414
<<: *app
15+
selenium-vscode:
16+
volumes:
17+
- ./docker-selenium-vscode/vscode_wrapper:/opt/vscode_wrapper

docker-compose.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ services:
1111
volumes:
1212
- vendor:/vendor
1313
- home:/home/ruby
14+
depends_on:
15+
- selenium-vscode
1416
ruby-2-4:
1517
<<: *app
1618
ruby-2-3:
@@ -25,6 +27,11 @@ services:
2527
<<: *app-build
2628
args:
2729
RUBY_VERSION: 2.2.7
30+
selenium-vscode:
31+
build:
32+
context: docker-selenium-vscode
33+
ports:
34+
- 5900
2835
volumes:
2936
home:
3037
vendor:
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#! /usr/bin/env bash
2+
3+
set -e
4+
tmpdir="/tmp/vscode-test-$(date +'%s')"
5+
mkdir $tmpdir
6+
cd $tmpdir
7+
mkdir .vscode
8+
9+
args=()
10+
11+
for opt in "$@"
12+
do
13+
case $opt in
14+
--before-boot=* )
15+
before_boot=$(echo "$1" | sed -e "s/^--before-boot='//" -e "s/'$//")
16+
echo $before_boot
17+
;;
18+
'data:,' )
19+
# Ignore
20+
;;
21+
* )
22+
args+=( $1 )
23+
;;
24+
esac
25+
shift
26+
done
27+
28+
if [ "$before_boot" ]; then
29+
eval "$before_boot"
30+
fi
31+
32+
/usr/bin/code --skip-getting-started --disable-updates --disable-crash-reporter --wait ${args[*]} .
33+
rm -rf $tmpdir

language_server.gemspec

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@ Gem::Specification.new do |spec|
2525
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
2626
spec.require_paths = ["lib"]
2727

28-
spec.add_dependency "language_server-protocol", "0.4.0"
28+
spec.add_dependency "language_server-protocol", "0.5.0"
2929

3030
spec.add_development_dependency "awesome_print"
3131
spec.add_development_dependency "benchmark-ips"
3232
spec.add_development_dependency "bundler", "~> 1.14"
33+
spec.add_development_dependency "capybara"
3334
spec.add_development_dependency "guard"
3435
spec.add_development_dependency "guard-minitest"
3536
spec.add_development_dependency "m"
@@ -38,4 +39,5 @@ Gem::Specification.new do |spec|
3839
spec.add_development_dependency "minitest-power_assert"
3940
spec.add_development_dependency "pry-byebug"
4041
spec.add_development_dependency "rake", "~> 12.2"
42+
spec.add_development_dependency "selenium-webdriver"
4143
end

lib/language_server.rb

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,14 @@ def on(method, &callback)
8888
text_document_sync: Protocol::Interface::TextDocumentSyncOptions.new(
8989
change: Protocol::Constant::TextDocumentSyncKind::FULL,
9090
),
91-
completion_provider: Protocol::Interface::CompletionOptions.new(
92-
resolve_provider: true,
93-
trigger_characters: %w[.],
94-
),
91+
completion_provider: if LanguageServer.adhoc_enabled?
92+
Protocol::Interface::CompletionOptions.new(
93+
resolve_provider: true,
94+
trigger_characters: %w[.],
95+
)
96+
else
97+
false
98+
end,
9599
definition_provider: LanguageServer.adhoc_enabled?,
96100
),
97101
)

test/language_server_test.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
require "test_helper"
2+
require "open3"
3+
4+
class LanguageServerTest < IntegrationTest
5+
def test_syntax_check
6+
create_and_open_new_file "a.rb"
7+
8+
input_contents "def hi"
9+
assert_error_message_on "hi", message: "unexpected end-of-input, expecting ';' or '\\n'"
10+
11+
input_contents :enter
12+
input_contents "end"
13+
14+
assert_no_error_message
15+
end
16+
end

test/support/capybara.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
require "capybara/minitest"
2+
3+
Capybara.register_driver(:vscode) do |app|
4+
options = { browser: :remote, url: "http://selenium-vscode:4444/wd/hub" }
5+
6+
options[:desired_capabilities] = Selenium::WebDriver::Remote::Capabilities.chrome(
7+
chrome_options: {
8+
binary: "/opt/vscode_wrapper",
9+
args: ["before-boot='echo \"{ \\\"ruby-lsc.commandWithArgs\\\": [ \\\"nc\\\", \\\"#{Socket.gethostname}\\\", \\\"12345\\\" ] }\" > .vscode/settings.json'"],
10+
},
11+
)
12+
13+
Capybara::Selenium::Driver.new(app, options)
14+
end
15+
16+
Capybara.run_server = false
17+
Capybara.default_driver = :vscode
18+
Capybara.default_max_wait_time = 5

test/support/test_server.rb

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
class TestServer
2+
attr_reader :stdin, :stdout, :stderr, :thread, :port
3+
4+
def initialize(port = 12345)
5+
@stdin, @stdout, @stderr = Open3.popen3("bin/language_server-ruby")
6+
@port = port
7+
@thread = start_thread
8+
@thread.abort_on_exception = true
9+
end
10+
11+
private
12+
13+
def start_thread
14+
Thread.new do
15+
socket = TCPServer.open(port).accept
16+
17+
socket_buffer = ""
18+
stdout_buffer = ""
19+
20+
loop do
21+
readable_ios, writable_ios = IO.select([socket, stdout], [socket, stdin])
22+
23+
readable_ios.each do |io|
24+
c = io.readchar
25+
26+
case io
27+
when socket
28+
socket_buffer += c
29+
when stdout
30+
stdout_buffer += c
31+
end
32+
end
33+
34+
next if readable_ios.any?
35+
36+
writable_ios.each do |io|
37+
case io
38+
when stdin
39+
io.write(socket_buffer)
40+
socket_buffer.clear
41+
when socket
42+
io.write(stdout_buffer)
43+
stdout_buffer.clear
44+
end
45+
end
46+
end
47+
end
48+
end
49+
end

test/test_helper.rb

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,53 @@ def strip_heredoc
1212
gsub(/^[ \t]{#{indent}}/, "")
1313
end
1414
end
15+
16+
Dir.glob(File.join(__dir__, "support", "**", "*.rb")).each { |f| require f }
17+
18+
class IntegrationTest < Minitest::Test
19+
include Capybara::DSL
20+
include Capybara::Minitest::Assertions
21+
22+
def setup
23+
@server = TestServer.new
24+
25+
switch_to_window(windows.last)
26+
27+
assert_selector ".tab-label", text: /\AWelcome\z/, wait: 10
28+
end
29+
30+
def teardown
31+
evaluate_script "electron.remote.app.quit()"
32+
33+
puts @server.stderr.read unless passed?
34+
end
35+
36+
def create_and_open_new_file(filename)
37+
find(".explorer-viewlet").click
38+
find(".action-label.new-file").click
39+
find(".explorer-item input").send_keys(filename)
40+
find(".explorer-item input").send_keys(:enter)
41+
end
42+
43+
def input_contents(*contents)
44+
find(".monaco-editor textarea").send_keys(*contents)
45+
end
46+
47+
def focus_text(text)
48+
input_contents :escape
49+
50+
find("span", text: /\A#{Regexp.escape(text)}\z/).hover
51+
end
52+
53+
def assert_error_message_on(text, message: nil)
54+
focus_text text
55+
56+
options = message ? { text: /\A#{Regexp.escape(message)}\z/ } : {}
57+
58+
assert_selector ".monaco-tokenized-source", options
59+
end
60+
61+
def assert_no_error_message
62+
assert_selector ".task-statusbar-item-label-error+.task-statusbar-item-label-counter", text: /\A0\z/
63+
end
64+
end

0 commit comments

Comments
 (0)