ruber 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. data/CHANGES +21 -0
  2. data/data/share/apps/ruber/ruberui.rc +3 -1
  3. data/lib/ruber/application/application.rb +22 -23
  4. data/lib/ruber/application/plugin.yaml +7 -2
  5. data/lib/ruber/{projects → application}/project_files_list.rb +0 -0
  6. data/lib/ruber/{projects → application}/project_files_widget.rb +0 -0
  7. data/lib/ruber/application/ui/project_files_rule_chooser_widget.rb +74 -0
  8. data/lib/ruber/{projects → application}/ui/project_files_rule_chooser_widget.ui +0 -0
  9. data/lib/ruber/application/ui/project_files_widget.rb +117 -0
  10. data/lib/ruber/{projects → application}/ui/project_files_widget.ui +0 -0
  11. data/lib/ruber/component_manager.rb +14 -9
  12. data/lib/ruber/editor/document.rb +35 -5
  13. data/lib/ruber/kde_sugar.rb +16 -0
  14. data/lib/ruber/main_window/choose_plugins_dlg.rb +7 -4
  15. data/lib/ruber/main_window/main_window.rb +131 -193
  16. data/lib/ruber/main_window/main_window_actions.rb +157 -58
  17. data/lib/ruber/main_window/main_window_internal.rb +145 -54
  18. data/lib/ruber/main_window/open_file_in_project_dlg.rb +4 -4
  19. data/lib/ruber/main_window/plugin.yaml +3 -6
  20. data/lib/ruber/main_window/ui/workspace_settings_widget.rb +2 -2
  21. data/lib/ruber/main_window/workspace.rb +62 -32
  22. data/lib/ruber/output_widget.rb +20 -16
  23. data/lib/ruber/pane.rb +11 -5
  24. data/lib/ruber/project.rb +27 -12
  25. data/lib/ruber/projects/ui/project_files_rule_chooser_widget.rb +2 -2
  26. data/lib/ruber/projects/ui/project_files_widget.rb +2 -2
  27. data/lib/ruber/utils.rb +37 -4
  28. data/lib/ruber/version.rb +1 -1
  29. data/lib/ruber/world/document_factory.rb +121 -0
  30. data/lib/ruber/world/document_list.rb +396 -0
  31. data/lib/ruber/world/environment.rb +470 -0
  32. data/lib/ruber/{main_window → world}/hint_solver.rb +1 -1
  33. data/lib/ruber/world/plugin.yaml +11 -0
  34. data/lib/ruber/world/project_factory.rb +131 -0
  35. data/lib/ruber/world/project_list.rb +265 -0
  36. data/lib/ruber/world/ui/workspace_settings_widget.rb +51 -0
  37. data/lib/ruber/{main_window → world}/ui/workspace_settings_widget.ui +0 -0
  38. data/lib/ruber/world/world.rb +307 -0
  39. data/plugins/auto_end/auto_end.rb +135 -9
  40. data/plugins/autosave/autosave.rb +4 -4
  41. data/plugins/find_in_files/find_in_files.rb +5 -5
  42. data/plugins/find_in_files/find_in_files_widgets.rb +1 -1
  43. data/plugins/project_browser/project_browser.rb +4 -4
  44. data/plugins/rake/rake.rb +4 -4
  45. data/plugins/rake/rake_extension.rb +1 -1
  46. data/plugins/rspec/rspec.rb +4 -4
  47. data/plugins/rspec/ruber_rspec_formatter.rb +2 -2
  48. data/plugins/ruby_development/ruby_development.rb +3 -3
  49. data/plugins/ruby_runner/ruby_runner.rb +2 -2
  50. data/plugins/state/plugin.yaml +6 -8
  51. data/plugins/state/state.rb +201 -391
  52. data/plugins/state/ui/config_widget.rb +5 -5
  53. data/plugins/state/ui/config_widget.ui +3 -3
  54. data/plugins/syntax_checker/syntax_checker.rb +4 -0
  55. data/spec/annotation_model_spec.rb +1 -1
  56. data/spec/auto_end_spec.rb +98 -47
  57. data/spec/component_manager_spec.rb +80 -21
  58. data/spec/document_factory_spec.rb +115 -0
  59. data/spec/document_list_spec.rb +560 -450
  60. data/spec/document_spec.rb +143 -55
  61. data/spec/editor_view_spec.rb +2 -2
  62. data/spec/environment_spec.rb +1900 -0
  63. data/spec/hint_solver_spec.rb +5 -5
  64. data/spec/kde_sugar_spec.rb +16 -0
  65. data/spec/output_widget_spec.rb +177 -51
  66. data/spec/pane_spec.rb +29 -5
  67. data/spec/plugin_spec.rb +1 -1
  68. data/spec/project_factory_spec.rb +104 -0
  69. data/spec/project_list_spec.rb +352 -447
  70. data/spec/project_spec.rb +34 -33
  71. data/spec/qt_sugar_spec.rb +2 -2
  72. data/spec/state_spec.rb +508 -811
  73. data/spec/utils_spec.rb +149 -98
  74. data/spec/workspace_spec.rb +120 -9
  75. data/spec/world_spec.rb +1219 -0
  76. metadata +23 -14
  77. data/lib/ruber/documents/document_list.rb +0 -412
  78. data/lib/ruber/documents/plugin.yaml +0 -4
  79. data/lib/ruber/main_window/view_manager.rb +0 -431
  80. data/lib/ruber/projects/plugin.yaml +0 -11
  81. data/lib/ruber/projects/project_list.rb +0 -314
