cosmos 3.6.2 → 3.6.3

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 (31) hide show
  1. checksums.yaml +4 -4
  2. data/data/crc.txt +19 -19
  3. data/lib/cosmos/core_ext/array.rb +4 -1
  4. data/lib/cosmos/core_ext/matrix.rb +3 -0
  5. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +42 -35
  6. data/lib/cosmos/gui/line_graph/line_graph.rb +3 -0
  7. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +3 -1
  8. data/lib/cosmos/gui/opengl/gl_viewer.rb +115 -127
  9. data/lib/cosmos/gui/utilities/script_module_gui.rb +2 -5
  10. data/lib/cosmos/interfaces/linc_interface.rb +207 -147
  11. data/lib/cosmos/io/win32_serial_driver.rb +1 -1
  12. data/lib/cosmos/script/scripting.rb +2 -2
  13. data/lib/cosmos/script/tools.rb +8 -1
  14. data/lib/cosmos/tools/data_viewer/data_viewer.rb +12 -17
  15. data/lib/cosmos/tools/launcher/launcher_config.rb +1 -1
  16. data/lib/cosmos/tools/script_runner/script_runner.rb +9 -4
  17. data/lib/cosmos/tools/table_manager/table_manager.rb +3 -1
  18. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +11 -1
  19. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +1 -0
  20. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +8 -0
  21. data/lib/cosmos/version.rb +4 -4
  22. data/spec/core_ext/array_spec.rb +62 -1
  23. data/spec/core_ext/matrix_spec.rb +61 -0
  24. data/spec/interfaces/linc_interface_spec.rb +0 -9
  25. data/spec/script/script_spec.rb +7 -3
  26. data/spec/script/scripting_spec.rb +2 -2
  27. data/spec/script/tools_spec.rb +2 -0
  28. data/spec/spec_helper.rb +10 -1
  29. data/spec/tools/launcher/launcher_config_spec.rb +21 -11
  30. data/spec/top_level/top_level_spec.rb +1 -1
  31. metadata +2 -2
@@ -457,7 +457,7 @@ module Cosmos
457
457
  path = procedure_name if !path and File.exist?(procedure_name)
458
458
  path = procedure_name_with_extension if !path and procedure_name_with_extension and File.exist?(procedure_name_with_extension)
459
459
 
460
- raise "Procedure not found : #{procedure_name}" unless path
460
+ raise LoadError, "Procedure not found -- #{procedure_name}" unless path
461
461
  path
462
462
  end
463
463
 
@@ -544,7 +544,7 @@ module Cosmos
544
544
  begin
545
545
  Kernel::load(path)
546
546
  rescue LoadError => error
547
- raise RuntimeError.new("Error loading : #{procedure_name} : #{error.message}")
547
+ raise LoadError, "Error loading -- #{procedure_name}\n#{error.message}"
548
548
  end
549
549
  end
550
550
  # Return whether we had to load and instrument this file, i.e. it was not cached
@@ -37,10 +37,17 @@ module Cosmos
37
37
  rescue DRb::DRbConnError
38
38
  # No Listening Tlm Viewer - So Start One
39
39
  start_tlm_viewer
40
+ max_retries = 60
41
+ retry_count = 0
40
42
  begin
41
43
  yield tlm_viewer
42
44
  tlm_viewer.disconnect
43
45
  rescue DRb::DRbConnError
46
+ retry_count += 1
47
+ if retry_count < max_retries
48
+ canceled = cosmos_script_sleep(1)
49
+ retry unless canceled
50
+ end
44
51
  raise "Unable to Successfully Start Listening Telemetry Viewer: #{display_name} could not be #{action}"
45
52
  rescue Errno::ENOENT
46
53
  raise "Display Screen File: #{display_name}.txt does not exist"
@@ -61,7 +68,7 @@ module Cosmos
61
68
  cmd << 'w' if Kernel.is_windows? # Windows uses rubyw to avoid creating a DOS shell
62
69
  Cosmos.run_process("#{cmd} '#{File.join(Cosmos::USERPATH, 'tools', 'TlmViewer')}' --system #{system_file}")
63
70
  end
64
- sleep(5)
71
+ cosmos_script_sleep(1)
65
72
  end
66
73
 
67
74
  #######################################
