iruby 0.5.0 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
data/lib/iruby/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module IRuby
2
- VERSION = '0.5.0'
2
+ VERSION = '0.7.2'
3
3
  end
data/test/helper.rb CHANGED
@@ -1,10 +1,56 @@
1
1
  require "iruby"
2
+ require "json"
3
+ require 'multi_json'
4
+ require "pathname"
2
5
  require "test/unit"
3
6
  require "test/unit/rr"
4
7
  require "tmpdir"
5
8
 
9
+
10
+ IRuby.logger = IRuby::MultiLogger.new(*Logger.new(STDERR, level: Logger::Severity::INFO))
11
+
6
12
  module IRubyTest
7
13
  class TestBase < Test::Unit::TestCase
14
+ def self.startup
15
+ @__config_dir = Dir.mktmpdir("iruby-test")
16
+ @__config_path = Pathname.new(@__config_dir) + "config.json"
17
+ File.write(@__config_path, {
18
+ control_port: 50160,
19
+ shell_port: 57503,
20
+ transport: "tcp",
21
+ signature_scheme: "hmac-sha256",
22
+ stdin_port: 52597,
23
+ hb_port: 42540,
24
+ ip: "127.0.0.1",
25
+ iopub_port: 40885,
26
+ key: "a0436f6c-1916-498b-8eb9-e81ab9368e84"
27
+ }.to_json)
28
+
29
+ @__original_kernel_instance = IRuby::Kernel.instance
30
+ end
31
+
32
+ def self.shutdown
33
+ FileUtils.remove_entry_secure(@__config_dir)
34
+ end
35
+
36
+ def self.test_config_filename
37
+ @__config_path.to_s
38
+ end
39
+
40
+ def self.restore_kernel
41
+ IRuby::Kernel.instance = @__original_kernel_instance
42
+ end
43
+
44
+ def teardown
45
+ self.class.restore_kernel
46
+ end
47
+
48
+ def with_session_adapter(session_adapter_name)
49
+ IRuby::Kernel.new(self.class.test_config_filename, session_adapter_name)
50
+ $stdout = STDOUT
51
+ $stderr = STDERR
52
+ end
53
+
8
54
  def assert_output(stdout=nil, stderr=nil)
9
55
  flunk "assert_output requires a block to capture output." unless block_given?
10
56
 
@@ -8,6 +8,12 @@ module IRubyTest
8
8
  assert_equal 3, @plainbackend.eval('1+2', false)
9
9
  end
10
10
 
11
+ def test_include_module
12
+ assert_nothing_raised do
13
+ @plainbackend.eval("include Math, Comparable", false)
14
+ end
15
+ end
16
+
11
17
  def test_complete_req
12
18
  assert_includes @plainbackend.complete('req'), 'require'
13
19
  end
@@ -26,6 +32,12 @@ module IRubyTest
26
32
  assert_equal 3, @prybackend.eval('1+2', false)
27
33
  end
28
34
 
35
+ def test_include_module
36
+ assert_nothing_raised do
37
+ @prybackend.eval("include Math, Comparable", false)
38
+ end
39
+ end
40
+
29
41
  def test_complete_req
30
42
  assert_includes @prybackend.complete('req'), 'require'
31
43
  end