@@ -1,9 +1,9 @@
1
1
  require './spec/common'
2
- require 'ruber/main_window/hint_solver'
2
+ require 'ruber/world/hint_solver'
3
3
  require 'ruber/editor/document'
4
4
  require 'ruber/pane'
5
5
 
6
- describe Ruber::MainWindow::HintSolver do
6
+ describe Ruber::World::HintSolver do
7
7
 
8
8
  class HintSolverSpecComponentManager < Qt::Object
9
9
  extend Forwardable
@@ -29,7 +29,7 @@ describe Ruber::MainWindow::HintSolver do
29
29
 
30
30
  it 'takes the tab widget as argument' do
31
31
  tabs = KDE::TabWidget.new
32
- lambda{Ruber::MainWindow::HintSolver.new tabs, KParts::PartManager.new(@main_window), []}.should_not raise_error
32
+ lambda{Ruber::World::HintSolver.new tabs, KParts::PartManager.new(@main_window), []}.should_not raise_error
33
33
  end
34
34
 
35
35
  end
@@ -38,7 +38,7 @@ describe Ruber::MainWindow::HintSolver do
38
38
 
39
39
  before do
40
40
  @tabs = KDE::TabWidget.new
41
- @solver = Ruber::MainWindow::HintSolver.new @tabs, KParts::PartManager.new(@main_window), []
41
+ @solver = Ruber::World::HintSolver.new @tabs, KParts::PartManager.new(@main_window), []
42
42
  @doc = Ruber::Document.new nil
43
43
  end
44
44
 
@@ -332,7 +332,7 @@ describe Ruber::MainWindow::HintSolver do
332
332
 
333
333
  before do
334
334
  @tabs = KDE::TabWidget.new
335
- @solver = Ruber::MainWindow::HintSolver.new @tabs, KParts::PartManager.new(@main_window), []
335
+ @solver = Ruber::World::HintSolver.new @tabs, KParts::PartManager.new(@main_window), []
336
336
  @doc = Ruber::Document.new nil
337
337
  end
338
338
 
@@ -93,6 +93,22 @@ describe 'KDE::Url' do
93
93
 
94
94
  end
95
95
 