@@ -104,19 +104,25 @@ module Cosmos
104
104
  @search_find_keyseq = Qt::KeySequence.new(tr('Ctrl+F'))
105
105
  @search_find.shortcut = @search_find_keyseq
106
106
  @search_find.statusTip = tr('Find text')
107
- @search_find.connect(SIGNAL('triggered()')) { find() }
107
+ @search_find.connect(SIGNAL('triggered()')) do
108
+ FindReplaceDialog.show_find(self)
109
+ end
108
110
 
109
111
  @search_find_next = Qt::Action.new(tr('Find &Next'), self)
110
112
  @search_find_next_keyseq = Qt::KeySequence.new(tr('F3'))
111
113
  @search_find_next.shortcut = @search_find_next_keyseq
112
114
  @search_find_next.statusTip = tr('Find next instance')
113
- @search_find_next.connect(SIGNAL('triggered()')) { find_next() }
115
+ @search_find_next.connect(SIGNAL('triggered()')) do
116
+ FindReplaceDialog.find_next(self)
117
+ end
114
118
 
115
119
  @search_find_previous = Qt::Action.new(tr('Find &Previous'), self)
116
120
  @search_find_previous_keyseq = Qt::KeySequence.new(tr('Shift+F3'))
117
121
  @search_find_previous.shortcut = @search_find_previous_keyseq
118
122
  @search_find_previous.statusTip = tr('Find previous instance')
119
- @search_find_previous.connect(SIGNAL('triggered()')) { find_previous() }
123
+ @search_find_previous.connect(SIGNAL('triggered()')) do
124
+ FindReplaceDialog.find_previous(self)
125
+ end
120
126
 
121
127
  # Tab Menu Actions
122
128
  @delete_tab = Qt::Action.new(Cosmos.get_icon('delete_tab.png'), tr('&Delete Tab'), self)
@@ -179,21 +185,10 @@ module Cosmos
179
185
  end
180
186
  end
181
187
 
182
- def find
183
- current_component do |component|
184
- FindReplaceDialog.show_find(component.text)
185
- end
186
- end
187
-
188
- def find_next
189
- current_component do |component|
190
- FindReplaceDialog.find_next(component.text)
191
- end
192
- end
193
-
194
- def find_previous
188
+ # Called by the FindReplaceDialog to get the text to search
189
+ def search_text
195
190
  current_component do |component|
196
- FindReplaceDialog.find_previous(component.text)
191
+ component.text
197
192
  end
198
193
  end
199
194
 
@@ -151,7 +151,7 @@ module Cosmos
151
151
  if spec_name_split.length > 1 and spec_name_split[0] == 'cosmos'
152
152
  # Filter to just tools and not targets
153
153
  if File.exist?(File.join(spec.gem_dir, 'tools'))
154
- Dir[File.join(spec.gem_dir, 'tools', '*')].each do |filename|
154
+ Dir[File.join(spec.gem_dir, 'tools', '*')].sort.each do |filename|
155
155
  if File.extname(filename) == ''
156
156
  @items << [:TOOL, File.basename(filename), format_shell_command(parser, "LAUNCH_GEM #{File.basename(filename)}"), true, File.basename(filename).class_name_to_filename(false) + '.png', nil]
157
157
  end
@@ -160,7 +160,7 @@ module Cosmos
160
160
  @search_find.shortcut = @search_find_keyseq
161
161
  @search_find.statusTip = tr('Find text')
162
162
  @search_find.connect(SIGNAL('triggered()')) do
163
- FindReplaceDialog.show_find(active_script_runner_frame().script)
163
+ FindReplaceDialog.show_find(self)
164
164
  end
165
165
 
166
166
  @search_find_next = Qt::Action.new(tr('Find &Next'), self)
@@ -168,7 +168,7 @@ module Cosmos
168
168
  @search_find_next.shortcut = @search_find_next_keyseq
169
169
  @search_find_next.statusTip = tr('Find next instance')
170
170
  @search_find_next.connect(SIGNAL('triggered()')) do
171
- FindReplaceDialog.find_next(active_script_runner_frame().script)
171
+ FindReplaceDialog.find_next(self)
172
172
  end
173
173
 
174
174
  @search_find_previous = Qt::Action.new(tr('Find &Previous'), self)
@@ -176,7 +176,7 @@ module Cosmos
176
176
  @search_find_previous.shortcut = @search_find_previous_keyseq
