ruber 0.0.1.1

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 (166) hide show
  1. data/COPYING +339 -0
  2. data/INSTALL +137 -0
  3. data/LICENSE +8 -0
  4. data/bin/ruber +65 -0
  5. data/data/share/apps/ruber/core_components.yaml +31 -0
  6. data/data/share/apps/ruber/ruberui.rc +109 -0
  7. data/data/share/icons/ruber.png +0 -0
  8. data/data/share/pixmaps/ruby.png +0 -0
  9. data/icons/ruber-16.png +0 -0
  10. data/icons/ruber-32.png +0 -0
  11. data/icons/ruber-48.png +0 -0
  12. data/icons/ruber-8.png +0 -0
  13. data/lib/ruber/application/application.rb +288 -0
  14. data/lib/ruber/application/plugin.yaml +11 -0
  15. data/lib/ruber/component_manager.rb +899 -0
  16. data/lib/ruber/config/config.rb +82 -0
  17. data/lib/ruber/config/plugin.yaml +3 -0
  18. data/lib/ruber/document_project.rb +209 -0
  19. data/lib/ruber/documents/document_list.rb +416 -0
  20. data/lib/ruber/documents/plugin.yaml +4 -0
  21. data/lib/ruber/editor/document.rb +506 -0
  22. data/lib/ruber/editor/editor_view.rb +167 -0
  23. data/lib/ruber/editor/ktexteditor_wrapper.rb +202 -0
  24. data/lib/ruber/exception_widgets.rb +245 -0
  25. data/lib/ruber/external_program_plugin.rb +397 -0
  26. data/lib/ruber/filtered_output_widget.rb +342 -0
  27. data/lib/ruber/gui_states_handler.rb +231 -0
  28. data/lib/ruber/kde_config_option_backend.rb +167 -0
  29. data/lib/ruber/kde_sugar.rb +249 -0
  30. data/lib/ruber/main_window/choose_plugins_dlg.rb +353 -0
  31. data/lib/ruber/main_window/main_window.rb +524 -0
  32. data/lib/ruber/main_window/main_window_actions.rb +537 -0
  33. data/lib/ruber/main_window/main_window_internal.rb +239 -0
  34. data/lib/ruber/main_window/open_file_in_project_dlg.rb +212 -0
  35. data/lib/ruber/main_window/output_color_widget.rb +35 -0
  36. data/lib/ruber/main_window/plugin.yaml +58 -0
  37. data/lib/ruber/main_window/save_modified_files_dlg.rb +89 -0
  38. data/lib/ruber/main_window/status_bar.rb +156 -0
  39. data/lib/ruber/main_window/ui/choose_plugins_widget.rb +90 -0
  40. data/lib/ruber/main_window/ui/choose_plugins_widget.ui +77 -0
  41. data/lib/ruber/main_window/ui/main_window_settings_widget.rb +108 -0
  42. data/lib/ruber/main_window/ui/main_window_settings_widget.ui +89 -0
  43. data/lib/ruber/main_window/ui/new_project_widget.rb +119 -0
  44. data/lib/ruber/main_window/ui/new_project_widget.ui +178 -0
  45. data/lib/ruber/main_window/ui/open_file_in_project_dlg.rb +109 -0
  46. data/lib/ruber/main_window/ui/open_file_in_project_dlg.ui +168 -0
  47. data/lib/ruber/main_window/ui/output_color_widget.rb +241 -0
  48. data/lib/ruber/main_window/ui/output_color_widget.ui +204 -0
  49. data/lib/ruber/main_window/workspace.rb +442 -0
  50. data/lib/ruber/output_widget.rb +1093 -0
  51. data/lib/ruber/plugin.rb +264 -0
  52. data/lib/ruber/plugin_like.rb +589 -0
  53. data/lib/ruber/plugin_specification.rb +106 -0
  54. data/lib/ruber/plugin_specification_reader.rb +451 -0
  55. data/lib/ruber/project.rb +493 -0
  56. data/lib/ruber/project_backend.rb +105 -0
  57. data/lib/ruber/projects/plugin.yaml +11 -0
  58. data/lib/ruber/projects/project_files_list.rb +314 -0
  59. data/lib/ruber/projects/project_files_widget.rb +301 -0
  60. data/lib/ruber/projects/project_list.rb +314 -0
  61. data/lib/ruber/projects/ui/project_files_rule_chooser_widget.rb +74 -0
  62. data/lib/ruber/projects/ui/project_files_rule_chooser_widget.ui +61 -0
  63. data/lib/ruber/projects/ui/project_files_widget.rb +117 -0
  64. data/lib/ruber/projects/ui/project_files_widget.ui +123 -0
  65. data/lib/ruber/qt_sugar.rb +673 -0
  66. data/lib/ruber/settings_container.rb +515 -0
  67. data/lib/ruber/settings_dialog.rb +244 -0
  68. data/lib/ruber/settings_dialog_manager.rb +503 -0
  69. data/lib/ruber/utils.rb +414 -0
  70. data/lib/ruber/yaml_option_backend.rb +159 -0
  71. data/outsider_files +15 -0
  72. data/plugins/autosave/autosave.rb +404 -0
  73. data/plugins/autosave/plugin.yaml +16 -0
  74. data/plugins/autosave/ui/autosave_config_widget.rb +83 -0
  75. data/plugins/autosave/ui/autosave_config_widget.ui +68 -0
  76. data/plugins/command/command.png +0 -0
  77. data/plugins/command/command.rb +74 -0
  78. data/plugins/command/plugin.yaml +11 -0
  79. data/plugins/find_in_files/find_in_files.rb +337 -0
  80. data/plugins/find_in_files/find_in_files_dlg.rb +411 -0
  81. data/plugins/find_in_files/find_in_files_ui.rc +11 -0
  82. data/plugins/find_in_files/find_in_files_widgets.rb +485 -0
  83. data/plugins/find_in_files/plugin.yaml +23 -0
  84. data/plugins/find_in_files/ui/config_widget.rb +58 -0
  85. data/plugins/find_in_files/ui/config_widget.ui +41 -0
  86. data/plugins/find_in_files/ui/find_in_files_widget.rb +260 -0
  87. data/plugins/find_in_files/ui/find_in_files_widget.ui +324 -0
  88. data/plugins/project_browser/plugin.yaml +10 -0
  89. data/plugins/project_browser/project_browser.rb +245 -0
  90. data/plugins/rake/plugin.yaml +39 -0
  91. data/plugins/rake/rake.png +0 -0
  92. data/plugins/rake/rake.rb +567 -0
  93. data/plugins/rake/rake_extension.rb +153 -0
  94. data/plugins/rake/rake_widgets.rb +615 -0
  95. data/plugins/rake/rakeui.rc +27 -0
  96. data/plugins/rake/ui/add_quick_task_widget.rb +71 -0
  97. data/plugins/rake/ui/add_quick_task_widget.ui +59 -0
  98. data/plugins/rake/ui/choose_task_widget.rb +77 -0
  99. data/plugins/rake/ui/choose_task_widget.ui +72 -0
  100. data/plugins/rake/ui/config_widget.rb +127 -0
  101. data/plugins/rake/ui/config_widget.ui +123 -0
  102. data/plugins/rake/ui/project_widget.rb +217 -0
  103. data/plugins/rake/ui/project_widget.ui +246 -0
  104. data/plugins/rspec/plugin.yaml +30 -0
  105. data/plugins/rspec/rspec.png +0 -0
  106. data/plugins/rspec/rspec.rb +945 -0
  107. data/plugins/rspec/rspec.svg +90 -0
  108. data/plugins/rspec/rspecui.rc +20 -0
  109. data/plugins/rspec/ruber_rspec_formatter.rb +312 -0
  110. data/plugins/rspec/ui/rspec_project_widget.rb +170 -0
  111. data/plugins/rspec/ui/rspec_project_widget.ui +193 -0
  112. data/plugins/ruby_development/plugin.yaml +27 -0
  113. data/plugins/ruby_development/ruby_development.png +0 -0
  114. data/plugins/ruby_development/ruby_development.rb +453 -0
  115. data/plugins/ruby_development/ruby_developmentui.rc +19 -0
  116. data/plugins/ruby_development/ui/project_widget.rb +112 -0
  117. data/plugins/ruby_development/ui/project_widget.ui +108 -0
  118. data/plugins/ruby_runner/config_widget.rb +116 -0
  119. data/plugins/ruby_runner/plugin.yaml +26 -0
  120. data/plugins/ruby_runner/project_widget.rb +62 -0
  121. data/plugins/ruby_runner/ruby.png +0 -0
  122. data/plugins/ruby_runner/ruby_interpretersui.rc +26 -0
  123. data/plugins/ruby_runner/ruby_runner.rb +411 -0
  124. data/plugins/ruby_runner/ui/config_widget.rb +92 -0
  125. data/plugins/ruby_runner/ui/config_widget.ui +91 -0
  126. data/plugins/ruby_runner/ui/project_widget.rb +60 -0
  127. data/plugins/ruby_runner/ui/project_widget.ui +48 -0
  128. data/plugins/ruby_runner/ui/ruby_runnner_plugin_option_widget.rb +59 -0
  129. data/plugins/ruby_runner/ui/ruby_runnner_plugin_option_widget.ui +44 -0
  130. data/plugins/state/plugin.yaml +28 -0
  131. data/plugins/state/state.rb +520 -0
  132. data/plugins/state/ui/config_widget.rb +92 -0
  133. data/plugins/state/ui/config_widget.ui +89 -0
  134. data/plugins/syntax_checker/plugin.yaml +18 -0
  135. data/plugins/syntax_checker/syntax_checker.rb +662 -0
  136. data/ruber.desktop +10 -0
  137. data/spec/annotation_model_spec.rb +174 -0
  138. data/spec/common.rb +119 -0
  139. data/spec/component_manager_spec.rb +1259 -0
  140. data/spec/document_list_spec.rb +626 -0
  141. data/spec/document_project_spec.rb +373 -0
  142. data/spec/document_spec.rb +779 -0
  143. data/spec/editor_view_spec.rb +167 -0
  144. data/spec/external_program_plugin_spec.rb +676 -0
  145. data/spec/filtered_output_widget_spec.rb +642 -0
  146. data/spec/gui_states_handler_spec.rb +304 -0
  147. data/spec/kde_config_option_backend_spec.rb +214 -0
  148. data/spec/kde_sugar_spec.rb +101 -0
  149. data/spec/ktexteditor_wrapper_spec.rb +305 -0
  150. data/spec/output_widget_spec.rb +1703 -0
  151. data/spec/plugin_spec.rb +1393 -0
  152. data/spec/plugin_specification_reader_spec.rb +1765 -0
  153. data/spec/plugin_specification_spec.rb +401 -0
  154. data/spec/project_backend_spec.rb +172 -0
  155. data/spec/project_files_list_spec.rb +401 -0
  156. data/spec/project_list_spec.rb +511 -0
  157. data/spec/project_spec.rb +990 -0
  158. data/spec/qt_sugar_spec.rb +328 -0
  159. data/spec/settings_container_spec.rb +617 -0
  160. data/spec/settings_dialog_manager_spec.rb +773 -0
  161. data/spec/settings_dialog_spec.rb +419 -0
  162. data/spec/state_spec.rb +991 -0
  163. data/spec/utils_spec.rb +406 -0
  164. data/spec/workspace_spec.rb +869 -0
  165. data/spec/yaml_option_backend_spec.rb +246 -0
  166. metadata +284 -0
