ruber 0.0.8 → 0.0.9
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 +21 -0
- data/data/share/apps/ruber/ruberui.rc +3 -1
- data/lib/ruber/application/application.rb +22 -23
- data/lib/ruber/application/plugin.yaml +7 -2
- data/lib/ruber/{projects → application}/project_files_list.rb +0 -0
- data/lib/ruber/{projects → application}/project_files_widget.rb +0 -0
- data/lib/ruber/application/ui/project_files_rule_chooser_widget.rb +74 -0
- data/lib/ruber/{projects → application}/ui/project_files_rule_chooser_widget.ui +0 -0
- data/lib/ruber/application/ui/project_files_widget.rb +117 -0
- data/lib/ruber/{projects → application}/ui/project_files_widget.ui +0 -0
- data/lib/ruber/component_manager.rb +14 -9
- data/lib/ruber/editor/document.rb +35 -5
- data/lib/ruber/kde_sugar.rb +16 -0
- data/lib/ruber/main_window/choose_plugins_dlg.rb +7 -4
- data/lib/ruber/main_window/main_window.rb +131 -193
- data/lib/ruber/main_window/main_window_actions.rb +157 -58
- data/lib/ruber/main_window/main_window_internal.rb +145 -54
- data/lib/ruber/main_window/open_file_in_project_dlg.rb +4 -4
- data/lib/ruber/main_window/plugin.yaml +3 -6
- data/lib/ruber/main_window/ui/workspace_settings_widget.rb +2 -2
- data/lib/ruber/main_window/workspace.rb +62 -32
- data/lib/ruber/output_widget.rb +20 -16
- data/lib/ruber/pane.rb +11 -5
- data/lib/ruber/project.rb +27 -12
- data/lib/ruber/projects/ui/project_files_rule_chooser_widget.rb +2 -2
- data/lib/ruber/projects/ui/project_files_widget.rb +2 -2
- data/lib/ruber/utils.rb +37 -4
- data/lib/ruber/version.rb +1 -1
- data/lib/ruber/world/document_factory.rb +121 -0
- data/lib/ruber/world/document_list.rb +396 -0
- data/lib/ruber/world/environment.rb +470 -0
- data/lib/ruber/{main_window → world}/hint_solver.rb +1 -1
- data/lib/ruber/world/plugin.yaml +11 -0
- data/lib/ruber/world/project_factory.rb +131 -0
- data/lib/ruber/world/project_list.rb +265 -0
- data/lib/ruber/world/ui/workspace_settings_widget.rb +51 -0
- data/lib/ruber/{main_window → world}/ui/workspace_settings_widget.ui +0 -0
- data/lib/ruber/world/world.rb +307 -0
- data/plugins/auto_end/auto_end.rb +135 -9
- data/plugins/autosave/autosave.rb +4 -4
- data/plugins/find_in_files/find_in_files.rb +5 -5
- data/plugins/find_in_files/find_in_files_widgets.rb +1 -1
- data/plugins/project_browser/project_browser.rb +4 -4
- data/plugins/rake/rake.rb +4 -4
- data/plugins/rake/rake_extension.rb +1 -1
- data/plugins/rspec/rspec.rb +4 -4
- data/plugins/rspec/ruber_rspec_formatter.rb +2 -2
- data/plugins/ruby_development/ruby_development.rb +3 -3
- data/plugins/ruby_runner/ruby_runner.rb +2 -2
- data/plugins/state/plugin.yaml +6 -8
- data/plugins/state/state.rb +201 -391
- data/plugins/state/ui/config_widget.rb +5 -5
- data/plugins/state/ui/config_widget.ui +3 -3
- data/plugins/syntax_checker/syntax_checker.rb +4 -0
- data/spec/annotation_model_spec.rb +1 -1
- data/spec/auto_end_spec.rb +98 -47
- data/spec/component_manager_spec.rb +80 -21
- data/spec/document_factory_spec.rb +115 -0
- data/spec/document_list_spec.rb +560 -450
- data/spec/document_spec.rb +143 -55
- data/spec/editor_view_spec.rb +2 -2
- data/spec/environment_spec.rb +1900 -0
- data/spec/hint_solver_spec.rb +5 -5
- data/spec/kde_sugar_spec.rb +16 -0
- data/spec/output_widget_spec.rb +177 -51
- data/spec/pane_spec.rb +29 -5
- data/spec/plugin_spec.rb +1 -1
- data/spec/project_factory_spec.rb +104 -0
- data/spec/project_list_spec.rb +352 -447
- data/spec/project_spec.rb +34 -33
- data/spec/qt_sugar_spec.rb +2 -2
- data/spec/state_spec.rb +508 -811
- data/spec/utils_spec.rb +149 -98
- data/spec/workspace_spec.rb +120 -9
- data/spec/world_spec.rb +1219 -0
- metadata +23 -14
- data/lib/ruber/documents/document_list.rb +0 -412
- data/lib/ruber/documents/plugin.yaml +0 -4
- data/lib/ruber/main_window/view_manager.rb +0 -431
- data/lib/ruber/projects/plugin.yaml +0 -11
- data/lib/ruber/projects/project_list.rb +0 -314
data/spec/project_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
require 'spec/
|
1
|
+
require './spec/framework'
|
2
|
+
require './spec/common'
|
2
3
|
|
3
4
|
require 'set'
|
4
5
|
require 'stringio'
|
@@ -12,47 +13,47 @@ require 'ruber/project'
|
|
12
13
|
require 'ruber/plugin'
|
13
14
|
require 'ruber/plugin_specification'
|
14
15
|
|
15
|
-
class TestComponentManager < Qt::Object
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end
|
16
|
+
# class TestComponentManager < Qt::Object
|
17
|
+
#
|
18
|
+
# extend Forwardable
|
19
|
+
#
|
20
|
+
# def_delegators :@data, :[], :<<
|
21
|
+
# def_delegator :@data, :each, :each_component
|
22
|
+
#
|
23
|
+
# signals 'component_loaded(QObject*)', 'unloading_component(QObject*)'
|
24
|
+
#
|
25
|
+
# def initialize
|
26
|
+
# super
|
27
|
+
# @data = []
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# def emit_signal sig, obj
|
31
|
+
# emit method(sig).call(obj)
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# end
|
34
35
|
|
35
|
-
class Application < Qt::Object
|
36
|
-
|
37
|
-
end
|
36
|
+
# class Application < Qt::Object
|
37
|
+
# signals 'plugins_changed()'
|
38
|
+
# end
|
38
39
|
|
39
40
|
unless defined? OS
|
40
41
|
OS = OpenStruct
|
41
42
|
end
|
42
43
|
|
43
|
-
|
44
|
+
shared_examples_for 'an_abstract_project_spec_method' do
|
44
45
|
|
45
46
|
include FlexMock::ArgumentTypes
|
46
47
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
48
|
+
# before do
|
49
|
+
# @comp = TestComponentManager.new
|
50
|
+
# @fake_app = Application.new
|
51
|
+
# @dlg = flexmock('dialog', :read_settings => nil, :dispose => nil)
|
52
|
+
# @mw = Qt::Widget.new
|
53
|
+
# flexmock(Ruber).should_receive(:[]).with(:components).and_return( @comp).by_default
|
54
|
+
# flexmock(Ruber).should_receive(:[]).with(:app).and_return( @fake_app).by_default
|
55
|
+
# flexmock(Ruber).should_receive(:[]).with(:main_window).and_return( @mw).by_default
|
56
|
+
# end
|
56
57
|
|
57
58
|
after do
|
58
59
|
FileUtils.rm_f 'test.ruprj'
|
data/spec/qt_sugar_spec.rb
CHANGED
@@ -298,13 +298,13 @@ describe 'Qt::Base#named_connect' do
|
|
298
298
|
|
299
299
|
end
|
300
300
|
|
301
|
-
describe 'Qt::Base#
|
301
|
+
describe 'Qt::Base#named_disconnect' do
|
302
302
|
|
303
303
|
before do
|
304
304
|
@sender = QtNamedConnectSpec::Sender.new
|
305
305
|
end
|
306
306
|
|
307
|
-
it '
|
307
|
+
it 'allows to disconnect the block' do
|
308
308
|
m = flexmock{|mk| mk.should_receive(:test).never}
|
309
309
|
@sender.named_connect(SIGNAL('s1()'), 'test'){m.test}
|
310
310
|
@sender.named_disconnect 'test'
|
data/spec/state_spec.rb
CHANGED
@@ -10,15 +10,170 @@ require 'ruber/pane'
|
|
10
10
|
|
11
11
|
require 'plugins/state/state'
|
12
12
|
|
13
|
+
shared_examples_for 'a component of the state plugin saving an environment' do
|
14
|
+
|
15
|
+
before :all do
|
16
|
+
default_keys = {:tabs => :tabs, :cursor_positions => :cursor_positions, :active_view => :active_view}
|
17
|
+
@keys = default_keys.merge(@keys || {})
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'stores a tree of the open editors for each tab under the state/tabs entry' do
|
21
|
+
docs = [nil, __FILE__, File.join(File.dirname(__FILE__), 'common.rb'), nil].map! do |f|
|
22
|
+
f ? Ruber[:world].document(f) : Ruber[:world].new_document
|
23
|
+
end
|
24
|
+
views = [
|
25
|
+
docs[1].create_view,
|
26
|
+
docs[0].create_view,
|
27
|
+
docs[3].create_view,
|
28
|
+
docs[2].create_view,
|
29
|
+
docs[1].create_view,
|
30
|
+
docs[0].create_view
|
31
|
+
]
|
32
|
+
tab1 = Ruber::Pane.new views[0]
|
33
|
+
tab1.split views[0], views[1], Qt::Vertical
|
34
|
+
tab1.split views[0], views[2], Qt::Horizontal
|
35
|
+
tab2 = Ruber::Pane.new views[3]
|
36
|
+
tab2.split views[3], views[4], Qt::Horizontal
|
37
|
+
tab3 = Ruber::Pane.new views[5]
|
38
|
+
flexmock(@env).should_receive(:tabs).and_return [tab1, tab2, tab3]
|
39
|
+
flexmock(@env).should_receive(:documents).and_return(docs)
|
40
|
+
exp = [
|
41
|
+
[Qt::Vertical, [Qt::Horizontal, 'file://' + __FILE__, 1], 0],
|
42
|
+
[Qt::Horizontal, 'file://' + File.join(File.dirname(__FILE__), 'common.rb'), 'file://' + __FILE__],
|
43
|
+
[0]
|
44
|
+
]
|
45
|
+
@state.save_settings
|
46
|
+
@container[:state, @keys[:tabs]].should == exp
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'uses arrays with a single element in the :tabs entry to represent tabs with a single view' do
|
50
|
+
docs = [__FILE__, nil].map{|f| f ? Ruber[:world].document(f) : Ruber[:world].new_document}
|
51
|
+
flexmock(@env).should_receive(:documents).and_return(docs)
|
52
|
+
views = docs.reverse.map{|d| d.create_view}
|
53
|
+
tabs = views.map{|v| Ruber::Pane.new v}
|
54
|
+
flexmock(@env).should_receive(:tabs).and_return tabs
|
55
|
+
exp = [[0], ['file://' + __FILE__]]
|
56
|
+
@state.save_settings
|
57
|
+
@container[:state, @keys[:tabs]].should == exp
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'stores an empty array under the tabs entry if there aren\'t open editors' do
|
61
|
+
docs = [
|
62
|
+
Ruber[:world].new_document,
|
63
|
+
Ruber[:world].document(__FILE__),
|
64
|
+
]
|
65
|
+
flexmock(@env).should_receive(:documents).and_return([])
|
66
|
+
@state.save_settings
|
67
|
+
@container[:state, @keys[:tabs]].should == []
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'stores the active view as an array of integers referring to the tabs entry in the active_view entry' do
|
71
|
+
docs = [
|
72
|
+
Ruber[:world].new_document,
|
73
|
+
Ruber[:world].document(__FILE__),
|
74
|
+
Ruber[:world].document(File.join(File.dirname(__FILE__), 'common.rb')),
|
75
|
+
Ruber[:world].new_document,
|
76
|
+
]
|
77
|
+
flexmock(@env).should_receive(:documents).and_return(docs)
|
78
|
+
views = [
|
79
|
+
docs[1].create_view,
|
80
|
+
docs[0].create_view,
|
81
|
+
docs[3].create_view,
|
82
|
+
docs[2].create_view,
|
83
|
+
docs[1].create_view,
|
84
|
+
docs[0].create_view
|
85
|
+
]
|
86
|
+
tab1 = Ruber::Pane.new views[0]
|
87
|
+
tab1.split views[0], views[1], Qt::Vertical
|
88
|
+
tab1.split views[0], views[2], Qt::Horizontal
|
89
|
+
tab2 = Ruber::Pane.new views[3]
|
90
|
+
tab2.split views[3], views[4], Qt::Horizontal
|
91
|
+
tab3 = Ruber::Pane.new views[5]
|
92
|
+
flexmock(@env).should_receive(:tabs).and_return [tab1, tab2, tab3]
|
93
|
+
exp = [
|
94
|
+
[Qt::Vertical, [Qt::Horizontal, 'file://' + __FILE__, 1], 0],
|
95
|
+
[Qt::Horizontal, 'file://' + File.join(File.dirname(__FILE__), 'common.rb'), 'file://' + __FILE__],
|
96
|
+
[0]
|
97
|
+
]
|
98
|
+
sorted_views = [2,1,3,5,4].map{|i| views[i]}
|
99
|
+
flexmock(@env).should_receive(:views).and_return(sorted_views)
|
100
|
+
flexmock(@env).should_receive(:tab).with(sorted_views[0]).and_return tab1
|
101
|
+
@state.save_settings
|
102
|
+
@container[:state, @keys[:active_view]].should == [0, 1]
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'sets the active_view entry to nil if there is no view' do
|
106
|
+
docs = [
|
107
|
+
Ruber[:world].new_document,
|
108
|
+
Ruber[:world].document(__FILE__),
|
109
|
+
]
|
110
|
+
flexmock(@env).should_receive(:documents).and_return(docs)
|
111
|
+
@state.save_settings
|
112
|
+
@container[:state, @keys[:active_view]].should be_nil
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'stores the cursor position for each view in each tab in the cursor_positions entry' do
|
116
|
+
docs = [
|
117
|
+
Ruber[:world].new_document,
|
118
|
+
Ruber[:world].document(__FILE__),
|
119
|
+
Ruber[:world].document(File.join(File.dirname(__FILE__), 'common.rb')),
|
120
|
+
Ruber[:world].new_document,
|
121
|
+
]
|
122
|
+
flexmock(@env).should_receive(:documents).and_return docs
|
123
|
+
views = [
|
124
|
+
docs[1].create_view,
|
125
|
+
docs[0].create_view,
|
126
|
+
docs[3].create_view,
|
127
|
+
docs[2].create_view,
|
128
|
+
docs[1].create_view,
|
129
|
+
docs[0].create_view
|
130
|
+
]
|
131
|
+
tab1 = Ruber::Pane.new views[0]
|
132
|
+
tab1.split views[0], views[1], Qt::Vertical
|
133
|
+
tab1.split views[1], views[2], Qt::Horizontal
|
134
|
+
tab2 = Ruber::Pane.new views[3]
|
135
|
+
tab2.split views[3], views[4], Qt::Horizontal
|
136
|
+
tab3 = Ruber::Pane.new views[5]
|
137
|
+
cursor_positions = [
|
138
|
+
[[5, 1], [95,102], [1, 4]],
|
139
|
+
[[0,0], [45,93]],
|
140
|
+
[[12,42]]
|
141
|
+
]
|
142
|
+
i = 0
|
143
|
+
cursor_positions.each do |t|
|
144
|
+
t.each do |pos|
|
145
|
+
flexmock(views[i]).should_receive(:cursor_position).and_return(KTextEditor::Cursor.new(*pos))
|
146
|
+
i += 1
|
147
|
+
end
|
148
|
+
end
|
149
|
+
flexmock(@env).should_receive(:tabs).and_return [tab1, tab2, tab3]
|
150
|
+
@state.save_settings
|
151
|
+
@container[:state, @keys[:cursor_positions]].should == cursor_positions
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'stores an empty array under the cursor_positions entry if there is no view in the environment' do
|
155
|
+
docs = [
|
156
|
+
Ruber[:world].new_document,
|
157
|
+
Ruber[:world].document(__FILE__),
|
158
|
+
]
|
159
|
+
flexmock(@env).should_receive(:documents).and_return(docs)
|
160
|
+
@state.save_settings
|
161
|
+
@container[:state, @keys[:cursor_positions]].should == []
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
13
166
|
describe Ruber::State::Plugin do
|
14
167
|
|
15
168
|
before do
|
16
|
-
Ruber[:
|
169
|
+
Ruber[:world].close_all :all, :false
|
17
170
|
Ruber[:components].load_plugin 'plugins/state/'
|
171
|
+
Ruber[:world].close_all :all, :false
|
18
172
|
@plug = Ruber[:components][:state]
|
19
173
|
end
|
20
174
|
|
21
175
|
after do
|
176
|
+
Ruber[:world].close_all :all, :false
|
22
177
|
Ruber[:components].unload_plugin(:state)
|
23
178
|
end
|
24
179
|
|
@@ -43,38 +198,46 @@ describe Ruber::State::Plugin do
|
|
43
198
|
describe '#delayed_initialize' do
|
44
199
|
|
45
200
|
it 'calls the restore_last_state method if there\'s no open project and the only open document is pristine' do
|
46
|
-
Ruber[:
|
201
|
+
Ruber[:world].new_document
|
47
202
|
flexmock(@plug).should_receive(:restore_last_state).once
|
48
203
|
@plug.send :delayed_initialize
|
49
204
|
end
|
50
205
|
|
51
206
|
it 'doesn\'t call the restore_last_state method if there are open projects' do
|
52
207
|
prj = flexmock('project')
|
53
|
-
flexmock(Ruber[:
|
208
|
+
flexmock(Ruber[:world]).should_receive(:projects).once.and_return [prj]
|
54
209
|
flexmock(@plug).should_receive(:restore_last_state).never
|
55
210
|
@plug.send :delayed_initialize
|
56
211
|
end
|
57
212
|
|
58
213
|
it 'doesn\'t call the restore_last_state method if there is more than one open document' do
|
59
|
-
2.times{Ruber[:
|
214
|
+
2.times{Ruber[:world].new_document}
|
60
215
|
flexmock(@plug).should_receive(:restore_last_state).never
|
61
216
|
@plug.send :delayed_initialize
|
62
217
|
end
|
63
218
|
|
64
219
|
it 'doesn\'t call the restore_last_state method if there aren\'t open documents' do
|
220
|
+
flexmock(Ruber[:world]).should_receive(:documents).and_return []
|
65
221
|
flexmock(@plug).should_receive(:restore_last_state).never
|
66
222
|
@plug.send :delayed_initialize
|
67
223
|
end
|
68
224
|
|
69
225
|
it 'doesn\'t call the restore_last_state method if the only open document isn\'t pristine' do
|
70
|
-
doc = Ruber[:
|
226
|
+
doc = Ruber[:world].new_document
|
71
227
|
doc.text = 'xyz'
|
72
228
|
flexmock(@plug).should_receive(:restore_last_state).never
|
73
229
|
@plug.send :delayed_initialize
|
74
230
|
end
|
75
231
|
|
232
|
+
it 'passes the :force argument to restore_last_state if restoring session' do
|
233
|
+
Ruber[:world].new_document
|
234
|
+
flexmock(Ruber[:app]).should_receive(:sessionRestored?).and_return true
|
235
|
+
flexmock(@plug).should_receive(:restore_last_state).once.with(:force)
|
236
|
+
@plug.send :delayed_initialize
|
237
|
+
end
|
238
|
+
|
76
239
|
it 'does nothing if the application is already running' do
|
77
|
-
doc = Ruber[:
|
240
|
+
doc = Ruber[:world].new_document
|
78
241
|
flexmock(KDE::Application.instance).should_receive(:starting?).and_return false
|
79
242
|
flexmock(@plug).should_receive(:restore_last_state).never
|
80
243
|
@plug.send :delayed_initialize
|
@@ -82,827 +245,413 @@ describe Ruber::State::Plugin do
|
|
82
245
|
|
83
246
|
end
|
84
247
|
|
85
|
-
|
86
|
-
|
87
|
-
it 'stores a list with the project file of each open project under the :open_projects key' do
|
88
|
-
prjs = 5.times.map{|i| flexmock(i.to_s){|m| m.should_receive(:project_file).and_return i.to_s}}
|
89
|
-
flexmock(Ruber[:projects]).should_receive(:projects).once.and_return(prjs)
|
90
|
-
flexmock(Ruber[:projects]).should_receive(:current).once.and_return(nil)
|
91
|
-
@plug.send(:gather_settings).should have_entries(:open_projects => (0...5).map(&:to_s))
|
92
|
-
end
|
93
|
-
|
94
|
-
it 'puts the file corresponding to the open project at the beginning of the :open_projects entry' do
|
95
|
-
prjs = 5.times.map{|i| flexmock(i.to_s, :project_file => i.to_s)}
|
96
|
-
flexmock(Ruber[:projects]).should_receive(:projects).once.and_return(prjs)
|
97
|
-
flexmock(Ruber[:projects]).should_receive(:current).once.and_return prjs[2]
|
98
|
-
@plug.send(:gather_settings).should have_entries(:open_projects => %w[2 0 1 3 4])
|
99
|
-
end
|
100
|
-
|
101
|
-
it 'stores the project files in an arbitrary order if there\'s no active project' do
|
102
|
-
prjs = 5.times.map{|i| flexmock(i.to_s){|m| m.should_receive(:project_file).and_return i.to_s}}
|
103
|
-
flexmock(Ruber[:projects]).should_receive(:projects).once.and_return(prjs)
|
104
|
-
flexmock(Ruber[:projects]).should_receive(:current).once.and_return nil
|
105
|
-
@plug.send(:gather_settings).should have_entries(:open_projects => (0...5).map(&:to_s))
|
106
|
-
end
|
107
|
-
|
108
|
-
it 'stores an empty array under the :open_projects key if there are no open projects' do
|
109
|
-
@plug.send(:gather_settings).should have_entries(:open_projects => [])
|
110
|
-
end
|
111
|
-
|
112
|
-
it 'stores a list of the URLs of the files associated with all open documents under the :open_files key' do
|
113
|
-
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}")}}
|
114
|
-
flexmock(Ruber[:documents]).should_receive(:documents).once.and_return(docs)
|
115
|
-
exp = [
|
116
|
-
'file:///xyz/file%200',
|
117
|
-
'file:///xyz/file%201',
|
118
|
-
'file:///xyz/file%202',
|
119
|
-
'file:///xyz/file%203',
|
120
|
-
'file:///xyz/file%204',
|
121
|
-
]
|
122
|
-
@plug.send(:gather_settings).should have_entries(:open_documents => exp)
|
123
|
-
end
|
124
|
-
|
125
|
-
it 'stores nil in place of documents not associated with files' do
|
126
|
-
docs = 5.times.map do |i|
|
127
|
-
flexmock(i.to_s, :view => flexmock) do |m|
|
128
|
-
m.should_receive(:url).and_return(i % 2 == 0 ? KDE::Url.new("file:///xyz/file #{i}") : KDE::Url.new)
|
129
|
-
m.should_receive(:has_file?).and_return(i % 2 == 0)
|
130
|
-
end
|
131
|
-
end
|
132
|
-
flexmock(Ruber[:documents]).should_receive(:documents).once.and_return(docs)
|
133
|
-
exp = [
|
134
|
-
'file:///xyz/file%200',
|
135
|
-
nil,
|
136
|
-
'file:///xyz/file%202',
|
137
|
-
nil,
|
138
|
-
'file:///xyz/file%204',
|
139
|
-
]
|
140
|
-
@plug.send(:gather_settings).should have_entries(:open_documents => exp)
|
141
|
-
end
|
142
|
-
|
143
|
-
it 'stores an empty array under the :open_files key if there are no open documents' do
|
144
|
-
@plug.send(:gather_settings).should have_entries(:open_documents => [])
|
145
|
-
end
|
146
|
-
|
147
|
-
it 'stores a tree of the open editors for each tab under the tabs entry' do
|
148
|
-
docs = [nil, __FILE__, File.join(File.dirname(__FILE__), 'common.rb'), nil].map! do |f|
|
149
|
-
f ? Ruber[:documents].document(f) : Ruber[:documents].new_document
|
150
|
-
end
|
151
|
-
views = [
|
152
|
-
docs[1].create_view,
|
153
|
-
docs[0].create_view,
|
154
|
-
docs[3].create_view,
|
155
|
-
docs[2].create_view,
|
156
|
-
docs[1].create_view,
|
157
|
-
docs[0].create_view
|
158
|
-
]
|
159
|
-
tab1 = Ruber::Pane.new views[0]
|
160
|
-
tab1.split views[0], views[1], Qt::Vertical
|
161
|
-
tab1.split views[0], views[2], Qt::Horizontal
|
162
|
-
tab2 = Ruber::Pane.new views[3]
|
163
|
-
tab2.split views[3], views[4], Qt::Horizontal
|
164
|
-
tab3 = Ruber::Pane.new views[5]
|
165
|
-
flexmock(Ruber[:main_window]).should_receive(:tabs).once.and_return [tab1, tab2, tab3]
|
166
|
-
exp = [
|
167
|
-
[Qt::Vertical, [Qt::Horizontal, 'file://' + __FILE__, 1], 0],
|
168
|
-
[Qt::Horizontal, 'file://' + File.join(File.dirname(__FILE__), 'common.rb'), 'file://' + __FILE__],
|
169
|
-
[0]
|
170
|
-
]
|
171
|
-
@plug.send(:gather_settings)[:tabs].should == exp
|
172
|
-
end
|
248
|
+
context 'when saving settings' do
|
173
249
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
@plug.send(:gather_settings)[:tabs].should == exp
|
250
|
+
before :all do
|
251
|
+
@keys = {
|
252
|
+
:tabs => :default_environment_tabs,
|
253
|
+
:active_view => :default_environment_active_view,
|
254
|
+
:cursor_positions => :default_environment_cursor_positions
|
255
|
+
}
|
181
256
|
end
|
182
257
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
@
|
189
|
-
|
190
|
-
|
191
|
-
it 'stores the active view as an array of integers referring to the tabs entry in the active_view entry' do
|
192
|
-
docs = [
|
193
|
-
Ruber[:documents].new_document,
|
194
|
-
Ruber[:documents].document(__FILE__),
|
195
|
-
Ruber[:documents].document(File.join(File.dirname(__FILE__), 'common.rb')),
|
196
|
-
Ruber[:documents].new_document,
|
197
|
-
]
|
198
|
-
views = [
|
199
|
-
docs[1].create_view,
|
200
|
-
docs[0].create_view,
|
201
|
-
docs[3].create_view,
|
202
|
-
docs[2].create_view,
|
203
|
-
docs[1].create_view,
|
204
|
-
docs[0].create_view
|
205
|
-
]
|
206
|
-
tab1 = Ruber::Pane.new views[0]
|
207
|
-
tab1.split views[0], views[1], Qt::Vertical
|
208
|
-
tab1.split views[0], views[2], Qt::Horizontal
|
209
|
-
tab2 = Ruber::Pane.new views[3]
|
210
|
-
tab2.split views[3], views[4], Qt::Horizontal
|
211
|
-
tab3 = Ruber::Pane.new views[5]
|
212
|
-
flexmock(Ruber[:main_window]).should_receive(:tabs).once.and_return [tab1, tab2, tab3]
|
213
|
-
exp = [
|
214
|
-
[Qt::Vertical, [Qt::Horizontal, 'file://' + __FILE__, 1], 0],
|
215
|
-
[Qt::Horizontal, 'file://' + File.join(File.dirname(__FILE__), 'common.rb'), 'file://' + __FILE__],
|
216
|
-
[0]
|
217
|
-
]
|
218
|
-
flexmock(Ruber[:main_window]).should_receive(:active_editor).and_return(views[2])
|
219
|
-
flexmock(Ruber[:main_window]).should_receive(:tab).with(views[2]).and_return tab1
|
220
|
-
@plug.send(:gather_settings)[:active_view].should == [0,1]
|
221
|
-
end
|
222
|
-
|
223
|
-
it 'sets the active_view entry to nil if there isn\'t an active editor' do
|
224
|
-
docs = [
|
225
|
-
Ruber[:documents].new_document,
|
226
|
-
Ruber[:documents].document(__FILE__),
|
227
|
-
]
|
228
|
-
@plug.send(:gather_settings)[:active_view].should be_nil
|
229
|
-
end
|
230
|
-
|
231
|
-
it 'stores the cursor position for each view in each tab in the cursor_positions entry' do
|
232
|
-
docs = [
|
233
|
-
Ruber[:documents].new_document,
|
234
|
-
Ruber[:documents].document(__FILE__),
|
235
|
-
Ruber[:documents].document(File.join(File.dirname(__FILE__), 'common.rb')),
|
236
|
-
Ruber[:documents].new_document,
|
237
|
-
]
|
238
|
-
views = [
|
239
|
-
docs[1].create_view,
|
240
|
-
docs[0].create_view,
|
241
|
-
docs[3].create_view,
|
242
|
-
docs[2].create_view,
|
243
|
-
docs[1].create_view,
|
244
|
-
docs[0].create_view
|
245
|
-
]
|
246
|
-
tab1 = Ruber::Pane.new views[0]
|
247
|
-
tab1.split views[0], views[1], Qt::Vertical
|
248
|
-
tab1.split views[1], views[2], Qt::Horizontal
|
249
|
-
tab2 = Ruber::Pane.new views[3]
|
250
|
-
tab2.split views[3], views[4], Qt::Horizontal
|
251
|
-
tab3 = Ruber::Pane.new views[5]
|
252
|
-
cursor_positions = [
|
253
|
-
[[5, 1], [95,102], [1, 4]],
|
254
|
-
[[0,0], [45,93]],
|
255
|
-
[[12,42]]
|
256
|
-
]
|
257
|
-
i = 0
|
258
|
-
cursor_positions.each do |t|
|
259
|
-
t.each do |pos|
|
260
|
-
flexmock(views[i]).should_receive(:cursor_position).and_return(KTextEditor::Cursor.new(*pos))
|
261
|
-
i += 1
|
262
|
-
end
|
263
|
-
end
|
264
|
-
flexmock(Ruber[:main_window]).should_receive(:tabs).once.and_return [tab1, tab2, tab3]
|
265
|
-
@plug.send(:gather_settings)[:cursor_positions].should == cursor_positions
|
266
|
-
end
|
267
|
-
|
268
|
-
end
|
269
|
-
|
270
|
-
describe '#save_settings' do
|
271
|
-
|
272
|
-
it 'stores the value corresponding to the :open_projects key in the hash returned by gather_settings in the state/open_projects setting' do
|
273
|
-
flexmock(@plug).should_receive(:gather_settings).once.and_return(:open_projects => %w[x y z])
|
274
|
-
flexmock(Ruber[:config]).should_receive(:[]=).with(:state, :open_projects, %w[x y z]).once
|
275
|
-
flexmock(Ruber[:config]).should_receive(:[]=)
|
276
|
-
@plug.save_settings
|
258
|
+
before do
|
259
|
+
@files = [nil, '/prj1.ruprj', '/prj2.ruprj']
|
260
|
+
@prjs = @files.map{|f| f ? flexmock(:project_file => f) : nil}
|
261
|
+
@envs = @prjs.map{|pr| flexmock :project => pr}
|
262
|
+
@state = @plug
|
263
|
+
@container = Ruber[:config]
|
264
|
+
@env = Ruber[:world].default_environment
|
277
265
|
end
|
278
266
|
|
279
|
-
|
280
|
-
|
281
|
-
flexmock(Ruber[:
|
282
|
-
|
267
|
+
|
268
|
+
it 'lists the active environment as first element under the state/last_state key' do
|
269
|
+
flexmock(Ruber[:world]).should_receive(:active_environment).and_return(@envs[1])
|
270
|
+
exp = [@files[1], @files[0], @files[2]]
|
271
|
+
flexmock(Ruber[:world]).should_receive(:environments).and_return @envs
|
283
272
|
@plug.save_settings
|
273
|
+
Ruber[:config][:state, :last_state].should == exp
|
284
274
|
end
|
285
275
|
|
286
|
-
it '
|
287
|
-
flexmock(
|
288
|
-
flexmock(Ruber[:
|
289
|
-
flexmock(Ruber[:config]).should_receive(:[]=)
|
276
|
+
it 'puts the default environment as first element of the state/last_state entry if there\'s no active environment' do
|
277
|
+
flexmock(Ruber[:world]).should_receive(:active_environment).and_return(nil)
|
278
|
+
flexmock(Ruber[:world]).should_receive(:environments).and_return @envs
|
290
279
|
@plug.save_settings
|
280
|
+
Ruber[:config][:state, :last_state].should == @files
|
291
281
|
end
|
292
282
|
|
293
|
-
|
294
|
-
flexmock(@plug).should_receive(:gather_settings).once.and_return(:tabs => [Qt::Horizontal, 'file://'+__FILE__, 0])
|
295
|
-
flexmock(Ruber[:config]).should_receive(:[]=).with(:state, :tabs, [Qt::Horizontal, 'file://'+__FILE__, 0]).once
|
296
|
-
flexmock(Ruber[:config]).should_receive(:[]=)
|
297
|
-
@plug.save_settings
|
298
|
-
|
299
|
-
end
|
283
|
+
it_behaves_like 'a component of the state plugin saving an environment'
|
300
284
|
|
301
285
|
end
|
302
286
|
|
303
|
-
|
304
|
-
|
305
|
-
it 'returns the value of the state/restore_cursor_position config entry if the @force_restore_cursor_position instance variable is nil' do
|
306
|
-
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :restore_cursor_position).once.and_return(true)
|
307
|
-
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :restore_cursor_position).once.and_return(false)
|
308
|
-
@plug.instance_variable_set :@force_restore_cursor_position, nil
|
309
|
-
@plug.restore_cursor_position?.should == true
|
310
|
-
@plug.restore_cursor_position?.should == false
|
311
|
-
end
|
287
|
+
context 'when restoring an environment' do
|
312
288
|
|
313
|
-
it '
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
289
|
+
it 'closes all the editors in the environment' do
|
290
|
+
data = {
|
291
|
+
:tabs => [],
|
292
|
+
:cursor_positions => []
|
293
|
+
}
|
294
|
+
env = Ruber[:world].default_environment
|
295
|
+
env.editor_for! __FILE__
|
296
|
+
@plug.send :restore_environment, env, data
|
297
|
+
env.tabs.should be_empty
|
298
|
+
end
|
299
|
+
|
300
|
+
it 'recreates the tabs contained in the environment' do
|
301
|
+
data = {
|
302
|
+
:tabs => [
|
303
|
+
[Qt::Vertical, 0, 1, 'file://'+__FILE__],
|
304
|
+
[Qt::Horizontal, [Qt::Vertical, 1,0], 'file://'+__FILE__]
|
305
|
+
],
|
306
|
+
:cursor_positions => []
|
307
|
+
}
|
308
|
+
env = Ruber[:world].default_environment
|
309
|
+
@plug.send :restore_environment, env, data
|
310
|
+
env.tabs.count.should == 2
|
311
|
+
env.tabs[0].panes.map{|pn| pn.view.document.path}.should == ['', '', __FILE__]
|
312
|
+
env.tabs[1].views.map{|v| v.document.path}.should == ['', '', __FILE__]
|
313
|
+
env.tabs[0].views[1].document.should == env.tabs[1].views[0].document
|
314
|
+
env.tabs[1].views[0].document.should == env.tabs[0].views[1].document
|
315
|
+
env.tabs[0].views[0].document.should_not == env.tabs[0].views[1].document
|
316
|
+
end
|
317
|
+
|
318
|
+
it 'creates empty documents for local files which do not exist' do
|
319
|
+
data = {
|
320
|
+
:tabs => [[Qt::Vertical, 0, 'file://'+__FILE__, 'file:///xyz.rb']],
|
321
|
+
:cursor_positions => [],
|
322
|
+
:active_view => [0,0]
|
323
|
+
}
|
324
|
+
env = Ruber[:world].default_environment
|
325
|
+
lambda{@plug.send :restore_environment, env, data}.should_not raise_error
|
326
|
+
env.views[2].document.should be_pristine
|
319
327
|
end
|
320
328
|
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
@plug.
|
329
|
-
|
330
|
-
@plug.restore_project_files?.should == false
|
329
|
+
it 'creates empty documents for remote files which do not exist' do
|
330
|
+
data = {
|
331
|
+
:tabs => [[Qt::Vertical, 0, 'file://'+__FILE__, 'http:///xyz.org/abc.txt']],
|
332
|
+
:cursor_positions => [],
|
333
|
+
:active_view => [0,0]
|
334
|
+
}
|
335
|
+
env = Ruber[:world].default_environment
|
336
|
+
lambda{@plug.send :restore_environment, env, data}.should_not raise_error
|
337
|
+
env.views[2].document.should be_pristine
|
331
338
|
end
|
332
339
|
|
333
|
-
it '
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
340
|
+
it 'activates the view which was active last time' do
|
341
|
+
data = {
|
342
|
+
:tabs => [
|
343
|
+
[Qt::Vertical, 0, 1, 'file://'+__FILE__],
|
344
|
+
[Qt::Horizontal, [Qt::Vertical, 1,0], 'file://'+__FILE__]
|
345
|
+
],
|
346
|
+
:cursor_positions => [],
|
347
|
+
:active_view => [1,2]
|
348
|
+
}
|
349
|
+
env = Ruber[:world].default_environment
|
350
|
+
@plug.send :restore_environment, env, data
|
351
|
+
env.views[0].should == env.tabs[1].panes[1].view
|
339
352
|
end
|
340
353
|
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
:
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
354
|
+
it 'moves the cursor of each view to the position it was last time' do
|
355
|
+
positions = [
|
356
|
+
[[10,5]],
|
357
|
+
[[78,12]]
|
358
|
+
]
|
359
|
+
data = {
|
360
|
+
:tabs => [
|
361
|
+
[Qt::Vertical,'file://'+__FILE__],
|
362
|
+
[Qt::Horizontal, 'file://'+__FILE__]
|
363
|
+
],
|
364
|
+
:cursor_positions => positions
|
365
|
+
}
|
366
|
+
doc = Ruber[:world].document __FILE__
|
367
|
+
views = Array.new(2){doc.create_view}
|
368
|
+
views.each do |v|
|
369
|
+
flexmock(doc).should_receive(:create_view).once.and_return v
|
370
|
+
end
|
371
|
+
flexmock(views[0]).should_receive(:go_to).once.with(*positions[0][0])
|
372
|
+
flexmock(views[1]).should_receive(:go_to).once.with(*positions[1][0])
|
373
|
+
@plug.send :restore_environment, Ruber[:world].default_environment, data
|
374
|
+
end
|
375
|
+
|
376
|
+
it 'gives focus to the active window' do
|
377
|
+
data = {
|
378
|
+
:tabs => [
|
379
|
+
[Qt::Vertical,'file://'+__FILE__],
|
380
|
+
[Qt::Horizontal, 'file://'+__FILE__]
|
381
|
+
],
|
382
|
+
:cursor_positions => [],
|
383
|
+
:active_view => [1,0]
|
384
|
+
}
|
385
|
+
doc = Ruber[:world].document __FILE__
|
386
|
+
views = Array.new(2){doc.create_view}
|
387
|
+
views.each do |v|
|
388
|
+
flexmock(doc).should_receive(:create_view).once.and_return v
|
389
|
+
end
|
390
|
+
flexmock(views[1]).should_receive(:set_focus).at_least.once
|
391
|
+
@plug.send :restore_environment, Ruber[:world].default_environment, data
|
392
|
+
|
355
393
|
end
|
356
394
|
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
'State' => {
|
364
|
-
:open_projects => %w[a b c],
|
365
|
-
:open_documents => %w[x y z],
|
366
|
-
:tabs => [Qt::Horizontal, 'file://'+__FILE__, 0],
|
367
|
-
:active_view => [0,0]
|
368
|
-
}
|
369
|
-
}
|
370
|
-
exp_hash = {
|
371
|
-
[:state, :open_projects] => %w[a b c],
|
372
|
-
[:state, :open_documents] => %w[x y z],
|
373
|
-
[:state, :active_view] => [0,0],
|
374
|
-
[:state, :tabs] => [Qt::Horizontal, 'file://'+__FILE__, 0],
|
375
|
-
}
|
376
|
-
default = {:open_projects => [], :open_documents => [], :active_document => nil}
|
377
|
-
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
|
378
|
-
flexmock(@plug).should_receive(:restore).with(FlexMock.on{|a| a == exp_hash and a[:state, :open_projects] == %w[a b c]}).once
|
379
|
-
@plug.restore_session hash
|
395
|
+
it 'does nothing if there are no views' do
|
396
|
+
Ruber[:config][:state, :startup_behaviour] = [:default_environment]
|
397
|
+
Ruber[:config][:state, :default_environment_tabs] = []
|
398
|
+
Ruber[:config][:state, :default_environment_active_view] = nil
|
399
|
+
@plug.send :restore_environment, Ruber[:world].default_environment, :tabs => [], :cursor_positions => []
|
400
|
+
Ruber[:world].default_environment.tabs.should be_empty
|
380
401
|
end
|
381
402
|
|
382
403
|
end
|
383
404
|
|
384
|
-
describe '#
|
405
|
+
describe '#restore_last_state' do
|
385
406
|
|
386
|
-
|
407
|
+
context 'when called with no arguments' do
|
387
408
|
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
it 'calls the block without changing the @force_restore_cursor_position instance variable if the :restore_cursor_position entry isn\'t given' do
|
405
|
-
restore_doc = true
|
406
|
-
@plug.with({}){restore_doc = @plug.instance_variable_get(:@force_restore_cursor_position)}
|
407
|
-
restore_doc.should be_nil
|
408
|
-
end
|
409
|
-
|
410
|
-
it 'sets the @force_restore_cursor_position back to nil after executing the block, even if the block raises an exception' do
|
411
|
-
@plug.with(:restore_cursor_position => true){@plug.instance_variable_get(:@force_restore_cursor_position).should be_true}
|
412
|
-
@plug.instance_variable_get(:@force_restore_cursor_position).should be_nil
|
413
|
-
@plug.with(:restore_cursor_position => false){@plug.instance_variable_get(:@force_restore_cursor_position).should == false}
|
414
|
-
@plug.instance_variable_get(:@force_restore_cursor_position).should be_nil
|
415
|
-
begin @plug.with(:restore_cursor_position => true){raise Exception}
|
416
|
-
rescue Exception
|
409
|
+
context 'if the state/startup_behaviour config option contains :default_environment' do
|
410
|
+
|
411
|
+
it 'restores the default environment' do
|
412
|
+
data = {
|
413
|
+
:tabs => [[Qt::Vertical, 0, 'file://'+__FILE__]],
|
414
|
+
:cursor_positions => [[2,3], [4,5]],
|
415
|
+
:active_view => [0,1]
|
416
|
+
}
|
417
|
+
cfg = Ruber[:config][:state]
|
418
|
+
cfg[:startup_behaviour] = [:default_environment]
|
419
|
+
cfg[:default_environment_tabs] = data[:tabs]
|
420
|
+
cfg[:default_environment_cursor_positions] = data[:cursor_positions]
|
421
|
+
cfg[:default_environment_active_view] = data[:active_view]
|
422
|
+
flexmock(@plug).should_receive(:restore_environment).with(Ruber[:world].default_environment, data).once
|
423
|
+
@plug.send(:restore_last_state)
|
417
424
|
end
|
418
|
-
|
425
|
+
|
419
426
|
end
|
420
427
|
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
@plug.
|
430
|
-
@plug.
|
431
|
-
restore.should == 'x'
|
428
|
+
context 'if the state/startup_behaviour config option doesn\'t contain :default_environment' do
|
429
|
+
|
430
|
+
it 'doesn\'t recreate the tabs in the default environment' do
|
431
|
+
Ruber[:config][:state, :startup_behaviour] = []
|
432
|
+
Ruber[:config][:state, :default_environment_tabs] = [
|
433
|
+
[Qt::Vertical, 0, 1, 'file://'+__FILE__],
|
434
|
+
[Qt::Horizontal, [Qt::Vertical, 1,0], 'file://'+__FILE__]
|
435
|
+
]
|
436
|
+
@plug.send(:restore_last_state)
|
437
|
+
flexmock(@plug).should_receive(:restore_environment).never
|
432
438
|
end
|
433
|
-
|
439
|
+
|
434
440
|
end
|
435
441
|
|
436
|
-
|
442
|
+
context 'if the state/startup_behaviour config option contains :projects' do
|
437
443
|
|
438
444
|
before do
|
439
|
-
@
|
445
|
+
@project_files = Array.new(3) do |i|
|
446
|
+
file = Tempfile.new ['', 'ruprj']
|
447
|
+
file.write YAML.dump(:general => {:project_name => "project #{i}"})
|
448
|
+
file.flush
|
449
|
+
file
|
450
|
+
end
|
440
451
|
end
|
441
452
|
|
442
|
-
|
443
|
-
|
444
|
-
@plug.with(:restore_cursor_position => 'x', :force => true){restore_doc = @plug.instance_variable_get(:@force_restore_cursor_position)}
|
445
|
-
restore_doc.should == 'x'
|
453
|
+
after do
|
454
|
+
Ruber[:world].close_all(:projects, :discard)
|
446
455
|
end
|
447
456
|
|
448
|
-
it '
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
@plug.with(:restore_cursor_position => nil, :force => true){restore_doc = @plug.instance_variable_get(:@force_restore_cursor_position)}
|
455
|
-
restore_doc.should == false
|
457
|
+
it 'opens the projects listed under the state/last_state config option' do
|
458
|
+
exp = @project_files.map &:path
|
459
|
+
Ruber[:config][:state, :startup_behaviour] = [:projects]
|
460
|
+
Ruber[:config][:state, :last_state] = exp
|
461
|
+
@plug.send :restore_last_state
|
462
|
+
Ruber[:world].projects.map(&:project_file).should == exp
|
456
463
|
end
|
457
464
|
|
458
|
-
it '
|
459
|
-
|
460
|
-
@
|
461
|
-
|
465
|
+
it 'ignores any project whose project file doesn\'t exist' do
|
466
|
+
files = @project_files.map &:path
|
467
|
+
@project_files[1].close!
|
468
|
+
Ruber[:config][:state, :startup_behaviour] = [:projects]
|
469
|
+
Ruber[:config][:state, :last_state] = files
|
470
|
+
exp = files.dup
|
471
|
+
exp.delete_at(1)
|
472
|
+
@plug.send :restore_last_state
|
473
|
+
Ruber[:world].projects.map(&:project_file).should == exp
|
462
474
|
end
|
463
475
|
|
464
|
-
it '
|
465
|
-
@
|
466
|
-
@
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
@plug.
|
473
|
-
|
474
|
-
|
475
|
-
end
|
476
|
-
|
477
|
-
end
|
478
|
-
|
479
|
-
describe ', when the @force_restore_cursor_position instance variable is nil' do
|
480
|
-
|
481
|
-
it 'calls the given block after setting the @force_restore_project_files instance variable to the :restore_cursor_position entry if the entry is a true value' do
|
482
|
-
restore_doc = nil
|
483
|
-
@plug.with(:restore_cursor_position => 'x'){restore_doc = @plug.instance_variable_get(:@force_restore_cursor_position)}
|
484
|
-
restore_doc.should == 'x'
|
485
|
-
end
|
486
|
-
|
487
|
-
it 'calls the given block after setting the @force_restore_project_files instance variable to false if the :restore_cursor_position entry is given and is a false value' do
|
488
|
-
restore_doc = nil
|
489
|
-
@plug.with(:restore_cursor_position => false){restore_doc = @plug.instance_variable_get(:@force_restore_cursor_position)}
|
490
|
-
restore_doc.should == false
|
491
|
-
restore_doc = nil
|
492
|
-
@plug.instance_variable_set :@force_restore_cursor_position, nil
|
493
|
-
@plug.with(:restore_cursor_position => nil){restore_doc = @plug.instance_variable_get(:@force_restore_cursor_position)}
|
494
|
-
restore_doc.should == false
|
495
|
-
end
|
496
|
-
|
497
|
-
it 'calls the block without changing the @force_restore_cursor_position instance variable if the :restore_cursor_position entry isn\'t given' do
|
498
|
-
restore_doc = true
|
499
|
-
@plug.with({}){restore_doc = @plug.instance_variable_get(:@force_restore_cursor_position)}
|
500
|
-
restore_doc.should be_nil
|
501
|
-
end
|
502
|
-
|
503
|
-
it 'sets the @force_restore_cursor_position back to nil after executing the block, even if the block raises an exception' do
|
504
|
-
@plug.with(:restore_cursor_position => true){@plug.instance_variable_get(:@force_restore_cursor_position).should be_true}
|
505
|
-
@plug.instance_variable_get(:@force_restore_cursor_position).should be_nil
|
506
|
-
@plug.with(:restore_cursor_position => false){@plug.instance_variable_get(:@force_restore_cursor_position).should == false}
|
507
|
-
@plug.instance_variable_get(:@force_restore_cursor_position).should be_nil
|
508
|
-
begin @plug.with(:restore_cursor_position => true){raise Exception}
|
509
|
-
rescue Exception
|
476
|
+
it 'ignores any project whose project file is invalid' do
|
477
|
+
@project_files[1] << "\n{"
|
478
|
+
@project_files[1].flush
|
479
|
+
files = @project_files.map &:path
|
480
|
+
Ruber[:config][:state, :startup_behaviour] = [:projects]
|
481
|
+
Ruber[:config][:state, :last_state] = files
|
482
|
+
exp = files.dup
|
483
|
+
exp.delete_at(1)
|
484
|
+
@plug.send :restore_last_state
|
485
|
+
Ruber[:world].projects.map(&:project_file).should == exp
|
510
486
|
end
|
511
|
-
@plug.instance_variable_get(:@force_restore_cursor_position).should be_nil
|
512
|
-
end
|
513
|
-
|
514
|
-
end
|
515
|
-
|
516
|
-
describe ', when the @force_restore_project_files instance variable is not nil' do
|
517
|
-
|
518
|
-
describe ' and the :force entry isn\'t true' do
|
519
|
-
|
520
|
-
it 'calls the block without changing the value of the @force_restore_project_files instance variable' do
|
521
|
-
restore = nil
|
522
|
-
@plug.instance_variable_set(:@force_restore_project_files, 'x')
|
523
|
-
@plug.with(:restore_project_files => 'y'){restore = @plug.instance_variable_get(:@force_restore_project_files)}
|
524
|
-
restore.should == 'x'
|
525
|
-
end
|
526
|
-
|
527
|
-
end
|
528
|
-
|
529
|
-
describe ' and the :force entry is true' do
|
530
487
|
|
531
|
-
|
532
|
-
@
|
488
|
+
it 'restores all opened projects' do
|
489
|
+
files = @project_files.map &:path
|
490
|
+
prjs = @project_files.map{|f| Ruber[:world].project(f.path)}
|
491
|
+
prjs.each do |prj|
|
492
|
+
flexmock(@plug).should_receive(:restore_environment).with( Ruber[:world].environment(prj), Hash).once
|
493
|
+
end
|
494
|
+
Ruber[:config][:state, :startup_behaviour] = [:projects]
|
495
|
+
Ruber[:config][:state, :last_state] = files
|
496
|
+
@plug.send :restore_last_state
|
533
497
|
end
|
534
498
|
|
535
|
-
it '
|
536
|
-
|
537
|
-
|
538
|
-
|
499
|
+
it 'activates the project which is listed first in the state/last_state option' do
|
500
|
+
files = @project_files.map &:path
|
501
|
+
Ruber[:config][:state, :startup_behaviour] = [:projects]
|
502
|
+
Ruber[:config][:state, :last_state] = files
|
503
|
+
@plug.send :restore_last_state
|
504
|
+
Ruber[:world].active_project.should == Ruber[:world].project(files[0])
|
539
505
|
end
|
540
506
|
|
541
|
-
it '
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
@plug.with(:restore_project_files => nil, :force => true){restore_prj = @plug.instance_variable_get(:@force_restore_project_files)}
|
548
|
-
restore_prj.should == false
|
507
|
+
it 'activates the default environment if the first entry of the state/last_state option is nil' do
|
508
|
+
files = @project_files.map(&:path).unshift nil
|
509
|
+
Ruber[:config][:state, :startup_behaviour] = [:projects]
|
510
|
+
Ruber[:config][:state, :last_state] = files
|
511
|
+
@plug.send :restore_last_state
|
512
|
+
Ruber[:world].active_project.should be_nil
|
549
513
|
end
|
550
514
|
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
restore_prj.should == 'y'
|
555
|
-
end
|
515
|
+
end
|
516
|
+
|
517
|
+
context 'if the state/startup_behaviour config option doesn\'t contain :projects' do
|
556
518
|
|
557
|
-
it '
|
558
|
-
|
559
|
-
|
560
|
-
@plug.
|
561
|
-
@plug.instance_variable_get(:@force_restore_project_files).should == 'y'
|
562
|
-
begin @plug.with(:restore_project_files => true, :force => true){raise Exception}
|
563
|
-
rescue Exception
|
564
|
-
end
|
565
|
-
@plug.instance_variable_get(:@force_restore_project_files).should == 'y'
|
519
|
+
it 'doesn\'t attempt to open other projects' do
|
520
|
+
Ruber[:config][:state, :startup_behaviour] = []
|
521
|
+
flexmock(Ruber[:world]).should_receive(:project).never
|
522
|
+
@plug.send :restore_last_state
|
566
523
|
end
|
567
524
|
|
568
525
|
end
|
569
526
|
|
570
527
|
end
|
571
528
|
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
end
|
581
|
-
|
582
|
-
end
|
583
|
-
|
584
|
-
describe '#restore_project' do
|
585
|
-
|
586
|
-
it 'calls the project\'s state extension\'s restore method' do
|
587
|
-
ext = flexmock('extension'){|m| m.should_receive(:restore).once}
|
588
|
-
prj = flexmock('prj'){|m| m.should_receive(:extension).once.with(:state).and_return ext}
|
589
|
-
@plug.restore_project prj
|
590
|
-
end
|
591
|
-
|
592
|
-
end
|
593
|
-
|
594
|
-
describe '#restore_projects' do
|
595
|
-
|
596
|
-
it 'closes all projects' do
|
597
|
-
prjs = 3.times.map{|i| flexmock(i.to_s)}
|
598
|
-
prjs.each{|pr| flexmock(Ruber[:projects]).should_receive(:close_project).with(pr).once}
|
599
|
-
flexmock(Ruber[:projects]).should_receive(:to_a).once.and_return(prjs)
|
600
|
-
@plug.restore_projects
|
601
|
-
end
|
602
|
-
|
603
|
-
it 'uses the safe_open_project method of the main window to open the first entry of the state/open_projects setting' do
|
604
|
-
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :open_projects).once.and_return %w[/x/y/z.ruprj /a/b/c.ruprj]
|
605
|
-
prj = flexmock('project', :project_file => '/x/y/z.ruprj')
|
606
|
-
flexmock(Ruber[:main_window]).should_receive(:safe_open_project).once.with('/x/y/z.ruprj').and_return prj
|
607
|
-
flexmock(Ruber[:projects]).should_receive(:current_project=)
|
608
|
-
@plug.restore_projects
|
609
|
-
end
|
610
|
-
|
611
|
-
it 'activates the project returned by safe_open_project' do
|
612
|
-
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :open_projects).once.and_return %w[/x/y/z.ruprj /a/b/c.ruprj]
|
613
|
-
prj = flexmock('project')
|
614
|
-
flexmock(Ruber[:main_window]).should_receive(:safe_open_project).once.with('/x/y/z.ruprj').and_return prj
|
615
|
-
flexmock(Ruber[:projects]).should_receive(:current_project=).once.with(prj)
|
616
|
-
@plug.restore_projects
|
617
|
-
end
|
618
|
-
|
619
|
-
it 'doesn\'t attempt to activate the project if safe_open_project returned nil' do
|
620
|
-
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :open_projects).once.and_return %w[/x/y/z.ruprj /a/b/c.ruprj]
|
621
|
-
prj = flexmock('project')
|
622
|
-
flexmock(Ruber[:main_window]).should_receive(:safe_open_project).once.with('/x/y/z.ruprj').and_return nil
|
623
|
-
flexmock(Ruber[:projects]).should_receive(:current_project=).never
|
624
|
-
lambda{@plug.restore_projects}.should_not raise_error
|
625
|
-
end
|
626
|
-
|
627
|
-
it 'does nothing if the state/open_projects setting is empty' do
|
628
|
-
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :open_projects).once.and_return []
|
629
|
-
prj = flexmock('project')
|
630
|
-
flexmock(Ruber[:projects]).should_receive(:project).never
|
631
|
-
flexmock(Ruber[:projects]).should_receive(:current_project=).never
|
632
|
-
@plug.restore_projects
|
633
|
-
end
|
634
|
-
|
635
|
-
it 'reads the settings from the argument, if given, rather than from the config object' do
|
636
|
-
flexmock(Ruber[:config]).should_receive(:[]).never
|
637
|
-
h = {[:state, :open_projects] => ['/x/y/z.ruprj']}
|
638
|
-
def h.[] group, name
|
639
|
-
super [group, name]
|
640
|
-
end
|
641
|
-
prj = flexmock('project')
|
642
|
-
flexmock(Ruber[:main_window]).should_receive(:safe_open_project).once.with('/x/y/z.ruprj').and_return prj
|
643
|
-
flexmock(Ruber[:projects]).should_receive(:current_project=).once.with(prj)
|
644
|
-
@plug.restore_projects h
|
645
|
-
end
|
646
|
-
|
647
|
-
end
|
648
|
-
|
649
|
-
describe '#restore_documents' do
|
650
|
-
|
651
|
-
it 'closes all open documents' do
|
652
|
-
flexmock(Ruber[:documents]).should_receive(:close_all).once.and_return true
|
653
|
-
@plug.restore_documents
|
654
|
-
end
|
655
|
-
|
656
|
-
it 'does nothing if the user chooses to abort closing the documents' do
|
657
|
-
flexmock(Ruber[:documents]).should_receive(:close_all).once.and_return false
|
658
|
-
files = [__FILE__, File.join(File.dirname(__FILE__), 'common.rb'), File.join(File.dirname(__FILE__), 'framework.rb')].map{|f| "file://#{f}"}
|
659
|
-
Ruber[:config][:state, :open_documents] = files
|
660
|
-
flexmock(Ruber[:documents]).should_receive(:document).never
|
661
|
-
@plug.restore_documents
|
662
|
-
end
|
663
|
-
|
664
|
-
it 'creates a new document for each entry in the state/open_documents' do
|
665
|
-
files = [__FILE__, File.join(File.dirname(__FILE__), 'common.rb'), File.join(File.dirname(__FILE__), 'framework.rb')].map{|f| "file://#{f}"}
|
666
|
-
Ruber[:config][:state, :open_documents] = files
|
667
|
-
@plug.restore_documents
|
668
|
-
Ruber[:documents].count.should == files.count
|
669
|
-
Ruber[:documents].each_with_index do |doc, i|
|
670
|
-
doc.url.url.should == files[i]
|
671
|
-
end
|
672
|
-
end
|
673
|
-
|
674
|
-
it 'creates empty documents for numeric entries under the state/open_documents key' do
|
675
|
-
files = [0, 'file:///x/y/f1.rb', 'file:///a/b/f2.rb', 2]
|
676
|
-
Ruber[:config][:state, :open_documents] = files
|
677
|
-
flexmock(Ruber[:documents]).should_receive(:new_document).once.ordered
|
678
|
-
flexmock(Ruber[:documents]).should_receive(:document).once.with(KDE::Url.new(files[1])).ordered
|
679
|
-
flexmock(Ruber[:documents]).should_receive(:document).once.with(KDE::Url.new(files[2])).ordered
|
680
|
-
flexmock(Ruber[:documents]).should_receive(:new_document).once.ordered
|
681
|
-
flexmock(Ruber[:main_window]).should_receive(:without_activating)
|
682
|
-
@plug.restore_documents
|
683
|
-
end
|
684
|
-
|
685
|
-
it 'creates a tab for each array in the :tabs entry if all of them contain a single element' do
|
686
|
-
docs = [nil, __FILE__, File.join(File.dirname(__FILE__), 'common.rb'), nil].map{|f| f ? 'file://' + f : nil}
|
687
|
-
views = [[docs[1]], [1], [0]]
|
688
|
-
Ruber[:config][:state, :open_documents] = docs
|
689
|
-
Ruber[:config][:state, :tabs] = views
|
690
|
-
@plug.restore_documents
|
691
|
-
tabs = Ruber[:main_window].tabs
|
692
|
-
tabs.count.should == 3
|
693
|
-
tabs[0].view.document.path.should == __FILE__
|
694
|
-
tabs[1].view.document.should == Ruber[:documents][3]
|
695
|
-
tabs[2].view.document.should == Ruber[:documents][0]
|
696
|
-
end
|
697
|
-
|
698
|
-
it 'creates nested tabs for each element of the :tabs entry which is a nested array' do
|
699
|
-
docs = [nil, __FILE__, File.join(File.dirname(__FILE__), 'common.rb'), nil].map{|f| f ? 'file://' + f : nil}
|
700
|
-
views =[
|
701
|
-
[Qt::Vertical, [Qt::Horizontal, 'file://' + __FILE__, 1], 0],
|
702
|
-
[Qt::Horizontal, 'file://' + File.join(File.dirname(__FILE__), 'common.rb'), 'file://' + __FILE__],
|
703
|
-
[0]
|
704
|
-
]
|
705
|
-
Ruber[:config][:state, :open_documents] = docs
|
706
|
-
Ruber[:config][:state, :tabs] = views
|
707
|
-
@plug.restore_documents
|
708
|
-
tabs = Ruber[:main_window].tabs
|
709
|
-
tabs.count.should == 3
|
710
|
-
tabs[0].orientation.should == Qt::Vertical
|
711
|
-
child_pane = tabs[0].splitter.widget(0)
|
712
|
-
child_pane.orientation.should == Qt::Horizontal
|
713
|
-
view_list = child_pane.to_a
|
714
|
-
view_list[0].document.path.should == __FILE__
|
715
|
-
view_list[1].document.should == Ruber[:documents][-1]
|
716
|
-
tabs[0].splitter.widget(1).view.document.should == Ruber[:documents][0]
|
717
|
-
tabs[1].orientation.should == Qt::Horizontal
|
718
|
-
view_list = tabs[1].to_a
|
719
|
-
view_list[0].document.path.should == File.join(File.dirname(__FILE__), 'common.rb')
|
720
|
-
view_list[1].document.path.should == __FILE__
|
721
|
-
tabs[2].should be_single_view
|
722
|
-
tabs[2].view.document.should == Ruber[:documents][0]
|
723
|
-
end
|
724
|
-
|
725
|
-
it 'moves the cursor position of each view according to the contents of the :cursor_positions entry' do
|
726
|
-
docs = ['file://'+__FILE__, 'file://'+File.join(File.dirname(__FILE__), 'common.rb'), 'file://'+File.join(File.dirname(__FILE__), 'framework.rb')]
|
727
|
-
views =[
|
728
|
-
[Qt::Vertical, [Qt::Horizontal, docs[0], docs[1] ], docs[2]],
|
729
|
-
[docs[1]]
|
730
|
-
]
|
731
|
-
positions = [
|
732
|
-
[[30, 16], [53,33], [1,2]],
|
733
|
-
[[2,6]]
|
734
|
-
]
|
735
|
-
Ruber[:config][:state, :open_documents] = docs
|
736
|
-
Ruber[:config][:state, :tabs] = views
|
737
|
-
Ruber[:config][:state, :cursor_positions] = positions
|
738
|
-
@plug.restore_documents
|
739
|
-
tabs = Ruber[:main_window].tabs
|
740
|
-
tabs.each_with_index do |t, i|
|
741
|
-
t.to_a.each_with_index do |v, j|
|
742
|
-
c = v.cursor_position
|
743
|
-
c.line.should == positions[i][j][0]
|
744
|
-
c.column.should == positions[i][j][1]
|
529
|
+
context 'when called with :force as argument' do
|
530
|
+
|
531
|
+
before do
|
532
|
+
@project_files = Array.new(3) do |i|
|
533
|
+
file = Tempfile.new ['', 'ruprj']
|
534
|
+
file.write YAML.dump(:general => {:project_name => "project #{i}"})
|
535
|
+
file.flush
|
536
|
+
file
|
745
537
|
end
|
746
538
|
end
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
|
762
|
-
|
763
|
-
|
539
|
+
|
540
|
+
after do
|
541
|
+
Ruber[:world].close_all(:all, :discard)
|
542
|
+
end
|
543
|
+
|
544
|
+
it 'restores the default environment even if the state/startup_behaviour option doesn\'t contain :default_environment' do
|
545
|
+
data = {
|
546
|
+
:tabs => [[Qt::Vertical, 0, 'file://'+__FILE__]],
|
547
|
+
:cursor_positions => [[2,3], [4,5]],
|
548
|
+
:active_view => [0,1]
|
549
|
+
}
|
550
|
+
cfg = Ruber[:config][:state]
|
551
|
+
cfg[:startup_behaviour] = []
|
552
|
+
cfg[:default_environment_tabs] = data[:tabs]
|
553
|
+
cfg[:default_environment_cursor_positions] = data[:cursor_positions]
|
554
|
+
cfg[:default_environment_active_view] = data[:active_view]
|
555
|
+
flexmock(@plug).should_receive(:restore_environment).with(Ruber[:world].default_environment, data).once
|
556
|
+
@plug.send :restore_last_state, :force
|
557
|
+
end
|
558
|
+
|
559
|
+
it 'opens the projects listed under the state/last_state config option even
|
560
|
+
if the state/startup_behaviour option doesn\'t contain :projects' do
|
561
|
+
exp = @project_files.map &:path
|
562
|
+
Ruber[:config][:state, :startup_behaviour] = []
|
563
|
+
Ruber[:config][:state, :last_state] = exp
|
564
|
+
@plug.send :restore_last_state, :force
|
565
|
+
Ruber[:world].projects.map(&:project_file).should == exp
|
566
|
+
end
|
567
|
+
|
568
|
+
it 'restores all opened projects even if the state/startup_behaviour option doesn\'t contain :projects' do
|
569
|
+
files = @project_files.map &:path
|
570
|
+
prjs = @project_files.map{|f| Ruber[:world].project(f.path)}
|
571
|
+
prjs.each do |prj|
|
572
|
+
flexmock(@plug).should_receive(:restore_environment).with( Ruber[:world].environment(prj), Hash).once
|
764
573
|
end
|
574
|
+
flexmock(@plug).should_receive(:restore_environment).with Ruber[:world].default_environment, Hash
|
575
|
+
Ruber[:config][:state, :startup_behaviour] = []
|
576
|
+
Ruber[:config][:state, :last_state] = files
|
577
|
+
@plug.send :restore_last_state, :force
|
765
578
|
end
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
[
|
773
|
-
[0]
|
774
|
-
]
|
775
|
-
Ruber[:config][:state, :open_documents] = docs
|
776
|
-
Ruber[:config][:state, :tabs] = views
|
777
|
-
Ruber[:config][:state, :active_view] = [1, 1]
|
778
|
-
flexmock(Ruber[:main_window]).should_receive(:focus_on_editor).once.with(FlexMock.on{|v, h| v == Ruber[:main_window].tabs[1].to_a[1]})
|
779
|
-
@plug.restore_documents
|
780
|
-
end
|
781
|
-
|
782
|
-
it 'doesn\'t attempt to give focus to an editor if the active_editor entry is nil' do
|
783
|
-
docs = [nil, __FILE__, File.join(File.dirname(__FILE__), 'common.rb'), nil].map{|f| f ? 'file://' + f : nil}
|
784
|
-
views =[
|
785
|
-
[Qt::Vertical, [Qt::Horizontal, 'file://' + __FILE__, 1], 0],
|
786
|
-
[Qt::Horizontal, 'file://' + File.join(File.dirname(__FILE__), 'common.rb'), 'file://' + __FILE__],
|
787
|
-
[0]
|
788
|
-
]
|
789
|
-
Ruber[:config][:state, :open_documents] = docs
|
790
|
-
Ruber[:config][:state, :tabs] = views
|
791
|
-
Ruber[:config][:state, :active_view] = nil
|
792
|
-
flexmock(Ruber[:main_window]).should_receive(:focus_on_editor).never
|
793
|
-
@plug.restore_documents
|
794
|
-
end
|
795
|
-
|
796
|
-
it 'uses the settings stored in the object passed as a argument instead of those in the global configuration object' do
|
797
|
-
docs = [nil, 'file://'+__FILE__]
|
798
|
-
conf = flexmock do |m|
|
799
|
-
m.should_receive(:[]).with(:state, :open_documents).once.and_return docs
|
800
|
-
m.should_receive(:[]).with(:state, :tabs).once.and_return []
|
801
|
-
m.should_receive(:[]).with(:state, :active_view).once.and_return nil
|
802
|
-
m.should_receive(:[]).with(:state, :cursor_positions).once.and_return []
|
579
|
+
|
580
|
+
it 'activates the project which is listed first in the state/last_state option even if the state/startup_behaviour option doesn\'t contain :projects' do
|
581
|
+
files = @project_files.map &:path
|
582
|
+
Ruber[:config][:state, :startup_behaviour] = []
|
583
|
+
Ruber[:config][:state, :last_state] = files
|
584
|
+
@plug.send :restore_last_state, :force
|
585
|
+
Ruber[:world].active_project.should == Ruber[:world].project(files[0])
|
803
586
|
end
|
804
|
-
|
805
|
-
@plug.restore_documents conf
|
806
|
-
documents = Ruber[:documents].to_a
|
807
|
-
documents.size.should == 2
|
808
|
-
documents[0].should be_pristine
|
809
|
-
documents[1].path.should == __FILE__
|
587
|
+
|
810
588
|
end
|
811
589
|
|
812
590
|
end
|
813
591
|
|
814
|
-
|
592
|
+
context 'when a project is created' do
|
815
593
|
|
816
|
-
|
817
|
-
|
818
|
-
|
819
|
-
|
820
|
-
end
|
821
|
-
|
822
|
-
it 'calls the restore_documents method if the state/open_projects setting is empty' do
|
823
|
-
flexmock(Ruber[:config]).should_receive(:[]).with(:state, :open_projects).and_return []
|
824
|
-
flexmock(@plug).should_receive(:restore_documents).once.with(Ruber[:config])
|
825
|
-
@plug.restore
|
826
|
-
end
|
827
|
-
|
828
|
-
it 'uses the argument, rather than the config object, if one is given' do
|
829
|
-
flexmock(Ruber[:config]).should_receive(:[]).never
|
830
|
-
h = {[:state, :open_projects] => %w[/xyz/abc.ruprj]}
|
831
|
-
def h.[](group, name)
|
832
|
-
super [group, name]
|
594
|
+
before do
|
595
|
+
@project_file = Tempfile.new ['', 'ruprj']
|
596
|
+
@project_file.write YAML.dump(:general => {:project_name => "project"})
|
597
|
+
@project_file.flush
|
833
598
|
end
|
834
|
-
flexmock(@plug).should_receive(:restore_projects).once.with(h)
|
835
|
-
@plug.restore h
|
836
|
-
h[[:state, :open_projects]] = []
|
837
|
-
flexmock(@plug).should_receive(:restore_documents).once.with(h)
|
838
|
-
@plug.restore h
|
839
|
-
end
|
840
|
-
|
841
|
-
end
|
842
|
-
|
843
|
-
describe 'restore_last_state' do
|
844
|
-
|
845
|
-
describe ', when the state/startup_behaviour option is :restore_all' do
|
846
599
|
|
847
|
-
|
848
|
-
|
849
|
-
flexmock(@plug).should_receive(:restore).once
|
850
|
-
@plug.restore_last_state
|
600
|
+
after do
|
601
|
+
Ruber[:world].close_all(:all, :discard)
|
851
602
|
end
|
852
|
-
|
853
|
-
end
|
603
|
+
|
854
604
|
|
855
|
-
|
605
|
+
context 'if the state/restore_projects option is true' do
|
856
606
|
|
857
|
-
|
858
|
-
|
859
|
-
flexmock(@plug).should_receive(:restore_projects).once
|
860
|
-
flexmock(@plug).should_receive(:with).once.with({:restore_project_files => false}, FlexMock.on{|a| a.call || a.is_a?(Proc)})
|
861
|
-
@plug.restore_last_state
|
607
|
+
before do
|
608
|
+
Ruber[:config][:state, :restore_projects] = true
|
862
609
|
end
|
863
610
|
|
864
|
-
|
865
|
-
|
866
|
-
|
611
|
+
it 'calls the restore_environment method passing the project\'s environment and the data associated with it as argument' do
|
612
|
+
flexmock(@plug).should_receive(:restore_environment).once.with(FlexMock.on{|env| env.project.project_file == @project_file.path}, Hash)
|
613
|
+
Ruber[:world].project @project_file.path
|
614
|
+
end
|
867
615
|
|
868
|
-
it '
|
869
|
-
|
870
|
-
flexmock(@plug).should_receive(:
|
871
|
-
|
616
|
+
it 'doesn\'t call the restore_environment if the environment already contains views' do
|
617
|
+
prj = Ruber[:world].project @project_file.path
|
618
|
+
flexmock(@plug).should_receive(:restore_environment).never
|
619
|
+
Ruber[:world].environment(prj).editor_for! __FILE__
|
620
|
+
Ruber[:world].instance_eval{emit project_created(prj)}
|
872
621
|
end
|
873
622
|
|
874
623
|
end
|
875
624
|
|
876
|
-
|
625
|
+
context 'if the state/restore_projects option is true' do
|
877
626
|
|
878
|
-
|
879
|
-
|
880
|
-
flexmock(@plug).should_receive(:with).never
|
881
|
-
flexmock(@plug).should_receive(:restore_projects).never
|
882
|
-
flexmock(@plug).should_receive(:restore_documents).never
|
883
|
-
flexmock(@plug).should_receive(:restore).never
|
884
|
-
@plug.restore_last_state
|
627
|
+
before do
|
628
|
+
Ruber[:config][:state, :restore_projects] = false
|
885
629
|
end
|
886
630
|
|
631
|
+
it 'does nothing' do
|
632
|
+
flexmock(@plug).should_receive(:restore_environment).never
|
633
|
+
Ruber[:world].project @project_file.path
|
634
|
+
end
|
635
|
+
|
887
636
|
end
|
888
637
|
|
889
638
|
end
|
890
|
-
|
639
|
+
|
891
640
|
end
|
892
641
|
|
893
642
|
describe Ruber::State::DocumentExtension do
|
894
643
|
|
895
644
|
before do
|
896
645
|
Ruber[:components].load_plugin 'plugins/state/'
|
897
|
-
Ruber[:
|
646
|
+
Ruber[:world].documents.dup.each{|d| d.close false}
|
898
647
|
@plug = Ruber[:components][:state]
|
899
|
-
@doc = Ruber[:
|
648
|
+
@doc = Ruber[:world].document __FILE__
|
900
649
|
@prj = @doc.own_project
|
901
650
|
@ext = @doc.own_project.extension(:state)
|
902
651
|
end
|
903
652
|
|
904
653
|
after do
|
905
|
-
Ruber[:
|
654
|
+
Ruber[:world].documents.dup.each{|d| d.close false}
|
906
655
|
Ruber[:components].unload_plugin :state
|
907
656
|
end
|
908
657
|
|
@@ -974,16 +723,16 @@ describe Ruber::State::DocumentExtension do
|
|
974
723
|
@prj[:state, :cursor_position].should == [50,15]
|
975
724
|
end
|
976
725
|
|
977
|
-
|
978
|
-
|
979
|
-
|
980
|
-
|
981
|
-
|
982
|
-
|
983
|
-
|
984
|
-
|
985
|
-
|
986
|
-
|
726
|
+
it 'keeps using the view which last got focus' do
|
727
|
+
views = 3.times.map{@doc.create_view}
|
728
|
+
views[1].instance_eval{emit focus_in(self)}
|
729
|
+
views[0].instance_eval{emit focus_in(self)}
|
730
|
+
flexmock(@ext).should_receive(:save_settings)
|
731
|
+
views[1].close
|
732
|
+
flexmock(@prj).should_receive(:[]).with(:state, :cursor_position).never
|
733
|
+
flexmock(views[0]).should_receive(:cursor_position).once.and_return(KTextEditor::Cursor.new(2,3))
|
734
|
+
@doc.create_view
|
735
|
+
end
|
987
736
|
|
988
737
|
|
989
738
|
it 'does nothing if none of the views associated with the document have received focus' do
|
@@ -999,11 +748,14 @@ describe Ruber::State::DocumentExtension do
|
|
999
748
|
|
1000
749
|
describe 'auto_restore' do
|
1001
750
|
|
1002
|
-
context 'if the state
|
1003
|
-
|
1004
|
-
|
751
|
+
context 'if the state/restore_cursor_position option is true' do
|
752
|
+
|
753
|
+
before do
|
754
|
+
Ruber[:config][:state, :restore_cursor_position] = true
|
755
|
+
end
|
756
|
+
|
757
|
+
it 'calls the restore method' do
|
1005
758
|
view = @doc.create_view
|
1006
|
-
flexmock(@plug).should_receive(:restore_cursor_position?).once.and_return true
|
1007
759
|
flexmock(@ext).should_receive(:restore).once.with(view)
|
1008
760
|
@ext.send :auto_restore, view
|
1009
761
|
end
|
@@ -1011,10 +763,13 @@ describe Ruber::State::DocumentExtension do
|
|
1011
763
|
end
|
1012
764
|
|
1013
765
|
context 'if the state plugin doesn\'t want the cursor position restored' do
|
1014
|
-
|
766
|
+
|
767
|
+
before do
|
768
|
+
Ruber[:config][:state, :restore_cursor_position] = false
|
769
|
+
end
|
770
|
+
|
1015
771
|
it 'does nothing' do
|
1016
772
|
view = @doc.create_view
|
1017
|
-
flexmock(@plug).should_receive(:restore_cursor_position?).once.and_return false
|
1018
773
|
flexmock(@ext).should_receive(:restore).never
|
1019
774
|
@ext.send :auto_restore, view
|
1020
775
|
end
|
@@ -1038,7 +793,7 @@ describe Ruber::State::DocumentExtension do
|
|
1038
793
|
flexmock(@ext).should_receive(:save_settings)
|
1039
794
|
end
|
1040
795
|
|
1041
|
-
it '
|
796
|
+
it 'behaves as if no other view had ever got focus' do
|
1042
797
|
views = 3.times.map{@doc.create_view}
|
1043
798
|
views[1].instance_eval{emit focus_in(self)}
|
1044
799
|
views[0].instance_eval{emit focus_in(self)}
|
@@ -1052,7 +807,7 @@ describe Ruber::State::DocumentExtension do
|
|
1052
807
|
|
1053
808
|
context 'and the view isn\'t the last one which got focus' do
|
1054
809
|
|
1055
|
-
it 'does nothing
|
810
|
+
it 'does nothing' do
|
1056
811
|
views = 3.times.map{@doc.create_view}
|
1057
812
|
views[1].instance_eval{emit focus_in(self)}
|
1058
813
|
views[0].instance_eval{emit focus_in(self)}
|
@@ -1091,13 +846,14 @@ describe Ruber::State::ProjectExtension do
|
|
1091
846
|
end
|
1092
847
|
|
1093
848
|
before do
|
1094
|
-
Ruber[:
|
849
|
+
Ruber[:world].documents.dup.each{|doc| doc.close false}
|
1095
850
|
Ruber[:components].load_plugin 'plugins/state/'
|
1096
851
|
@plug = Ruber[:components][:state]
|
1097
852
|
@dir = File.join Dir.tmpdir, random_string(10)
|
1098
853
|
FileUtils.mkdir @dir
|
1099
|
-
@prj = Ruber[:
|
854
|
+
@prj = Ruber[:world].new_project File.join(@dir, 'test.ruprj'), 'Test'
|
1100
855
|
@ext = @prj.extension :state
|
856
|
+
@env = Ruber[:world].environment @prj
|
1101
857
|
end
|
1102
858
|
|
1103
859
|
after do
|
@@ -1105,74 +861,15 @@ describe Ruber::State::ProjectExtension do
|
|
1105
861
|
Ruber[:components].unload_plugin :state
|
1106
862
|
end
|
1107
863
|
|
1108
|
-
describe ', when created' do
|
1109
|
-
|
1110
|
-
it 'connects the project\'s activated() signal to its auto_restore slot' do
|
1111
|
-
flexmock(@ext).should_receive(:auto_restore).once
|
1112
|
-
@prj.activate
|
1113
|
-
end
|
1114
|
-
|
1115
|
-
it 'connects the save_settings slot to the deactivated signal of the project' do
|
1116
|
-
flexmock(@ext).should_receive(:save_settings).once
|
1117
|
-
@prj.instance_eval{emit deactivated}
|
1118
|
-
end
|
1119
|
-
|
1120
|
-
end
|
1121
|
-
|
1122
|
-
describe '#restore' do
|
1123
|
-
|
1124
|
-
it 'calls the restore_documents method of the state plugin passing the project as argument' do
|
1125
|
-
flexmock(Ruber[:state]).should_receive(:restore_documents).once.with(@prj)
|
1126
|
-
@ext.restore
|
1127
|
-
end
|
1128
|
-
|
1129
|
-
end
|
1130
|
-
|
1131
864
|
describe '#save_settings' do
|
1132
865
|
|
1133
|
-
|
1134
|
-
@
|
1135
|
-
|
1136
|
-
tabs_state = {
|
1137
|
-
:tabs => [['file://'+__FILE__], [0]],
|
1138
|
-
:cursor_positions => [],
|
1139
|
-
:active_view => [[1,0]]
|
1140
|
-
}
|
1141
|
-
state = Ruber[:state]
|
1142
|
-
flexmock(state).should_receive(:documents_state).once.and_return(docs_state)
|
1143
|
-
flexmock(state).should_receive(:tabs_state).once.and_return(tabs_state)
|
1144
|
-
@ext.save_settings
|
1145
|
-
@prj[:state, :open_documents].should == docs_state
|
1146
|
-
@prj[:state, :tabs].should == tabs_state[:tabs]
|
1147
|
-
@prj[:state, :active_view].should == tabs_state[:active_view]
|
1148
|
-
@prj[:state, :cursor_positions].should == tabs_state[:cursor_positions]
|
1149
|
-
end
|
1150
|
-
|
1151
|
-
end
|
1152
|
-
|
1153
|
-
describe 'auto_restore' do
|
1154
|
-
|
1155
|
-
|
1156
|
-
it 'disconnects the project\'s activated() signal from the extension' do
|
1157
|
-
flexmock(Ruber[:state]).should_receive(:restore_project_files?).once.and_return false
|
1158
|
-
@ext.send :auto_restore
|
1159
|
-
flexmock(@ext).should_receive(:auto_restore).never
|
1160
|
-
flexmock(@prj).instance_eval{emit activated}
|
1161
|
-
end
|
1162
|
-
|
1163
|
-
it 'calls the restore method if the State plugins wants the project files restored' do
|
1164
|
-
flexmock(Ruber[:state]).should_receive(:restore_project_files?).once.and_return true
|
1165
|
-
flexmock(@ext).should_receive(:restore).once
|
1166
|
-
@ext.send :auto_restore
|
866
|
+
before do
|
867
|
+
@state = @ext
|
868
|
+
@container = @prj
|
1167
869
|
end
|
1168
870
|
|
1169
|
-
|
1170
|
-
flexmock(Ruber[:state]).should_receive(:restore_project_files?).once.and_return false
|
1171
|
-
flexmock(@ext).should_receive(:restore).never
|
1172
|
-
@ext.send :auto_restore
|
1173
|
-
end
|
1174
|
-
|
871
|
+
it_behaves_like 'a component of the state plugin saving an environment'
|
1175
872
|
|
1176
873
|
end
|
1177
|
-
|
874
|
+
|
1178
875
|
end
|