177
177
  @search_find_previous.statusTip = tr('Find previous instance')
178
178
  @search_find_previous.connect(SIGNAL('triggered()')) do
179
- FindReplaceDialog.find_previous(active_script_runner_frame().script)
179
+ FindReplaceDialog.find_previous(self)
180
180
  end
181
181
 
182
182
  @search_replace = Qt::Action.new(tr('&Replace'), self)
@@ -184,7 +184,7 @@ module Cosmos
184
184
  @search_replace.shortcut = @search_replace_keyseq
185
185
  @search_replace.statusTip = tr('Replace')
186
186
  @search_replace.connect(SIGNAL('triggered()')) do
187
- FindReplaceDialog.show_replace(active_script_runner_frame().script)
187
+ FindReplaceDialog.show_replace(self)
188
188
  end
189
189
 
190
190
  # Script Actions
@@ -614,6 +614,11 @@ module Cosmos
614
614
  # Callbacks
615
615
  ###########################################
616
616
 
617
+ # Called by the FindReplaceDialog to get the text to search
618
+ def search_text
619
+ active_script_runner_frame().script
620
+ end
621
+
617
622
  def undo_available(bool)
618
623
  update_title()
619
624
  end
@@ -890,7 +890,9 @@ module Cosmos
890
890
 
891
891
  case item_def.display_type
892
892
  when :STATE
893
- gui_table.setItem(table_row, table_column, Qt::TableWidgetItem.new(table_def.read(item_def.name)))
893
+ item = Qt::TableWidgetItem.new
894
+ item.setData(Qt::DisplayRole, Qt::Variant.new(table_def.read(item_def.name)))
895
+ gui_table.setItem(table_row, table_column, item)
894
896
  if item_def.editable
895
897
  gui_table.item(table_row, table_column).setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
896
898
  else
@@ -20,6 +20,7 @@ module Cosmos
20
20
 
21
21
  # Widget which lays out the options for editing a plot
22
22
  class LinegraphPlotEditor < PlotEditor
23
+ UTC = 'UTC' # Used in combobox and matcher logic
23
24
 
24
25
  def initialize(parent, plot = nil)
25
26
  super(parent, plot)
@@ -92,13 +93,21 @@ module Cosmos
92
93
  @manual_y_grid_line_scale = FloatChooser.new(self, 'Manual Y Grid Line Scale:', manual_y_grid_line_scale.to_s)
93
94
  @layout.addWidget(@manual_y_grid_line_scale)
94
95
 
95
- # Combobox Chooser
96
96
  choices = ['TRUE', 'FALSE']
97
97
  choices.delete(@plot.unix_epoch_x_values.to_s.upcase)
98
98
  choices.unshift(@plot.unix_epoch_x_values.to_s.upcase)
99
99
  @unix_epoch_x_values = ComboboxChooser.new(self, 'Unix Epoch X Values:', choices)
100
100
  @layout.addWidget(@unix_epoch_x_values)
101
101
 
102
+ # If utc_time is already selected show it first
103
+ if @plot.utc_time
104
+ choices = [UTC, 'Local']
105
+ else
106
+ choices = ['Local', UTC]
107
+ end
108
+ @time_format_chooser = ComboboxChooser.new(self, 'Time Format:', choices)
109
+ @layout.addWidget(@time_format_chooser)
110
+
102
111
  setLayout(@layout)
103
112
  end # def initialize
104
113
 
@@ -173,6 +182,7 @@ module Cosmos
173
182
  plot.manual_y_grid_line_scale = nil
174
183
  end
175
184
  plot.unix_epoch_x_values = ConfigParser.handle_true_false(@unix_epoch_x_values.string)
185
+ plot.utc_time = (@time_format_chooser.string == UTC)
176
186
  plot
177
187
  end
178
188
 
@@ -77,6 +77,7 @@ module Cosmos
77
77
  self.manual_x_grid_line_scale = @plot.manual_x_grid_line_scale
78
78
  self.manual_y_grid_line_scale = @plot.manual_y_grid_line_scale
79
79
  self.unix_epoch_x_values = @plot.unix_epoch_x_values
80
+ self.utc_time = @plot.utc_time
80
81
 
81
82
  # Update horizontal lines
82
83
  self.clear_horizontal_lines