96
+ describe '#eql?' do
97
+ it 'returns true if the two URLs are equal according to ==' do
98
+ u1, u2 = 2.times.map{KDE::Url.new 'file:///xyz'}
99
+ u1.should eql(u2)
100
+ end
101
+ end
102
+
103
+ describe '#hash' do
104
+
105
+ it 'returns the hash value of the path' do
106
+ u = KDE::Url.new 'file://xyz'
107
+ u.hash.should == u.path.hash
108
+ end
109
+
110
+ end
111
+
96
112
  end
97
113
 
98
114
  describe 'KDE::MimeType#=~' do
@@ -1089,36 +1089,165 @@ describe Ruber::OutputWidget do
1089
1089
  @mod.append_row Qt::StandardItem.new('')
1090
1090
  end
1091
1091
 
1092
- it 'calls the find_filename_in_string method, passing it the text of the index, if the argument is a Qt::ModelIndex' do
1093
- @mod.item(0,0).text = __FILE__
1094
- flexmock(@ow).should_receive(:find_filename_in_string).once.with __FILE__
1095
- @ow.send :find_filename_in_index, @mod.index(0,0)
1092
+ context 'when the argument is a Qt::ModelIndex' do
1093
+
1094
+ it 'calls #find_filename_in_string passing the text associated with the index as argument' do
1095
+ @mod.item(0,0).text = __FILE__
1096
+ flexmock(@ow).should_receive(:find_filename_in_string).with __FILE__
1097
+ @ow.send :find_filename_in_index, @mod.index(0,0)
1098
+ end
1099
+
1100
+ end
1101
+
1102
+ context 'when the argument is a string' do
1103
+
1104
+ it 'calls #find_filename_in_string passing the string as argument' do
1105
+ @mod.item(0,0).text = __FILE__
1106
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with __FILE__
1107
+ @ow.send :find_filename_in_index, __FILE__
1108
+ end
1109
+
1096
1110
  end
1097
1111
 
1098
- it 'calls the find_filename_in_string method, passing it the argument, if the argument is a string' do
1099
- @mod.item(0,0).text = __FILE__
1100
- flexmock(@ow).should_receive(:find_filename_in_string).once.with __FILE__
1101
- @ow.send :find_filename_in_index, __FILE__
1112
+ context 'when #find_filename_in_string returns nil' do
1113
+
1114
+ it 'returns nil' do
1115
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return nil
1116
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should be_nil
1117
+ end
1118
+
1119
+ end
1120
+
1121
+ context 'when #find_filename_in_string returns a string' do
1122
+
1123
+ it 'returns an array with the string as first argument and 0 as second argument' do
1124
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return __FILE__
1125
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 0]
1126
+ end
1127
+
1128
+ end
1129
+
1130
+ context 'when #find_filename_in_string returns an array with one element' do
1131
+
1132
+ it 'returns the array after appending a 0 to it' do
1133
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return [__FILE__]
1134
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 0]
1135
+ end
1136
+
1137
+ end
1138
+
1139
+ context 'when #find_filename_in_string returns an array with two elements' do
1140
+
1141
+ it 'returns the array' do
1142
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return [__FILE__, 6]
1143
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 6]
1144
+ end
1145
+
1102
1146
  end
1103
1147
 
1104
- it 'returns nil if find_filename_in_string returns nil' do
1105
- flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return nil
1106
- @ow.send(:find_filename_in_index, @mod.index(0,0)).should be_nil
1148
+ context 'when the string or first element of the array returned by #find_filename_in_string is an absolute path' do
1149
+
1150
+ it 'transforms it in a canonical path' do
1151
+ path_parts = __FILE__.split('/')
1152
+ orig_path = path_parts[0..-2].join('/') + '/../' + path_parts[-2..-1].join('/')
1153
+ flexmock(@ow).should_receive(:find_filename_in_string).once.and_return [orig_path, 0]
1154
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 0]
1155
+ flexmock(@ow).should_receive(:find_filename_in_string).once.and_return orig_path
1156
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 0]
1157
+ end
1158
+
1107
1159
  end
