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.
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