@@ -61,6 +61,9 @@ module Cosmos
61
61
  # Interpret x values as unix epoch timestamps
62
62
  attr_accessor :unix_epoch_x_values
63
63
 
64
+ # Display x values as UTC time
65
+ attr_accessor :utc_time
66
+
64
67
  def initialize
65
68
  super()
66
69
  @title = nil
@@ -78,6 +81,7 @@ module Cosmos
78
81
  @manual_x_grid_line_scale = nil
79
82
  @manual_y_grid_line_scale = nil
80
83
  @unix_epoch_x_values = true
84
+ @utc_time = false
81
85
  end # def initialize
82
86
 
83
87
  # Handles plot specific keywords
@@ -165,6 +169,9 @@ module Cosmos
165
169
  parser.verify_num_parameters(1, 1, "UNIX_EPOCH_X_VALUES <TRUE or FALSE>")
166
170
  @unix_epoch_x_values = ConfigParser.handle_true_false(parameters[0])
167
171
 
172
+ when 'UTC_TIME'
173
+ @utc_time = true
174
+
168
175
  else
169
176
  # Unknown keywords are passed to parent data object
170
177
  super(parser, keyword, parameters)
@@ -193,6 +200,7 @@ module Cosmos
193
200
  string << " MANUAL_X_GRID_LINE_SCALE #{@manual_x_grid_line_scale}\n" if @manual_x_grid_line_scale
194
201
  string << " MANUAL_Y_GRID_LINE_SCALE #{@manual_y_grid_line_scale}\n" if @manual_y_grid_line_scale
195
202
  string << " UNIX_EPOCH_X_VALUES #{@unix_epoch_x_values.to_s.upcase}\n"
203
+ string << " UTC_TIME\n" if @utc_time
196
204
  string
197
205
  end # def plot_configuration_string
198
206
 
@@ -1,12 +1,12 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- COSMOS_VERSION = '3.6.2'
3
+ COSMOS_VERSION = '3.6.3'
4
4
  module Cosmos
5
5
  module Version
6
6
  MAJOR = '3'
7
7
  MINOR = '6'
8
- PATCH = '2'
9
- BUILD = 'fcb3c8cec14487f39b0465f850a61b9ea13355cc'
8
+ PATCH = '3'
9
+ BUILD = '94a14746a45a58b2382cb17b0984f2ec5fd265af'
10
10
  end
11
- VERSION = '3.6.2'
11
+ VERSION = '3.6.3'
12
12
  end
@@ -120,6 +120,35 @@ describe Array do
120
120
  it "finds the range of values containing both" do
121
121
  expect(Array.new([0,1,1,2,2,3]).range_containing(1,2)).to eql (1..4)
122
122
  expect(Array.new([0,1,1,2,2,3]).range_containing(1,1)).to eql (1..2)
123
+ expect(Array.new([0,1,2,3,4,5]).range_containing(1,4)).to eql (1..4)
124
+ end
125
+
126
+ it "creates an empty range at the beginning of the array if the values both too small" do
127
+ expect(Array.new([0,1,1,2,2,3]).range_containing(-2,-1)).to eql (0..0)
128
+ end
129
+
130
+ it "creates an empty range at the end of the array if the values are both too large" do
131
+ expect(Array.new([0,1,1,2,2,3]).range_containing(4,5)).to eql (5..5)
132
+ end
133
+ end
134
+
135
+ describe "range_within" do
136
+ it "complains if start < end" do
137
+ expect { Array.new().range_within(2,1) }.to raise_error(RuntimeError, "end_value: 1 must be greater than start_value: 2")
138
+ end
139
+
140
+ it "finds the range of values within both" do
141
+ expect(Array.new([0,1,1,2,2,3]).range_within(1,2)).to eql (2..3)
142
+ expect(Array.new([0,1,1,2,2,3]).range_within(1,1)).to eql (1..2)
143
+ expect(Array.new([0,1,2,3,4,5]).range_within(1,4)).to eql (1..4)
144
+ end
145
+
146
+ it "creates an empty range at the beginning of the array if the values both too small" do
147
+ expect(Array.new([0,1,1,2,2,3]).range_within(-2,-1)).to eql (0..0)
148
+ end
149
+
150
+ it "creates an empty range at the end of the array if the values are both too large" do
151
+ expect(Array.new([0,1,1,2,2,3]).range_within(4,5)).to eql (5..5)
123
152
  end