1108
1160
 
1109
- it 'returns an array having the value returned by find_filename_in_string as first element and 0 as second if find_filename_in_string returns a string' do
1110
- flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return __FILE__
1111
- @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 0]
1161
+ context 'when the string or first element of the array returned by #find_filename_in_string is a relative path' do
1162
+
1163
+ it 'transforms it into an absolute filename relative to the working directory' do
1164
+ @ow.working_dir = File.dirname __FILE__
1165
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return [File.basename(__FILE__), 6]
1166
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return [File.basename(__FILE__)]
1167
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return File.basename(__FILE__)
1168
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 6]
1169
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 0]
1170
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 0]
1171
+ end
1172
+
1173
+ it 'transforms it in a canonical path' do
1174
+ @ow.working_dir = File.dirname File.dirname(__FILE__)
1175
+ path_parts = __FILE__.split('/')
1176
+ orig_path = "spec/../spec/#{File.basename(__FILE__)}"
1177
+
1178
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return [orig_path, 6]
1179
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return [orig_path]
1180
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return orig_path
1181
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 6]
1182
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 0]
1183
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 0]
1184
+ end
1185
+
1112
1186
  end
1113
1187
 
1114
- it 'returns an array having the value returned by find_filename_in_string as first element and 0 as second if find_filename_in_string returns an array with one element' do
1115
- flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return [__FILE__]
1116
- @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 0]
1188
+ context 'when the string or first element of the array returned by #find_filename_in_string is an URL with the file scheme' do
1189
+
1190
+ context 'if the name of the file is an absolute path' do
1191
+
1192
+ it 'returns the path corresponding to the URL as first element of the array' do
1193
+ url = 'file://' + __FILE__
1194
+ flexmock(@ow).should_receive(:find_filename_in_string).once.and_return [url, 0]
1195
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 0]
1196
+ flexmock(@ow).should_receive(:find_filename_in_string).once.and_return url
1197
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 0]
1198
+ end
1199
+
1200
+ it 'transforms it in a canonical path' do
1201
+ path_parts = __FILE__.split('/')
1202
+ url = 'file://' + path_parts[0..-2].join('/') + '/../' + path_parts[-2..-1].join('/')
1203
+ flexmock(@ow).should_receive(:find_filename_in_string).once.and_return [url, 0]
1204
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 0]
1205
+ flexmock(@ow).should_receive(:find_filename_in_string).once.and_return url
1206
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 0]
1207
+ end
1208
+
1209
+ end
1210
+
1211
+ context 'if the name of the file is a relative path' do
1212
+
1213
+ it 'transforms it into an absolute filename relative to the working directory' do
1214
+ @ow.working_dir = File.dirname __FILE__
1215
+ url = 'file://' + File.basename(__FILE__)
1216
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return [url, 6]
1217
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return [url]
1218
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return url
1219
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 6]
1220
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 0]
1221
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 0]
1222
+ end
1223
+
1224
+ it 'transforms it in a canonical path' do
1225
+ @ow.working_dir = File.dirname File.dirname(__FILE__)
1226
+ url = "file://spec/../spec/#{File.basename(__FILE__)}"
1227
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return [url, 6]
1228
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return [url]
1229
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return url
1230
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 6]
1231
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 0]
1232
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 0]
1233
+ end
1234
+
1235
+ end
1236
+
1117
1237
  end
1118
1238
 
1119
- it 'returns the value returned by find_filename_in_string if it is an array with two elements' do
1120
- flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return [__FILE__, 6]
1121
- @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [__FILE__, 6]
1239
+ context 'when the string or first element of the array returned by #find_filename_in_string is an URL with a scheme different from file' do
1240
+
1241
+ it 'returns the URL as it is as the first element of the array' do
1242
+ url = 'http://xyz/abc.it'
1243
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return [url, 6]
1244
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return [url]
1245
+ flexmock(@ow).should_receive(:find_filename_in_string).once.with('').and_return url
1246
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [url, 6]
1247
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [url, 0]
1248
+ @ow.send(:find_filename_in_index, @mod.index(0,0)).should == [url, 0]
1249
+ end
1250
+
1122
1251
  end