@@ -0,0 +1,188 @@
1
+ module IRubyTest
2
+ class DisplayTest < TestBase
3
+ def setup
4
+ @object = Object.new
5
+ @object.instance_variable_set(:@to_html_called, false)
6
+ @object.instance_variable_set(:@to_markdown_called, false)
7
+ @object.instance_variable_set(:@to_iruby_called, false)
8
+ @object.instance_variable_set(:@to_iruby_mimebundle_called, false)
9
+
10
+ class << @object
11
+ attr_reader :to_html_called
12
+ attr_reader :to_markdown_called
13
+ attr_reader :to_iruby_called
14
+ attr_reader :to_iruby_mimebundle_called
15
+
16
+ def html
17
+ "<b>html</b>"
18
+ end
19
+
20
+ def markdown
21
+ "*markdown*"
22
+ end
23
+
24
+ def inspect
25
+ "!!! inspect !!!"
26
+ end
27
+ end
28
+ end
29
+
30
+ def define_to_html
31
+ class << @object
32
+ def to_html
33
+ @to_html_called = true
34
+ html
35
+ end
36
+ end
37
+ end
38
+
39
+ def define_to_markdown
40
+ class << @object
41
+ def to_markdown
42
+ @to_markdown_called = true
43
+ markdown
44
+ end
45
+ end
46
+ end
47
+
48
+ def define_to_iruby
49
+ class << @object
50
+ def to_iruby
51
+ @to_iruby_called = true
52
+ ["text/html", "<b>to_iruby</b>"]
53
+ end
54
+ end
55
+ end
56
+
57
+ def define_to_iruby_mimebundle
58
+ class << @object
59
+ def to_iruby_mimebundle(include: [])
60
+ @to_iruby_mimebundle_called = true
61
+ mimes = if include.empty?
62
+ ["text/html", "text/markdown", "application/json"]
63
+ else
64
+ include
65
+ end
66
+ formats = mimes.map { |mime|
67
+ result = case mime
68
+ when "text/html"
69
+ "<i>html</i>"
70
+ when "text/markdown"
71
+ "**markdown**"
72
+ when "application/json"
73
+ %Q[{"mimebundle": "json"}]
74
+ end
75
+ [mime, result]
76
+ }.to_h
77
+ metadata = {}
78
+ return formats, metadata
79
+ end
80
+ end
81
+ end
82
+
83
+ def assert_iruby_display(expected)
84
+ assert_equal(expected,
85
+ {
86
+ result: IRuby::Display.display(@object),
87
+ to_html_called: @object.to_html_called,
88
+ to_markdown_called: @object.to_markdown_called,
89
+ to_iruby_called: @object.to_iruby_called,
90
+ to_iruby_mimebundle_called: @object.to_iruby_mimebundle_called
91
+ })
92
+ end
93
+
94
+ sub_test_case("the object cannot handle all the mime types") do
95
+ def test_display
96
+ assert_iruby_display({
97
+ result: {"text/plain" => "!!! inspect !!!"},
98
+ to_html_called: false,
99
+ to_markdown_called: false,
100
+ to_iruby_called: false,
101
+ to_iruby_mimebundle_called: false
102
+ })
103
+ end
104
+ end
105
+
106
+ sub_test_case("the object can respond to to_iruby") do
107
+ def setup
108
+ super
109
+ define_to_iruby
110
+ end
111
+
112
+ def test_display
113
+ assert_iruby_display({
114
+ result: {
115
+ "text/html" => "<b>to_iruby</b>",
116
+ "text/plain" => "!!! inspect !!!"
117
+ },
118
+ to_html_called: false,
119
+ to_markdown_called: false,
120
+ to_iruby_called: true,
121
+ to_iruby_mimebundle_called: false
122
+ })
123
+ end
124
+
125
+ sub_test_case("the object can respond to to_markdown") do
126
+ def setup
127
+ super
128
+ define_to_markdown
129
+ end
130
+
131
+ def test_display
132
+ assert_iruby_display({
133
+ result: {
134
+ "text/markdown" => "*markdown*",
135
+ "text/plain" => "!!! inspect !!!"
136
+ },
137
+ to_html_called: false,
138
+ to_markdown_called: true,
139
+ to_iruby_called: false,
140
+ to_iruby_mimebundle_called: false
141
+ })
142
+ end
143
+ end
144
+
145
+ sub_test_case("the object can respond to to_html") do
146
+ def setup
147
+ super
148
+ define_to_html
149
+ end
150
+
151
+ def test_display
152
+ assert_iruby_display({
153
+ result: {
154
+ "text/html" => "<b>html</b>",
155
+ "text/plain" => "!!! inspect !!!"
156
+ },
157
+ to_html_called: true,
158
+ to_markdown_called: false,
159
+ to_iruby_called: false,
160
+ to_iruby_mimebundle_called: false
161
+ })
162
+ end
163
+
164
+ sub_test_case("the object can respond to to_iruby_mimebundle") do
165
+ def setup
166
+ super
167
+ define_to_iruby_mimebundle
168
+ end
169
+
170
+ def test_display
171
+ assert_iruby_display({
172
+ result: {
173
+ "text/html" => "<i>html</i>",
174
+ "text/markdown" => "**markdown**",
175
+ "application/json" => %Q[{"mimebundle": "json"}],
176
+ "text/plain" => "!!! inspect !!!"
177
+ },
178
+ to_html_called: false,
179
+ to_markdown_called: false,
180
+ to_iruby_called: false,
181
+ to_iruby_mimebundle_called: true
182
+ })
183
+ end
184
+ end
185
+ end
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,92 @@
1
+ module IRubyTest
2
+ class EventManagerTest < TestBase
3
+ def setup
4
+ @man = IRuby::EventManager.new([:foo, :bar])
5
+ end
6
+
7
+ def test_available_events
8
+ assert_equal([:foo, :bar],
9
+ @man.available_events)
10
+ end
11
+
12
+ sub_test_case("#register") do
13
+ sub_test_case("known event name") do
14
+ def test_register
15
+ fn = ->() {}
16
+ assert_equal(fn,
17
+ @man.register(:foo, &fn))
18
+ end
19
+ end
20
+
21
+ sub_test_case("unknown event name") do
22
+ def test_register
23
+ assert_raise_message("Unknown event name: baz") do
24
+ @man.register(:baz) {}
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ sub_test_case("#unregister") do
31
+ sub_test_case("no event is registered") do
32
+ def test_unregister
33
+ fn = ->() {}
34
+ assert_raise_message("Given callable object #{fn} is not registered as a foo callback") do
35
+ @man.unregister(:foo, fn)
36
+ end
37
+ end
38
+ end
39
+
40
+ sub_test_case("the registered callable is given") do
41
+ def test_unregister
42
+ results = { values: [] }
43
+ fn = ->(a) { values << a }
44
+
45
+ @man.register(:foo, &fn)
46
+
47
+ results[:retval] = @man.unregister(:foo, fn)
48
+
49
+ @man.trigger(:foo, 42)
50
+
51
+ assert_equal({
52
+ values: [],
53
+ retval: fn
54
+ },
55
+ results)
56
+ end
57
+ end
58
+ end
59
+
60
+ sub_test_case("#trigger") do
61
+ sub_test_case("no event is registered") do
62
+ def test_trigger
63
+ assert_nothing_raised do
64
+ @man.trigger(:foo)
65
+ end
66
+ end
67
+ end
68
+
69
+ sub_test_case("some events are registered") do
70
+ def test_trigger
71
+ values = []
72
+ @man.register(:foo) {|a| values << a }
73
+ @man.register(:foo) {|a| values << 10*a }
74
+ @man.register(:foo) {|a| values << 100+a }
75
+
76
+ @man.trigger(:foo, 5)
77
+
78
+ assert_equal([5, 50, 105],
79
+ values)
80
+ end
81
+ end
82
+
83
+ sub_test_case("unknown event name") do
84
+ def test_trigger
85
+ assert_raise_message("Unknown event name: baz") do
86
+ @man.trigger(:baz, 100)
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,185 @@
1
+ require "base64"
2
+
3
+ module IRubyTest
4
+ class KernelTest < TestBase
5
+ def setup
6
+ super
7
+ with_session_adapter("test")
8
+ @kernel = IRuby::Kernel.instance
9
+ end
10
+
11
+ sub_test_case("iruby_initialized event") do
12
+ def setup
13
+ super
14
+ @initialized_kernel = nil
15
+ @callback = IRuby::Kernel.events.register(:initialized) do |kernel|
16
+ @initialized_kernel = kernel
17
+ end
18
+ end
19
+
20
+ def teardown
21
+ IRuby::Kernel.events.unregister(:initialized, @callback)
22
+ end
23
+
24
+ def test_iruby_initialized_event
25
+ with_session_adapter("test")
26
+ assert_same(IRuby::Kernel.instance, @initialized_kernel)
27
+ end
28
+ end
29
+
30
+ def test_execute_request
31
+ obj = Object.new
32
+
33
+ class << obj
34
+ def to_html
35
+ "<b>HTML</b>"
36
+ end
37
+
38
+ def inspect
39
+ "!!! inspect !!!"
40
+ end
41
+ end
42
+
43
+ ::IRubyTest.define_singleton_method(:test_object) { obj }
44
+
45
+ msg_types = []
46
+ execute_reply = nil
47
+ execute_result = nil
48
+ @kernel.session.adapter.send_callback = ->(sock, msg) do
49
+ header = msg[:header]
50
+ content = msg[:content]
51
+ msg_types << header["msg_type"]
52
+ case header["msg_type"]
53
+ when "execute_reply"
54
+ execute_reply = content
55
+ when "execute_result"
56
+ execute_result = content
57
+ end
58
+ end
59
+
60
+ msg = {
61
+ content: {
62
+ "code" => "IRubyTest.test_object",
63
+ "silent" => false,
64
+ "store_history" => false,
65
+ "user_expressions" => {},
66
+ "allow_stdin" => false,
67
+ "stop_on_error" => true,
68
+ }
69
+ }
70
+ @kernel.execute_request(msg)
71
+
72
+ assert_equal({
73
+ msg_types: [ "execute_input", "execute_result", "execute_reply" ],
74
+ execute_reply: {
75
+ status: "ok",
76
+ user_expressions: {},
77
+ },
78
+ execute_result: {
79
+ data: {
80
+ "text/html" => "<b>HTML</b>",
81
+ "text/plain" => "!!! inspect !!!"
82
+ },
83
+ metadata: {},
84
+ }
85
+ },
86
+ {
87
+ msg_types: msg_types,
88
+ execute_reply: {
89
+ status: execute_reply["status"],
90
+ user_expressions: execute_reply["user_expressions"]
91
+ },
92
+ execute_result: {
93
+ data: execute_result["data"],
94
+ metadata: execute_result["metadata"]
95
+ }
96
+ })
97
+ end
98
+
99
+ def test_events_around_of_execute_request
100
+ event_history = []
101
+
102
+ @kernel.events.register(:pre_execute) do
103
+ event_history << :pre_execute
104
+ end
105
+
106
+ @kernel.events.register(:pre_run_cell) do |exec_info|
107
+ event_history << [:pre_run_cell, exec_info]
108
+ end
109
+
110
+ @kernel.events.register(:post_execute) do
111
+ event_history << :post_execute
112
+ end
113
+
114
+ @kernel.events.register(:post_run_cell) do |result|
115
+ event_history << [:post_run_cell, result]
116
+ end
117
+
118
+ msg = {
119
+ content: {
120
+ "code" => "true",
121
+ "silent" => false,
122
+ "store_history" => false,
123
+ "user_expressions" => {},
124
+ "allow_stdin" => false,
125
+ "stop_on_error" => true,
126
+ }
127
+ }
128
+ @kernel.execute_request(msg)
129
+
130
+ msg = {
131
+ content: {
132
+ "code" => "true",
133
+ "silent" => true,
134
+ "store_history" => false,
135
+ "user_expressions" => {},
136
+ "allow_stdin" => false,
137
+ "stop_on_error" => true,
138
+ }
139
+ }
140
+ @kernel.execute_request(msg)
141
+
142
+ assert_equal([
143
+ :pre_execute,
144
+ [:pre_run_cell, IRuby::ExecutionInfo.new("true", false, false)],
145
+ :post_execute,
146
+ [:post_run_cell, true],
147
+ :pre_execute,
148
+ :post_execute
149
+ ],
150
+ event_history)
151
+ end
152
+
153
+ sub_test_case("#switch_backend!") do
154
+ sub_test_case("") do
155
+ def test_switch_backend
156
+ classes = []
157
+
158
+ # First pick the default backend class
159
+ classes << @kernel.instance_variable_get(:@backend).class
160
+
161
+ @kernel.switch_backend!(:pry)
162
+ classes << @kernel.instance_variable_get(:@backend).class
163
+
164
+ @kernel.switch_backend!(:irb)
165
+ classes << @kernel.instance_variable_get(:@backend).class
166
+
167
+ @kernel.switch_backend!(:pry)
168
+ classes << @kernel.instance_variable_get(:@backend).class
169
+
170
+ @kernel.switch_backend!(:plain)
171
+ classes << @kernel.instance_variable_get(:@backend).class
172
+
173
+ assert_equal([
174
+ IRuby::PlainBackend,
175
+ IRuby::PryBackend,
176
+ IRuby::PlainBackend,
177
+ IRuby::PryBackend,
178
+ IRuby::PlainBackend
179
+ ],
180
+ classes)
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end