124
153
  end
125
154
 
@@ -163,7 +192,7 @@ describe Array do
163
192
  end
164
193
 
165
194
  describe "histogram" do
166
- it "groups elements" do
195
+ it "groups numeric elements" do
167
196
  myData1 = [1, 7, 4, 3, 4, 2, 7, 0, 8, 3, 4]
168
197
  myData2 = [1, 2, 3]
169
198
  myData3 = [2, 4, 8]
@@ -181,6 +210,38 @@ describe Array do
181
210
  expect(myData3.histogram(7, true)[2][2]).to eql 1
182
211
  expect(myData3.histogram(25, true)[20][2]).to eql 0
183
212
  end
213
+
214
+ it "sorts by a given block" do
215
+ myData1 = [1, 7, 4, 3, 4, 2, 7, 0, 8, 3, 4]
216
+ histogram = myData1.histogram(nil, true) do |val1, val2|
217
+ val2[0] <=> val1[0]
218
+ end
219
+ expect(myData1.histogram(nil, true)).to eql histogram.reverse
220
+ end
221
+
222
+ it "groups non-numeric elements" do
223
+ myData1 = ['b', 'h', 'e', 'd', 'e', 'c', 'h', 'a', 'i', 'd', 'e']
224
+ myData2 = ['b', 'c', 'd']
225
+ myData3 = ['c', 'e', 'i']
226
+
227
+ expect(myData1.histogram()).to eql [['a','a',1],['b','b',1],['c','c',1],['d','d',2],['e','e',3],['h','h',2],['i','i',1]]
228
+ expect(myData2.histogram()).to eql [["b", "b", 1], ["c", "c", 1], ["d", "d", 1]]
229
+ expect(myData3.histogram()).to eql [["c", "c", 1], ["e", "e", 1], ["i", "i", 1]]
230
+
231
+ # Even though we request 9 we only get 7 because that's all the unique values we have
232
+ expect(myData1.histogram(9, false).length).to eql 7
233
+ expect(myData1.histogram(1, false).length).to eql 1
234
+ expect(myData1.histogram(7, false)[0][2]).to eql 1
235
+ expect(myData1.histogram(7, false)[4][2]).to eql 3
236
+ expect(myData1.histogram(3, false)[0][2]).to eql 3
237
+ # Even though we request 5 we only get 3 because that's all the unique values we have
238
+ expect(myData2.histogram(5, false).length).to eql 3
239
+ expect(myData2.histogram(3, false)[2][2]).to eql 1
240
+ expect(myData2.histogram(3, false)[1][2]).to eql 1
241
+ # Even though we request 7 we only get 3 because that's all the unique values we have
242
+ expect(myData3.histogram(7, false).length).to eql 3
243
+ expect(myData3.histogram(3, false)[2][2]).to eql 1
244
+ end
184
245
  end
185
246
  end
186
247
 
@@ -10,6 +10,7 @@
10
10
 
11
11
  require 'spec_helper'
12
12
  require 'cosmos/core_ext/matrix'
13
+ require 'ostruct'
13
14
 
14
15
  describe Matrix do
15
16
 
@@ -62,5 +63,65 @@ describe Matrix do
62
63
  expect(Matrix[[1,2],[4,5],[7,8]].trace).to eql 6.0
63
64
  end
64
65
  end
