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,167 @@
1
+ require 'spec/common'
2
+
3
+ require 'tempfile'
4
+ require 'fileutils'
5
+ require 'flexmock/argument_types'
6
+ require 'facets/string/camelcase'
7
+
8
+ require 'ruber/editor/editor_view'
9
+ require 'ruber/editor/document'
10
+
11
+ describe Ruber::EditorView do
12
+
13
+ def self.test_auto_signal s, signal_args = [], pending_info = nil
14
+ signal_args = [signal_args] unless signal_args.is_a? Array
15
+ sig = s.sub('@', 'QWidget*')
16
+ s_args = s.match(/\((.*)\)/)[0].split(/\s*,\s*/)
17
+ s_args.map! do |a|
18
+ case a
19
+ when 'QString' then String
20
+ when 'QList' then Array
21
+ when 'QHash' then Hash
22
+ when /^Q/ then Qt.const_get(a[1..-1])
23
+ when /^KTextEditor/ then KTextEditor.const_get(a.sub(/^KTextEditor::/,''))
24
+ when /u?int/ then Integer
25
+ when 'double' then Double
26
+ else nil
27
+ end
28
+ end
29
+ has_view_arg = s.match(/@/)
30
+ o_sig = s.camelcase(false).sub(/\((.*?)(?:,\s+)?(@)\)/) do |s|
31
+ res = '('
32
+ res += 'KTextEditor::View*' + (!$1.empty? ? ', ' : '') if $2
33
+ res += ($1 || '')+')'
34
+ res
35
+ end
36
+ it "should emit the \"#{sig}\" signal in response to the underlying KTextEditor::View #{o_sig} signal" do
37
+ prc = lambda do
38
+ mock = flexmock('mock')
39
+ if has_view_arg
40
+ mock.should_receive(:test).once.with(@view.object_id)
41
+ else mock.should_receive(:test).once.with_no_args
42
+ end
43
+ signal_args.unshift 'self' if has_view_arg
44
+ @view.connect(SIGNAL(sig)) do |*args|
45
+ v = args.pop if has_view_arg
46
+ s_args.each_with_index do |a, i|
47
+ args[i].should be_kind_of a if a
48
+ end
49
+ has_view_arg ? mock.test(@view.object_id) : mock.test
50
+ end
51
+ v = @view.instance_variable_get :@view
52
+ code = "b = binding; emit #{o_sig[/[^(]*/]}(#{signal_args.map{|a| "eval( '#{a}', b)"}.join(',')})"
53
+ v.instance_eval code
54
+ end
55
+ if pending_info and pending_info[:no_block]
56
+ pending pending_info[:msg]
57
+ prc.call
58
+ elsif pending_info
59
+ pending(pending_info[:msg]){prc.call}
60
+ else prc.call
61
+ end
62
+ end
63
+ end
64
+
65
+ before do
66
+ @app = KDE::Application.instance
67
+ @w = Qt::Widget.new
68
+ @comp = Qt::Object.new
69
+ flexmock(@comp).should_receive(:each_component)
70
+ flexmock(Ruber).should_receive(:[]).with(:components).and_return @comp
71
+ @doc = Ruber::Document.new @app
72
+ @view = @doc.create_view @w
73
+ end
74
+
75
+ after do
76
+ @view.disconnect
77
+ end
78
+
79
+ test_auto_signal 'context_menu_about_to_show(QMenu*, @)', 'Qt::Menu.new'
80
+ test_auto_signal 'focus_in(@)'
81
+ test_auto_signal 'focus_out(@)'
82
+ test_auto_signal 'horizontal_scroll_position_changed(@)'
83
+ test_auto_signal 'information_message(QString, @)', '"test_string"'
84
+ test_auto_signal 'cursor_position_changed(KTextEditor::Cursor, @)', 'KTextEditor::Cursor.new()'
85
+ test_auto_signal 'mouse_position_changed(KTextEditor::Cursor, @)', 'KTextEditor::Cursor.new()'
86
+ test_auto_signal 'selection_changed(@)'
87
+ test_auto_signal 'text_inserted(KTextEditor::Cursor, QString, @)', ['KTextEditor::Cursor.new(0,0)', '"test text"']
88
+ test_auto_signal 'vertical_scroll_position_changed(KTextEditor::Cursor, @)', 'KTextEditor::Cursor.new()'
89
+
90
+ it "should emit the \"selection_mode_changed(bool, QWidget*)\" signal when the selection mode changes" do
91
+ mock = flexmock('mock')
92
+ mock.should_receive(:block_mode_on).globally.ordered.once.with(@view.object_id)
93
+ mock.should_receive(:block_mode_off).globally.ordered.once.with(@view.object_id)
94
+ @view.connect(SIGNAL('selection_mode_changed(bool, QWidget*)')) do |m, v|
95
+ mock.send( (m ? :block_mode_on : :block_mode_off), v.object_id)
96
+ end
97
+ @view.block_selection = true
98
+ @view.block_selection = false
99
+ end
100
+
101
+ it "should emit the \"edit_mode_changed(KTextEditor::View::EditoMode, QWidget*)\" signal in response to the underlying KTextEditor::View viewEditModeChanged(KTextEditor::View, KTextEditor::View::EditMode) signal" do
102
+ mock = flexmock('mock')
103
+ mock.should_receive(:test).globally.ordered.once.with(1, @view.object_id)
104
+ mock.should_receive(:test).globally.ordered.once.with(0, @view.object_id)
105
+ @view.connect(SIGNAL('edit_mode_changed(KTextEditor::View::EditMode, QWidget*)')) do |m, v|
106
+ mock.test m, v.object_id
107
+ end
108
+ v = @view.instance_variable_get(:@view)
109
+ v.instance_eval{emit viewEditModeChanged(self, KTextEditor::View::EditOverwrite)}
110
+ v.instance_eval{emit viewEditModeChanged(self, KTextEditor::View::EditInsert)}
111
+ end
112
+
113
+ it "should emit the \"view_mode_changed(QString, QWidget*)\" signal in response to the underlying KTextEditor::View viewModeChanged(KTextEditor::View*) signal" do
114
+ mock = flexmock('mock')
115
+ mock.should_receive(:test).once.with("INS", @view.object_id)
116
+ @view.connect(SIGNAL('view_mode_changed(QString, QWidget*)')) do |m, v|
117
+ mock.test m, v.object_id
118
+ end
119
+ v = @view.instance_variable_get(:@view)
120
+ v.instance_eval{emit viewModeChanged(self)}
121
+ end
122
+
123
+ describe '#internal' do
124
+
125
+ it 'returns the underlying KTextEditor::View object' do
126
+ @view.send(:internal).should be_a(KTextEditor::View)
127
+ end
128
+
129
+ end
130
+
131
+ end
132
+
133
+ describe 'Ruber::EditorView#execute_action' do
134
+
135
+ before do
136
+ @app = KDE::Application.instance
137
+ @w = Qt::Widget.new
138
+ @comp = Qt::Object.new
139
+ flexmock(@comp).should_receive(:each_component)
140
+ flexmock(Ruber).should_receive(:[]).with(:components).and_return @comp
141
+ @doc = Ruber::Document.new @app
142
+ @view = @doc.create_view @w
143
+ end
144
+
145
+ it 'should make the action emit the "triggered()" signal' do
146
+ a = @view.action_collection.action 'edit_select_all'
147
+ mk = flexmock('test'){|m| m.should_receive(:triggered).once}
148
+ a.connect(SIGNAL(:triggered)){mk.triggered}
149
+ @view.execute_action 'edit_select_all'
150
+ end
151
+
152
+ it 'should make the action emit the "toggled(bool)" signal if it is a KDE::ToggleAction' do
153
+ a = @view.action_collection.action 'view_vi_input_mode'
154
+ mk = flexmock('test'){|m| m.should_receive(:toggled).once.with true}
155
+ a.connect(SIGNAL('toggled(bool)')){|b| mk.toggled b}
156
+ @view.execute_action 'view_vi_input_mode', true
157
+ end
158
+
159
+ it 'should return true if the action is found' do
160
+ @view.execute_action('edit_select_all').should be_true
161
+ end
162
+
163
+ it 'should do nothing and return false if the action doesn\'t exist' do
164
+ lambda{@view.execute_action( 'inexistant_action').should be_false}.should_not raise_error
165
+ end
166
+
167
+ end
@@ -0,0 +1,676 @@
1
+ require 'spec/common'
2
+
3
+ require 'fileutils'
4
+
5
+ require 'ruber/external_program_plugin'
6
+ require 'ruber/plugin_specification'
7
+ require 'ruber/output_widget'
8
+
9
+ describe Ruber::ExternalProgramPlugin do
10
+
11
+ before do
12
+ ui_file = random_string
13
+ `touch #{ui_file}`
14
+ @pdf = Ruber::PluginSpecification.full({:name => 'test', :ui_file => ui_file})
15
+ flexmock(Ruber).should_receive(:[]).with(:app).and_return(KDE::Application.instance)
16
+ @components = flexmock{|m| m.should_ignore_missing}
17
+ @mw = KParts::MainWindow.new nil, 0
18
+ @mw.send(:create_shell_GUI)
19
+ flexmock(Ruber).should_receive(:[]).with(:components).and_return(@components)
20
+ flexmock(Ruber).should_receive(:[]).with(:config).and_return(nil)
21
+ flexmock(Ruber).should_receive(:[]).with(:main_window).and_return(@mw)
22
+ end
23
+
24
+ after do
25
+ FileUtils.rm @pdf.ui_file
26
+ end
27
+
28
+ it 'inherits from Ruber::GuiPlugin' do
29
+ Ruber::ExternalProgramPlugin.ancestors.should include(Ruber::GuiPlugin)
30
+ end
31
+
32
+ describe ', when created' do
33
+
34
+ it 'takes one or two arguments' do
35
+ lambda{Ruber::ExternalProgramPlugin.new @pdf, true}.should_not raise_error
36
+ lambda{Ruber::ExternalProgramPlugin.new @pdf}.should_not raise_error
37
+ end
38
+
39
+ it 'creates a new process' do
40
+ plug = Ruber::ExternalProgramPlugin.new @pdf
41
+ plug.process.should be_a(KDE::Process)
42
+ end
43
+
44
+ it 'sets the value of the @line_buffered instance variable to the second argument' do
45
+ plug = Ruber::ExternalProgramPlugin.new @pdf
46
+ plug.instance_variable_get(:@line_buffered).should be_true
47
+ plug = Ruber::ExternalProgramPlugin.new @pdf, false
48
+ plug.instance_variable_get(:@line_buffered).should be_false
49
+ end
50
+
51
+ it 'sets the @buffer instance variable to nil' do
52
+ plug = Ruber::ExternalProgramPlugin.new @pdf
53
+ plug.instance_variables.should include(:@buffer)
54
+ plug.instance_variable_get(:@buffer).should be_nil
55
+ end
56
+
57
+ it 'sets the @buffer_content_channel instance variable to nil' do
58
+ plug = Ruber::ExternalProgramPlugin.new @pdf
59
+ plug.instance_variables.should include(:@buffer_content_channel)
60
+ plug.instance_variable_get(:@buffer_content_channel).should be_nil
61
+ end
62
+
63
+ it 'sets the @output_widget instance variable to nil, if it doesn\'t exist' do
64
+ plug = Ruber::ExternalProgramPlugin.new @pdf
65
+ plug.instance_variables.should include(:@output_widget)
66
+ plug.instance_variable_get(:@output_widget).should be_nil
67
+ end
68
+
69
+ it 'doesn\'t set the @output_widget instance variable to nil if it already exists' do
70
+ plug = Ruber::ExternalProgramPlugin.new(@pdf){@output_widget = 'test'}
71
+ plug.instance_variables.should include(:@output_widget)
72
+ plug.instance_variable_get(:@output_widget).should == 'test'
73
+ end
74
+
75
+ it 'sets the process\'s process channel mode to Qt::Process::SeparateChannels' do
76
+ plug = Ruber::ExternalProgramPlugin.new @pdf
77
+ plug.process.process_channel_mode.should == Qt::Process::SeparateChannels
78
+ end
79
+
80
+ it 'connects the process\'s readyReadStandardOutput() signal to a block which reads the contents of standard output, converts them to a string and calls do_stdout' do
81
+ plug = Ruber::ExternalProgramPlugin.new @pdf
82
+ data = Qt::ByteArray.new('xyz')
83
+ flexmock(data).should_receive(:to_s).once.and_return 'xyz'
84
+ flexmock(plug.process).should_receive(:read_all_standard_output).once.and_return(data)
85
+ flexmock(plug).should_receive(:do_stdout).once.with('xyz')
86
+ plug.process.instance_eval{emit readyReadStandardOutput}
87
+ end
88
+
89
+ it 'connects the process\'s readyReadStandardError() signal to a block which reads the contents of standard error, converts them to a string and calls do_stderr' do
90
+ plug = Ruber::ExternalProgramPlugin.new @pdf
91
+ data = Qt::ByteArray.new('xyz')
92
+ flexmock(data).should_receive(:to_s).once.and_return 'xyz'
93
+ flexmock(plug.process).should_receive(:read_all_standard_error).once.and_return(data)
94
+ flexmock(plug).should_receive(:do_stderr).once.with('xyz')
95
+ plug.process.instance_eval{emit readyReadStandardError}
96
+ end
97
+
98
+ it 'connects the process\'s finished(int, QProcess::ExitStatus) signal with its slot_process_finished(int, QProcess::ExitStatus) slot' do
99
+ plug = Ruber::ExternalProgramPlugin.new @pdf
100
+ flexmock(plug).should_receive(:slot_process_finished).once.with(1, Qt::Process::CrashExit)
101
+ plug.process.instance_eval{emit finished(1, Qt::Process::CrashExit)}
102
+ end
103
+
104
+ it 'connects the process\'s started() signal with its process_started() signal' do
105
+ plug = Ruber::ExternalProgramPlugin.new @pdf
106
+ m = flexmock{|mk| mk.should_receive(:started).once}
107
+ plug.connect(SIGNAL('process_started()')){m.started}
108
+ plug.process.instance_eval{emit started}
109
+ end
110
+
111
+ it 'connects the process\'s error(QProcess::ProcessError) signal to a block which calls failed_to_start if the argument is Qt::Process::FailedToStart' do
112
+ plug = Ruber::ExternalProgramPlugin.new @pdf
113
+ flexmock(plug).should_receive(:failed_to_start).once
114
+ plug.process.instance_eval{emit error Qt::Process::FailedToStart}
115
+ plug.process.instance_eval{emit error Qt::Process::Crashed}
116
+ end
117
+
118
+ it 'connects its process_finished(int, QString) signal to its display_exit_message(int, QString) slot' do
119
+ plug = Ruber::ExternalProgramPlugin.new @pdf
120
+ flexmock(plug).should_receive(:display_exit_message).once.with(5, 'crash')
121
+ plug.instance_eval{emit process_finished(5, 'crash')}
122
+ end
123
+
124
+ end
125
+
126
+ describe '#shutdown' do
127
+
128
+ before do
129
+ @plug = Ruber::ExternalProgramPlugin.new @pdf
130
+ end
131
+
132
+ it 'blocks the process\'s signals' do
133
+ flexmock(@plug.process).should_receive(:block_signals).once.with(true)
134
+ @plug.send :shutdown
135
+ end
136
+
137
+ it 'kills the process' do
138
+ flexmock(@plug.process).should_receive(:kill).once
139
+ @plug.send :shutdown
140
+ end
141
+
142
+ end
143
+
144
+ describe '#do_stdout' do
145
+
146
+ before do
147
+ @plug = Ruber::ExternalProgramPlugin.new @pdf
148
+ end
149
+
150
+ describe 'if the plugin is not line buffered' do
151
+
152
+ before do
153
+ @plug.instance_variable_set(:@line_buffered, false)
154
+ end
155
+
156
+ it 'calls the process_standard_output passing it the argument split into lines' do
157
+ flexmock(@plug).should_receive(:process_standard_output).twice.with %w[a b c]
158
+ @plug.send :do_stdout, "a\nb\nc\n"
159
+ @plug.send :do_stdout, "a\nb\nc"
160
+ end
161
+
162
+ it 'does nothing if the string is empty or made only of newlines' do
163
+ flexmock(@plug).should_receive(:process_standard_output).never
164
+ @plug.send :do_stdout, ""
165
+ @plug.send :do_stdout, "\n"
166
+ end
167
+
168
+ end
169
+
170
+ describe ', if the plugin is line buffered' do
171
+
172
+ describe ' and the buffer is empty' do
173
+
174
+ it 'calls the process_standard_output method passing it the string divided into lines, if the string ends in a newline' do
175
+ flexmock(@plug).should_receive(:process_standard_output).once.with %w[a b c]
176
+ @plug.send :do_stdout, "a\nb\nc\n"
177
+ end
178
+
179
+ it 'calls the process_standard_output method passing it the string divided into lines except for the last one if the string doesn\'t end in a newline' do
180
+ flexmock(@plug).should_receive(:process_standard_output).once.with %w[a b]
181
+ @plug.send :do_stdout, "a\nb\nc"
182
+ end
183
+
184
+ it 'puts the last line in the buffer and sets the buffer_content_channel to :stdout if the string doesn\'t end in a newline' do
185
+ @plug.send :do_stdout, "a\nb\nc"
186
+ @plug.instance_variable_get(:@buffer).should == 'c'
187
+ @plug.instance_variable_get(:@buffer_content_channel).should == :stdout
188
+ end
189
+
190
+ it 'puts the only line in the buffer, sets the buffer_content_channel to :stdout and does nothing else if there\'s only one string and it doesn\'t end in a newline' do
191
+ flexmock(@plug).should_receive(:process_standard_output).never
192
+ lambda{@plug.send :do_stdout, ''}.should_not raise_error
193
+ @plug.send :do_stdout, "a"
194
+ @plug.instance_variable_get(:@buffer).should == 'a'
195
+ @plug.instance_variable_get(:@buffer_content_channel).should == :stdout
196
+ end
197
+
198
+ it 'does nothing if the string is empty or made only of newlines' do
199
+ flexmock(@plug).should_receive(:process_standard_output).never
200
+ lambda{@plug.send :do_stdout, ''}.should_not raise_error
201
+ lambda{@plug.send :do_stdout, "\n"}.should_not raise_error
202
+ end
203
+
204
+ end
205
+
206
+ describe ', the buffer is not empty and its channel is stdout' do
207
+
208
+ before do
209
+ @plug.instance_variable_set(:@buffer, 'x')
210
+ @plug.instance_variable_set(:@buffer_content_channel, :stdout)
211
+ class << @plug
212
+ alias :do_stdout_needed_for_test :do_stdout
213
+ end
214
+ end
215
+
216
+ it 'adds the buffer to the beginning of the string, clears the buffer and calls itself with the new string' do
217
+ flexmock(@plug).should_receive(:do_stdout).once.with("xa\nb\nc\n")
218
+ @plug.send :do_stdout_needed_for_test, "a\nb\nc\n"
219
+ @plug.instance_variable_get(:@buffer).should be_nil
220
+ @plug.instance_variable_get(:@buffer_content_channel).should be_nil
221
+ end
222
+
223
+ it 'does nothing if the string is empty' do
224
+ flexmock(@plug).should_receive(:process_standard_output).never
225
+ lambda{@plug.send :do_stdout, ''}.should_not raise_error
226
+ @plug.instance_variable_get(:@buffer).should == 'x'
227
+ @plug.instance_variable_get(:@buffer_content_channel).should == :stdout
228
+ end
229
+
230
+ it 'adds the buffer to the beginning of the string, clears the buffer and calls itself with the new string even if the string only contains newlines' do
231
+ flexmock(@plug).should_receive(:do_stdout).once.with("x\n\n")
232
+ @plug.send :do_stdout_needed_for_test, "\n\n"
233
+ @plug.instance_variable_get(:@buffer).should be_nil
234
+ @plug.instance_variable_get(:@buffer_content_channel).should be_nil
235
+ end
236
+
237
+ it 'doesn\'t call process_standard_output a second time' do
238
+ flexmock(@plug).should_receive(:process_standard_output).once
239
+ @plug.send :do_stdout, "a\nb\nc\n"
240
+ end
241
+
242
+ end
243
+
244
+ describe ', the buffer is not empty and its channel is stderr' do
245
+
246
+ before do
247
+ @plug.instance_variable_set(:@buffer, 'x')
248
+ @plug.instance_variable_set(:@buffer_content_channel, :stderr)
249
+ end
250
+
251
+ it 'clears the buffer and calls process_standard_error passing the an array containing the buffer as argument before going on' do
252
+ flexmock(@plug).should_receive(:process_standard_error).once.with(["x"]).ordered
253
+ flexmock(@plug).should_receive(:process_standard_output).once.with(%w[a b c]).ordered
254
+ @plug.send :do_stdout, "a\nb\nc\n"
255
+ @plug.instance_variable_get(:@buffer).should be_nil
256
+ @plug.instance_variable_get(:@buffer_content_channel).should be_nil
257
+ end
258
+
259
+ it 'does nothing if the string is empty' do
260
+ flexmock(@plug).should_receive(:process_standard_output).never
261
+ flexmock(@plug).should_receive(:do_stderr).never
262
+ lambda{@plug.send :do_stdout, ''}.should_not raise_error
263
+ @plug.instance_variable_get(:@buffer).should == 'x'
264
+ @plug.instance_variable_get(:@buffer_content_channel).should == :stderr
265
+ end
266
+
267
+ it 'clears the buffer, calls do_stderr passing the buffer and does nothing else if the string only contains newlines' do
268
+ flexmock(@plug).should_receive(:process_standard_error).once.with(["x"]).ordered
269
+ flexmock(@plug).should_receive(:process_standard_output).never
270
+ @plug.send :do_stdout, "\n\n"
271
+ @plug.instance_variable_get(:@buffer).should be_nil
272
+ @plug.instance_variable_get(:@buffer_content_channel).should be_nil
273
+ end
274
+
275
+ end
276
+
277
+ end
278
+
279
+ end
280
+
281
+ describe '#do_stderr' do
282
+
283
+ before do
284
+ @plug = Ruber::ExternalProgramPlugin.new @pdf
285
+ end
286
+
287
+ describe 'if the plugin is not line buffered' do
288
+
289
+ before do
290
+ @plug.instance_variable_set(:@line_buffered, false)
291
+ end
292
+
293
+ it 'calls the process_standard_error passing it the argument split into lines' do
294
+ flexmock(@plug).should_receive(:process_standard_error).twice.with %w[a b c]
295
+ @plug.send :do_stderr, "a\nb\nc\n"
296
+ @plug.send :do_stderr, "a\nb\nc"
297
+ end
298
+
299
+ it 'does nothing if the string is empty or made only of newlines' do
300
+ flexmock(@plug).should_receive(:process_standard_error).never
301
+ @plug.send :do_stderr, ""
302
+ @plug.send :do_stderr, "\n"
303
+ end
304
+
305
+ end
306
+
307
+ describe ', if the plugin is line buffered' do
308
+
309
+ describe ' and the buffer is empty' do
310
+
311
+ it 'calls the process_standard_error method passing it the string divided into lines, if the string ends in a newline' do
312
+ flexmock(@plug).should_receive(:process_standard_error).once.with %w[a b c]
313
+ @plug.send :do_stderr, "a\nb\nc\n"
314
+ end
315
+
316
+ it 'calls the process_standard_error method passing it the string divided into lines except for the last one if the string doesn\'t end in a newline' do
317
+ flexmock(@plug).should_receive(:process_standard_error).once.with %w[a b]
318
+ @plug.send :do_stderr, "a\nb\nc"
319
+ end
320
+
321
+ it 'puts the last line in the buffer and sets the buffer_content_channel to :stderr if the string doesn\'t end in a newline' do
322
+ @plug.send :do_stderr, "a\nb\nc"
323
+ @plug.instance_variable_get(:@buffer).should == 'c'
324
+ @plug.instance_variable_get(:@buffer_content_channel).should == :stderr
325
+ end
326
+
327
+ it 'puts the only line in the buffer, sets the buffer_content_channel to :stderr and does nothing else if there\'s only one string and it doesn\'t end in a newline' do
328
+ flexmock(@plug).should_receive(:process_standard_error).never
329
+ lambda{@plug.send :do_stderr, ''}.should_not raise_error
330
+ @plug.send :do_stderr, "a"
331
+ @plug.instance_variable_get(:@buffer).should == 'a'
332
+ @plug.instance_variable_get(:@buffer_content_channel).should == :stderr
333
+ end
334
+
335
+ it 'does nothing if the string is empty or made only of newlines' do
336
+ flexmock(@plug).should_receive(:process_standard_error).never
337
+ lambda{@plug.send :do_stderr, ''}.should_not raise_error
338
+ lambda{@plug.send :do_stderr, "\n"}.should_not raise_error
339
+ end
340
+
341
+ end
342
+
343
+ describe ', the buffer is not empty and its channel is stderr' do
344
+
345
+ before do
346
+ @plug.instance_variable_set(:@buffer, 'x')
347
+ @plug.instance_variable_set(:@buffer_content_channel, :stderr)
348
+ class << @plug
349
+ alias :do_stderr_needed_for_test :do_stderr
350
+ end
351
+ end
352
+
353
+ it 'adds the buffer to the beginning of the string, clears the buffer and calls itself with the new string' do
354
+ flexmock(@plug).should_receive(:do_stderr).once.with("xa\nb\nc\n")
355
+ @plug.send :do_stderr_needed_for_test, "a\nb\nc\n"
356
+ @plug.instance_variable_get(:@buffer).should be_nil
357
+ @plug.instance_variable_get(:@buffer_content_channel).should be_nil
358
+ end
359
+
360
+ it 'does nothing if the string is empty' do
361
+ flexmock(@plug).should_receive(:process_standard_error).never
362
+ lambda{@plug.send :do_stderr, ''}.should_not raise_error
363
+ @plug.instance_variable_get(:@buffer).should == 'x'
364
+ @plug.instance_variable_get(:@buffer_content_channel).should == :stderr
365
+ end
366
+
367
+ it 'adds the buffer to the beginning of the string, clears the buffer and calls itself with the new string even if the string only contains newlines' do
368
+ flexmock(@plug).should_receive(:do_stderr).once.with("x\n\n")
369
+ @plug.send :do_stderr_needed_for_test, "\n\n"
370
+ @plug.instance_variable_get(:@buffer).should be_nil
371
+ @plug.instance_variable_get(:@buffer_content_channel).should be_nil
372
+ end
373
+
374
+ it 'doesn\'t call process_standard_error a second time' do
375
+ flexmock(@plug).should_receive(:process_standard_error).once
376
+ @plug.send :do_stderr, "a\nb\nc\n"
377
+ end
378
+
379
+
380
+ end
381
+
382
+ describe ', the buffer is not empty and its channel is stdout' do
383
+
384
+ before do
385
+ @plug.instance_variable_set(:@buffer, 'x')
386
+ @plug.instance_variable_set(:@buffer_content_channel, :stdout)
387
+ end
388
+
389
+ it 'clears the buffer and calls process_standard_output passing an array containing the buffer as argument before going on' do
390
+ flexmock(@plug).should_receive(:process_standard_output).once.with(["x"]).ordered
391
+ flexmock(@plug).should_receive(:process_standard_error).once.with(%w[a b c]).ordered
392
+ @plug.send :do_stderr, "a\nb\nc\n"
393
+ @plug.instance_variable_get(:@buffer).should be_nil
394
+ @plug.instance_variable_get(:@buffer_content_channel).should be_nil
395
+ end
396
+
397
+ it 'does nothing if the string is empty' do
398
+ flexmock(@plug).should_receive(:process_standard_error).never
399
+ flexmock(@plug).should_receive(:do_stdout).never
400
+ lambda{@plug.send :do_stderr, ''}.should_not raise_error
401
+ @plug.instance_variable_get(:@buffer).should == 'x'
402
+ @plug.instance_variable_get(:@buffer_content_channel).should == :stdout
403
+ end
404
+
405
+ it 'clears the buffer, calls process_standard_output passing an array containing the buffer and does nothing else if the string only contains newlines' do
406
+ flexmock(@plug).should_receive(:process_standard_output).once.with(["x"]).ordered
407
+ flexmock(@plug).should_receive(:process_standard_error).never
408
+ @plug.send :do_stderr, "\n\n"
409
+ @plug.instance_variable_get(:@buffer).should be_nil
410
+ @plug.instance_variable_get(:@buffer_content_channel).should be_nil
411
+ end
412
+
413
+ end
414
+
415
+ end
416
+
417
+ end
418
+
419
+ describe '#process_standard_output' do
420
+
421
+ before do
422
+ @plug = Ruber::ExternalProgramPlugin.new @pdf
423
+ end
424
+
425
+ it 'does nothing if the @output_widget instance variable is nil' do
426
+ lambda{@plug.send :process_standard_output, %w[a b]}.should_not raise_error
427
+ end
428
+
429
+ it 'inserts the entries of the array in the model associated to the @output_widget instance variable and set their output type to output if the @output_widget instance variable is not nil' do
430
+ ow = Ruber::OutputWidget.new
431
+ ow.set_color_for(:output, Qt::Color.new(0,0,0))
432
+ mod = ow.model
433
+ 3.times{|i| mod.append_row Qt::StandardItem.new(i.to_s)}
434
+ @plug.instance_variable_set :@output_widget, ow
435
+ @plug.send :process_standard_output, %w[a b]
436
+ mod.row_count.should == 5
437
+ mod.column_count.should == 1
438
+ mod.item(3,0).text.should == 'a'
439
+ mod.item(3,0).data(Ruber::OutputWidget::OutputTypeRole).to_string.should == 'output'
440
+ mod.item(4,0).text.should == 'b'
441
+ mod.item(4,0).data(Ruber::OutputWidget::OutputTypeRole).to_string.should == 'output'
442
+ end
443
+
444
+ end
445
+
446
+ describe '#process_standard_error' do
447
+
448
+ before do
449
+ @plug = Ruber::ExternalProgramPlugin.new @pdf
450
+ end
451
+
452
+ it 'does nothing if the @error_widget instance variable is nil' do
453
+ lambda{@plug.send :process_standard_error, %w[a b]}.should_not raise_error
454
+ end
455
+
456
+ it 'inserts the entries of the array in the model associated to the @error_widget instance variable and set their error type to error if the @error_widget instance variable is not nil' do
457
+ ow = Ruber::OutputWidget.new
458
+ ow.set_color_for(:error, Qt::Color.new(0,0,0))
459
+ mod = ow.model
460
+ 3.times{|i| mod.append_row Qt::StandardItem.new(i.to_s)}
461
+ @plug.instance_variable_set :@output_widget, ow
462
+ @plug.send :process_standard_error, %w[a b]
463
+ mod.row_count.should == 5
464
+ mod.column_count.should == 1
465
+ mod.item(3,0).text.should == 'a'
466
+ mod.item(3,0).data(Ruber::OutputWidget::OutputTypeRole).to_string.should == 'error'
467
+ mod.item(4,0).text.should == 'b'
468
+ mod.item(4,0).data(Ruber::OutputWidget::OutputTypeRole).to_string.should == 'error'
469
+ end
470
+
471
+ end
472
+
473
+ describe '#slot_process_finished' do
474
+
475
+ before do
476
+ @plug = Ruber::ExternalProgramPlugin.new @pdf
477
+ end
478
+
479
+ it 'reads from standard output and standard error and calls the do_stdout and do_stderr methods (appending a newline if necessary)' do
480
+ flexmock(@plug.process).should_receive(:read_all_standard_output).once.and_return(Qt::ByteArray.new('xyz'))
481
+ flexmock(@plug.process).should_receive(:read_all_standard_output).once.and_return(Qt::ByteArray.new("xyz\n"))
482
+ flexmock(@plug.process).should_receive(:read_all_standard_error).once.and_return(Qt::ByteArray.new('abc'))
483
+ flexmock(@plug.process).should_receive(:read_all_standard_error).once.and_return(Qt::ByteArray.new("abc\n"))
484
+ flexmock(@plug).should_receive(:do_stdout).twice.with("xyz\n")
485
+ flexmock(@plug).should_receive(:do_stderr).twice.with("abc\n")
486
+ @plug.send :slot_process_finished, 1, Qt::Process::NormalExit
487
+ @plug.send :slot_process_finished, 1, Qt::Process::NormalExit
488
+ end
489
+
490
+ it 'emits the process_finished(int, QString) with "killed" as second argument if status is Qt::Process::CrashExit and code is 0' do
491
+ m = flexmock{|mk| mk.should_receive(:test).once.with(0, 'killed')}
492
+ @plug.connect(SIGNAL('process_finished(int, QString)')){|i, s| m.test i, s}
493
+ @plug.process.instance_eval{emit finished(0, Qt::Process::CrashExit)}
494
+ end
495
+
496
+ it 'emits the process_finished(int, QString) with "crash" as second argument if status is Qt::Process::CrashExit and code is not 0' do
497
+ m = flexmock{|mk| mk.should_receive(:test).once.with(5, 'crash')}
498
+ @plug.connect(SIGNAL('process_finished(int, QString)')){|i, s| m.test i, s}
499
+ @plug.process.instance_eval{emit finished(5, Qt::Process::CrashExit)}
500
+ end
501
+
502
+ it 'emits the process_finished(int, QString) with "" as second argument if status is Qt::Process::NormalExit' do
503
+ m = flexmock{|mk| mk.should_receive(:test).once.with(0, '')}
504
+ @plug.connect(SIGNAL('process_finished(int, QString)')){|i, s| m.test i, s}
505
+ @plug.process.instance_eval{emit finished(0, Qt::Process::NormalExit)}
506
+ end
507
+
508
+ end
509
+
510
+ describe '#failed_to_start' do
511
+
512
+ before do
513
+ @plug = Ruber::ExternalProgramPlugin.new @pdf
514
+ end
515
+
516
+ it 'emits the process_failed_to_start signal' do
517
+ m = flexmock{|mk| mk.should_receive(:test).once}
518
+ @plug.connect(SIGNAL(:process_failed_to_start)){m.test}
519
+ @plug.send :failed_to_start
520
+ end
521
+
522
+ it 'displays a message of type error1 in the output widget @output_widget, if @output_widget is not nil' do
523
+ ow = Ruber::OutputWidget.new
524
+ ow.set_color_for :error1, Qt::Color.new(255,0,0)
525
+ mod = ow.model
526
+ 3.times{|i| mod.append_row Qt::StandardItem.new(i.to_s)}
527
+ @plug.instance_variable_set :@output_widget, ow
528
+ @plug.process.set_program '/usr/bin/xyz', %w[-a --bc d]
529
+ @plug.send :failed_to_start
530
+ mod.row_count.should == 4
531
+ mod.item(3,0).text.should == "/usr/bin/xyz failed to start. The command line was /usr/bin/xyz -a --bc d"
532
+ mod.item(3,0).data(Ruber::OutputWidget::OutputTypeRole).to_string.should == 'error1'
533
+ end
534
+
535
+ it 'doesn\'t attempt to display the error message if @output_widget is nil' do
536
+ lambda{@plug.send :failed_to_start}.should_not raise_error
537
+ end
538
+
539
+ end
540
+
541
+ describe '#run_process' do
542
+
543
+ before do
544
+ @plug = Ruber::ExternalProgramPlugin.new @pdf
545
+ flexmock(@plug.process).should_receive(:start).by_default
546
+ end
547
+
548
+ it 'sets the working directory of the proces' do
549
+ @plug.run_process '/usr/bin/xyz', ENV['HOME'], %w[a b c]
550
+ @plug.process.working_directory.should == ENV['HOME']
551
+ end
552
+
553
+ it 'clears the program and argument list' do
554
+ flexmock(@plug).process.should_receive(:clear_program).once
555
+ @plug.run_process '/usr/bin/xyz', ENV['HOME'], %w[a b c]
556
+ end
557
+
558
+ it 'sets the program and argument list' do
559
+ @plug.run_process '/usr/bin/xyz', ENV['HOME'], %w[a b c]
560
+ @plug.process.program.should == %w[/usr/bin/xyz a b c]
561
+ end
562
+
563
+ it 'starts the program, after having set all the parameters' do
564
+ flexmock(@plug.process).should_receive(:clear_program).once.ordered
565
+ flexmock(@plug.process).should_receive(:working_directory=).once.ordered
566
+ flexmock(@plug.process).should_receive(:program=).once.ordered
567
+ flexmock(@plug.process).should_receive(:start).once.ordered
568
+ @plug.run_process '/usr/bin/xyz', ENV['HOME'], %w[a b c]
569
+ end
570
+
571
+ describe 'if the @output_widget instance variable is not nil' do
572
+
573
+ before do
574
+ @ow = Ruber::OutputWidget.new
575
+ @plug.instance_variable_set :@output_widget, @ow
576
+ end
577
+
578
+ it 'sets the title of the output widget to the command line before starting the program if the fourth parameter is an empty string' do
579
+ flexmock(@ow).should_receive(:title=).with('/usr/bin/xyz a b c').once.ordered
580
+ flexmock(@plug.process).should_receive(:start).once.ordered
581
+ @plug.run_process '/usr/bin/xyz', ENV['HOME'], %w[a b c], ''
582
+ end
583
+
584
+ it 'uses the fourth argument as title for the output widget if it\'s a non-empty string' do
585
+ flexmock(@ow).should_receive(:title=).with('TITLE').once.ordered
586
+ flexmock(@plug.process).should_receive(:start).once.ordered
587
+ @plug.run_process '/usr/bin/xyz', ENV['HOME'], %w[a b c], 'TITLE'
588
+ end
589
+
590
+ it 'doesn\'t attempt to set the output widget title if the fourth argument is nil or false' do
591
+ flexmock(@ow).should_receive(:title=).never
592
+ flexmock(@plug.process).should_receive(:start).twice
593
+ @plug.run_process '/usr/bin/xyz', ENV['HOME'], %w[a b c], false
594
+ @plug.run_process '/usr/bin/xyz', ENV['HOME'], %w[a b c], nil
595
+ end
596
+
597
+ end
598
+
599
+ it 'doesn\'t attempt to set the output widget title if the @output_widget instance variable is nil' do
600
+ lambda{@plug.run_process '/usr/bin/xyz', ENV['HOME'], %w[a b c], ''}.should_not raise_error
601
+ end
602
+
603
+ end
604
+
605
+ describe '#stop process' do
606
+
607
+ it 'kills the process' do
608
+ plug = Ruber::ExternalProgramPlugin.new @pdf
609
+ flexmock(plug.process).should_receive(:kill).once
610
+ plug.stop_process
611
+ end
612
+
613
+ end
614
+
615
+ describe '#display_exit_ message' do
616
+
617
+ before do
618
+ @plug = Ruber::ExternalProgramPlugin.new @pdf
619
+ end
620
+
621
+ describe ', if the @output_widget instance variable is not nil' do
622
+
623
+ before do
624
+ @ow = Ruber::OutputWidget.new
625
+ @ow.set_color_for :message, Qt::Color.new(255,0,0)
626
+ @ow.set_color_for :message_bad, Qt::Color.new(255,0,0)
627
+ @plug.instance_variable_set :@output_widget, @ow
628
+ @mod = @ow.model
629
+ 5.times{|i| @mod.append_row Qt::StandardItem.new(i.to_s)}
630
+ end
631
+
632
+ it 'appends a line with output type message and text "Process exited normally" if the second argument is empty and code is 0' do
633
+ @plug.process.program = %w[/usr/bin/xyz -a --bc d]
634
+ @plug.send :display_exit_message, 0, ''
635
+ @mod.row_count.should == 6
636
+ @mod.item(5,0).text.should == 'Process exited normally'
637
+ @mod.item(5,0).data(Ruber::OutputWidget::OutputTypeRole).to_string.should == 'message'
638
+ end
639
+
640
+ it 'appends a line with output type message_bad and text "Process exited with code code" if the second argument is empty and code is not' do
641
+ @plug.process.program = %w[/usr/bin/xyz -a --bc d]
642
+ @plug.send :display_exit_message, 5, ''
643
+ @mod.row_count.should == 6
644
+ @mod.item(5,0).text.should == 'Process exited with code 5'
645
+ @mod.item(5,0).data(Ruber::OutputWidget::OutputTypeRole).to_string.should == 'message_bad'
646
+ end
647
+
648
+ it 'appends a line with output type message and text "Process killed" if the second argument is "killed"' do
649
+ @plug.process.program = %w[/usr/bin/xyz -a --bc d]
650
+ @plug.send :display_exit_message, 0, 'killed'
651
+ @mod.row_count.should == 6
652
+ @mod.item(5,0).text.should == 'Process killed'
653
+ @mod.item(5,0).data(Ruber::OutputWidget::OutputTypeRole).to_string.should == 'message'
654
+ end
655
+
656
+ it 'appends a line with output type message_bad and text "Process crashed with code code" if the second argument is "crash"' do
657
+ @plug.process.program = %w[/usr/bin/xyz -a --bc d]
658
+ @plug.send :display_exit_message, 5, 'crash'
659
+ @mod.row_count.should == 6
660
+ @mod.item(5,0).text.should == 'Process crashed with code 5'
661
+ @mod.item(5,0).data(Ruber::OutputWidget::OutputTypeRole).to_string.should == 'message_bad'
662
+ end
663
+
664
+ end
665
+
666
+ describe ', if the @output_widget instance variable is nil' do
667
+
668
+ it 'does nothing' do
669
+ lambda{@plug.send :display_exit_message, 0, ''}.should_not raise_error
670
+ end
671
+
672
+ end
673
+
674
+ end
675
+
676
+ end