@@ -0,0 +1,773 @@
1
+ require 'spec/common'
2
+
3
+ require 'set'
4
+
5
+ require 'ruber/settings_dialog_manager'
6
+ require 'ruber/settings_dialog'
7
+ require 'ruber/settings_container'
8
+
9
+ describe 'Ruber::SettingsDialogManager' do
10
+
11
+ before do
12
+ @back = flexmock('backend'){|m| m.should_ignore_missing}
13
+ @cont = Object.new
14
+ @cont.extend Ruber::SettingsContainer
15
+ @cont.send :setup_container, @back
16
+ @options = {
17
+ OS.new({:name => :o1, :default => 'abc', :group => :G1}) => 'abc',
18
+ OS.new({:name => :o2, :default => 3, :group => :G2}) => 1
19
+ }
20
+ @options.each do |k, v|
21
+ @cont.add_option k
22
+ @cont[k.group, k.name] = v
23
+ end
24
+ @mw = Qt::Widget.new
25
+ flexmock(Ruber).should_receive(:[]).with(:main_window).and_return(@mw).by_default
26
+ end
27
+
28
+ it 'should inherit from Qt::Object' do
29
+ dlg = Ruber::SettingsDialog.new @cont, [], []
30
+ manager = Ruber::SettingsDialogManager.new dlg, @options.keys, []
31
+ manager.should be_a(Qt::Object)
32
+ end
33
+
34
+ it 'should call the setup_option method for each option when created' do
35
+ dlg = Ruber::SettingsDialog.new @cont, [], []
36
+ $settings_dialog_manager_constructor = Set.new
37
+ class Ruber::SettingsDialogManager
38
+ alias_method :old_setup_option, :setup_option
39
+ def setup_option opt
40
+ $settings_dialog_manager_constructor << opt
41
+ end
42
+ end
43
+ manager = Ruber::SettingsDialogManager.new dlg, @options.keys, []
44
+ $settings_dialog_manager_constructor.should == Set.new(@options.keys)
45
+ class Ruber::SettingsDialogManager
46
+ alias_method :setup_option, :old_setup_option
47
+ end
48
+ end
49
+
50
+ end
51
+
52
+ describe 'Ruber::SettingsDialogManager#setup_option' do
53
+
54
+ include FlexMock::ArgumentTypes
55
+
56
+ before do
57
+ @back = flexmock('backend'){|m| m.should_ignore_missing}
58
+ @cont = Object.new
59
+ @cont.extend Ruber::SettingsContainer
60
+ @cont.send :setup_container, @back
61
+ @options = {
62
+ OS.new({:name => :o1, :default => 'abc', :group => :G1}) => 'abc',
63
+ OS.new({:name => :o2, :default => 3, :group => :G2}) => 1,
64
+ OS.new({:name => :o3, :default => nil, :group => :G1}) => /a/
65
+ }
66
+ w = Qt::Widget.new
67
+ w1 = Qt::LineEdit.new( w){|le| le.object_name = '_G1__o1'}
68
+
69
+ @widgets = [ w, Qt::SpinBox.new{|s| s.object_name = '_G2__o2'} ]
70
+
71
+ @options.each do |k, v|
72
+ @cont.add_option k
73
+ @cont[k.group, k.name] = v
74
+ end
75
+ @mw = Qt::Widget.new
76
+ flexmock(Ruber).should_receive(:[]).with(:main_window).and_return(@mw).by_default
77
+ @dlg = Ruber::SettingsDialog.new nil, [], []
78
+ end
79
+
80
+ it 'should call the setup_automatic_option method if one of the widgets, or one of their children has an object name made of: underscore, option group, double underscore, option name' do
81
+ manager = Ruber::SettingsDialogManager.new @dlg, [], @widgets
82
+ options = @options.invert
83
+ lineedit = @widgets[0].find_child(Qt::LineEdit)
84
+ flexmock(manager).should_receive(:setup_automatic_option).once.with(options['abc'], lineedit, @widgets[0])
85
+ flexmock(manager).should_receive(:setup_automatic_option).once.with(options[1], @widgets[1], @widgets[1])
86
+ flexmock(manager).should_receive(:setup_automatic_option).never.with(options[nil], any, any)
87
+ @options.each_key{|v| manager.send :setup_option, v}
88
+ end
89
+
90
+ end
91
+
92
+ describe 'Ruber::SettingsDialogManager#setup_automatic_option, if the widget has a signle signal in the "signal" property' do
93
+
94
+ before do
95
+ @mw = Qt::Widget.new
96
+ flexmock(Ruber).should_receive(:[]).with(:main_window).and_return(@mw).by_default
97
+ @dlg = Ruber::SettingsDialog.new nil, [], []
98
+ end
99
+
100
+ it 'should connect the object\'s signal with the SettingsDialogManager "settings_changed" slot' do
101
+ widgets = [Qt::LineEdit.new{|w| w.object_name = '_G1__o1'}]
102
+ widgets[0].set_property 'signal', Qt::Variant.new('textChanged(QString)')
103
+ manager = Ruber::SettingsDialogManager.new @dlg, [], widgets
104
+ def manager.connect;end #needed because otherwise flexmock refuses to create a mock for it, saying it's undefined
105
+ flexmock(manager).should_receive(:connect).once.with(widgets[0], SIGNAL('textChanged(QString)'), manager, SLOT(:settings_changed)).once
106
+ manager.send :setup_automatic_option, OS.new({:name => :o1, :group => :G1, :default => 'abc'}), widgets[0], widgets[0]
107
+ end
108
+
109
+ it 'should automatically determine the signature of the signal, if only the name is given' do
110
+ widgets = [Qt::LineEdit.new{|w| w.object_name = '_G1__o1'}]
111
+ widgets[0].set_property 'signal', Qt::Variant.new('textChanged')
112
+ manager = Ruber::SettingsDialogManager.new @dlg, [], widgets
113
+ def manager.connect;end #needed because otherwise flexmock refuses to create a mock for it, saying it's undefined
114
+ flexmock(manager).should_receive(:connect).once.with(widgets[0], SIGNAL('textChanged(QString)'), manager, SLOT(:settings_changed)).once
115
+ manager.send :setup_automatic_option, OS.new({:name => :o1, :group => :G1, :default => 'abc'}), widgets[0], widgets[0]
116
+ end
117
+
118
+ it 'should raise ArgumentError if the signature of the signal isn\'t given and no signal matches the given name' do
119
+ widgets = [Qt::LineEdit.new{|w| w.object_name = '_G1__o1'}]
120
+ widgets[0].set_property 'signal', Qt::Variant.new('my_signal')
121
+ manager = Ruber::SettingsDialogManager.new @dlg, [], widgets
122
+ lambda do
123
+ manager.send :setup_automatic_option, OS.new({:name => :o1, :group => :G1, :default => 'abc'}), widgets[0], widgets[0]
124
+ end.should raise_error(ArgumentError, "No signal with name 'my_signal' exist")
125
+ end
126
+
127
+ it 'should raise ArgumentError if the signature of the signal isn\'t given and more than one signal has the given name' do
128
+ widgets = [Qt::ComboBox.new{|w| w.object_name = '_G1__o1'}]
129
+ widgets[0].set_property 'signal', Qt::Variant.new('currentIndexChanged')
130
+ manager = Ruber::SettingsDialogManager.new @dlg, [], widgets
131
+ lambda do
132
+ manager.send :setup_automatic_option, OS.new({:name => :o1, :group => :G1, :default => 'abc'}), widgets[0], widgets[0]
133
+ end.should raise_error(ArgumentError, "Ambiguous signal name, 'currentIndexChanged'")
134
+ end
135
+
136
+ it 'should associate the option with widget and its "read" property, if given' do
137
+ w = Qt::LineEdit.new do |wi|
138
+ wi.object_name = '_G1__o1'
139
+ wi.set_property 'signal', Qt::Variant.new('textChanged(QString)')
140
+ wi.set_property 'read', Qt::Variant.new('text_from_option')
141
+ end
142
+ widgets = [w]
143
+ manager = Ruber::SettingsDialogManager.new @dlg, [], widgets
144
+ manager.send :setup_automatic_option, OS.new({:name => :o1, :group => :G1, :default => 'abc'}), w, w
145
+ manager.instance_variable_get(:@associations)[w.object_name][:read].should == [w, 'text_from_option']
146
+ end
147
+
148
+ it 'should associate the option with widget and its "store" property, if given' do
149
+ w = Qt::LineEdit.new do |wi|
150
+ wi.object_name = '_G1__o1'
151
+ wi.set_property 'signal', Qt::Variant.new('textChanged(QString)')
152
+ wi.set_property 'store', Qt::Variant.new('text_to_option')
153
+ end
154
+ widgets = [w]
155
+ manager = Ruber::SettingsDialogManager.new @dlg, [], widgets
156
+ manager.send :setup_automatic_option, OS.new({:name => :o1, :group => :G1, :default => 'abc'}), w, w
157
+ manager.instance_variable_get(:@associations)[w.object_name][:store].should == [w, 'text_to_option']
158
+ end
159
+
160
+ it 'should raise ArgumentError if the widget has the read and/or the store properties together with the access property' do
161
+ w = Qt::LineEdit.new do |wi|
162
+ wi.object_name = '_G1__o1'
163
+ wi.set_property 'signal', Qt::Variant.new('textChanged(QString)')
164
+ wi.set_property 'store', Qt::Variant.new('text_to_option')
165
+ wi.set_property 'access', Qt::Variant.new('option')
166
+ end
167
+
168
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
169
+ lambda do
170
+ manager.send :setup_automatic_option, OS.new({:name => :o1, :group => :G1, :default => 'abc'}), w, w
171
+ end.should raise_error(ArgumentError, 'The widget _G1__o1 has both the access property and one or both of the store and read properties')
172
+
173
+ w = Qt::LineEdit.new do |wi|
174
+ wi.object_name = '_G1__o1'
175
+ wi.set_property 'signal', Qt::Variant.new('textChanged(QString)')
176
+ wi.set_property 'read', Qt::Variant.new('option_to_text')
177
+ wi.set_property 'access', Qt::Variant.new('option')
178
+ end
179
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
180
+ lambda do
181
+ manager.send :setup_automatic_option, OS.new({:name => :o1, :group => :G1, :default => 'abc'}), w, w
182
+ end.should raise_error(ArgumentError, 'The widget _G1__o1 has both the access property and one or both of the store and read properties')
183
+
184
+ w = Qt::LineEdit.new do |wi|
185
+ wi.object_name = '_G1__o1'
186
+ wi.set_property 'signal', Qt::Variant.new('textChanged(QString)')
187
+ wi.set_property 'store', Qt::Variant.new('text_to_option')
188
+ wi.set_property 'read', Qt::Variant.new('option_to_text')
189
+ wi.set_property 'access', Qt::Variant.new('option')
190
+ end
191
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
192
+ lambda do
193
+ manager.send :setup_automatic_option, OS.new({:name => :o1, :group => :G1, :default => 'abc'}), w, w
194
+ end.should raise_error(ArgumentError, 'The widget _G1__o1 has both the access property and one or both of the store and read properties')
195
+ end
196
+
197
+ it 'should use the widget\'s "access" insteaod of the "store" property, if it exists' do
198
+ w = Qt::LineEdit.new do |wi|
199
+ wi.object_name = '_G1__o1'
200
+ wi.set_property 'signal', Qt::Variant.new('textChanged(QString)')
201
+ wi.set_property 'access', Qt::Variant.new('option')
202
+ end
203
+ widgets = [w]
204
+ manager = Ruber::SettingsDialogManager.new @dlg, [], widgets
205
+ manager.send :setup_automatic_option, OS.new({:name => :o1, :group => :G1, :default => 'abc'}), w, w
206
+ manager.instance_variable_get(:@associations)[w.object_name][:store].should == [w, 'option']
207
+ end
208
+
209
+ it 'should derive the "read" property from the widget\'s "access" property, if it exists, by removing the ending ? or ! (if it exists) and by adding an ending =' do
210
+ w = Qt::LineEdit.new do |wi|
211
+ wi.object_name = '_G1__o1'
212
+ wi.set_property 'signal', Qt::Variant.new('textChanged(QString)')
213
+ wi.set_property 'access', Qt::Variant.new('option')
214
+ end
215
+ widgets = [w]
216
+ manager = Ruber::SettingsDialogManager.new @dlg, [], widgets
217
+ manager.send :setup_automatic_option, OS.new({:name => :o1, :group => :G1, :default => 'abc'}), w, w
218
+ manager.instance_variable_get(:@associations)[w.object_name][:read].should == [w, 'option=']
219
+
220
+ w.set_property 'access', Qt::Variant.new('option?')
221
+ manager = Ruber::SettingsDialogManager.new @dlg, [], widgets
222
+ manager.send :setup_automatic_option, OS.new({:name => :o1, :group => :G1, :default => 'abc'}), w, w
223
+ manager.instance_variable_get(:@associations)[w.object_name][:read].should == [w, 'option=']
224
+
225
+ w.set_property 'access', Qt::Variant.new('option!')
226
+ manager = Ruber::SettingsDialogManager.new @dlg, [], widgets
227
+ manager.send :setup_automatic_option, OS.new({:name => :o1, :group => :G1, :default => 'abc'}), w, w
228
+ manager.instance_variable_get(:@associations)[w.object_name][:read].should == [w, 'option=']
229
+
230
+ end
231
+
232
+ it 'should associate the option with the widget\'s top-level widget for reading, storing or both if respectively the "read", "store" or "access" property begin with $' do
233
+ top = Qt::Widget.new
234
+ w = Qt::LineEdit.new(top) do |wi|
235
+ wi.object_name = '_G1__o1'
236
+ wi.set_property 'signal', Qt::Variant.new('textChanged(QString)')
237
+ wi.set_property 'read', Qt::Variant.new('$text_from_option')
238
+ wi.set_property 'store', Qt::Variant.new('option_from_text')
239
+ end
240
+ widgets = [top]
241
+ manager = Ruber::SettingsDialogManager.new @dlg, [], top
242
+ manager.send :setup_automatic_option, OS.new({:name => :o1, :group => :G1, :default => 'abc'}), w, top
243
+ manager.instance_variable_get(:@associations)[w.object_name][:read].should == [top, 'text_from_option']
244
+ manager.instance_variable_get(:@associations)[w.object_name][:store].should == [w, 'option_from_text']
245
+
246
+ top = Qt::Widget.new
247
+ w = Qt::LineEdit.new(top) do |wi|
248
+ wi.object_name = '_G1__o1'
249
+ wi.set_property 'signal', Qt::Variant.new('textChanged(QString)')
250
+ wi.set_property 'read', Qt::Variant.new('text_from_option')
251
+ wi.set_property 'store', Qt::Variant.new('$option_from_text')
252
+ end
253
+ widgets = [top]
254
+ manager = Ruber::SettingsDialogManager.new @dlg, [], top
255
+ manager.send :setup_automatic_option, OS.new({:name => :o1, :group => :G1, :default => 'abc'}), w, top
256
+ manager.instance_variable_get(:@associations)[w.object_name][:read].should == [w, 'text_from_option']
257
+ manager.instance_variable_get(:@associations)[w.object_name][:store].should == [top, 'option_from_text']
258
+
259
+ top = Qt::Widget.new
260
+ w = Qt::LineEdit.new(top) do |wi|
261
+ wi.object_name = '_G1__o1'
262
+ wi.set_property 'signal', Qt::Variant.new('textChanged(QString)')
263
+ wi.set_property 'access', Qt::Variant.new('$option')
264
+ end
265
+ widgets = [top]
266
+ manager = Ruber::SettingsDialogManager.new @dlg, [], top
267
+ manager.send :setup_automatic_option, OS.new({:name => :o1, :group => :G1, :default => 'abc'}), w, top
268
+ manager.instance_variable_get(:@associations)[w.object_name][:read].should == [top, 'option=']
269
+ manager.instance_variable_get(:@associations)[w.object_name][:store].should == [top, 'option']
270
+ end
271
+
272
+ it 'should generate the "store" property from the name of the signal, removing the changed/edited/modified words from its end, if the object has neither "store" nor the "access" property' do
273
+ w = Qt::LineEdit.new{|wi| wi.object_name = '_G1__o1'}
274
+ opt = OS.new({:name => :o1, :group => :G1, :default => 'abc'})
275
+
276
+ w.set_property 'signal', Qt::Variant.new( 'textChanged(QString)')
277
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
278
+ manager.send :setup_automatic_option, opt, w, w
279
+ manager.instance_variable_get(:@associations)[w.object_name][:store].should == [w, 'text']
280
+
281
+ w.set_property 'signal', Qt::Variant.new( 'textModified(QString)')
282
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
283
+ manager.send :setup_automatic_option, opt, w, w
284
+ manager.instance_variable_get(:@associations)[w.object_name][:store].should == [w, 'text']
285
+
286
+ w.set_property 'signal', Qt::Variant.new( 'textEdited(QString)')
287
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
288
+ manager.send :setup_automatic_option, opt, w, w
289
+ manager.instance_variable_get(:@associations)[w.object_name][:store].should == [w, 'text']
290
+
291
+ w.set_property 'signal', Qt::Variant.new( 'text_changed(QString)')
292
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
293
+ manager.send :setup_automatic_option, opt, w, w
294
+ manager.instance_variable_get(:@associations)[w.object_name][:store].should == [w, 'text']
295
+
296
+ w.set_property 'signal', Qt::Variant.new( 'text_modified(QString)')
297
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
298
+ manager.send :setup_automatic_option, opt, w, w
299
+ manager.instance_variable_get(:@associations)[w.object_name][:store].should == [w, 'text']
300
+
301
+ w.set_property 'signal', Qt::Variant.new( 'text_edited(QString)')
302
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
303
+ manager.send :setup_automatic_option, opt, w, w
304
+ manager.instance_variable_get(:@associations)[w.object_name][:store].should == [w, 'text']
305
+
306
+ w.set_property 'signal', Qt::Variant.new( 'state(QString)')
307
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
308
+ manager.send :setup_automatic_option, opt, w, w
309
+ manager.instance_variable_get(:@associations)[w.object_name][:store].should == [w, 'state']
310
+ end
311
+
312
+ it 'should generate the "store" property from the name of the signal, removing the changed/edited/modified words from its end, if the object has neither "store" nor the "access" property' do
313
+ w = Qt::LineEdit.new{|wi| wi.object_name = '_G1__o1'}
314
+ opt = OS.new({:name => :o1, :group => :G1, :default => 'abc'})
315
+
316
+ w.set_property 'signal', Qt::Variant.new( 'textChanged(QString)')
317
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
318
+ manager.send :setup_automatic_option, opt, w, w
319
+ manager.instance_variable_get(:@associations)[w.object_name][:store].should == [w, 'text']
320
+
321
+ w.set_property 'signal', Qt::Variant.new( 'textModified(QString)')
322
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
323
+ manager.send :setup_automatic_option, opt, w, w
324
+ manager.instance_variable_get(:@associations)[w.object_name][:store].should == [w, 'text']
325
+
326
+ w.set_property 'signal', Qt::Variant.new( 'textEdited(QString)')
327
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
328
+ manager.send :setup_automatic_option, opt, w, w
329
+ manager.instance_variable_get(:@associations)[w.object_name][:store].should == [w, 'text']
330
+
331
+ w.set_property 'signal', Qt::Variant.new( 'text_changed(QString)')
332
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
333
+ manager.send :setup_automatic_option, opt, w, w
334
+ manager.instance_variable_get(:@associations)[w.object_name][:store].should == [w, 'text']
335
+
336
+ w.set_property 'signal', Qt::Variant.new( 'text_modified(QString)')
337
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
338
+ manager.send :setup_automatic_option, opt, w, w
339
+ manager.instance_variable_get(:@associations)[w.object_name][:store].should == [w, 'text']
340
+
341
+ w.set_property 'signal', Qt::Variant.new( 'text_edited(QString)')
342
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
343
+ manager.send :setup_automatic_option, opt, w, w
344
+ manager.instance_variable_get(:@associations)[w.object_name][:store].should == [w, 'text']
345
+
346
+ w.set_property 'signal', Qt::Variant.new( 'state(QString)')
347
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
348
+ manager.send :setup_automatic_option, opt, w, w
349
+ manager.instance_variable_get(:@associations)[w.object_name][:store].should == [w, 'state']
350
+ end
351
+
352
+ it 'should generate the "read" property from the name of the signal, removing the changed/edited/modified words from its end and adding a final =, if the object has neither "read" nor the "access" property' do
353
+ w = Qt::LineEdit.new{|wi| wi.object_name = '_G1__o1'}
354
+ opt = OS.new({:name => :o1, :group => :G1, :default => 'abc'})
355
+
356
+ w.set_property 'signal', Qt::Variant.new( 'textChanged(QString)')
357
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
358
+ manager.send :setup_automatic_option, opt, w, w
359
+ manager.instance_variable_get(:@associations)[w.object_name][:read].should == [w, 'text=']
360
+
361
+ w.set_property 'signal', Qt::Variant.new( 'textModified(QString)')
362
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
363
+ manager.send :setup_automatic_option, opt, w, w
364
+ manager.instance_variable_get(:@associations)[w.object_name][:read].should == [w, 'text=']
365
+
366
+ w.set_property 'signal', Qt::Variant.new( 'textEdited(QString)')
367
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
368
+ manager.send :setup_automatic_option, opt, w, w
369
+ manager.instance_variable_get(:@associations)[w.object_name][:read].should == [w, 'text=']
370
+
371
+ w.set_property 'signal', Qt::Variant.new( 'text_changed(QString)')
372
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
373
+ manager.send :setup_automatic_option, opt, w, w
374
+ manager.instance_variable_get(:@associations)[w.object_name][:read].should == [w, 'text=']
375
+
376
+ w.set_property 'signal', Qt::Variant.new( 'text_modified(QString)')
377
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
378
+ manager.send :setup_automatic_option, opt, w, w
379
+ manager.instance_variable_get(:@associations)[w.object_name][:read].should == [w, 'text=']
380
+
381
+ w.set_property 'signal', Qt::Variant.new( 'text_edited(QString)')
382
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
383
+ manager.send :setup_automatic_option, opt, w, w
384
+ manager.instance_variable_get(:@associations)[w.object_name][:read].should == [w, 'text=']
385
+
386
+ w.set_property 'signal', Qt::Variant.new( 'state(QString)')
387
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
388
+ manager.send :setup_automatic_option, opt, w, w
389
+ manager.instance_variable_get(:@associations)[w.object_name][:read].should == [w, 'state=']
390
+ end
391
+
392
+ end
393
+
394
+ describe 'Ruber::SettingsDialogManager#setup_automatic_option, when the widget specifies more than one signal' do
395
+
396
+ before do
397
+ @mw = Qt::Widget.new
398
+ flexmock(Ruber).should_receive(:[]).with(:main_window).and_return(@mw).by_default
399
+ @dlg = Ruber::SettingsDialog.new nil, [], []
400
+ end
401
+
402
+ it 'should connect each of its signals to the settings_changed slot' do
403
+ widgets = [Qt::LineEdit.new{|w| w.object_name = '_G1__o1'}]
404
+ widgets[0].set_property 'signal', Qt::Variant.new('[textChanged(QString), textEdited(QString)]')
405
+ widgets[0].set_property 'access', Qt::Variant.new('text')
406
+ manager = Ruber::SettingsDialogManager.new @dlg, [], widgets
407
+ def manager.connect;end #needed because otherwise flexmock refuses to create a mock for it, saying it's undefined
408
+ flexmock(manager).should_receive(:connect).once.with(widgets[0], SIGNAL('textChanged(QString)'), manager, SLOT(:settings_changed)).once
409
+ flexmock(manager).should_receive(:connect).once.with(widgets[0], SIGNAL('textEdited(QString)'), manager, SLOT(:settings_changed)).once
410
+ manager.send :setup_automatic_option, OS.new({:name => :o1, :group => :G1, :default => 'abc'}), widgets[0], widgets[0]
411
+ end
412
+
413
+ it 'should automatically determine the signatures of the signals' do
414
+ widgets = [Qt::LineEdit.new{|w| w.object_name = '_G1__o1'}]
415
+ widgets[0].set_property 'signal', Qt::Variant.new('[textChanged, textEdited]')
416
+ widgets[0].set_property 'access', Qt::Variant.new('text')
417
+ manager = Ruber::SettingsDialogManager.new @dlg, [], widgets
418
+ def manager.connect;end #needed because otherwise flexmock refuses to create a mock for it, saying it's undefined
419
+ flexmock(manager).should_receive(:connect).once.with(widgets[0], SIGNAL('textChanged(QString)'), manager, SLOT(:settings_changed)).once
420
+ flexmock(manager).should_receive(:connect).once.with(widgets[0], SIGNAL('textEdited(QString)'), manager, SLOT(:settings_changed)).once
421
+ manager.send :setup_automatic_option, OS.new({:name => :o1, :group => :G1, :default => 'abc'}), widgets[0], widgets[0]
422
+ end
423
+
424
+ it 'should raise ArgumentError if the widget doesn\'t have the "access" property or both the "store" and the "read" properties' do
425
+ widgets = [Qt::LineEdit.new{|w| w.object_name = '_G1__o1'}]
426
+ widgets[0].set_property 'signal', Qt::Variant.new('[textChanged, textEdited]')
427
+ manager = Ruber::SettingsDialogManager.new @dlg, [], widgets
428
+ lambda do
429
+ manager.send :setup_automatic_option, OS.new({:name => :o1, :group => :G1, :default => 'abc'}), widgets[0], widgets[0]
430
+ end.should raise_error(ArgumentError, "When more signals are specified, you need to specify also the access property or both the read and store properties")
431
+ end
432
+
433
+ end
434
+
435
+ describe 'Ruber::SettingsDialogManager#setup_automatic_option, when no signal is specified' do
436
+
437
+ defaults = [
438
+ [ Qt::CheckBox , 'toggled(bool)', "checked?"],
439
+ [Qt::PushButton , 'toggled(bool)', "checked?"],
440
+ [KDE::PushButton , 'toggled(bool)', "checked?"],
441
+ [KDE::ColorButton, 'changed(QColor)', "color"],
442
+ [KDE::IconButton, 'iconChanged(QString)', "icon"],
443
+ [Qt::LineEdit , 'textChanged(QString)', "text"],
444
+ [KDE::LineEdit , 'textChanged(QString)', "text"],
445
+ [KDE::RestrictedLine, 'textChanged(QString)', "text"],
446
+ [Qt::ComboBox, 'currentIndexChanged(int)', "current_index"],
447
+ [KDE::ComboBox, 'currentIndexChanged(int)', "current_index"],
448
+ [KDE::ColorCombo, 'currentIndexChanged(int)', "color"],
449
+ [Qt::TextEdit, 'textChanged(QString)', "text"],
450
+ [KDE::TextEdit, 'textChanged(QString)', "text"],
451
+ [Qt::PlainTextEdit, 'textChanged(QString)', "text"],
452
+ [Qt::SpinBox, 'valueChanged(int)', "value"],
453
+ [KDE::IntSpinBox, 'valueChanged(int)', "value"],
454
+ [Qt::DoubleSpinBox, 'valueChanged(double)', "value"],
455
+ [KDE::IntNumInput, 'valueChanged(int)', "value"],
456
+ [KDE::DoubleNumInput, 'valueChanged(double)', "value"],
457
+ [Qt::TimeEdit, 'timeChanged(QTime)', "time"],
458
+ [Qt::DateEdit, 'dateChanged(QDate)', "date"],
459
+ [Qt::DateTimeEdit, 'dateTimeChanged(QDateTime)', "date_time"],
460
+ [Qt::Dial, 'valueChanged(int)', "value"],
461
+ [Qt::Slider, 'valueChanged(int)', "value"],
462
+ [KDE::DatePicker, 'dateChanged(QDate)', "date"],
463
+ [KDE::DateTimeWidget, 'valueChanged(QDateTime)', "date_time"],
464
+ [KDE::DateWidget, 'changed(QDate)', "date"],
465
+ [KDE::FontComboBox, 'currentFontChanged(QFont)', "current_font"],
466
+ [KDE::FontRequester, 'fontSelected(QFont)', "font"],
467
+ [KDE::UrlRequester, 'textChanged(QString)', "url"]
468
+ ]
469
+
470
+ before do
471
+ @mw = Qt::Widget.new
472
+ flexmock(Ruber).should_receive(:[]).with(:main_window).and_return(@mw).by_default
473
+ @dlg = Ruber::SettingsDialog.new nil, [], []
474
+ end
475
+
476
+ defaults.each do |cls, *s|
477
+ desc = "should behave as if the widget had'#{s[0]}' for the \"signal\" property and '#{s[1]}' for the \"accessor\" property, if the object is of class #{cls} and neither the 'access' nor the 'read' and 'store' properties have been specified"
478
+ it desc do
479
+ extend FlexMock::ArgumentTypes
480
+ widgets = [cls.new{|w| w.object_name = '_G1__o1'}]
481
+ opt = OS.new({:name => :o1, :group => :G1, :default => 'x'})
482
+ manager = Ruber::SettingsDialogManager.new @dlg, [opt], widgets
483
+ def manager.connect;end
484
+ flexmock(manager).should_receive(:connect).once.with(widgets[0], SIGNAL(s[0]), manager, SLOT(:settings_changed))
485
+ manager.send :setup_automatic_option, opt, widgets[0], widgets[0]
486
+ assoc = manager.instance_variable_get(:@associations)
487
+ assoc['_G1__o1'][:store][1].should == s[1]
488
+ assoc['_G1__o1'][:read][1].should == s[1].sub(/[\?!]$/, '') + '='
489
+ end
490
+ end
491
+
492
+ defaults.each do |cls, *s|
493
+ desc = "should behave as if the widget had'#{s[0]}' for the \"signal\" property if the object is of class #{cls} and the 'access' property has been specified"
494
+ it desc do
495
+ extend FlexMock::ArgumentTypes
496
+ w = cls.new do |w|
497
+ w.object_name = '_G1__o1'
498
+ w.set_property 'access', Qt::Variant.new('option')
499
+ end
500
+ opt = OS.new({:name => :o1, :group => :G1, :default => 'x'})
501
+ manager = Ruber::SettingsDialogManager.new @dlg, [opt], [w]
502
+ def manager.connect;end
503
+ flexmock(manager).should_receive(:connect).once.with(w, SIGNAL(s[0]), manager, SLOT(:settings_changed))
504
+ manager.send :setup_automatic_option, opt, w, w
505
+ assoc = manager.instance_variable_get(:@associations)
506
+ assoc['_G1__o1'][:store][1].should == 'option'
507
+ assoc['_G1__o1'][:read][1].should == 'option='
508
+ end
509
+ end
510
+
511
+ defaults.each do |cls, *s|
512
+ desc = "should behave as if the widget had'#{s[0]}' for the \"signal\" property if the object is of class #{cls} and the 'read' and 'store' properties have been specified"
513
+ it desc do
514
+ extend FlexMock::ArgumentTypes
515
+ w = cls.new do |w|
516
+ w.object_name = '_G1__o1'
517
+ w.set_property 'read', Qt::Variant.new('option=')
518
+ w.set_property 'store', Qt::Variant.new('option')
519
+ end
520
+ opt = OS.new({:name => :o1, :group => :G1, :default => 'x'})
521
+ manager = Ruber::SettingsDialogManager.new @dlg, [opt], [w]
522
+ def manager.connect;end
523
+ flexmock(manager).should_receive(:connect).once.with(w, SIGNAL(s[0]), manager, SLOT(:settings_changed))
524
+ manager.send :setup_automatic_option, opt, w, w
525
+ assoc = manager.instance_variable_get(:@associations)
526
+ assoc['_G1__o1'][:store][1].should == 'option'
527
+ assoc['_G1__o1'][:read][1].should == 'option='
528
+ end
529
+ end
530
+
531
+ it 'should raise ArgumentError if the object is of an unknown class' do
532
+ w = Qt::Frame.new{|w| w.object_name = '_G1__o1'}
533
+ manager = Ruber::SettingsDialogManager.new @dlg, [], [w]
534
+ opt = OS.new({:name => :o1, :group => :G1, :default => 'x'})
535
+ lambda do
536
+ manager.send :setup_automatic_option, opt, w, w
537
+ end.should raise_error(ArgumentError, "No default signal exists for class Qt::Frame, you need to specify one")
538
+ end
539
+
540
+ end
541
+
542
+ describe 'Ruber::SettingsDialog#convert_value' do
543
+
544
+ before do
545
+ @mw = Qt::Widget.new
546
+ flexmock(Ruber).should_receive(:[]).with(:main_window).and_return(@mw).by_default
547
+ @back = flexmock('backend'){|m| m.should_ignore_missing}
548
+ @cont = Object.new
549
+ @cont.extend Ruber::SettingsContainer
550
+ @cont.send :setup_container, @back
551
+ @dlg = @cont.dialog
552
+ @manager = @dlg.instance_variable_get(:@manager)
553
+ end
554
+
555
+ it 'should return the firts argument if both argument are of the same class' do
556
+ str1 = "abc"
557
+ @manager.send(:convert_value, str1, "xyz").should equal(str1)
558
+ @manager.send(:convert_value, 1, 2).should == 1
559
+ end
560
+
561
+ it 'should return the first argument if there\'s no conversion method from the class of the first to the class of the second' do
562
+ a = [1,2, 3]
563
+ @manager.send(:convert_value, a, "xyz").should equal(a)
564
+ h = {:a => 1, :b => 2}
565
+ @manager.send(:convert_value, h, []).should equal(h)
566
+ end
567
+
568
+ it 'should convert a string to a symbol and vice versa' do
569
+ @manager.send(:convert_value, :xyz, "abc").should == 'xyz'
570
+ @manager.send(:convert_value, 'xyz', :abc).should == :xyz
571
+ end
572
+
573
+ it 'should convert a string to a KDE::Url and vice versa' do
574
+ @manager.send(:convert_value, ENV['HOME'], KDE::Url.new).should == KDE::Url.from_path(ENV['HOME'])
575
+ @manager.send(:convert_value, KDE::Url.from_path(ENV['HOME']), '').should == ENV['HOME']
576
+ @manager.send(:convert_value, KDE::Url.new, '').should == ''
577
+ end
578
+
579
+ it 'should convert a string to a FixNum and vice versa' do
580
+ @manager.send(:convert_value, 1, '').should == '1'
581
+ @manager.send(:convert_value, '1', 0).should == 1
582
+ end
583
+
584
+ it 'should convert a string to a Float and vice versa' do
585
+ @manager.send(:convert_value, 1.2, '').should == 1.2.to_s
586
+ @manager.send(:convert_value, '1.2', 1.0).should == 1.2
587
+ end
588
+
589
+ it 'should not convert true to false or vice versa' do
590
+ @manager.send(:convert_value, true, false).should be_true
591
+ @manager.send(:convert_value, false, true).should be_false
592
+ end
593
+
594
+ end
595
+
596
+ describe 'Ruber::SettingsDialog#read_settings' do
597
+
598
+ before do
599
+ @mw = Qt::Widget.new
600
+ flexmock(Ruber).should_receive(:[]).with(:main_window).and_return(@mw).by_default
601
+ @back = flexmock('backend'){|m| m.should_ignore_missing}
602
+ @cont = Object.new
603
+ @cont.extend Ruber::SettingsContainer
604
+ @cont.send :setup_container, @back
605
+ @options = [
606
+ OS.new({:name => :o1, :default => 3, :group => :G1}),
607
+ OS.new({:name => :o2, :default => "abc", :group => :G2}),
608
+ OS.new({:name => :o3, :default => true, :group => :G1}),
609
+ ]
610
+ @option_values = [-2, "xyz", false]
611
+ @options.each{|o| @cont.add_option o}
612
+ @options.zip(@option_values).each{|op, val| @cont[op.group, op.name] = val}
613
+ end
614
+
615
+ it 'should call the read methods associated to each option, passing as argument the value of the option read from the option container' do
616
+ widgets_data = [
617
+ OS.new({:caption => 'C1', :code => 'Qt::LineEdit.new{|w| w.object_name = "_G2__o2"}'}),
618
+ OS.new({:caption => 'C1', :code => 'Qt::CheckBox.new{|w| w.object_name = "_G1__o3"}'})
619
+ ]
620
+ widgets_data.each{|w| @cont.add_widget w}
621
+ dlg = @cont.dialog
622
+ flexmock(dlg.find_child(Qt::LineEdit, '_G2__o2')).should_receive(:text=).once.with('xyz')
623
+ flexmock(dlg.find_child(Qt::CheckBox, '_G1__o3')).should_receive(:checked=).once.with(false)
624
+ dlg.instance_variable_get(:@manager).read_settings
625
+ end
626
+
627
+ it 'should convert the values stored in the options by passing them to the "convert_value" method before updating the widgets' do
628
+ opt = OS.new({:name => :o1, :group => :G3, :default => :abc})
629
+ @cont.add_option opt
630
+ @cont[:G2, :o2] = ENV['HOME']
631
+ @cont[:G3, :o1] = :xyz
632
+ widgets_data = [
633
+ OS.new({:caption => 'C1', :code => 'Qt::LineEdit.new{|w| w.object_name = "_G3__o1"}'}),
634
+ OS.new({:caption => 'C1', :code => 'KDE::UrlRequester.new{|w| w.object_name = "_G2__o2"}'})
635
+ ]
636
+ widgets_data.each{|w| @cont.add_widget w}
637
+ dlg = @cont.dialog
638
+ flexmock(dlg.find_child(Qt::LineEdit, '_G3__o1')).should_receive(:text=).once.with('xyz')
639
+ flexmock(dlg.find_child(KDE::UrlRequester, '_G2__o2')).should_receive(:url=).once.with KDE::Url.from_path(ENV['HOME'])
640
+ manager = dlg.instance_variable_get(:@manager)
641
+ flexmock(manager).should_receive(:convert_value).once.with(ENV['HOME'], KDE::Url.new).and_return(KDE::Url.from_path(ENV['HOME']))
642
+ flexmock(manager).should_receive(:convert_value).once.with(:xyz, '').and_return('xyz')
643
+ manager.read_settings
644
+ end
645
+
646
+ end
647
+
648
+ describe 'Ruber::SettingsDialogManager#store_settings' do
649
+
650
+ before do
651
+ @mw = Qt::Widget.new
652
+ flexmock(Ruber).should_receive(:[]).with(:main_window).and_return(@mw).by_default
653
+ @back = flexmock('backend'){|m| m.should_ignore_missing}
654
+ @cont = Object.new
655
+ @cont.extend Ruber::SettingsContainer
656
+ @cont.send :setup_container, @back
657
+ @options = [
658
+ OS.new({:name => :o1, :default => 3, :group => :G1}),
659
+ OS.new({:name => :o2, :default => "abc", :group => :G2}),
660
+ OS.new({:name => :o3, :default => true, :group => :G1}),
661
+ ]
662
+ @option_values = [-2, "xyz", false]
663
+ @options.each{|o| @cont.add_option o}
664
+ @options.zip(@option_values).each{|op, val| @cont[op.group, op.name] = val}
665
+ end
666
+
667
+ it 'store the value of each option, read using the corresponding "store" method, in the container' do
668
+ widgets_data = [
669
+ OS.new({:caption => 'C1', :code => 'Qt::LineEdit.new{|w| w.object_name = "_G2__o2"}'}),
670
+ OS.new({:caption => 'C1', :code => 'Qt::CheckBox.new{|w| w.object_name = "_G1__o3"}'})
671
+ ]
672
+ widgets_data.each{|w| @cont.add_widget w}
673
+ dlg = @cont.dialog
674
+ flexmock(dlg.find_child(Qt::LineEdit, '_G2__o2')).should_receive(:text).once.and_return('hello')
675
+ flexmock(dlg.find_child(Qt::CheckBox, '_G1__o3')).should_receive(:checked?).once.and_return true
676
+ flexmock(@cont).should_receive(:[]=).once.with(:G1, :o3, true)
677
+ flexmock(@cont).should_receive(:[]=).once.with(:G2, :o2, 'hello')
678
+ dlg.instance_variable_get(:@manager).store_settings
679
+
680
+ end
681
+
682
+ it 'should convert the values stored in the options by passing them to the "convert_value" method before updating the container' do
683
+ opt = OS.new({:name => :o1, :group => :G3, :default => :abc})
684
+ @cont.add_option opt
685
+ @cont[:G2, :o2] = ''
686
+ @cont[:G3, :o1] = :abcd
687
+ widgets_data = [
688
+ OS.new({:caption => 'C1', :code => 'Qt::LineEdit.new{|w| w.object_name = "_G3__o1"}'}),
689
+ OS.new({:caption => 'C1', :code => 'KDE::UrlRequester.new{|w| w.object_name = "_G2__o2"}'})
690
+ ]
691
+ widgets_data.each{|w| @cont.add_widget w}
692
+ dlg = @cont.dialog
693
+ flexmock(dlg.find_child(Qt::LineEdit, '_G3__o1')).should_receive(:text).once.and_return('xyz')
694
+ flexmock(dlg.find_child(KDE::UrlRequester, '_G2__o2')).should_receive(:url).once.and_return KDE::Url.from_path(ENV['HOME'])
695
+ manager = dlg.instance_variable_get(:@manager)
696
+ flexmock(manager).should_receive(:convert_value).once.with(KDE::Url.from_path(ENV['HOME']), '').and_return(ENV['HOME'])
697
+ flexmock(manager).should_receive(:convert_value).once.with('xyz', :abcd).and_return(:xyz)
698
+ flexmock(@cont).should_receive(:[]=).once.with(:G3, :o1, :xyz)
699
+ flexmock(@cont).should_receive(:[]=).once.with(:G2, :o2, ENV['HOME'])
700
+ manager.store_settings
701
+ end
702
+
703
+ end
704
+
705
+ describe 'Ruber::SettingsDialog#read_default_settings' do
706
+
707
+ before do
708
+ @mw = Qt::Widget.new
709
+ flexmock(Ruber).should_receive(:[]).with(:main_window).and_return(@mw).by_default
710
+ @back = flexmock('backend'){|m| m.should_ignore_missing}
711
+ @cont = Object.new
712
+ @cont.extend Ruber::SettingsContainer
713
+ @cont.send :setup_container, @back
714
+ @options = [
715
+ OS.new({:name => :o1, :default => 3, :group => :G1}),
716
+ OS.new({:name => :o2, :default => "abc", :group => :G2}),
717
+ OS.new({:name => :o3, :default => true, :group => :G1}),
718
+ ]
719
+ @option_values = [-2, "xyz", false]
720
+ @options.each{|o| @cont.add_option o}
721
+ @options.zip(@option_values).each{|op, val| @cont[op.group, op.name] = val}
722
+ end
723
+
724
+ it 'should call the read methods associated to each option, passing as argument the default value of the option read from the option container' do
725
+ widgets_data = [
726
+ OS.new({:caption => 'C1', :code => 'Qt::LineEdit.new{|w| w.object_name = "_G2__o2"}'}),
727
+ OS.new({:caption => 'C1', :code => 'Qt::CheckBox.new{|w| w.object_name = "_G1__o3"}'})
728
+ ]
729
+ widgets_data.each{|w| @cont.add_widget w}
730
+ dlg = @cont.dialog
731
+ flexmock(dlg.find_child(Qt::LineEdit, '_G2__o2')).should_receive(:text=).once.with(@options[1].default)
732
+ flexmock(dlg.find_child(Qt::CheckBox, '_G1__o3')).should_receive(:checked=).once.with(@options[2].default)
733
+ dlg.instance_variable_get(:@manager).read_default_settings
734
+ end
735
+
736
+ it 'should convert the default values of the options by passing them to the "convert_value" method before updating the widgets' do
737
+ opt = OS.new({:name => :o1, :group => :G3, :default => :abc})
738
+ @cont.add_option opt
739
+ @cont[:G2, :o2] = ENV['HOME']
740
+ @cont[:G3, :o1] = :xyz
741
+ widgets_data = [
742
+ OS.new({:caption => 'C1', :code => 'Qt::LineEdit.new{|w| w.object_name = "_G3__o1"}'}),
743
+ OS.new({:caption => 'C1', :code => 'KDE::UrlRequester.new{|w| w.object_name = "_G2__o2"}'})
744
+ ]
745
+ widgets_data.each{|w| @cont.add_widget w}
746
+ dlg = @cont.dialog
747
+ flexmock(@cont).should_receive(:default).once.with(:G2, :o2).and_return('/usr')
748
+ flexmock(@cont).should_receive(:default).once.with(:G3, :o1).and_return(:abc)
749
+ flexmock(dlg.find_child(Qt::LineEdit, '_G3__o1')).should_receive(:text=).once.with('abc')
750
+ flexmock(dlg.find_child(KDE::UrlRequester, '_G2__o2')).should_receive(:url=).once.with KDE::Url.from_path('/usr')
751
+ manager = dlg.instance_variable_get(:@manager)
752
+ flexmock(manager).should_receive(:convert_value).once.with('/usr', KDE::Url.new).and_return(KDE::Url.from_path('/usr'))
753
+ flexmock(manager).should_receive(:convert_value).once.with(:abc, '').and_return('abc')
754
+ manager.read_default_settings
755
+ end
756
+
757
+ end
758
+
759
+ describe 'Ruber::SettingsDialogManager#settings_changed' do
760
+
761
+ it 'should enable the Apply button of the dialog' do
762
+ @mw = Qt::Widget.new
763
+ flexmock(Ruber).should_receive(:[]).with(:main_window).and_return(@mw).by_default
764
+ back = flexmock('backend'){|m| m.should_ignore_missing}
765
+ cont = Object.new
766
+ cont.extend Ruber::SettingsContainer
767
+ cont.send :setup_container, back
768
+ dlg = cont.dialog
769
+ flexmock(dlg).should_receive(:enable_button_apply).once.with(true)
770
+ dlg.instance_variable_get(:@manager).send :settings_changed
771
+ end
772
+
773
+ end