1123
1252
 
1124
1253
  it 'removes the first filename from the index text before passing it to find_filename_in_string if the index corresponds to the title and the @skip_first_file_in_title instance variable is true' do
@@ -1425,37 +1554,6 @@ describe Ruber::OutputWidget::Model do
1425
1554
 
1426
1555
  end
1427
1556
 
1428
- describe '#flags' do
1429
-
1430
- before do
1431
- @mod = @ow.model
1432
- end
1433
-
1434
- it 'returns the value specified in the @flags variable if the index is valid and the global_flags attribute is not nil' do
1435
- flags = Qt::ItemIsEnabled | Qt::ItemIsUserCheckable
1436
- @mod.global_flags = flags
1437
- @mod.append_row Qt::StandardItem.new('x')
1438
- @mod.flags(@mod.index(0,0)).should == flags.to_i
1439
- end
1440
-
1441
- it 'returns Qt::NoItemFlags if the inxed is not valid and the global_flags attribute is not nil' do
1442
- flags = Qt::ItemIsEnabled | Qt::ItemIsUserCheckable
1443
- @mod.global_flags = flags
1444
- @mod.append_row Qt::StandardItem.new('x')
1445
- @mod.flags(Qt::ModelIndex.new).should == Qt::NoItemFlags.to_i
1446
- end
1447
-
1448
- it 'calls super if the global_flags attribute is nil' do
1449
- @mod.global_flags = nil
1450
- it = Qt::StandardItem.new('x')
1451
- flags = Qt::ItemIsEnabled|Qt::ItemIsEditable|Qt::ItemIsDragEnabled
1452
- it.flags = flags
1453
- @mod.append_row it
1454
- @mod.flags(it.index).to_i.should == flags.to_i
1455
- @mod.flags(Qt::ModelIndex.new).to_i.should == Qt::ItemIsDropEnabled.to_i
1456
- end
1457
-
1458
- end
1459
1557
 
1460
1558
  describe '#set' do
1461
1559
 
@@ -1495,6 +1593,19 @@ describe Ruber::OutputWidget::Model do
1495
1593
  @mod.set 'Test', :message, 2, :col => 4, :parent => @mod.item(0,0)
1496
1594
  end
1497
1595
 
1596
+ it 'sets the flags of the new item to the value returned by #global_flags' do
1597
+ flags = Qt::ItemIsEnabled | Qt::ItemIsUserCheckable
1598
+ @mod.global_flags = flags
1599
+ it = @mod.set 'test', :message, 0
1600
+ it.flags.should == flags
1601
+ end
1602
+
1603
+ it 'leaves the default flags for the item if #global_flags returns nil' do
1604
+ @mod.global_flags = nil
1605
+ it = @mod.set 'test', :message, 0
1606
+ it.flags.should == Qt::ItemIsEnabled|Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsDropEnabled|Qt::ItemIsDragEnabled
1607
+ end
1608
+
1498
1609
  it 'calls the set_output_type method of the output widget passing it the index of the item and the type argument' do
1499
1610
  5.times{|i| @mod.append_row Qt::StandardItem.new(i.to_s)}
1500
1611
  flexmock(@ow).should_receive(:set_output_type).once.with(FlexMock.on{|i| i.is_a?(Qt::ModelIndex) and i.row == 3 and i.column == 5}, :message)
@@ -1665,6 +1776,21 @@ describe '#insert' do
1665
1776
  lambda{@mod.insert 'x', :message, -15}.should raise_error(IndexError, "Row index -10 is out of range. The allowed values are from 0 to 5")
1666
1777
  end
1667
1778
 
