ruber 0.0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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