ruber 0.0.5 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|