1779
+ it 'sets the flags of the new item to the value returned by #global_flags' do
1780
+ flags = Qt::ItemIsEnabled | Qt::ItemIsUserCheckable
1781
+ @mod.global_flags = flags
1782
+ row = @mod.insert ['x', 'y'], :message, 0
1783
+ row.each{|it| it.flags.should == flags}
1784
+ end
1785
+
1786
+ it 'leaves the default flags for the item if #global_flags returns nil' do
1787
+ @mod.global_flags = nil
1788
+ flags = Qt::ItemIsEnabled|Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsDropEnabled|Qt::ItemIsDragEnabled
1789
+ row = @mod.insert ['x', 'y'], :message, 0
1790
+ row.each{|it| it.flags.should == flags}
1791
+ end
1792
+
1793
+
1668
1794
  end
1669
1795
 
1670
1796
  describe '#insert_lines' do
@@ -114,18 +114,35 @@ describe Ruber::Pane do
114
114
 
115
115
  describe '#view' do
116
116
 
117
- it 'returns the view if the pane contains a single view' do
118
- view = @doc.create_view(nil)
119
- pane = Ruber::Pane.new view
120
- pane.view.should == view
117
+ context 'if the pane is in single view' do
118
+
119
+ before do
120
+ @view = @doc.create_view(nil)
121
+ @pane = Ruber::Pane.new @view
122
+ end
123
+
124
+ it 'returns the view if the pane contains a single view' do
125
+ @pane.view.should == @view
126
+ end
127
+
128
+ it 'returns nil if the view has been closed' do
129
+ @view.close
130
+ @pane.view.should be_nil
131
+ end
132
+
121
133
  end
122
134
 
135
+
123
136
  it 'returns nil if the pane contains multiple panes' do
124
137
  views = 2.times.map{@doc.create_view(nil)}
125
138
  pane = Ruber::Pane.new Qt::Vertical, views[0], views[1]
126
139
  pane.view.should be_nil
127
140
  end
128
141
 
142
+ it 'returns nil if the only view has been removed' do
143
+
144
+ end
145
+
129
146
  end
130
147
 
131
148
  describe '#split' do
@@ -690,6 +707,13 @@ describe Ruber::Pane do
690
707
  res.should == [@views[0]]
691
708
  end
692
709
 
710
+ it 'does nothing if the pane is in single view and the only view has been closed' do
711
+ res = []
712
+ @views[0].close
713
+ @pane.each_view{|v| res << v}
714
+ res.should == []
715
+ end
716
+
693
717
  it 'returns self' do
694
718
  @pane.each_view{}.should == @pane
695
719
  @pane.split @views[0], @views[1], Qt::Vertical
@@ -713,7 +737,7 @@ describe Ruber::Pane do
713
737
  res_single.should == [@views[0]]
714
738
  res_multi.should == [@views[0], @views[1], @views[3], @views[2]]
715
739
  end
716
-
740
+
717
741
  end
718
742
 
719
743
  describe '#parent_pane' do
@@ -1071,7 +1071,7 @@ describe 'Ruber::Plugin#update_project' do
1071
1071
  @plug = Ruber::Plugin.new Ruber::PluginSpecification.full(@data)
1072
1072
  @prj = Ruber::Project.new 'test.ruprj', 'Test'
1073
1073
  @plug.register_with_project @prj
1074
- @doc = Ruber::Document.new nil, __FILE__
1074
+ @doc = Ruber::Document.new __FILE__
1075
1075
  end
1076
1076
 
1077
1077
  it 'calls remove_options_from_project passing false as second argument' do