66
+
67
+ describe "cfromq" do
68
+ it "calculates the rotational matrix from the quaternion" do
69
+ quaternion = OpenStruct.new
70
+ quaternion.w = 1
71
+ quaternion.x = 0
72
+ quaternion.y = 0
73
+ quaternion.z = 0
74
+ expect(Matrix.cfromq(quaternion)).to eql Matrix[[1.0,0.0,0.0],[0.0,1.0,0.0],[0.0,0.0,1.0]]
75
+
76
+ quaternion.w = Math.sqrt(0.5)
77
+ quaternion.x = Math.sqrt(0.5)
78
+ quaternion.y = 0
79
+ quaternion.z = 0
80
+ matrix = Matrix.cfromq(quaternion)
81
+ expect(matrix[0]).to eql [1.0, 0.0, 0.0]
82
+ expect(matrix[1][0]).to eql 0.0
83
+ expect(matrix[1][1]).to be_within(1e-10).of(0.0)
84
+ expect(matrix[1][2]).to be_within(1e-10).of(1.0)
85
+ expect(matrix[2][0]).to eql 0.0
86
+ expect(matrix[2][1]).to be_within(1e-10).of(-1.0)
87
+ expect(matrix[2][2]).to be_within(1e-10).of(0.0)
88
+ end
89
+ end
90
+
91
+ describe "trans4" do
92
+ it "translates the matrix by x,y,z" do
93
+ matrix = Matrix[[4,4,4,4],[3,3,3,3],[2,2,2,2],[1,1,1,1]]
94
+ expect(matrix.trans4(1,1,1)).to eql Matrix[[4,4,4,4],[3,3,3,3],[2,2,2,2],[10,10,10,10]]
95
+ end
96
+ end
97
+
98
+ describe "scale4" do
99
+ it "scales the matrix by x,y,z" do
100
+ matrix = Matrix[[5,5,5,5],[4,4,4,4],[3,3,3,3],[2,2,2,2]]
101
+ expect(matrix.scale4(2,4,6)).to eql Matrix[[10,10,10,10],[16,16,16,16],[18,18,18,18],[2,2,2,2]]
102
+ end
103
+ end
104
+
105
+ describe "rot4" do
106
+ it "rotates the matrix about the quaternion" do
107
+ matrix = Matrix[[4,4,4,4],[3,3,3,3],[2,2,2,2],[1,1,1,1]]
108
+ quaternion = OpenStruct.new
109
+ quaternion.w = Math.sqrt(0.5)
110
+ quaternion.x = Math.sqrt(0.5)
111
+ quaternion.y = 0
112
+ quaternion.z = 0
113
+ matrix = matrix.rot4(quaternion)
114
+ expect(matrix[0]).to eql [4.0, 4.0, 4.0, 4.0]
115
+ expect(matrix[1][0]).to be_within(1e-10).of(2.0)
116
+ expect(matrix[1][1]).to be_within(1e-10).of(2.0)
117
+ expect(matrix[1][2]).to be_within(1e-10).of(2.0)
118
+ expect(matrix[1][3]).to be_within(1e-10).of(2.0)
119
+ expect(matrix[2][0]).to be_within(1e-10).of(-3.0)
120
+ expect(matrix[2][1]).to be_within(1e-10).of(-3.0)
121
+ expect(matrix[2][2]).to be_within(1e-10).of(-3.0)
122
+ expect(matrix[2][3]).to be_within(1e-10).of(-3.0)
123
+ expect(matrix[3]).to eql [1.0, 1.0, 1.0, 1.0]
124
+ end
125
+ end
65
126
  end
66
127
 
@@ -243,15 +243,6 @@ module Cosmos
243
243
 
244
244
  @i.read
245
245
  end
246
-
247
- it "handles response overflows" do
248
- @handshake = System.telemetry.packet("INST","HANDSHAKE")
249
- @handshake.write("GSE_HDR_ID", 1001)
250
- @handshake.write("ORIGIN", 0)
251
- allow_any_instance_of(LengthStreamProtocol).to receive(:read).and_return(@handshake)
252
- 100.times { @i.read }
253
- expect { @i.read }.to raise_error
254
- end
255
246
  end
256
247
 
257
248
  end
@@ -9,7 +9,6 @@
9
9
  # attribution addendums as found in the LICENSE.txt
10
10
 
11
11
  require 'spec_helper'
12
- require 'cosmos'
13
12
  require 'cosmos/script'
14
13
  require 'tempfile'
15
14
 
@@ -25,8 +24,6 @@ module Cosmos
25
24
  file.puts 'TARGET INST'
26
25
  end
27
26
  System.class_eval('@@instance = nil')
28
-
29
- require 'cosmos/script'
30
27
  end
31
28
 
32
29
  after(:all) do
@@ -35,6 +32,13 @@ module Cosmos
35
32
  end
36
33
 
37
34
  describe "require cosmos/script.rb" do
35
+ it "should require cosmos/script/script" do
36
+ save = $0
37
+ $0 = "Test"
38
+ expect { load 'cosmos/script.rb' }.to_not raise_error()
39
+ $0 = save
40
+ end
41
+
38
42
  it "should raise when inside CmdTlmServer" do
39
43
  save = $0
40
44
  $0 = "CmdTlmServer"