ruber 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +54 -0
- data/bin/ruber +12 -1
- data/data/share/apps/ruber/ruberui.rc +5 -0
- data/data/share/icons/pin.png +0 -0
- data/lib/ruber/application/application.rb +1 -1
- data/lib/ruber/documents/document_list.rb +1 -1
- data/lib/ruber/editor/document.rb +26 -6
- data/lib/ruber/editor/editor_view.rb +21 -2
- data/lib/ruber/filtered_output_widget.rb +1 -1
- data/lib/ruber/ktexteditor_sugar.rb +124 -0
- data/lib/ruber/main_window/main_window.rb +34 -16
- data/lib/ruber/main_window/main_window_actions.rb +98 -5
- data/lib/ruber/main_window/main_window_internal.rb +1 -1
- data/lib/ruber/main_window/plugin.yaml +5 -0
- data/lib/ruber/main_window/ui/choose_plugins_widget.rb +2 -2
- data/lib/ruber/main_window/ui/main_window_settings_widget.rb +67 -34
- data/lib/ruber/main_window/ui/main_window_settings_widget.ui +77 -30
- data/lib/ruber/main_window/ui/new_project_widget.rb +2 -2
- data/lib/ruber/main_window/ui/open_file_in_project_dlg.rb +2 -2
- data/lib/ruber/main_window/ui/output_color_widget.rb +2 -2
- data/lib/ruber/main_window/ui/workspace_settings_widget.rb +1 -1
- data/lib/ruber/main_window/view_manager.rb +14 -1
- data/lib/ruber/output_widget.rb +409 -288
- data/lib/ruber/pane.rb +22 -0
- data/lib/ruber/projects/ui/project_files_rule_chooser_widget.rb +2 -2
- data/lib/ruber/projects/ui/project_files_widget.rb +2 -2
- data/lib/ruber/qt_sugar.rb +11 -0
- data/lib/ruber/version.rb +1 -1
- data/plugins/auto_end/auto_end.rb +122 -0
- data/plugins/auto_end/plugin.yaml +11 -0
- data/plugins/autosave/ui/autosave_config_widget.rb +2 -2
- data/plugins/command/command.rb +71 -12
- data/plugins/command/output.rb +592 -0
- data/plugins/command/ui/tool_widget.rb +143 -0
- data/plugins/command/ui/tool_widget.ui +147 -0
- data/plugins/find_in_files/ui/config_widget.rb +2 -2
- data/plugins/find_in_files/ui/find_in_files_widget.rb +2 -2
- data/plugins/rake/ui/add_quick_task_widget.rb +2 -2
- data/plugins/rake/ui/choose_task_widget.rb +2 -2
- data/plugins/rake/ui/config_widget.rb +2 -2
- data/plugins/rake/ui/project_widget.rb +2 -2
- data/plugins/rspec/plugin.yaml +7 -2
- data/plugins/rspec/rspec.rb +178 -53
- data/plugins/rspec/rspecui.rc +2 -3
- data/plugins/rspec/ui/config_widget.rb +79 -0
- data/plugins/rspec/ui/config_widget.ui +89 -0
- data/plugins/rspec/ui/rspec_project_widget.rb +2 -2
- data/plugins/ruby_development/ruby_development.rb +1 -1
- data/plugins/ruby_development/ui/config_widget.rb +1 -1
- data/plugins/ruby_development/ui/project_widget.rb +2 -2
- data/plugins/ruby_runner/ruby_runner.rb +13 -12
- data/plugins/ruby_runner/ui/config_widget.rb +2 -2
- data/plugins/ruby_runner/ui/project_widget.rb +2 -2
- data/plugins/ruby_runner/ui/ruby_runnner_plugin_option_widget.rb +2 -2
- data/plugins/state/ui/config_widget.rb +2 -2
- data/plugins/syntax_checker/syntax_checker.rb +1 -1
- data/spec/auto_end_spec.rb +272 -0
- data/spec/common.rb +1 -0
- data/spec/document_spec.rb +83 -0
- data/spec/editor_view_spec.rb +41 -0
- data/spec/filtered_output_widget_spec.rb +2 -2
- data/spec/ktexteditor_sugar_spec.rb +190 -0
- data/spec/output_widget_spec.rb +120 -11
- data/spec/pane_spec.rb +1 -1
- data/spec/qt_sugar_spec.rb +14 -0
- data/spec/state_spec.rb +0 -26
- metadata +14 -3
data/spec/common.rb
CHANGED
data/spec/document_spec.rb
CHANGED
@@ -802,4 +802,87 @@ describe Ruber::Document do
|
|
802
802
|
|
803
803
|
end
|
804
804
|
|
805
|
+
describe '#text' do
|
806
|
+
|
807
|
+
before do
|
808
|
+
@doc = Ruber::Document.new
|
809
|
+
end
|
810
|
+
|
811
|
+
context 'when called with no arguments' do
|
812
|
+
|
813
|
+
it 'returns an empty string if the document is empty' do
|
814
|
+
@doc.text.should == ''
|
815
|
+
end
|
816
|
+
|
817
|
+
it 'returns the text of the document if the document is not empty' do
|
818
|
+
@doc.text = 'xyz'
|
819
|
+
@doc.text.should == 'xyz'
|
820
|
+
end
|
821
|
+
|
822
|
+
end
|
823
|
+
|
824
|
+
context 'when called with a KTextEditor::Range argument' do
|
825
|
+
|
826
|
+
it 'returns an empty string if the document is empty' do
|
827
|
+
@doc.text(KTextEditor::Range.new(2,3, 4, 5)).should == ''
|
828
|
+
end
|
829
|
+
|
830
|
+
it 'returns the text contained in the given range if the document is not empty' do
|
831
|
+
@doc.text = "abc\ndef\nghi"
|
832
|
+
@doc.text(KTextEditor::Range.new(0,1,1,2)).should == "bc\nde"
|
833
|
+
end
|
834
|
+
|
835
|
+
it 'returns an empty string if the range is invalid' do
|
836
|
+
@doc.text = "abc\ndef\nghi"
|
837
|
+
@doc.text(KTextEditor::Range.new(-5,0,0,2)).should == ''
|
838
|
+
end
|
839
|
+
|
840
|
+
end
|
841
|
+
|
842
|
+
context 'when the second argument is true' do
|
843
|
+
|
844
|
+
it 'returns an empty string if the document is empty' do
|
845
|
+
@doc.text(KTextEditor::Range.new(2,3, 4, 5), true).should == ''
|
846
|
+
end
|
847
|
+
|
848
|
+
it 'returns the text contained in the given range, considered as a block selection, if the document is not empty' do
|
849
|
+
@doc.text = "abc\ndef\nghi"
|
850
|
+
@doc.text(KTextEditor::Range.new(0,1,1,2), true).should == "b\ne"
|
851
|
+
end
|
852
|
+
|
853
|
+
it 'returns an empty string if the range is invalid' do
|
854
|
+
@doc.text = "abc\ndef\nghi"
|
855
|
+
@doc.text(KTextEditor::Range.new(-5,0,0,2), true).should == ''
|
856
|
+
end
|
857
|
+
|
858
|
+
end
|
859
|
+
|
860
|
+
end
|
861
|
+
|
862
|
+
describe '#line' do
|
863
|
+
|
864
|
+
before do
|
865
|
+
@doc = Ruber::Document.new
|
866
|
+
end
|
867
|
+
|
868
|
+
it 'returns the text in the line given as argument' do
|
869
|
+
@doc.text = "abc\ndef\nghi"
|
870
|
+
lines = %w[abc def ghi]
|
871
|
+
lines.each_with_index do |str, i|
|
872
|
+
@doc.line(i).should == str
|
873
|
+
end
|
874
|
+
end
|
875
|
+
|
876
|
+
it 'returns an empty string if the line is empty' do
|
877
|
+
@doc.text = "abc\n\nxyz"
|
878
|
+
@doc.line(1).should == ''
|
879
|
+
end
|
880
|
+
|
881
|
+
it 'returns an empty string if the line number corresponds to a nonexisting line' do
|
882
|
+
@doc.text = "abc\ndef\nghi"
|
883
|
+
@doc.line(10).should == ''
|
884
|
+
end
|
885
|
+
|
886
|
+
end
|
887
|
+
|
805
888
|
end
|
data/spec/editor_view_spec.rb
CHANGED
@@ -148,6 +148,47 @@ describe Ruber::EditorView do
|
|
148
148
|
end
|
149
149
|
|
150
150
|
end
|
151
|
+
|
152
|
+
describe '#move_cursor_by' do
|
153
|
+
|
154
|
+
before do
|
155
|
+
@doc.text = 20.times.map{'x'*20}.join("\n")
|
156
|
+
@view.go_to 10, 8
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'moves the cursor by the specified amount from the current position' do
|
160
|
+
exp = KTextEditor::Cursor.new 14, 9
|
161
|
+
@view.move_cursor_by 4, 1
|
162
|
+
res = @view.cursor_position
|
163
|
+
res.line.should == exp.line
|
164
|
+
res.column.should == exp.column
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'moves the cursor upwards if the row argument is negative' do
|
168
|
+
exp = KTextEditor::Cursor.new 6, 9
|
169
|
+
@view.move_cursor_by -4, 1
|
170
|
+
res = @view.cursor_position
|
171
|
+
res.line.should == exp.line
|
172
|
+
res.column.should == exp.column
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'moves the cursor to the left if the column argument is negative' do
|
176
|
+
exp = KTextEditor::Cursor.new 14, 5
|
177
|
+
@view.move_cursor_by 4, -3
|
178
|
+
res = @view.cursor_position
|
179
|
+
res.line.should == exp.line
|
180
|
+
res.column.should == exp.column
|
181
|
+
end
|
182
|
+
|
183
|
+
it 'doesn\'t move the cursor and returns false if the new cursor position is out of range' do
|
184
|
+
exp = KTextEditor::Cursor.new 10, 8
|
185
|
+
@view.move_cursor_by(100, -300).should be_false
|
186
|
+
res = @view.cursor_position
|
187
|
+
res.line.should == exp.line
|
188
|
+
res.column.should == exp.column
|
189
|
+
end
|
190
|
+
|
191
|
+
end
|
151
192
|
|
152
193
|
end
|
153
194
|
|
@@ -60,13 +60,13 @@ describe Ruber::FilteredOutputWidget do
|
|
60
60
|
flexmock(editor).should_receive(:hide).once
|
61
61
|
flexmock(KDE::LineEdit).should_receive(:new).once.with(Ruber::FilteredOutputWidget).and_return editor
|
62
62
|
ow = Ruber::FilteredOutputWidget.new
|
63
|
-
ow.layout.item_at_position(
|
63
|
+
ow.layout.item_at_position(2,0).widget.should be_the_same_as(editor)
|
64
64
|
end
|
65
65
|
|
66
66
|
it 'overrides the editor\'s keyReleasedEvent method so that it hides the editor itself if the ESC key (without modifiers) is pressed' do
|
67
67
|
ow = Ruber::FilteredOutputWidget.new
|
68
68
|
ed = ow.instance_variable_get(:@editor)
|
69
|
-
flexmock(ed).should_receive(:hide)
|
69
|
+
flexmock(ed).should_receive(:hide) #.once
|
70
70
|
ev = Qt::KeyEvent.new Qt::KeyEvent::KeyRelease, Qt::Key_Escape, 0
|
71
71
|
ed.send :keyReleaseEvent, ev
|
72
72
|
ev = Qt::KeyEvent.new Qt::KeyEvent::KeyRelease, Qt::Key_A, 0, 'A'
|
@@ -0,0 +1,190 @@
|
|
1
|
+
require './spec/common'
|
2
|
+
require 'ruber/ktexteditor_sugar'
|
3
|
+
|
4
|
+
describe KTextEditor::Cursor do
|
5
|
+
|
6
|
+
describe '#inspect' do
|
7
|
+
|
8
|
+
it 'returns a string containing the class, the object id and the line and column associated with the cursor' do
|
9
|
+
line = 12
|
10
|
+
col = 38
|
11
|
+
cur = KTextEditor::Cursor.new line, col
|
12
|
+
exp = "<KTextEditor::Cursor:#{cur.object_id} line=#{line} column=#{col}>"
|
13
|
+
cur.inspect.should == exp
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'returns a string containing the class, the object id and the string DISPOSED if the Cursor has been disposed' do
|
17
|
+
range = KTextEditor::Cursor.new 1,2
|
18
|
+
range.dispose
|
19
|
+
range.inspect.should == "<KTextEditor::Cursor:#{range.object_id} DISPOSED>"
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#==' do
|
26
|
+
|
27
|
+
it 'returns true if the argument is a Cursor with the same line and column' do
|
28
|
+
line = 10
|
29
|
+
col = 24
|
30
|
+
c1, c2 = 2.times.map{KTextEditor::Cursor.new line, col}
|
31
|
+
c1.should == c2
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'returns false if the argument is a Cursor with a different line or column number' do
|
35
|
+
cursor = KTextEditor::Cursor.new 10, 34
|
36
|
+
cursors =
|
37
|
+
[
|
38
|
+
KTextEditor::Cursor.new(10, 21),
|
39
|
+
KTextEditor::Cursor.new(2, 34),
|
40
|
+
KTextEditor::Cursor.new(1, 9)
|
41
|
+
]
|
42
|
+
cursors.each{|c| cursor.should_not == c}
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'returns false if the other object is not a Cursor' do
|
46
|
+
cursor = KTextEditor::Cursor.new(10, 34).should_not == "x"
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#dup' do
|
52
|
+
|
53
|
+
before do
|
54
|
+
@cur = KTextEditor::Cursor.new 23, 57
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'returns a copy of self' do
|
58
|
+
res = @cur.dup
|
59
|
+
res.should == @cur
|
60
|
+
res.should_not equal(@cur)
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'doesn\'t copy the frozen state of self' do
|
64
|
+
res = @cur.dup
|
65
|
+
res.should_not be_frozen
|
66
|
+
@cur.freeze
|
67
|
+
res = @cur.dup
|
68
|
+
res.should_not be_frozen
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
describe '#clone' do
|
74
|
+
|
75
|
+
before do
|
76
|
+
@cur = KTextEditor::Cursor.new 23, 57
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'returns a copy of self' do
|
80
|
+
res = @cur.clone
|
81
|
+
res.should == @cur
|
82
|
+
res.should_not equal(@cur)
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'copies the frozen state of self' do
|
86
|
+
res = @cur.clone
|
87
|
+
res.should_not be_frozen
|
88
|
+
@cur.freeze
|
89
|
+
res = @cur.clone
|
90
|
+
res.should be_frozen
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
describe KTextEditor::Range do
|
98
|
+
|
99
|
+
describe '#inspect' do
|
100
|
+
|
101
|
+
it 'returns a string containing the class, the object id and the starting and ending line and column' do
|
102
|
+
start_line = 12
|
103
|
+
start_col = 38
|
104
|
+
end_line = 15
|
105
|
+
end_col = 20
|
106
|
+
range = KTextEditor::Range.new start_line, start_col, end_line, end_col
|
107
|
+
exp = "<KTextEditor::Range:#{range.object_id} start=(#{start_line};#{start_col}) end=(#{end_line};#{end_col})>"
|
108
|
+
range.inspect.should == exp
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'returns a string containing the class, the object id and the string DISPOSED if the Range has been disposed' do
|
112
|
+
range = KTextEditor::Range.new 1,2,3,4
|
113
|
+
range.dispose
|
114
|
+
range.inspect.should == "<KTextEditor::Range:#{range.object_id} DISPOSED>"
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
describe '==' do
|
120
|
+
|
121
|
+
it 'returns true if the argument is a Range with the same start and end' do
|
122
|
+
r1 = KTextEditor::Range.new 12, 4, 13, 5
|
123
|
+
r2 = KTextEditor::Range.new 12, 4, 13, 5
|
124
|
+
r1.should == r2
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'returns false if the argument is not a Range' do
|
128
|
+
r = KTextEditor::Range.new 12, 4, 13, 5
|
129
|
+
r.should_not == 'x'
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'returns false if the argument is a range with different start or end' do
|
133
|
+
range = KTextEditor::Range.new 12, 4, 13, 5
|
134
|
+
ranges = [
|
135
|
+
KTextEditor::Range.new(11,4,13,5),
|
136
|
+
KTextEditor::Range.new(12,4,13,9),
|
137
|
+
KTextEditor::Range.new(13,2,15,6)
|
138
|
+
]
|
139
|
+
ranges.each{|r| r.should_not == range}
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
143
|
+
|
144
|
+
describe '#dup' do
|
145
|
+
|
146
|
+
before do
|
147
|
+
@range = KTextEditor::Range.new 23, 57, 46, 23
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'returns a copy of self' do
|
151
|
+
res = @range.dup
|
152
|
+
res.should == @range
|
153
|
+
res.should_not equal(@range)
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'doesn\'t copy the frozen state of self' do
|
157
|
+
res = @range.dup
|
158
|
+
res.should_not be_frozen
|
159
|
+
@range.freeze
|
160
|
+
res = @range.dup
|
161
|
+
res.should_not be_frozen
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
166
|
+
describe '#clone' do
|
167
|
+
|
168
|
+
before do
|
169
|
+
@range = KTextEditor::Range.new 23, 57, 46, 23
|
170
|
+
end
|
171
|
+
|
172
|
+
it 'returns a copy of self' do
|
173
|
+
res = @range.clone
|
174
|
+
res.should == @range
|
175
|
+
res.should_not equal(@range)
|
176
|
+
end
|
177
|
+
|
178
|
+
it 'copies the frozen state of self' do
|
179
|
+
res = @range.clone
|
180
|
+
res.should_not be_frozen
|
181
|
+
@range.freeze
|
182
|
+
res = @range.clone
|
183
|
+
res.should be_frozen
|
184
|
+
end
|
185
|
+
|
186
|
+
end
|
187
|
+
|
188
|
+
|
189
|
+
|
190
|
+
end
|
data/spec/output_widget_spec.rb
CHANGED
@@ -152,9 +152,17 @@ describe Ruber::OutputWidget do
|
|
152
152
|
w.view.parent.should equal(w)
|
153
153
|
end
|
154
154
|
|
155
|
-
it 'inserts the view in the layout at position (
|
155
|
+
it 'inserts the view in the layout at position (1,0)' do
|
156
156
|
w = Ruber::OutputWidget.new
|
157
|
-
w.layout.item_at_position(
|
157
|
+
w.layout.item_at_position(1,0).widget.should be_a(Ruber::OutputWidget::ListView)
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'has a checkable Qt::ToolButton in the first line, aligned to the right' do
|
161
|
+
w = Ruber::OutputWidget.new
|
162
|
+
it = w.layout.item_at_position(0,0)
|
163
|
+
it.widget.should be_a(Qt::ToolButton)
|
164
|
+
it.alignment.should == Qt::AlignRight | Qt::AlignVCenter
|
165
|
+
it.widget.should be_checkable
|
158
166
|
end
|
159
167
|
|
160
168
|
it 'sets the selection mode to Extended' do
|
@@ -587,6 +595,14 @@ describe Ruber::OutputWidget do
|
|
587
595
|
@ow.send :do_auto_scroll, Qt::ModelIndex.new, 1, 3
|
588
596
|
end
|
589
597
|
|
598
|
+
it 'does nothing if the slider is not at the maximum value' do
|
599
|
+
flexmock(@ow).should_receive(:scroll_to).never
|
600
|
+
scroll = @ow.view.vertical_scroll_bar
|
601
|
+
scroll.maximum = 100
|
602
|
+
scroll.value = 30
|
603
|
+
@ow.send :do_auto_scroll, Qt::ModelIndex.new, 1, 3
|
604
|
+
end
|
605
|
+
|
590
606
|
end
|
591
607
|
|
592
608
|
describe '#with_auto_scrolling' do
|
@@ -885,6 +901,25 @@ describe Ruber::OutputWidget do
|
|
885
901
|
|
886
902
|
end
|
887
903
|
|
904
|
+
describe '#pinned_down?' do
|
905
|
+
|
906
|
+
before do
|
907
|
+
@ow = Ruber::OutputWidget.new
|
908
|
+
end
|
909
|
+
|
910
|
+
it 'returns true if the pinned tool button is on' do
|
911
|
+
@ow.instance_variable_get(:@pin_button).checked = true
|
912
|
+
@ow.should be_pinned_down
|
913
|
+
end
|
914
|
+
|
915
|
+
it 'returns false if the pinned tool button is off' do
|
916
|
+
@ow.instance_variable_get(:@pin_button).checked = false
|
917
|
+
@ow.should_not be_pinned_down
|
918
|
+
end
|
919
|
+
|
920
|
+
end
|
921
|
+
|
922
|
+
|
888
923
|
describe '#maybe_open_file' do
|
889
924
|
|
890
925
|
before do
|
@@ -897,7 +932,9 @@ describe Ruber::OutputWidget do
|
|
897
932
|
@mod = @ow.model
|
898
933
|
@mod.append_row Qt::StandardItem.new ''
|
899
934
|
@mw = flexmock{|m| m.should_ignore_missing}
|
935
|
+
@cfg = flexmock{|m| m.should_receive(:[]).with(:general, :tool_open_files).and_return(:new_tab).by_default}
|
900
936
|
flexmock(Ruber).should_receive(:[]).with(:main_window).and_return(@mw).by_default
|
937
|
+
flexmock(Ruber).should_receive(:[]).with(:config).and_return(@cfg).by_default
|
901
938
|
end
|
902
939
|
|
903
940
|
after do
|
@@ -908,31 +945,56 @@ describe Ruber::OutputWidget do
|
|
908
945
|
flexmock(@ow).should_receive(:find_filename_in_index).once.with @mod.index(0,0)
|
909
946
|
@ow.send :maybe_open_file, @mod.index(0,0)
|
910
947
|
end
|
911
|
-
|
948
|
+
|
912
949
|
describe ', when the find_filename_in_index methods returns an array' do
|
913
950
|
|
914
951
|
before do
|
915
952
|
flexmock(@ow).should_receive(:find_filename_in_index).with(@mod.index(0,0)).and_return([__FILE__, 10]).by_default
|
916
953
|
end
|
917
954
|
|
918
|
-
|
919
|
-
|
955
|
+
context 'when the Meta key is not pressed' do
|
956
|
+
|
957
|
+
it 'calls the display_document method of the main window using the hints returned by hints but with the :existing key set to always' do
|
958
|
+
hints = {:existing => :never, :new => :current, :split => :horizontal}
|
959
|
+
flexmock(@ow).should_receive(:hints).and_return(hints)
|
960
|
+
exp = hints.merge :existing => :always, :line => 9
|
961
|
+
@mw.should_receive(:display_document).once.with(__FILE__, exp)
|
962
|
+
@ow.send :maybe_open_file, @mod.index(0,0)
|
963
|
+
end
|
964
|
+
|
965
|
+
end
|
966
|
+
|
967
|
+
context 'when the Meta key is pressed' do
|
968
|
+
it 'calls the display_document method of the main window using the hints returned by hints but with the :existing key set to :never' do
|
969
|
+
flexmock(Ruber::Application).should_receive(:keyboard_modifiers).and_return(Qt::MetaModifier)
|
970
|
+
hints = {:existing => :always, :new => :current, :split => :horizontal}
|
971
|
+
flexmock(@ow).should_receive(:hints).and_return(hints)
|
972
|
+
exp = hints.merge :existing => :never, :line => 9
|
973
|
+
@mw.should_receive(:display_document).once.with(__FILE__, exp)
|
974
|
+
@ow.send :maybe_open_file, @mod.index(0,0)
|
975
|
+
end
|
976
|
+
|
977
|
+
end
|
978
|
+
|
979
|
+
it 'decreases line numbers by one' do
|
980
|
+
@mw.should_receive(:display_document).once.with(__FILE__, FlexMock.on{|h| h[:line].should == 9})
|
920
981
|
@ow.send :maybe_open_file, @mod.index(0,0)
|
921
982
|
end
|
922
983
|
|
923
|
-
it 'doesn\'t
|
924
|
-
@
|
925
|
-
@
|
984
|
+
it 'doesn\'t decrease the line number if it\'s 0' do
|
985
|
+
flexmock(@ow).should_receive(:find_filename_in_index).with(@mod.index(0,0)).and_return([__FILE__, 0])
|
986
|
+
@mw.should_receive(:display_document).once.with(__FILE__, FlexMock.on{|h| h[:line].should == 0})
|
926
987
|
@ow.send :maybe_open_file, @mod.index(0,0)
|
927
988
|
end
|
928
989
|
|
929
|
-
it 'hides the tool widget if
|
990
|
+
it 'hides the tool widget if #pinned_down? returns false' do
|
991
|
+
flexmock(@ow).should_receive(:pinned_down?).and_return false
|
930
992
|
@mw.should_receive(:hide_tool).with(@ow).once
|
931
993
|
@ow.send :maybe_open_file, @mod.index(0,0)
|
932
994
|
end
|
933
995
|
|
934
|
-
it 'doesn\'t hide the tool widget if
|
935
|
-
flexmock(
|
996
|
+
it 'doesn\'t hide the tool widget if #pinned_down? returns true' do
|
997
|
+
flexmock(@ow).should_receive(:pinned_down?).and_return true
|
936
998
|
@mw.should_receive(:hide_tool).with(@ow).never
|
937
999
|
@ow.send :maybe_open_file, @mod.index(0,0)
|
938
1000
|
end
|
@@ -972,6 +1034,53 @@ describe Ruber::OutputWidget do
|
|
972
1034
|
|
973
1035
|
end
|
974
1036
|
|
1037
|
+
describe '#hints' do
|
1038
|
+
|
1039
|
+
before do
|
1040
|
+
@ow = Ruber::OutputWidget.new
|
1041
|
+
@cfg = flexmock{|m| m.should_ignore_missing}
|
1042
|
+
flexmock(Ruber).should_receive(:[]).with(:config).and_return(@cfg).by_default
|
1043
|
+
end
|
1044
|
+
|
1045
|
+
context 'when the general/tool_open_files setting is :split_horizontally' do
|
1046
|
+
|
1047
|
+
it 'returns {:new => :current_tab, :split => :horizontal}' do
|
1048
|
+
@cfg.should_receive(:[]).with(:general, :tool_open_files).and_return(:split_horizontally)
|
1049
|
+
@ow.send(:hints).should == {:new => :current_tab, :split => :horizontal}
|
1050
|
+
end
|
1051
|
+
|
1052
|
+
end
|
1053
|
+
|
1054
|
+
context 'when the general/tool_open_files setting is :split_vertically' do
|
1055
|
+
|
1056
|
+
it 'returns {:new => :current_tab, :split => :vertical}' do
|
1057
|
+
@cfg.should_receive(:[]).with(:general, :tool_open_files).and_return(:split_vertically)
|
1058
|
+
@ow.send(:hints).should == {:new => :current_tab, :split => :vertical}
|
1059
|
+
end
|
1060
|
+
|
1061
|
+
end
|
1062
|
+
|
1063
|
+
context 'when the general/tool_open_files setting is :new_tab' do
|
1064
|
+
|
1065
|
+
it 'returns {:new => :new_tab}' do
|
1066
|
+
@cfg.should_receive(:[]).with(:general, :tool_open_files).and_return(:new_tab)
|
1067
|
+
@ow.send(:hints).should == {:new => :new_tab}
|
1068
|
+
end
|
1069
|
+
|
1070
|
+
end
|
1071
|
+
|
1072
|
+
context 'when the general/tool_open_files setting contains an invalid value' do
|
1073
|
+
|
1074
|
+
it 'returns {:new => :new_tab}' do
|
1075
|
+
@cfg.should_receive(:[]).with(:general, :tool_open_files).and_return(:xyz)
|
1076
|
+
@ow.send(:hints).should == {:new => :new_tab}
|
1077
|
+
end
|
1078
|
+
|
1079
|
+
end
|
1080
|
+
|
1081
|
+
end
|
1082
|
+
|
1083
|
+
|
975
1084
|
describe '#find_filename_in_index' do
|
976
1085
|
|
977
1086
|
before do
|