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