ruber 0.0.5 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +25 -0
- data/bin/ruber +0 -0
- data/data/share/apps/ruber/ruberui.rc +15 -1
- data/data/share/icons/{ruber.png → ruber-old.pgn} +0 -0
- data/lib/ruber/application/application.rb +216 -73
- data/lib/ruber/application/plugin.yaml +2 -2
- data/lib/ruber/document_project.rb +25 -5
- data/lib/ruber/documents/document_list.rb +11 -15
- data/lib/ruber/editor/document.rb +106 -50
- data/lib/ruber/editor/editor_view.rb +4 -2
- data/lib/ruber/external_program_plugin.rb +8 -0
- data/lib/ruber/kde_config_option_backend.rb +12 -4
- data/lib/ruber/kde_sugar.rb +35 -1
- data/lib/ruber/main_window/choose_plugins_dlg.rb +10 -10
- data/lib/ruber/main_window/hint_solver.rb +263 -0
- data/lib/ruber/main_window/main_window.rb +462 -206
- data/lib/ruber/main_window/main_window_actions.rb +228 -62
- data/lib/ruber/main_window/main_window_internal.rb +169 -115
- data/lib/ruber/main_window/plugin.yaml +13 -3
- data/lib/ruber/main_window/save_modified_files_dlg.rb +1 -1
- data/lib/ruber/main_window/ui/choose_plugins_widget.rb +1 -1
- data/lib/ruber/main_window/ui/main_window_settings_widget.rb +1 -1
- data/lib/ruber/main_window/ui/new_project_widget.rb +1 -1
- data/lib/ruber/main_window/ui/open_file_in_project_dlg.rb +1 -1
- data/lib/ruber/main_window/ui/output_color_widget.rb +1 -1
- data/lib/ruber/main_window/ui/workspace_settings_widget.rb +51 -0
- data/lib/ruber/main_window/ui/workspace_settings_widget.ui +28 -0
- data/lib/ruber/main_window/view_manager.rb +418 -0
- data/lib/ruber/main_window/workspace.png +0 -0
- data/lib/ruber/output_widget.rb +43 -37
- data/lib/ruber/pane.rb +621 -0
- data/lib/ruber/plugin_specification_reader.rb +8 -1
- data/lib/ruber/projects/project_files_list.rb +6 -0
- data/lib/ruber/projects/ui/project_files_rule_chooser_widget.rb +1 -1
- data/lib/ruber/projects/ui/project_files_widget.rb +1 -1
- data/lib/ruber/qt_sugar.rb +94 -4
- data/lib/ruber/utils.rb +16 -7
- data/lib/ruber/version.rb +2 -2
- data/plugins/autosave/autosave.rb +62 -1
- data/plugins/autosave/plugin.yaml +1 -0
- data/plugins/autosave/ui/autosave_config_widget.rb +37 -14
- data/plugins/autosave/ui/autosave_config_widget.ui +62 -12
- data/plugins/find_in_files/find_in_files_widgets.rb +1 -3
- data/plugins/find_in_files/ui/config_widget.rb +1 -1
- data/plugins/find_in_files/ui/find_in_files_widget.rb +1 -1
- data/plugins/rake/plugin.yaml +1 -1
- data/plugins/rake/ui/add_quick_task_widget.rb +1 -1
- data/plugins/rake/ui/choose_task_widget.rb +1 -1
- data/plugins/rake/ui/config_widget.rb +1 -1
- data/plugins/rake/ui/project_widget.rb +1 -1
- data/plugins/rspec/rspec.rb +14 -22
- data/plugins/rspec/ruber_rspec_formatter.rb +4 -1
- data/plugins/rspec/ui/rspec_project_widget.rb +1 -1
- data/plugins/ruby_development/plugin.yaml +7 -2
- data/plugins/ruby_development/ruby_development.rb +134 -13
- data/plugins/ruby_development/ui/config_widget.rb +66 -0
- data/plugins/ruby_development/ui/config_widget.ui +58 -0
- data/plugins/ruby_development/ui/project_widget.rb +1 -1
- data/plugins/ruby_runner/plugin.yaml +2 -2
- data/plugins/ruby_runner/ruby_runner.rb +15 -3
- data/plugins/ruby_runner/ui/config_widget.rb +1 -1
- data/plugins/ruby_runner/ui/project_widget.rb +1 -1
- data/plugins/ruby_runner/ui/ruby_runnner_plugin_option_widget.rb +1 -1
- data/plugins/state/plugin.yaml +6 -2
- data/plugins/state/state.rb +305 -81
- data/plugins/state/ui/config_widget.rb +1 -1
- data/spec/common.rb +11 -3
- data/spec/document_list_spec.rb +8 -8
- data/spec/document_project_spec.rb +98 -25
- data/spec/document_spec.rb +178 -152
- data/spec/editor_view_spec.rb +26 -5
- data/spec/framework.rb +5 -0
- data/spec/hint_solver_spec.rb +450 -0
- data/spec/kde_sugar_spec.rb +73 -6
- data/spec/output_widget_spec.rb +172 -156
- data/spec/pane_spec.rb +1165 -0
- data/spec/plugin_specification_reader_spec.rb +37 -1
- data/spec/project_files_list_spec.rb +30 -20
- data/spec/qt_sugar_spec.rb +269 -0
- data/spec/state_spec.rb +566 -353
- data/spec/utils_spec.rb +1 -1
- data/spec/view_manager_spec.rb +71 -0
- metadata +16 -4
data/spec/state_spec.rb
CHANGED
@@ -1,36 +1,46 @@
|
|
1
|
-
require 'spec/
|
1
|
+
require './spec/framework'
|
2
|
+
require './spec/common'
|
2
3
|
|
3
4
|
require 'tempfile'
|
4
5
|
require 'fileutils'
|
5
6
|
|
6
7
|
require 'ruber/plugin_specification'
|
7
8
|
require 'ruber/editor/document'
|
9
|
+
require 'ruber/pane'
|
8
10
|
|
9
11
|
require 'plugins/state/state'
|
10
12
|
|
11
13
|
describe Ruber::State::Plugin do
|
12
14
|
|
13
15
|
before do
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
16
|
+
# #Needed because the Qt::Object connect method doesn't like @components not being a
|
17
|
+
# #Qt::Object
|
18
|
+
# class Ruber::State::Plugin
|
19
|
+
# def connect *args
|
20
|
+
# end
|
21
|
+
# end
|
22
|
+
# @components = flexmock('components'){|m| m.should_ignore_missing}
|
23
|
+
# @config = flexmock('config'){|m| m.should_ignore_missing}
|
24
|
+
# flexmock(Ruber).should_receive(:[]).with(:components).and_return(@components).by_default
|
25
|
+
# flexmock(Ruber).should_receive(:[]).with(:app).and_return(KDE::Application.instance).by_default
|
26
|
+
# flexmock(Ruber).should_receive(:[]).with(:config).and_return(@config).by_default
|
27
|
+
Ruber[:documents].close_all(false)
|
28
|
+
Ruber[:components].load_plugin 'plugins/state/'
|
29
|
+
@plug = Ruber[:components][:state]
|
30
|
+
# data = YAML.load('plugins/state/plugin.yaml')
|
31
|
+
# psf = Ruber::PluginSpecification.full data
|
32
|
+
# @plug = Ruber::State::Plugin.new psf
|
27
33
|
end
|
28
34
|
|
29
35
|
after do
|
30
|
-
|
31
|
-
remove_method :connect rescue nil
|
32
|
-
end
|
36
|
+
Ruber[:components].unload_plugin(:state)
|
33
37
|
end
|
38
|
+
#
|
39
|
+
# after do
|
40
|
+
# class Ruber::State::Plugin
|
41
|
+
# remove_method :connect rescue nil
|
42
|
+
# end
|
43
|
+
# end
|
34
44
|
|
35
45
|
it 'inherits Ruber::Plugin' do
|
36
46
|
Ruber::State::Plugin.ancestors.should include(Ruber::Plugin)
|
@@ -52,58 +62,45 @@ describe Ruber::State::Plugin do
|
|
52
62
|
|
53
63
|
describe '#delayed_initialize' do
|
54
64
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
flexmock(Ruber).should_receive(:[]).with(:projects).and_return(@projects).by_default
|
61
|
-
end
|
65
|
+
# before do
|
66
|
+
# @documents = flexmock('documents')
|
67
|
+
# @projects = flexmock('projects')
|
68
|
+
# flexmock(KDE::Application.instance).should_receive(:starting?).and_return(true).by_default
|
69
|
+
# end
|
62
70
|
|
63
71
|
it 'calls the restore_last_state method if there\'s no open project and the only open document is pristine' do
|
64
|
-
|
65
|
-
@documents.should_receive(:to_a).once.and_return [doc]
|
66
|
-
@documents.should_receive(:[]).with(0).once.and_return doc
|
67
|
-
@projects.should_receive(:to_a).once.and_return []
|
72
|
+
Ruber[:documents].new_document
|
68
73
|
flexmock(@plug).should_receive(:restore_last_state).once
|
69
74
|
@plug.send :delayed_initialize
|
70
75
|
end
|
71
76
|
|
72
77
|
it 'doesn\'t call the restore_last_state method if there are open projects' do
|
73
78
|
prj = flexmock('project')
|
74
|
-
|
79
|
+
flexmock(Ruber[:projects]).should_receive(:to_a).once.and_return [prj]
|
75
80
|
flexmock(@plug).should_receive(:restore_last_state).never
|
76
81
|
@plug.send :delayed_initialize
|
77
82
|
end
|
78
83
|
|
79
84
|
it 'doesn\'t call the restore_last_state method if there is more than one open document' do
|
80
|
-
|
81
|
-
@projects.should_receive(:to_a).once.and_return []
|
85
|
+
2.times{Ruber[:documents].new_document}
|
82
86
|
flexmock(@plug).should_receive(:restore_last_state).never
|
83
87
|
@plug.send :delayed_initialize
|
84
88
|
end
|
85
89
|
|
86
90
|
it 'doesn\'t call the restore_last_state method if there aren\'t open documents' do
|
87
|
-
@documents.should_receive(:to_a).once.and_return []
|
88
|
-
@projects.should_receive(:to_a).once.and_return []
|
89
91
|
flexmock(@plug).should_receive(:restore_last_state).never
|
90
92
|
@plug.send :delayed_initialize
|
91
93
|
end
|
92
94
|
|
93
95
|
it 'doesn\'t call the restore_last_state method if the only open document isn\'t pristine' do
|
94
|
-
doc =
|
95
|
-
|
96
|
-
@documents.should_receive(:[]).with(0).once.and_return doc
|
97
|
-
@projects.should_receive(:to_a).once.and_return []
|
96
|
+
doc = Ruber[:documents].new_document
|
97
|
+
doc.text = 'xyz'
|
98
98
|
flexmock(@plug).should_receive(:restore_last_state).never
|
99
99
|
@plug.send :delayed_initialize
|
100
100
|
end
|
101
101
|
|
102
102
|
it 'does nothing if the application is already running' do
|
103
|
-
doc =
|
104
|
-
@documents.should_receive(:to_a).and_return [doc]
|
105
|
-
@documents.should_receive(:[]).with(0).and_return doc
|
106
|
-
@projects.should_receive(:to_a).and_return []
|
103
|
+
doc = Ruber[:documents].new_document
|
107
104
|
flexmock(KDE::Application.instance).should_receive(:starting?).and_return false
|
108
105
|
flexmock(@plug).should_receive(:restore_last_state).never
|
109
106
|
@plug.send :delayed_initialize
|
@@ -113,39 +110,24 @@ describe Ruber::State::Plugin do
|
|
113
110
|
|
114
111
|
describe '#gather_settings' do
|
115
112
|
|
116
|
-
before do
|
117
|
-
@projects = flexmock('projects') do |m|
|
118
|
-
m.should_receive(:projects).and_return([]).by_default
|
119
|
-
m.should_receive(:current).and_return(nil).by_default
|
120
|
-
end
|
121
|
-
@documents = flexmock('documents') do |m|
|
122
|
-
m.should_receive(:documents).and_return([]).by_default
|
123
|
-
m.should_receive(:current).and_return(nil).by_default
|
124
|
-
end
|
125
|
-
@mw = flexmock('main window'){|m| m.should_ignore_missing}
|
126
|
-
flexmock(Ruber).should_receive(:[]).with(:projects).and_return(@projects).by_default
|
127
|
-
flexmock(Ruber).should_receive(:[]).with(:docs).and_return(@documents).by_default
|
128
|
-
flexmock(Ruber).should_receive(:[]).with(:main_window).and_return(@mw).by_default
|
129
|
-
end
|
130
|
-
|
131
113
|
it 'stores a list with the project file of each open project under the :open_projects key' do
|
132
114
|
prjs = 5.times.map{|i| flexmock(i.to_s){|m| m.should_receive(:project_file).and_return i.to_s}}
|
133
|
-
|
134
|
-
|
115
|
+
flexmock(Ruber[:projects]).should_receive(:projects).once.and_return(prjs)
|
116
|
+
flexmock(Ruber[:projects]).should_receive(:current).once.and_return(nil)
|
135
117
|
@plug.send(:gather_settings).should have_entries(:open_projects => (0...5).map(&:to_s))
|
136
118
|
end
|
137
119
|
|
138
120
|
it 'puts the file corresponding to the open project at the beginning of the :open_projects entry' do
|
139
121
|
prjs = 5.times.map{|i| flexmock(i.to_s, :project_file => i.to_s)}
|
140
|
-
|
141
|
-
|
122
|
+
flexmock(Ruber[:projects]).should_receive(:projects).once.and_return(prjs)
|
123
|
+
flexmock(Ruber[:projects]).should_receive(:current).once.and_return prjs[2]
|
142
124
|
@plug.send(:gather_settings).should have_entries(:open_projects => %w[2 0 1 3 4])
|
143
125
|
end
|
144
126
|
|
145
127
|
it 'stores the project files in an arbitrary order if there\'s no active project' do
|
146
128
|
prjs = 5.times.map{|i| flexmock(i.to_s){|m| m.should_receive(:project_file).and_return i.to_s}}
|
147
|
-
|
148
|
-
|
129
|
+
flexmock(Ruber[:projects]).should_receive(:projects).once.and_return(prjs)
|
130
|
+
flexmock(Ruber[:projects]).should_receive(:current).once.and_return nil
|
149
131
|
@plug.send(:gather_settings).should have_entries(:open_projects => (0...5).map(&:to_s))
|
150
132
|
end
|
151
133
|
|
@@ -153,87 +135,209 @@ describe Ruber::State::Plugin do
|
|
153
135
|
@plug.send(:gather_settings).should have_entries(:open_projects => [])
|
154
136
|
end
|
155
137
|
|
156
|
-
it 'stores a list of the
|
157
|
-
docs = 5.times.map{|i| flexmock(i.to_s){|m| m.should_receive(:
|
158
|
-
|
159
|
-
|
138
|
+
it 'stores a list of the URLs of the files associated with all open documents under the :open_files key' do
|
139
|
+
docs = 5.times.map{|i| flexmock(i.to_s, :has_file? => true, :view => flexmock){|m| m.should_receive(:url).and_return KDE::Url.new("file:///xyz/file #{i}")}}
|
140
|
+
flexmock(Ruber[:documents]).should_receive(:documents).once.and_return(docs)
|
141
|
+
exp = [
|
142
|
+
'file:///xyz/file%200',
|
143
|
+
'file:///xyz/file%201',
|
144
|
+
'file:///xyz/file%202',
|
145
|
+
'file:///xyz/file%203',
|
146
|
+
'file:///xyz/file%204',
|
147
|
+
]
|
148
|
+
@plug.send(:gather_settings).should have_entries(:open_documents => exp)
|
160
149
|
end
|
161
150
|
|
162
|
-
it '
|
151
|
+
it 'stores nil in place of documents not associated with files' do
|
163
152
|
docs = 5.times.map do |i|
|
164
|
-
flexmock(i.to_s) do |m|
|
165
|
-
m.should_receive(:
|
153
|
+
flexmock(i.to_s, :view => flexmock) do |m|
|
154
|
+
m.should_receive(:url).and_return(i % 2 == 0 ? KDE::Url.new("file:///xyz/file #{i}") : KDE::Url.new)
|
155
|
+
m.should_receive(:has_file?).and_return(i % 2 == 0)
|
166
156
|
end
|
167
157
|
end
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
@plug.send(:gather_settings).should have_entries(:open_documents =>
|
158
|
+
flexmock(Ruber[:documents]).should_receive(:documents).once.and_return(docs)
|
159
|
+
exp = [
|
160
|
+
'file:///xyz/file%200',
|
161
|
+
nil,
|
162
|
+
'file:///xyz/file%202',
|
163
|
+
nil,
|
164
|
+
'file:///xyz/file%204',
|
165
|
+
]
|
166
|
+
@plug.send(:gather_settings).should have_entries(:open_documents => exp)
|
167
|
+
end
|
168
|
+
|
169
|
+
it 'stores an empty array under the :open_files key if there are no open documents' do
|
177
170
|
@plug.send(:gather_settings).should have_entries(:open_documents => [])
|
178
171
|
end
|
179
172
|
|
180
|
-
it 'stores
|
181
|
-
docs =
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
173
|
+
it 'stores a tree of the open editors for each tab under the tabs entry' do
|
174
|
+
docs = [nil, __FILE__, File.join(File.dirname(__FILE__), 'common.rb'), nil].map! do |f|
|
175
|
+
f ? Ruber[:documents].document(f) : Ruber[:documents].new_document
|
176
|
+
end
|
177
|
+
views = [
|
178
|
+
docs[1].create_view,
|
179
|
+
docs[0].create_view,
|
180
|
+
docs[3].create_view,
|
181
|
+
docs[2].create_view,
|
182
|
+
docs[1].create_view,
|
183
|
+
docs[0].create_view
|
184
|
+
]
|
185
|
+
tab1 = Ruber::Pane.new views[0]
|
186
|
+
tab1.split views[0], views[1], Qt::Vertical
|
187
|
+
tab1.split views[0], views[2], Qt::Horizontal
|
188
|
+
tab2 = Ruber::Pane.new views[3]
|
189
|
+
tab2.split views[3], views[4], Qt::Horizontal
|
190
|
+
tab3 = Ruber::Pane.new views[5]
|
191
|
+
flexmock(Ruber[:main_window]).should_receive(:tabs).once.and_return [tab1, tab2, tab3]
|
192
|
+
exp = [
|
193
|
+
[Qt::Vertical, [Qt::Horizontal, 'file://' + __FILE__, 1], 0],
|
194
|
+
[Qt::Horizontal, 'file://' + File.join(File.dirname(__FILE__), 'common.rb'), 'file://' + __FILE__],
|
195
|
+
[0]
|
196
|
+
]
|
197
|
+
@plug.send(:gather_settings)[:tabs].should == exp
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'uses arrays with a single element in the :tabs entry to represent tabs with a single view' do
|
201
|
+
docs = [__FILE__, nil].map{|f| f ? Ruber[:documents].document(f) : Ruber[:documents].new_document}
|
202
|
+
views = docs.reverse.map{|d| d.create_view}
|
203
|
+
tabs = views.map{|v| Ruber::Pane.new v}
|
204
|
+
flexmock(Ruber[:main_window]).should_receive(:tabs).once.and_return tabs
|
205
|
+
exp = [[0], ['file://' + __FILE__]]
|
206
|
+
@plug.send(:gather_settings)[:tabs].should == exp
|
207
|
+
end
|
208
|
+
|
209
|
+
it 'stores an empty array under the tabs entry if there aren\'t open editors' do
|
210
|
+
docs = [
|
211
|
+
Ruber[:documents].new_document,
|
212
|
+
Ruber[:documents].document(__FILE__),
|
213
|
+
]
|
214
|
+
@plug.send(:gather_settings)[:tabs].should == []
|
215
|
+
end
|
216
|
+
|
217
|
+
it 'stores the active view as an array of integers referring to the tabs entry in the active_view entry' do
|
218
|
+
docs = [
|
219
|
+
Ruber[:documents].new_document,
|
220
|
+
Ruber[:documents].document(__FILE__),
|
221
|
+
Ruber[:documents].document(File.join(File.dirname(__FILE__), 'common.rb')),
|
222
|
+
Ruber[:documents].new_document,
|
223
|
+
]
|
224
|
+
views = [
|
225
|
+
docs[1].create_view,
|
226
|
+
docs[0].create_view,
|
227
|
+
docs[3].create_view,
|
228
|
+
docs[2].create_view,
|
229
|
+
docs[1].create_view,
|
230
|
+
docs[0].create_view
|
231
|
+
]
|
232
|
+
tab1 = Ruber::Pane.new views[0]
|
233
|
+
tab1.split views[0], views[1], Qt::Vertical
|
234
|
+
tab1.split views[0], views[2], Qt::Horizontal
|
235
|
+
tab2 = Ruber::Pane.new views[3]
|
236
|
+
tab2.split views[3], views[4], Qt::Horizontal
|
237
|
+
tab3 = Ruber::Pane.new views[5]
|
238
|
+
flexmock(Ruber[:main_window]).should_receive(:tabs).once.and_return [tab1, tab2, tab3]
|
239
|
+
exp = [
|
240
|
+
[Qt::Vertical, [Qt::Horizontal, 'file://' + __FILE__, 1], 0],
|
241
|
+
[Qt::Horizontal, 'file://' + File.join(File.dirname(__FILE__), 'common.rb'), 'file://' + __FILE__],
|
242
|
+
[0]
|
243
|
+
]
|
244
|
+
flexmock(Ruber[:main_window]).should_receive(:active_editor).and_return(views[2])
|
245
|
+
flexmock(Ruber[:main_window]).should_receive(:tab).with(views[2]).and_return tab1
|
246
|
+
@plug.send(:gather_settings)[:active_view].should == [0,1]
|
247
|
+
end
|
248
|
+
|
249
|
+
it 'sets the active_view entry to nil if there isn\'t an active editor' do
|
250
|
+
docs = [
|
251
|
+
Ruber[:documents].new_document,
|
252
|
+
Ruber[:documents].document(__FILE__),
|
253
|
+
]
|
254
|
+
@plug.send(:gather_settings)[:active_view].should be_nil
|
255
|
+
end
|
256
|
+
|
257
|
+
it 'stores the cursor position for each view in each tab in the cursor_positions entry' do
|
258
|
+
docs = [
|
259
|
+
Ruber[:documents].new_document,
|
260
|
+
Ruber[:documents].document(__FILE__),
|
261
|
+
Ruber[:documents].document(File.join(File.dirname(__FILE__), 'common.rb')),
|
262
|
+
Ruber[:documents].new_document,
|
263
|
+
]
|
264
|
+
views = [
|
265
|
+
docs[1].create_view,
|
266
|
+
docs[0].create_view,
|
267
|
+
docs[3].create_view,
|
268
|
+
docs[2].create_view,
|
269
|
+
docs[1].create_view,
|
270
|
+
docs[0].create_view
|
271
|
+
]
|
272
|
+
tab1 = Ruber::Pane.new views[0]
|
273
|
+
tab1.split views[0], views[1], Qt::Vertical
|
274
|
+
tab1.split views[1], views[2], Qt::Horizontal
|
275
|
+
tab2 = Ruber::Pane.new views[3]
|
276
|
+
tab2.split views[3], views[4], Qt::Horizontal
|
277
|
+
tab3 = Ruber::Pane.new views[5]
|
278
|
+
cursor_positions = [
|
279
|
+
[[5, 1], [95,102], [1, 4]],
|
280
|
+
[[0,0], [45,93]],
|
281
|
+
[[12,42]]
|
282
|
+
]
|
283
|
+
i = 0
|
284
|
+
cursor_positions.each do |t|
|
285
|
+
t.each do |pos|
|
286
|
+
flexmock(views[i]).should_receive(:cursor_position).and_return(KTextEditor::Cursor.new(*pos))
|
287
|
+
i += 1
|
288
|
+
end
|
289
|
+
end
|
290
|
+
flexmock(Ruber[:main_window]).should_receive(:tabs).once.and_return [tab1, tab2, tab3]
|
291
|
+
@plug.send(:gather_settings)[:cursor_positions].should == cursor_positions
|
196
292
|
end
|
197
|
-
|
293
|
+
|
198
294
|
end
|
199
295
|
|
200
296
|
describe '#save_settings' do
|
201
297
|
|
202
298
|
it 'stores the value corresponding to the :open_projects key in the hash returned by gather_settings in the state/open_projects setting' do
|
203
299
|
flexmock(@plug).should_receive(:gather_settings).once.and_return(:open_projects => %w[x y z])
|
204
|
-
|
205
|
-
|
300
|
+
flexmock(Ruber[:config]).should_receive(:[]=).with(:state, :open_projects, %w[x y z]).once
|
301
|
+
flexmock(Ruber[:config]).should_receive(:[]=)
|
206
302
|
@plug.save_settings
|
207
303
|
end
|
208
304
|
|
209
305
|
it 'stores the value corresponding to the :open_documents key in the hash returned by gather_settings in the state/open_documents setting' do
|
210
306
|
flexmock(@plug).should_receive(:gather_settings).once.and_return(:open_documents => %w[x y z])
|
211
|
-
|
212
|
-
|
307
|
+
flexmock(Ruber[:config]).should_receive(:[]=).with(:state, :open_documents, %w[x y z]).once
|
308
|
+
flexmock(Ruber[:config]).should_receive(:[]=)
|
213
309
|
@plug.save_settings
|
214
310
|
end
|
215
311
|
|
216
|
-
it 'stores the value corresponding to the :
|
217
|
-
flexmock(@plug).should_receive(:gather_settings).once.and_return(:
|
218
|
-
|
219
|
-
|
312
|
+
it 'stores the value corresponding to the :active_view key in the hash returned by gather_settings in the state/active_editor setting' do
|
313
|
+
flexmock(@plug).should_receive(:gather_settings).once.and_return(:active_view => [1, 2])
|
314
|
+
flexmock(Ruber[:config]).should_receive(:[]=).with(:state, :active_view, [1,2]).once
|
315
|
+
flexmock(Ruber[:config]).should_receive(:[]=)
|
220
316
|
@plug.save_settings
|
221
317
|
end
|
222
318
|
|
319
|
+
it 'stores the value corresponding to the :tabs key of the has returned by gather_settings in the state/tabs setting' do
|
320
|
+
flexmock(@plug).should_receive(:gather_settings).once.and_return(:tabs => [Qt::Horizontal, 'file://'+__FILE__, 0])
|
321
|
+
flexmock(Ruber[:config]).should_receive(:[]=).with(:state, :tabs, [Qt::Horizontal, 'file://'+__FILE__, 0]).once
|
322
|
+
flexmock(Ruber[:config]).should_receive(:[]=)
|
323
|
+
@plug.save_settings
|
324
|
+
|
325
|
+
end
|
326
|
+
|
223
327
|
end
|
224
328
|
|
225
329
|
describe '#restore_cursor_position?' do
|
226
330
|
|
227
331
|
it 'returns the value of the state/restore_cursor_position config entry if the @force_restore_cursor_position instance variable is nil' do
|
228
|
-
|
229
|
-
|
332
|
+
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :restore_cursor_position).once.and_return(true)
|
333
|
+
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :restore_cursor_position).once.and_return(false)
|
230
334
|
@plug.instance_variable_set :@force_restore_cursor_position, nil
|
231
335
|
@plug.restore_cursor_position?.should == true
|
232
336
|
@plug.restore_cursor_position?.should == false
|
233
337
|
end
|
234
338
|
|
235
339
|
it 'returns the value of the @force_restore_cursor_position instance variable if it is not nil' do
|
236
|
-
|
340
|
+
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :restore_cursor_position).never
|
237
341
|
@plug.instance_variable_set :@force_restore_cursor_position, true
|
238
342
|
@plug.restore_cursor_position?.should == true
|
239
343
|
@plug.instance_variable_set :@force_restore_cursor_position, false
|
@@ -245,15 +349,15 @@ describe Ruber::State::Plugin do
|
|
245
349
|
describe '#restore_project_files?' do
|
246
350
|
|
247
351
|
it 'returns the value of the state/restore_project_files config entry if the @force_restore_project_files instance variable is nil' do
|
248
|
-
|
249
|
-
|
352
|
+
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :restore_project_files).once.and_return(true)
|
353
|
+
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :restore_project_files).once.and_return(false)
|
250
354
|
@plug.instance_variable_set :@force_restore_project_files, nil
|
251
355
|
@plug.restore_project_files?.should == true
|
252
356
|
@plug.restore_project_files?.should == false
|
253
357
|
end
|
254
358
|
|
255
359
|
it 'returns the value of the @force_restore_project_files instance variable if it is not nil' do
|
256
|
-
|
360
|
+
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :restore_project_files).never
|
257
361
|
@plug.instance_variable_set :@force_restore_project_files, true
|
258
362
|
@plug.restore_project_files?.should == true
|
259
363
|
@plug.instance_variable_set :@force_restore_project_files, false
|
@@ -268,7 +372,8 @@ describe Ruber::State::Plugin do
|
|
268
372
|
hash = {
|
269
373
|
:open_projects => %w[a b c],
|
270
374
|
:open_documents => %w[x y z],
|
271
|
-
:
|
375
|
+
:tabs => [Qt::Horizontal, 'file://'+__FILE__, 0],
|
376
|
+
:active_view => [0,0]
|
272
377
|
}
|
273
378
|
flexmock(@plug).should_receive(:gather_settings).once.and_return hash
|
274
379
|
res = @plug.session_data
|
@@ -284,13 +389,15 @@ describe Ruber::State::Plugin do
|
|
284
389
|
'State' => {
|
285
390
|
:open_projects => %w[a b c],
|
286
391
|
:open_documents => %w[x y z],
|
287
|
-
:
|
392
|
+
:tabs => [Qt::Horizontal, 'file://'+__FILE__, 0],
|
393
|
+
:active_view => [0,0]
|
288
394
|
}
|
289
395
|
}
|
290
396
|
exp_hash = {
|
291
397
|
[:state, :open_projects] => %w[a b c],
|
292
398
|
[:state, :open_documents] => %w[x y z],
|
293
|
-
[:state, :
|
399
|
+
[:state, :active_view] => [0,0],
|
400
|
+
[:state, :tabs] => [Qt::Horizontal, 'file://'+__FILE__, 0],
|
294
401
|
}
|
295
402
|
default = {:open_projects => [], :open_documents => [], :active_document => nil}
|
296
403
|
flexmock(@plug).should_receive(:with).with({:restore_cursor_position => true, :restore_project_files => true, :force => true}, FlexMock.on{|a| a.call || a.is_a?(Proc)}).once
|
@@ -512,60 +619,54 @@ describe Ruber::State::Plugin do
|
|
512
619
|
|
513
620
|
describe '#restore_projects' do
|
514
621
|
|
515
|
-
before do
|
516
|
-
@projects = flexmock('projects'){|m| m.should_ignore_missing}
|
517
|
-
flexmock(Ruber).should_receive(:[]).with(:projects).and_return(@projects).by_default
|
518
|
-
@mw = flexmock{|m| m.should_ignore_missing}
|
519
|
-
flexmock(Ruber).should_receive(:[]).with(:main_window).and_return(@mw).by_default
|
520
|
-
end
|
521
|
-
|
522
622
|
it 'closes all projects' do
|
523
623
|
prjs = 3.times.map{|i| flexmock(i.to_s)}
|
524
|
-
prjs.each{|pr|
|
525
|
-
|
624
|
+
prjs.each{|pr| flexmock(Ruber[:projects]).should_receive(:close_project).with(pr).once}
|
625
|
+
flexmock(Ruber[:projects]).should_receive(:to_a).once.and_return(prjs)
|
526
626
|
@plug.restore_projects
|
527
627
|
end
|
528
628
|
|
529
629
|
it 'uses the safe_open_project method of the main window to open the first entry of the state/open_projects setting' do
|
530
|
-
|
531
|
-
prj = flexmock('project')
|
532
|
-
|
630
|
+
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :open_projects).once.and_return %w[/x/y/z.ruprj /a/b/c.ruprj]
|
631
|
+
prj = flexmock('project', :project_file => '/x/y/z.ruprj')
|
632
|
+
flexmock(Ruber[:main_window]).should_receive(:safe_open_project).once.with('/x/y/z.ruprj').and_return prj
|
633
|
+
flexmock(Ruber[:projects]).should_receive(:current_project=)
|
533
634
|
@plug.restore_projects
|
534
635
|
end
|
535
636
|
|
536
637
|
it 'activates the project returned by safe_open_project' do
|
537
|
-
|
638
|
+
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :open_projects).once.and_return %w[/x/y/z.ruprj /a/b/c.ruprj]
|
538
639
|
prj = flexmock('project')
|
539
|
-
|
540
|
-
|
640
|
+
flexmock(Ruber[:main_window]).should_receive(:safe_open_project).once.with('/x/y/z.ruprj').and_return prj
|
641
|
+
flexmock(Ruber[:projects]).should_receive(:current_project=).once.with(prj)
|
541
642
|
@plug.restore_projects
|
542
643
|
end
|
543
644
|
|
544
645
|
it 'doesn\'t attempt to activate the project if safe_open_project returned nil' do
|
545
|
-
|
646
|
+
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :open_projects).once.and_return %w[/x/y/z.ruprj /a/b/c.ruprj]
|
546
647
|
prj = flexmock('project')
|
547
|
-
|
548
|
-
|
648
|
+
flexmock(Ruber[:main_window]).should_receive(:safe_open_project).once.with('/x/y/z.ruprj').and_return nil
|
649
|
+
flexmock(Ruber[:projects]).should_receive(:current_project=).never
|
549
650
|
lambda{@plug.restore_projects}.should_not raise_error
|
550
651
|
end
|
551
652
|
|
552
653
|
it 'does nothing if the state/open_projects setting is empty' do
|
553
|
-
|
654
|
+
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :open_projects).once.and_return []
|
554
655
|
prj = flexmock('project')
|
555
|
-
|
556
|
-
|
656
|
+
flexmock(Ruber[:projects]).should_receive(:project).never
|
657
|
+
flexmock(Ruber[:projects]).should_receive(:current_project=).never
|
557
658
|
@plug.restore_projects
|
558
659
|
end
|
559
660
|
|
560
661
|
it 'reads the settings from the argument, if given, rather than from the config object' do
|
561
|
-
|
662
|
+
flexmock(Ruber[:config]).should_receive(:[]).never
|
562
663
|
h = {[:state, :open_projects] => ['/x/y/z.ruprj']}
|
563
664
|
def h.[] group, name
|
564
665
|
super [group, name]
|
565
666
|
end
|
566
667
|
prj = flexmock('project')
|
567
|
-
|
568
|
-
|
668
|
+
flexmock(Ruber[:main_window]).should_receive(:safe_open_project).once.with('/x/y/z.ruprj').and_return prj
|
669
|
+
flexmock(Ruber[:projects]).should_receive(:current_project=).once.with(prj)
|
569
670
|
@plug.restore_projects h
|
570
671
|
end
|
571
672
|
|
@@ -573,63 +674,165 @@ describe Ruber::State::Plugin do
|
|
573
674
|
|
574
675
|
describe '#restore_documents' do
|
575
676
|
|
576
|
-
|
577
|
-
|
578
|
-
@
|
579
|
-
flexmock(Ruber).should_receive(:[]).with(:main_window).and_return(@mw).by_default
|
580
|
-
flexmock(Ruber).should_receive(:[]).with(:docs).and_return(@docs).by_default
|
677
|
+
it 'closes all open documents' do
|
678
|
+
flexmock(Ruber[:documents]).should_receive(:close_all).once.and_return true
|
679
|
+
@plug.restore_documents
|
581
680
|
end
|
582
681
|
|
583
|
-
it '
|
584
|
-
|
682
|
+
it 'does nothing if the user chooses to abort closing the documents' do
|
683
|
+
flexmock(Ruber[:documents]).should_receive(:close_all).once.and_return false
|
684
|
+
files = [__FILE__, File.join(File.dirname(__FILE__), 'common.rb'), File.join(File.dirname(__FILE__), 'framework.rb')].map{|f| "file://#{f}"}
|
685
|
+
Ruber[:config][:state, :open_documents] = files
|
686
|
+
flexmock(Ruber[:documents]).should_receive(:document).never
|
585
687
|
@plug.restore_documents
|
586
688
|
end
|
587
689
|
|
588
|
-
it 'creates a new document for each entry in the state/open_documents
|
589
|
-
files =
|
590
|
-
|
591
|
-
@config.should_receive(:[]).with(:state, :active_document)
|
592
|
-
files.each{|f| @mw.should_receive(:editor_for!).once.with(f).ordered}
|
593
|
-
@mw.should_receive(:without_activating).once.with(FlexMock.on{|a| a.call || a.is_a?(Proc)})
|
690
|
+
it 'creates a new document for each entry in the state/open_documents' do
|
691
|
+
files = [__FILE__, File.join(File.dirname(__FILE__), 'common.rb'), File.join(File.dirname(__FILE__), 'framework.rb')].map{|f| "file://#{f}"}
|
692
|
+
Ruber[:config][:state, :open_documents] = files
|
594
693
|
@plug.restore_documents
|
694
|
+
Ruber[:documents].count.should == files.count
|
695
|
+
Ruber[:documents].each_with_index do |doc, i|
|
696
|
+
doc.url.url.should == files[i]
|
697
|
+
end
|
595
698
|
end
|
596
699
|
|
597
|
-
it '
|
598
|
-
files =
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
700
|
+
it 'creates empty documents for numeric entries under the state/open_documents key' do
|
701
|
+
files = [0, 'file:///x/y/f1.rb', 'file:///a/b/f2.rb', 2]
|
702
|
+
Ruber[:config][:state, :open_documents] = files
|
703
|
+
flexmock(Ruber[:documents]).should_receive(:new_document).once.ordered
|
704
|
+
flexmock(Ruber[:documents]).should_receive(:document).once.with(KDE::Url.new(files[1])).ordered
|
705
|
+
flexmock(Ruber[:documents]).should_receive(:document).once.with(KDE::Url.new(files[2])).ordered
|
706
|
+
flexmock(Ruber[:documents]).should_receive(:new_document).once.ordered
|
707
|
+
flexmock(Ruber[:main_window]).should_receive(:without_activating)
|
604
708
|
@plug.restore_documents
|
605
709
|
end
|
606
710
|
|
607
|
-
it '
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
@mw.should_receive(:display_document).twice.with(files[-1])
|
613
|
-
@mw.should_receive(:without_activating).twice.with(FlexMock.on{|a| a.call || a.is_a?(Proc)})
|
711
|
+
it 'creates a tab for each array in the :tabs entry if all of them contain a single element' do
|
712
|
+
docs = [nil, __FILE__, File.join(File.dirname(__FILE__), 'common.rb'), nil].map{|f| f ? 'file://' + f : nil}
|
713
|
+
views = [[docs[1]], [1], [0]]
|
714
|
+
Ruber[:config][:state, :open_documents] = docs
|
715
|
+
Ruber[:config][:state, :tabs] = views
|
614
716
|
@plug.restore_documents
|
717
|
+
tabs = Ruber[:main_window].tabs
|
718
|
+
tabs.count.should == 3
|
719
|
+
tabs[0].view.document.path.should == __FILE__
|
720
|
+
tabs[1].view.document.should == Ruber[:documents][3]
|
721
|
+
tabs[2].view.document.should == Ruber[:documents][0]
|
722
|
+
end
|
723
|
+
|
724
|
+
it 'creates nested tabs for each element of the :tabs entry which is a nested array' do
|
725
|
+
docs = [nil, __FILE__, File.join(File.dirname(__FILE__), 'common.rb'), nil].map{|f| f ? 'file://' + f : nil}
|
726
|
+
views =[
|
727
|
+
[Qt::Vertical, [Qt::Horizontal, 'file://' + __FILE__, 1], 0],
|
728
|
+
[Qt::Horizontal, 'file://' + File.join(File.dirname(__FILE__), 'common.rb'), 'file://' + __FILE__],
|
729
|
+
[0]
|
730
|
+
]
|
731
|
+
Ruber[:config][:state, :open_documents] = docs
|
732
|
+
Ruber[:config][:state, :tabs] = views
|
615
733
|
@plug.restore_documents
|
734
|
+
tabs = Ruber[:main_window].tabs
|
735
|
+
tabs.count.should == 3
|
736
|
+
tabs[0].orientation.should == Qt::Vertical
|
737
|
+
child_pane = tabs[0].splitter.widget(0)
|
738
|
+
child_pane.orientation.should == Qt::Horizontal
|
739
|
+
view_list = child_pane.to_a
|
740
|
+
view_list[0].document.path.should == __FILE__
|
741
|
+
view_list[1].document.should == Ruber[:documents][-1]
|
742
|
+
tabs[0].splitter.widget(1).view.document.should == Ruber[:documents][0]
|
743
|
+
tabs[1].orientation.should == Qt::Horizontal
|
744
|
+
view_list = tabs[1].to_a
|
745
|
+
view_list[0].document.path.should == File.join(File.dirname(__FILE__), 'common.rb')
|
746
|
+
view_list[1].document.path.should == __FILE__
|
747
|
+
tabs[2].should be_single_view
|
748
|
+
tabs[2].view.document.should == Ruber[:documents][0]
|
749
|
+
end
|
750
|
+
|
751
|
+
it 'moves the cursor position of each view according to the contents of the :cursor_positions entry' do
|
752
|
+
docs = ['file://'+__FILE__, 'file://'+File.join(File.dirname(__FILE__), 'common.rb'), 'file://'+File.join(File.dirname(__FILE__), 'framework.rb')]
|
753
|
+
views =[
|
754
|
+
[Qt::Vertical, [Qt::Horizontal, docs[0], docs[1] ], docs[2]],
|
755
|
+
[docs[1]]
|
756
|
+
]
|
757
|
+
positions = [
|
758
|
+
[[30, 16], [53,33], [1,2]],
|
759
|
+
[[2,6]]
|
760
|
+
]
|
761
|
+
Ruber[:config][:state, :open_documents] = docs
|
762
|
+
Ruber[:config][:state, :tabs] = views
|
763
|
+
Ruber[:config][:state, :cursor_positions] = positions
|
764
|
+
@plug.restore_documents
|
765
|
+
tabs = Ruber[:main_window].tabs
|
766
|
+
tabs.each_with_index do |t, i|
|
767
|
+
t.to_a.each_with_index do |v, j|
|
768
|
+
c = v.cursor_position
|
769
|
+
c.line.should == positions[i][j][0]
|
770
|
+
c.column.should == positions[i][j][1]
|
771
|
+
end
|
772
|
+
end
|
616
773
|
end
|
617
774
|
|
618
|
-
it '
|
619
|
-
|
620
|
-
|
775
|
+
it 'doesn\'t attempt to change the cursor positions if the cursor_positions entry is empty' do
|
776
|
+
docs = ['file://'+__FILE__, 'file://'+File.join(File.dirname(__FILE__), 'common.rb'), 'file://'+File.join(File.dirname(__FILE__), 'framework.rb')]
|
777
|
+
views =[
|
778
|
+
[Qt::Vertical, [Qt::Horizontal, docs[0], docs[1] ], docs[2]],
|
779
|
+
[docs[1]]
|
780
|
+
]
|
781
|
+
Ruber[:config][:state, :open_documents] = docs
|
782
|
+
Ruber[:config][:state, :tabs] = views
|
783
|
+
@plug.restore_documents
|
784
|
+
tabs = Ruber[:main_window].tabs
|
785
|
+
tabs.each_with_index do |t, i|
|
786
|
+
t.to_a.each_with_index do |v, j|
|
787
|
+
c = v.cursor_position
|
788
|
+
c.line.should == 0
|
789
|
+
c.column.should == 0
|
790
|
+
end
|
791
|
+
end
|
621
792
|
end
|
622
793
|
|
623
|
-
it '
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
794
|
+
it 'gives focus to the editor corresponding to the value in the active_editor entry' do
|
795
|
+
docs = [nil, __FILE__, File.join(File.dirname(__FILE__), 'common.rb'), nil].map{|f| f ? 'file://' + f : nil}
|
796
|
+
views =[
|
797
|
+
[Qt::Vertical, [Qt::Horizontal, 'file://' + __FILE__, 1], 0],
|
798
|
+
[Qt::Horizontal, 'file://' + File.join(File.dirname(__FILE__), 'common.rb'), 'file://' + __FILE__],
|
799
|
+
[0]
|
800
|
+
]
|
801
|
+
Ruber[:config][:state, :open_documents] = docs
|
802
|
+
Ruber[:config][:state, :tabs] = views
|
803
|
+
Ruber[:config][:state, :active_view] = [1, 1]
|
804
|
+
flexmock(Ruber[:main_window]).should_receive(:focus_on_editor).once.with(FlexMock.on{|v, h| v == Ruber[:main_window].tabs[1].to_a[1]})
|
805
|
+
@plug.restore_documents
|
806
|
+
end
|
807
|
+
|
808
|
+
it 'doesn\'t attempt to give focus to an editor if the active_editor entry is nil' do
|
809
|
+
docs = [nil, __FILE__, File.join(File.dirname(__FILE__), 'common.rb'), nil].map{|f| f ? 'file://' + f : nil}
|
810
|
+
views =[
|
811
|
+
[Qt::Vertical, [Qt::Horizontal, 'file://' + __FILE__, 1], 0],
|
812
|
+
[Qt::Horizontal, 'file://' + File.join(File.dirname(__FILE__), 'common.rb'), 'file://' + __FILE__],
|
813
|
+
[0]
|
814
|
+
]
|
815
|
+
Ruber[:config][:state, :open_documents] = docs
|
816
|
+
Ruber[:config][:state, :tabs] = views
|
817
|
+
Ruber[:config][:state, :active_view] = nil
|
818
|
+
flexmock(Ruber[:main_window]).should_receive(:focus_on_editor).never
|
819
|
+
@plug.restore_documents
|
820
|
+
end
|
821
|
+
|
822
|
+
it 'uses the settings stored in the object passed as a argument instead of those in the global configuration object' do
|
823
|
+
docs = [nil, 'file://'+__FILE__]
|
824
|
+
conf = flexmock do |m|
|
825
|
+
m.should_receive(:[]).with(:state, :open_documents).once.and_return docs
|
826
|
+
m.should_receive(:[]).with(:state, :tabs).once.and_return []
|
827
|
+
m.should_receive(:[]).with(:state, :active_view).once.and_return nil
|
828
|
+
m.should_receive(:[]).with(:state, :cursor_positions).once.and_return []
|
631
829
|
end
|
632
|
-
|
830
|
+
flexmock(Ruber[:config]).should_receive(:[]).never
|
831
|
+
@plug.restore_documents conf
|
832
|
+
documents = Ruber[:documents].to_a
|
833
|
+
documents.size.should == 2
|
834
|
+
documents[0].should be_pristine
|
835
|
+
documents[1].path.should == __FILE__
|
633
836
|
end
|
634
837
|
|
635
838
|
end
|
@@ -637,19 +840,19 @@ describe Ruber::State::Plugin do
|
|
637
840
|
describe 'restore' do
|
638
841
|
|
639
842
|
it 'calls the restore_projects method if the state/open_project setting is not empty' do
|
640
|
-
|
641
|
-
flexmock(@plug).should_receive(:restore_projects).once.with(
|
843
|
+
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :open_projects).and_return %w[/xyz/abc.ruprj]
|
844
|
+
flexmock(@plug).should_receive(:restore_projects).once.with(Ruber[:config])
|
642
845
|
@plug.restore
|
643
846
|
end
|
644
847
|
|
645
848
|
it 'calls the restore_documents method if the state/open_projects setting is empty' do
|
646
|
-
|
647
|
-
flexmock(@plug).should_receive(:restore_documents).once.with(
|
849
|
+
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :open_projects).and_return []
|
850
|
+
flexmock(@plug).should_receive(:restore_documents).once.with(Ruber[:config])
|
648
851
|
@plug.restore
|
649
852
|
end
|
650
853
|
|
651
854
|
it 'uses the argument, rather than the config object, if one is given' do
|
652
|
-
|
855
|
+
flexmock(Ruber[:config]).should_receive(:[]).never
|
653
856
|
h = {[:state, :open_projects] => %w[/xyz/abc.ruprj]}
|
654
857
|
def h.[](group, name)
|
655
858
|
super [group, name]
|
@@ -668,7 +871,7 @@ describe Ruber::State::Plugin do
|
|
668
871
|
describe ', when the state/startup_behaviour option is :restore_all' do
|
669
872
|
|
670
873
|
it 'calls the restore method' do
|
671
|
-
|
874
|
+
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :startup_behaviour).once.and_return :restore_all
|
672
875
|
flexmock(@plug).should_receive(:restore).once
|
673
876
|
@plug.restore_last_state
|
674
877
|
end
|
@@ -678,7 +881,7 @@ describe Ruber::State::Plugin do
|
|
678
881
|
describe ', when the state/startup_behaviour option is :restore_projects_only' do
|
679
882
|
|
680
883
|
it 'calls restore_project from within a with block with :restore_project_files set to false' do
|
681
|
-
|
884
|
+
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :startup_behaviour).once.and_return :restore_projects_only
|
682
885
|
flexmock(@plug).should_receive(:restore_projects).once
|
683
886
|
flexmock(@plug).should_receive(:with).once.with({:restore_project_files => false}, FlexMock.on{|a| a.call || a.is_a?(Proc)})
|
684
887
|
@plug.restore_last_state
|
@@ -689,7 +892,7 @@ describe Ruber::State::Plugin do
|
|
689
892
|
describe ', when the state/startup_behaviour option is :restore_documents_only' do
|
690
893
|
|
691
894
|
it 'calls restore_documents' do
|
692
|
-
|
895
|
+
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :startup_behaviour).once.and_return :restore_documents_only
|
693
896
|
flexmock(@plug).should_receive(:restore_documents).once
|
694
897
|
@plug.restore_last_state
|
695
898
|
end
|
@@ -699,7 +902,7 @@ describe Ruber::State::Plugin do
|
|
699
902
|
describe ', when the state/startup_behaviour option is :restore_nothing' do
|
700
903
|
|
701
904
|
it 'does nothing' do
|
702
|
-
|
905
|
+
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :startup_behaviour).once.and_return :restore_nothing
|
703
906
|
flexmock(@plug).should_receive(:with).never
|
704
907
|
flexmock(@plug).should_receive(:restore_projects).never
|
705
908
|
flexmock(@plug).should_receive(:restore_documents).never
|
@@ -715,6 +918,21 @@ end
|
|
715
918
|
|
716
919
|
describe Ruber::State::DocumentExtension do
|
717
920
|
|
921
|
+
before do
|
922
|
+
Ruber[:components].load_plugin 'plugins/state/'
|
923
|
+
Ruber[:documents].close_all(false)
|
924
|
+
@plug = Ruber[:components][:state]
|
925
|
+
@doc = Ruber[:documents].document __FILE__
|
926
|
+
@prj = @doc.own_project
|
927
|
+
@ext = @doc.own_project.extension(:state)
|
928
|
+
end
|
929
|
+
|
930
|
+
after do
|
931
|
+
Ruber[:documents].close_all(false)
|
932
|
+
Ruber[:components].unload_plugin :state
|
933
|
+
end
|
934
|
+
|
935
|
+
|
718
936
|
it 'inherits from Qt::Object' do
|
719
937
|
Ruber::State::DocumentExtension.ancestors.should include(Qt::Object)
|
720
938
|
end
|
@@ -723,18 +941,10 @@ describe Ruber::State::DocumentExtension do
|
|
723
941
|
Ruber::State::DocumentExtension.ancestors.should include(Ruber::Extension)
|
724
942
|
end
|
725
943
|
|
726
|
-
before do
|
727
|
-
@components = flexmock{|m| m.should_ignore_missing}
|
728
|
-
flexmock(Ruber).should_receive(:[]).with(:components).and_return(@components).by_default
|
729
|
-
@doc = Ruber::Document.new nil, __FILE__
|
730
|
-
@ext = Ruber::State::DocumentExtension.new @doc.own_project
|
731
|
-
@doc.own_project.add_extension :state, @ext
|
732
|
-
end
|
733
|
-
|
734
944
|
describe ', when created' do
|
735
945
|
|
736
|
-
it 'connects the document\'s view_created(QObject*, QObject*) signal to its auto_restore slot' do
|
737
|
-
flexmock(@ext).should_receive(:auto_restore).once
|
946
|
+
it 'connects the document\'s view_created(QObject*, QObject*) signal to its auto_restore slot, passing the view to it' do
|
947
|
+
flexmock(@ext).should_receive(:auto_restore).once.with(Ruber::EditorView)
|
738
948
|
@doc.create_view
|
739
949
|
end
|
740
950
|
|
@@ -742,68 +952,158 @@ describe Ruber::State::DocumentExtension do
|
|
742
952
|
|
743
953
|
describe '#restore' do
|
744
954
|
|
745
|
-
before do
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
|
753
|
-
|
754
|
-
|
955
|
+
context 'if no other view associated with the document received focus before' do
|
956
|
+
|
957
|
+
it 'moves the cursor to the position specified in the state/cursor_position entry of the document project' do
|
958
|
+
exp = [10, 5]
|
959
|
+
views = 3.times.map{@doc.create_view}
|
960
|
+
@prj[:state, :cursor_position] = exp
|
961
|
+
@ext.restore views[1]
|
962
|
+
cur = views[1].cursor_position
|
963
|
+
cur.line.should == exp[0]
|
964
|
+
cur.column.should == exp[1]
|
965
|
+
end
|
966
|
+
|
755
967
|
end
|
756
968
|
|
757
|
-
|
758
|
-
|
969
|
+
context 'if another view associated with the document has received focus before' do
|
970
|
+
|
971
|
+
it 'moves the cursor to the position of the cursor in the view which last received focus' do
|
972
|
+
exp = [10, 5]
|
973
|
+
views = 3.times.map{@doc.create_view}
|
974
|
+
views[0].instance_eval{emit focus_in(self)}
|
975
|
+
flexmock(@prj).should_receive(:[]).with(:state, :cursor_position).never
|
976
|
+
flexmock(views[0]).should_receive(:cursor_position).and_return(KTextEditor::Cursor.new(*exp))
|
977
|
+
@ext.restore views[1]
|
978
|
+
cur = views[1].cursor_position
|
979
|
+
cur.line.should == exp[0]
|
980
|
+
cur.column.should == exp[1]
|
981
|
+
end
|
982
|
+
|
759
983
|
end
|
760
|
-
|
984
|
+
|
761
985
|
end
|
762
986
|
|
763
987
|
describe '#save_settings' do
|
764
988
|
|
765
|
-
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
flexmock(
|
773
|
-
|
774
|
-
flexmock(
|
989
|
+
it 'stores the cursor position in the view which last got focus under the state/cursor_position key' do
|
990
|
+
views = 3.times.map{@doc.create_view}
|
991
|
+
#simply calling set_focus to give focus to the view wouldn't work because
|
992
|
+
#set_focus relies on a running event loop
|
993
|
+
views[1].instance_eval{emit focus_in(self)}
|
994
|
+
views[0].instance_eval{emit focus_in(self)}
|
995
|
+
views[2].instance_eval{emit focus_in(self)}
|
996
|
+
flexmock(views[1]).should_receive(:cursor_position).and_return(KTextEditor::Cursor.new(120,25))
|
997
|
+
flexmock(views[0]).should_receive(:cursor_position).and_return(KTextEditor::Cursor.new(33,45))
|
998
|
+
flexmock(views[2]).should_receive(:cursor_position).and_return(KTextEditor::Cursor.new(50,15))
|
775
999
|
@ext.save_settings
|
776
|
-
|
1000
|
+
@prj[:state, :cursor_position].should == [50,15]
|
1001
|
+
end
|
1002
|
+
|
1003
|
+
# it 'keeps using the view which last got focus' do
|
1004
|
+
# views = 3.times.map{@doc.create_view}
|
1005
|
+
# views[1].instance_eval{emit focus_in(self)}
|
1006
|
+
# views[0].instance_eval{emit focus_in(self)}
|
1007
|
+
# flexmock(@ext).should_receive(:save_settings)
|
1008
|
+
# views[1].close
|
1009
|
+
# flexmock(@prj).should_receive(:[]).with(:state, :cursor_position).never
|
1010
|
+
# flexmock(views[0]).should_receive(:cursor_position).once.and_return(KTextEditor::Cursor.new(2,3))
|
1011
|
+
# @doc.create_view
|
1012
|
+
# end
|
1013
|
+
|
777
1014
|
|
778
|
-
it '
|
779
|
-
|
780
|
-
|
1015
|
+
it 'does nothing if none of the views associated with the document have received focus' do
|
1016
|
+
views = 3.times.map{@doc.create_view}
|
1017
|
+
flexmock(views[1]).should_receive(:cursor_position).never
|
1018
|
+
flexmock(views[0]).should_receive(:cursor_position).never
|
1019
|
+
flexmock(views[2]).should_receive(:cursor_position).never
|
1020
|
+
flexmock(@prj).should_receive(:[]=).with(:state, :cursor_position).never
|
1021
|
+
@ext.save_settings
|
781
1022
|
end
|
782
1023
|
|
783
1024
|
end
|
784
1025
|
|
785
1026
|
describe 'auto_restore' do
|
1027
|
+
|
1028
|
+
context 'if the state plugin wants the cursor position restored' do
|
786
1029
|
|
787
|
-
|
788
|
-
|
789
|
-
|
790
|
-
|
791
|
-
|
1030
|
+
it 'calls the restore method if the State plugins wants the curesor position restored' do
|
1031
|
+
view = @doc.create_view
|
1032
|
+
flexmock(@plug).should_receive(:restore_cursor_position?).once.and_return true
|
1033
|
+
flexmock(@ext).should_receive(:restore).once.with(view)
|
1034
|
+
@ext.send :auto_restore, view
|
1035
|
+
end
|
792
1036
|
|
793
|
-
it 'calls the restore method if the State plugins wants the curesor position restored' do
|
794
|
-
flexmock(@plug).should_receive(:restore_cursor_position?).once.and_return true
|
795
|
-
flexmock(@ext).should_receive(:restore).once
|
796
|
-
@ext.send :auto_restore
|
797
1037
|
end
|
798
1038
|
|
799
|
-
|
800
|
-
|
801
|
-
|
802
|
-
|
1039
|
+
context 'if the state plugin doesn\'t want the cursor position restored' do
|
1040
|
+
|
1041
|
+
it 'does nothing' do
|
1042
|
+
view = @doc.create_view
|
1043
|
+
flexmock(@plug).should_receive(:restore_cursor_position?).once.and_return false
|
1044
|
+
flexmock(@ext).should_receive(:restore).never
|
1045
|
+
@ext.send :auto_restore, view
|
1046
|
+
end
|
1047
|
+
|
803
1048
|
end
|
804
1049
|
|
805
1050
|
end
|
1051
|
+
|
1052
|
+
context 'when a view associated with the document is closed' do
|
1053
|
+
|
1054
|
+
context 'and the view is the one which last got focus' do
|
1055
|
+
|
1056
|
+
it 'calls the save_settings method' do
|
1057
|
+
views = 3.times.map{@doc.create_view}
|
1058
|
+
views[1].instance_eval{emit focus_in(self)}
|
1059
|
+
views[0].instance_eval{emit focus_in(self)}
|
1060
|
+
flexmock(@ext).should_receive(:save_settings).once
|
1061
|
+
views[0].close
|
1062
|
+
#needed because otherwise the save_settings method is called again when
|
1063
|
+
#the document is closed in the after block
|
1064
|
+
flexmock(@ext).should_receive(:save_settings)
|
1065
|
+
end
|
1066
|
+
|
1067
|
+
it 'after behaves as if no other view had ever got focus' do
|
1068
|
+
views = 3.times.map{@doc.create_view}
|
1069
|
+
views[1].instance_eval{emit focus_in(self)}
|
1070
|
+
views[0].instance_eval{emit focus_in(self)}
|
1071
|
+
flexmock(@ext).should_receive(:save_settings)
|
1072
|
+
views[0].close
|
1073
|
+
flexmock(@prj).should_receive(:[]).with(:state, :cursor_position).once.and_return([10,2])
|
1074
|
+
@doc.create_view
|
1075
|
+
end
|
1076
|
+
|
1077
|
+
end
|
806
1078
|
|
1079
|
+
context 'and the view isn\'t the last one which got focus' do
|
1080
|
+
|
1081
|
+
it 'does nothing if the view is not the last which got focus' do
|
1082
|
+
views = 3.times.map{@doc.create_view}
|
1083
|
+
views[1].instance_eval{emit focus_in(self)}
|
1084
|
+
views[0].instance_eval{emit focus_in(self)}
|
1085
|
+
flexmock(@ext).should_receive(:save_settings).never
|
1086
|
+
views[1].close
|
1087
|
+
#needed because otherwise the save_settings method is called again when
|
1088
|
+
#the document is closed in the after block
|
1089
|
+
flexmock(@ext).should_receive(:save_settings)
|
1090
|
+
end
|
1091
|
+
|
1092
|
+
it 'keeps using the view which last got focus' do
|
1093
|
+
views = 3.times.map{@doc.create_view}
|
1094
|
+
views[1].instance_eval{emit focus_in(self)}
|
1095
|
+
views[0].instance_eval{emit focus_in(self)}
|
1096
|
+
flexmock(@ext).should_receive(:save_settings)
|
1097
|
+
views[1].close
|
1098
|
+
flexmock(@prj).should_receive(:[]).with(:state, :cursor_position).never
|
1099
|
+
flexmock(views[0]).should_receive(:cursor_position).once.and_return(KTextEditor::Cursor.new(2,3))
|
1100
|
+
@doc.create_view
|
1101
|
+
end
|
1102
|
+
|
1103
|
+
end
|
1104
|
+
|
1105
|
+
end
|
1106
|
+
|
807
1107
|
end
|
808
1108
|
|
809
1109
|
describe Ruber::State::ProjectExtension do
|
@@ -817,19 +1117,18 @@ describe Ruber::State::ProjectExtension do
|
|
817
1117
|
end
|
818
1118
|
|
819
1119
|
before do
|
1120
|
+
Ruber[:documents].close_all(false)
|
1121
|
+
Ruber[:components].load_plugin 'plugins/state/'
|
1122
|
+
@plug = Ruber[:components][:state]
|
820
1123
|
@dir = File.join Dir.tmpdir, random_string(10)
|
821
1124
|
FileUtils.mkdir @dir
|
822
|
-
@
|
823
|
-
@
|
824
|
-
flexmock(Ruber).should_receive(:[]).with(:components).and_return(@components).by_default
|
825
|
-
flexmock(Ruber).should_receive(:[]).with(:projects).and_return(@projects).by_default
|
826
|
-
@prj = Ruber::Project.new 'Test', File.join(@dir, 'test.ruprj')
|
827
|
-
@ext = Ruber::State::ProjectExtension.new @prj
|
828
|
-
@prj.add_extension :state, @ext
|
1125
|
+
@prj = Ruber[:projects].new_project File.join(@dir, 'test.ruprj'), 'Test'
|
1126
|
+
@ext = @prj.extension :state
|
829
1127
|
end
|
830
1128
|
|
831
1129
|
after do
|
832
1130
|
FileUtils.rm_rf @dir
|
1131
|
+
Ruber[:components].unload_plugin :state
|
833
1132
|
end
|
834
1133
|
|
835
1134
|
describe ', when created' do
|
@@ -839,148 +1138,62 @@ describe Ruber::State::ProjectExtension do
|
|
839
1138
|
@prj.activate
|
840
1139
|
end
|
841
1140
|
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
before do
|
847
|
-
@mw = flexmock('main window'){|m| m.should_ignore_missing}
|
848
|
-
@config = flexmock('config')
|
849
|
-
@docs = flexmock('docs'){|m| m.should_ignore_missing}
|
850
|
-
flexmock(Ruber).should_receive(:[]).with(:main_window).and_return(@mw).by_default
|
851
|
-
flexmock(Ruber).should_receive(:[]).with(:config).and_return(@config).by_default
|
852
|
-
flexmock(Ruber).should_receive(:[]).with(:docs).and_return(@docs).by_default
|
853
|
-
end
|
854
|
-
|
855
|
-
it 'calls the document list\'s close_all method' do
|
856
|
-
@docs.should_receive(:close_all).once
|
857
|
-
flexmock(@prj).should_receive(:[]).with(:state, :open_documents).once.and_return []
|
858
|
-
@ext.restore
|
1141
|
+
it 'connects the save_settings slot to the deactivated signal of the project' do
|
1142
|
+
flexmock(@ext).should_receive(:save_settings).once
|
1143
|
+
@prj.instance_eval{emit deactivated}
|
859
1144
|
end
|
860
1145
|
|
861
|
-
|
862
|
-
files = %w[/a.rb /b.rb /c.rb]
|
863
|
-
flexmock(@prj).should_receive(:[]).with(:state, :open_documents).once.and_return files
|
864
|
-
flexmock(@prj).should_receive(:[]).with(:state, :active_document).once.and_return nil
|
865
|
-
files.each{|f| @mw.should_receive(:editor_for!).with(f).once}
|
866
|
-
@mw.should_receive(:without_activating).once.with(FlexMock.on{|a| a.call || a.is_a?(Proc)})
|
867
|
-
@ext.restore
|
868
|
-
end
|
869
|
-
|
870
|
-
it 'activates the editor corresponding to the file in the project\'s state/active_document entry' do
|
871
|
-
files = %w[/a.rb /b.rb /c.rb]
|
872
|
-
flexmock(@prj).should_receive(:[]).with(:state, :open_documents).once.and_return files
|
873
|
-
flexmock(@prj).should_receive(:[]).with(:state, :active_document).once.and_return files[1]
|
874
|
-
@mw.should_receive(:without_activating).once.with(FlexMock.on{|a| a.call || a.is_a?(Proc)})
|
875
|
-
@mw.should_receive(:display_document).once.with files[1]
|
876
|
-
@ext.restore
|
877
|
-
end
|
878
|
-
|
879
|
-
it 'activates the editor corresponding to the last entry file in the project\'s state/open_documents entry if the state/active_documents entry is nil' do
|
880
|
-
files = %w[/a.rb /b.rb /c.rb]
|
881
|
-
editors = 3.times.map{|i| flexmock(i.to_s)}
|
882
|
-
flexmock(@prj).should_receive(:[]).with(:state, :open_documents).once.and_return files
|
883
|
-
flexmock(@prj).should_receive(:[]).with(:state, :active_document).once.and_return nil
|
884
|
-
@mw.should_receive(:without_activating).once.with(FlexMock.on{|a| a.call || a.is_a?(Proc)})
|
885
|
-
@mw.should_receive(:display_document).once.with files[-1]
|
886
|
-
@ext.restore
|
887
|
-
end
|
1146
|
+
end
|
888
1147
|
|
889
|
-
|
890
|
-
files = %w[/a.rb /b.rb /c.rb]
|
891
|
-
flexmock(@prj).should_receive(:[]).with(:state, :open_documents).once.and_return files
|
892
|
-
flexmock(@prj).should_receive(:[]).with(:state, :active_document).once.and_return '/d.rb'
|
893
|
-
@mw.should_receive(:without_activating).once.with(FlexMock.on{|a| a.call || a.is_a?(Proc)})
|
894
|
-
@mw.should_receive(:display_document).once.with files[-1]
|
895
|
-
@ext.restore
|
896
|
-
end
|
1148
|
+
describe '#restore' do
|
897
1149
|
|
898
|
-
it '
|
899
|
-
|
900
|
-
flexmock(@prj).should_receive(:[]).with(:state, :open_documents).once.and_return files
|
901
|
-
flexmock(@prj).should_receive(:[]).with(:state, :active_document).and_return nil
|
902
|
-
@mw.should_receive(:editor_for!).never
|
903
|
-
@mw.should_receive(:editor_for).never
|
904
|
-
@mw.should_receive(:without_activating).never
|
905
|
-
@mw.should_receive(:activate_editor).never
|
1150
|
+
it 'calls the restore_documents method of the state plugin passing the project as argument' do
|
1151
|
+
flexmock(Ruber[:state]).should_receive(:restore_documents).once.with(@prj)
|
906
1152
|
@ext.restore
|
907
1153
|
end
|
908
1154
|
|
909
1155
|
end
|
910
|
-
|
1156
|
+
|
911
1157
|
describe '#save_settings' do
|
912
1158
|
|
913
|
-
|
914
|
-
@
|
915
|
-
|
916
|
-
|
917
|
-
|
918
|
-
|
919
|
-
|
920
|
-
|
921
|
-
|
922
|
-
|
923
|
-
flexmock(
|
924
|
-
flexmock(@prj).should_receive(:[]=)
|
925
|
-
@ext.save_settings
|
926
|
-
end
|
927
|
-
|
928
|
-
it 'stores an empty array in the project\'s state/open_documents entry if there\'s no open file or if none of them is associated with a document' do
|
929
|
-
@docs.should_receive(:documents_with_file).once.and_return []
|
930
|
-
flexmock(@prj).should_receive(:[]=).once.with :state, :open_documents, []
|
931
|
-
flexmock(@prj).should_receive(:[]=)
|
932
|
-
@ext.save_settings
|
933
|
-
end
|
934
|
-
|
935
|
-
it 'stores the path of the current document in the project\'s state/active_document entry' do
|
936
|
-
docs = %w[a b c].map{|i| flexmock(i.to_s, :path => "/#{i}")}
|
937
|
-
active = flexmock('doc', :path => '/b')
|
938
|
-
@docs.should_receive(:documents_with_file).once.and_return docs
|
939
|
-
@mw.should_receive(:current_document).once.and_return active
|
940
|
-
flexmock(@prj).should_receive(:[]=).once.with :state, :active_document, '/b'
|
941
|
-
flexmock(@prj).should_receive(:[]=)
|
942
|
-
@ext.save_settings
|
943
|
-
end
|
944
|
-
|
945
|
-
it 'stores nil in the project\'s state/active_document entry if there\'s no active document or the active document isn\'t associated with a file' do
|
946
|
-
docs = %w[a b c].map{|i| flexmock(i.to_s, :path => "/#{i}")}
|
947
|
-
active = flexmock('doc', :path => '')
|
948
|
-
@docs.should_receive(:documents_with_file).twice.and_return docs
|
949
|
-
@mw.should_receive(:current_document).once.and_return active
|
950
|
-
@mw.should_receive(:current_document).once.and_return nil
|
951
|
-
flexmock(@prj).should_receive(:[]=).twice.with :state, :active_document, nil
|
952
|
-
flexmock(@prj).should_receive(:[]=)
|
953
|
-
@ext.save_settings
|
1159
|
+
it 'stores the entries returned by the documents_state and tabs_state entries of the state plugin in the project' do
|
1160
|
+
@prj.activate
|
1161
|
+
docs_state = ['file://'+__FILE__, nil]
|
1162
|
+
tabs_state = {
|
1163
|
+
:tabs => [['file://'+__FILE__], [0]],
|
1164
|
+
:cursor_positions => [],
|
1165
|
+
:active_view => [[1,0]]
|
1166
|
+
}
|
1167
|
+
state = Ruber[:state]
|
1168
|
+
flexmock(state).should_receive(:documents_state).once.and_return(docs_state)
|
1169
|
+
flexmock(state).should_receive(:tabs_state).once.and_return(tabs_state)
|
954
1170
|
@ext.save_settings
|
1171
|
+
@prj[:state, :open_documents].should == docs_state
|
1172
|
+
@prj[:state, :tabs].should == tabs_state[:tabs]
|
1173
|
+
@prj[:state, :active_view].should == tabs_state[:active_view]
|
1174
|
+
@prj[:state, :cursor_positions].should == tabs_state[:cursor_positions]
|
955
1175
|
end
|
956
1176
|
|
957
1177
|
end
|
958
1178
|
|
959
1179
|
describe 'auto_restore' do
|
960
1180
|
|
961
|
-
before do
|
962
|
-
@config = flexmock('config')
|
963
|
-
flexmock(Ruber).should_receive(:[]).with(:config).and_return(@config).by_default
|
964
|
-
@plug = Object.new
|
965
|
-
@plug.instance_variable_set :@force_restore_project_files, nil
|
966
|
-
flexmock(Ruber).should_receive(:[]).with(:state).and_return(@plug).by_default
|
967
|
-
end
|
968
1181
|
|
969
1182
|
it 'disconnects the project\'s activated() signal from the extension' do
|
970
|
-
flexmock(
|
1183
|
+
flexmock(Ruber[:state]).should_receive(:restore_project_files?).once.and_return false
|
971
1184
|
@ext.send :auto_restore
|
972
1185
|
flexmock(@ext).should_receive(:auto_restore).never
|
973
1186
|
flexmock(@prj).instance_eval{emit activated}
|
974
1187
|
end
|
975
1188
|
|
976
1189
|
it 'calls the restore method if the State plugins wants the project files restored' do
|
977
|
-
flexmock(
|
1190
|
+
flexmock(Ruber[:state]).should_receive(:restore_project_files?).once.and_return true
|
978
1191
|
flexmock(@ext).should_receive(:restore).once
|
979
1192
|
@ext.send :auto_restore
|
980
1193
|
end
|
981
1194
|
|
982
1195
|
it 'does noting if the State plugins doesn\'t want the project_files restored' do
|
983
|
-
flexmock(
|
1196
|
+
flexmock(Ruber[:state]).should_receive(:restore_project_files?).once.and_return false
|
984
1197
|
flexmock(@ext).should_receive(:restore).never
|
985
1198
|
@ext.send :auto_restore
|
986
1199
|
end
|