@@ -0,0 +1,104 @@
1
+ require 'spec/framework'
2
+ require './spec/common'
3
+ require 'ruber/world/project_factory'
4
+
5
+ require 'tempfile'
6
+ require 'tmpdir'
7
+
8
+ describe Ruber::World::ProjectFactory do
9
+
10
+ before do
11
+ @factory = Ruber::World::ProjectFactory.new
12
+ end
13
+
14
+ describe '#project' do
15
+
16
+ context 'when called with a file name as argument' do
17
+
18
+ before do
19
+ @file = Tempfile.new ['project_factory_test', '.ruprj']
20
+ @file.write YAML.dump({:general => {:project_name => 'project_factory_test'}})
21
+ @file.flush
22
+ end
23
+
24
+ after do
25
+ @file.close!
26
+ end
27
+
28
+ it 'returns a new project associated with the file if no other project is associated with it' do
29
+ prj = @factory.project @file.path
30
+ prj.should be_a(Ruber::Project)
31
+ prj.project_file.should == @file.path
32
+ end
33
+
34
+ it 'returns an existing project associated with the same file, if that project exists' do
35
+ old = @factory.project @file.path
36
+ new = @factory.project @file.path
37
+ new.should == old
38
+ end
39
+
40
+ it 'emits the project_created signal passing the project as argument if a new project was created' do
41
+ prj = Ruber::Project.new @file.path
42
+ flexmock(Ruber::Project).should_receive(:new).with(@file.path, nil).once.and_return prj
43
+ mk = flexmock{|m| m.should_receive(:test).once.with(prj)}
44
+ @factory.connect(SIGNAL('project_created(QObject*)')){|pr| mk.test pr}
45
+ @factory.project @file.path
46
+ end
47
+
48
+ it 'doesn\'t return an existing project which has been closed' do
49
+ old = @factory.project @file.path
50
+ old.close
51
+ new = @factory.project @file.path
52
+ new.should_not == old
53
+ end
54
+
55
+ end
56
+
57
+ end
58
+
59
+ context 'when called with a file name and a project name as arguments' do
60
+
61
+ it 'returns a new project associated with the file if no other project is associated with it' do
62
+ file = File.join Dir.tmpdir, 'project_factory_test.ruprj'
63
+ prj = @factory.project file, 'project_factory_test'
64
+ prj.should be_a(Ruber::Project)
65
+ prj.project_file.should == file
66
+ end
67
+
68
+ it 'returns the existing project associated with the file if there is such a project and the name of the project is equal to the second argument' do
69
+ file = File.join Dir.tmpdir, 'project_factory_test.ruprj'
70
+ old = @factory.project file, 'project_factory_test'
71
+ prj = @factory.project file, 'project_factory_test'
72
+ prj.should == old
73
+ end
74
+
75
+ it 'emits the project_created signal passing the project as argument if a new project was created' do
76
+ name = 'project_factory_test'
77
+ file = File.join Dir.tmpdir, 'project_factory_test.ruprj'
78
+ prj = Ruber::Project.new file, name
79
+ flexmock(Ruber::Project).should_receive(:new).once.with(file, name).and_return prj
80
+ mk = flexmock{|m| m.should_receive(:test).once.with(prj)}
81
+ @factory.connect(SIGNAL('project_created(QObject*)')){|pr| mk.test pr}
82
+ @factory.project file, name
83
+ end
84
+
85
+ it 'raises ProjectFactory::MismatchingNameError if there\'s a project associated with the same file but the project name is different from the second argument' do
86
+ file = File.join Dir.tmpdir, 'project_factory_test.ruprj'
87
+ old_name = 'project_factory_test'
88
+ old = @factory.project file, old_name
89
+ new_name = 'project_factory_test_other_name'
90
+ lambda{@factory.project file, new_name}.should raise_error(Ruber::World::ProjectFactory::MismatchingNameError, "A project associated with #{file} exists, but the corresponding project name is #{old_name} instead of #{new_name}")
91
+ end
92
+
93
+ it 'doesn\'t return an existing project which has been closed' do
94
+ file = File.join Dir.tmpdir, 'project_factory_test.ruprj'
95
+ old = @factory.project file, 'project_factory_test'
96
+ old.close false
97
+ new = @factory.project file, 'project_factory_test'
98
+ new.should_not == old
99
+ end
100
+
101
+
102
+ end
103
+
104
+ end