cosmos 3.9.1 → 3.9.2

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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -3
  3. data/Manifest.txt +7 -0
  4. data/autohotkey/tools/cmd_extractor.ahk +17 -0
  5. data/autohotkey/tools/tlm_extractor.ahk +62 -1
  6. data/bin/cosmos +182 -12
  7. data/data/crc.txt +35 -34
  8. data/demo/config/data/crc.txt +6 -2
  9. data/demo/config/targets/INST/screens/adcs.txt +1 -1
  10. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +1 -1
  11. data/demo/config/tools/example_application.css +58 -0
  12. data/demo/config/tools/launcher/launcher.css +7 -0
  13. data/demo/config/tools/launcher/launcher2.css +10 -0
  14. data/demo/config/tools/test_runner/test_runner.css +45 -0
  15. data/ext/cosmos/ext/packet/packet.c +6 -0
  16. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +15 -6
  17. data/lib/cosmos/gui/qt_tool.rb +58 -8
  18. data/lib/cosmos/gui/text/ruby_editor.rb +54 -6
  19. data/lib/cosmos/gui/utilities/analyze_log.rb +153 -0
  20. data/lib/cosmos/interfaces/interface.rb +6 -0
  21. data/lib/cosmos/packets/packet_item_limits.rb +14 -2
  22. data/lib/cosmos/packets/structure_item.rb +22 -3
  23. data/lib/cosmos/script/cmd_tlm_server.rb +28 -0
  24. data/lib/cosmos/script/extract.rb +10 -9
  25. data/lib/cosmos/script/tools.rb +10 -4
  26. data/lib/cosmos/system/system.rb +2 -1
  27. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +12 -0
  28. data/lib/cosmos/tools/cmd_tlm_server/api.rb +84 -0
  29. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +3 -2
  30. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +9 -0
  31. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +2 -2
  32. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +26 -17
  33. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +26 -0
  34. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +29 -0
  35. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +33 -0
  36. data/lib/cosmos/tools/data_viewer/data_viewer.rb +1 -1
  37. data/lib/cosmos/tools/launcher/launcher.rb +14 -25
  38. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +3 -7
  39. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +6 -4
  40. data/lib/cosmos/tools/script_runner/script_runner.rb +58 -9
  41. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +45 -19
  42. data/lib/cosmos/tools/table_manager/table_manager.rb +7 -7
  43. data/lib/cosmos/tools/test_runner/test_runner.rb +6 -0
  44. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +145 -8
  45. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +89 -19
  46. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +14 -0
  47. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +1 -1
  48. data/lib/cosmos/tools/tlm_viewer/screen.rb +15 -3
  49. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +23 -12
  50. data/lib/cosmos/version.rb +4 -4
  51. data/spec/packets/packet_item_limits_spec.rb +33 -6
  52. data/spec/packets/packet_item_spec.rb +9 -9
  53. data/spec/packets/packet_spec.rb +18 -6
  54. data/spec/packets/structure_item_spec.rb +22 -4
  55. data/spec/script/cmd_tlm_server_spec.rb +66 -0
  56. data/spec/script/extract_spec.rb +144 -0
  57. data/spec/script/tools_spec.rb +17 -2
  58. data/spec/system/system_spec.rb +1 -1
  59. data/spec/tools/cmd_tlm_server/api_spec.rb +6 -0
  60. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +1 -1
  61. data/spec/tools/table_manager/table_item_parser_spec.rb +61 -0
  62. data/spec/tools/table_manager/table_item_spec.rb +1 -1
  63. metadata +9 -2
@@ -16,18 +16,20 @@ module Cosmos
16
16
  class TlmExtractorConfig
17
17
 
18
18
  VALUE_TYPES = [:RAW, :CONVERTED, :FORMATTED, :WITH_UNITS]
19
+ COLUMN_MODES = [:NORMAL, :SHARE_ALL_COLUMNS, :SHARE_INDIV_COLUMNS, :FULL_COLUMN_NAMES]
19
20
  DEFAULT_UNIQUE_IGNORED = ['RECEIVED_TIMEFORMATTED', 'RECEIVED_TIMESECONDS']
20
21
  ITEM = 'ITEM'.freeze
21
22
  TEXT = 'TEXT'.freeze
22
23
 
23
24
  attr_accessor :matlab_header
24
25
  attr_accessor :fill_down
25
- attr_accessor :share_columns
26
+ attr_reader :column_mode
26
27
  attr_accessor :unique_only
27
28
  attr_accessor :delimiter
28
29
  attr_accessor :downsample_seconds
29
30
  attr_accessor :print_filenames_to_output
30
31
  attr_reader :items
32
+ attr_reader :shared_indiv_columns
31
33
 
32
34
  attr_accessor :output_filename
33
35
  attr_accessor :input_filenames
@@ -38,18 +40,19 @@ module Cosmos
38
40
  @output_file = nil
39
41
  reset_settings()
40
42
  clear_items()
43
+ clear_shared_columns()
41
44
  restore(config_file) if config_file
42
45
  end
43
46
 
44
47
  def reset_settings
45
48
  @matlab_header = false
46
49
  @fill_down = false
47
- @share_columns = false
48
50
  @unique_only = false
49
51
  @delimiter = "\t"
50
52
  @unique_ignored = DEFAULT_UNIQUE_IGNORED.clone
51
53
  @downsample_seconds = 0.0
52
54
  @print_filenames_to_output = true
55
+ set_column_mode(:NORMAL)
53
56
  end
54
57
 
55
58
  def clear_items
@@ -70,10 +73,12 @@ module Cosmos
70
73
 
71
74
  hash_index = item_name + ' ' + value_type.to_s
72
75
 
73
- if @share_columns and @columns_hash[hash_index]
76
+ if @column_mode == :SHARE_ALL_COLUMNS and @columns_hash[hash_index]
77
+ column_index = @columns_hash[hash_index]
78
+ elsif @column_mode == :SHARE_INDIV_COLUMNS and @shared_indiv_columns.include?(hash_index) and @columns_hash[hash_index]
74
79
  column_index = @columns_hash[hash_index]
75
80
  else
76
- @columns << [item_name, value_type, nil]
81
+ @columns << [item_name, value_type, nil, target_name, packet_name]
77
82
  column_index = @columns.length - 1
78
83
  @columns_hash[hash_index] = column_index
79
84
  end
@@ -84,22 +89,52 @@ module Cosmos
84
89
  end
85
90
 
86
91
  def add_text(column_name, text)
87
- @columns << [column_name, nil, nil]
92
+ @columns << [column_name, nil, nil, nil, nil]
88
93
  @items << [TEXT, column_name, text, nil, nil]
89
94
  @text_items << [@columns.length - 1, text]
90
95
  end
91
96
 
97
+ def set_column_mode(mode)
98
+ raise "Unknown Column Mode: #{mode}" unless COLUMN_MODES.include?(mode)
99
+
100
+ @column_mode = mode
101
+ if @column_mode != :SHARE_INDIV_COLUMNS
102
+ clear_shared_columns()
103
+ end
104
+ end
105
+
106
+ def clear_shared_columns()
107
+ @shared_indiv_columns = []
108
+ end
109
+
110
+ def add_shared_column(item_name, value_type = :CONVERTED)
111
+ raise "Unknown Value Type: #{value_type}" unless VALUE_TYPES.include?(value_type)
112
+
113
+ shared_column_name = item_name + ' ' + value_type.to_s
114
+ @shared_indiv_columns << shared_column_name
115
+ @shared_indiv_columns.uniq!
116
+ end
117
+
92
118
  def column_names
93
- row = Array.new(@columns.length + 2)
94
- row[0] = 'TARGET'
95
- row[1] = 'PACKET'
119
+ if @column_mode == :FULL_COLUMN_NAMES
120
+ col_offset = 0
121
+ row = Array.new(@columns.length)
122
+ else
123
+ col_offset = 2
124
+ row = Array.new(@columns.length + 2)
125
+ row[0] = 'TARGET'
126
+ row[1] = 'PACKET'
127
+ end
96
128
  index = 0
97
- @columns.each do |column_name, column_value_type, item_data_type|
129
+ @columns.each do |column_name, column_value_type, item_data_type, target_name, packet_name|
130
+ if @column_mode == :FULL_COLUMN_NAMES and target_name and packet_name
131
+ column_name = [target_name, packet_name, column_name].join(' ')
132
+ end
98
133
  case column_value_type
99
134
  when :CONVERTED, nil
100
- row[index + 2] = column_name
135
+ row[index + col_offset] = column_name
101
136
  else
102
- row[index + 2] = (column_name + '(' + column_value_type.to_s + ')')
137
+ row[index + col_offset] = (column_name + '(' + column_value_type.to_s + ')')
103
138
  end
104
139
  index += 1
105
140
  end
@@ -132,7 +167,30 @@ module Cosmos
132
167
  when 'SHARE_COLUMNS'
133
168
  # Expect 0 parameters
134
169
  parser.verify_num_parameters(0, 0, "SHARE_COLUMNS")
135
- @share_columns = true
170
+ set_column_mode(:SHARE_ALL_COLUMNS)
171
+
172
+ when 'SHARE_COLUMN'
173
+ # Expect 1 or 2 parameters
174
+ parser.verify_num_parameters(1, 2, "SHARE_COLUMN <Item Name> <Data Type (optional)>")
175
+ item_name = params[0].upcase
176
+ if params.length == 1
177
+ value_type = :CONVERTED
178
+ else
179
+ value_type = params[1].upcase
180
+ case value_type
181
+ when 'CONVERTED', 'RAW', 'FORMATTED', 'WITH_UNITS'
182
+ value_type = value_type.intern
183
+ else
184
+ raise "Unknown Value Type: #{value_type}"
185
+ end
186
+ end
187
+ set_column_mode(:SHARE_INDIV_COLUMNS)
188
+ add_shared_column(item_name, value_type)
189
+
190
+ when 'FULL_COLUMN_NAMES'
191
+ # Expect 0 parameters
192
+ parser.verify_num_parameters(0, 0, "FULL_COLUMN_NAMES")
193
+ set_column_mode(:FULL_COLUMN_NAMES)
136
194
 
137
195
  when 'UNIQUE_ONLY'
138
196
  # Expect 0 parameters
@@ -202,9 +260,17 @@ module Cosmos
202
260
  if !@print_filenames_to_output
203
261
  file.puts 'DONT_OUTPUT_FILENAMES'
204
262
  end
205
- if @share_columns
263
+ if @column_mode == :SHARE_ALL_COLUMNS
206
264
  file.puts 'SHARE_COLUMNS'
207
265
  end
266
+ if @column_mode == :SHARE_INDIV_COLUMNS
267
+ @shared_indiv_columns.each do |shared_column|
268
+ file.puts "SHARE_COLUMN #{shared_column}"
269
+ end
270
+ end
271
+ if @column_mode == :FULL_COLUMN_NAMES
272
+ file.puts 'FULL_COLUMN_NAMES'
273
+ end
208
274
  if @unique_only
209
275
  file.puts 'UNIQUE_ONLY'
210
276
  end
@@ -312,13 +378,13 @@ module Cosmos
312
378
 
313
379
  # Add each packet item to the row
314
380
  packet_mapping.each do |column_index|
315
- column_name, column_value_type, item_data_type = @columns[column_index]
381
+ column_name, column_value_type, item_data_type, target_name, packet_name = @columns[column_index]
316
382
 
317
383
  # Lookup item data type on first use
318
384
  unless item_data_type
319
385
  _, item = System.telemetry.packet_and_item(packet.target_name, packet.packet_name, column_name)
320
386
  item_data_type = item.data_type
321
- @columns[column_index] = [column_name, column_value_type, item_data_type]
387
+ @columns[column_index] = [column_name, column_value_type, item_data_type, target_name, packet_name]
322
388
  end
323
389
 
324
390
  if item_data_type == :BLOCK
@@ -349,11 +415,15 @@ module Cosmos
349
415
 
350
416
  if !@unique_only or changed
351
417
  # Output the row
352
- @output_file.print packet.target_name
353
- @output_file.print @delimiter
354
- @output_file.print packet.packet_name
355
- row.each_with_index do |value, index|
418
+ if @column_mode != :FULL_COLUMN_NAMES
419
+ @output_file.print packet.target_name
356
420
  @output_file.print @delimiter
421
+ @output_file.print packet.packet_name
422
+ end
423
+ row.each_with_index do |value, index|
424
+ if @column_mode != :FULL_COLUMN_NAMES or index != 0
425
+ @output_file.print @delimiter
426
+ end
357
427
  @output_file.print value if value
358
428
  end
359
429
  @output_file.puts ""
@@ -32,6 +32,7 @@ module Cosmos
32
32
  DEFAULT_POINTS_SAVED = 1000000
33
33
  DEFAULT_POINTS_PLOTTED = 1000
34
34
  DEFAULT_REFRESH_RATE_HZ = 10.0
35
+ DEFAULT_CTS_TIMEOUT = 10.0
35
36
 
36
37
  # Gives access to the array of tabs defined by the configuration file
37
38
  attr_accessor :tabs
@@ -48,6 +49,9 @@ module Cosmos
48
49
  # Global Refresh Rate Hz Setting
49
50
  attr_accessor :refresh_rate_hz
50
51
 
52
+ # Global CTS Timeout Setting
53
+ attr_accessor :cts_timeout
54
+
51
55
  # Plot types known by this tabbed plots definition
52
56
  attr_accessor :plot_types
53
57
 
@@ -75,6 +79,7 @@ module Cosmos
75
79
  @seconds_plotted = DEFAULT_SECONDS_PLOTTED
76
80
  @points_plotted = DEFAULT_POINTS_PLOTTED
77
81
  @refresh_rate_hz = DEFAULT_REFRESH_RATE_HZ
82
+ @cts_timeout = DEFAULT_CTS_TIMEOUT
78
83
  @packet_count = 0
79
84
  @configuration_errors = []
80
85
 
@@ -158,6 +163,14 @@ module Cosmos
158
163
  @refresh_rate_hz = parameters[0].to_f
159
164
  raise ArgumentError, "Invalid Refresh Rate Hz: #{@refresh_rate_hz}" if @refresh_rate_hz <= 0.0
160
165
 
166
+ when 'CTS_TIMEOUT'
167
+ # Expect 1 parameter
168
+ parser.verify_num_parameters(1, 1, "CTS_TIMEOUT <CTS Timeout in Seconds>")
169
+
170
+ # Update CTS Timeout
171
+ @cts_timeout = parameters[0].to_f
172
+ raise ArgumentError, "Invalid CTS Timeout: #{@cts_timeout}" if @cts_timeout <= 0.0
173
+
161
174
  else
162
175
  # Handle unknown keywords
163
176
  raise ArgumentError, "A TAB must be defined before using keyword: #{keyword}"
@@ -189,6 +202,7 @@ module Cosmos
189
202
  configuration << "POINTS_SAVED #{@points_saved}\n"
190
203
  configuration << "POINTS_PLOTTED #{@points_plotted}\n"
191
204
  configuration << "REFRESH_RATE_HZ #{@refresh_rate_hz}\n"
205
+ configuration << "CTS_TIMEOUT #{@cts_timeout}\n"
192
206
  @tabs.each do |tab|
193
207
  configuration << "\n"
194
208
  configuration << tab.configuration_string
@@ -19,7 +19,7 @@ module Cosmos
19
19
 
20
20
  # Create a new TabbedPlotsRealtimeThread
21
21
  def initialize(tabbed_plots_config, connection_success_callback = nil, connection_failed_callback = nil, connection_lost_callback = nil, fatal_exception_callback = nil)
22
- interface = TcpipClientInterface.new('localhost', nil, System.ports['CTS_PREIDENTIFIED'], nil, 10.0, 'PREIDENTIFIED')
22
+ interface = TcpipClientInterface.new('localhost', nil, System.ports['CTS_PREIDENTIFIED'], nil, tabbed_plots_config.cts_timeout, 'PREIDENTIFIED')
23
23
  super(interface)
24
24
 
25
25
  @queue = Queue.new
@@ -221,6 +221,10 @@ module Cosmos
221
221
  # regular TlmViewer application
222
222
  @single_screen = single_screen
223
223
 
224
+ # Read the application wide stylesheet if it exists
225
+ app_style = File.join(Cosmos::USERPATH, 'config', 'tools', 'application.css')
226
+ setStyleSheet(File.read(app_style)) if File.exist? app_style
227
+
224
228
  @widgets = Widgets.new(self, mode)
225
229
  @window = process(filename)
226
230
  @@open_screens << self if @window
@@ -254,10 +258,15 @@ module Cosmos
254
258
  if keyword
255
259
  case keyword
256
260
  when 'SCREEN'
257
- parser.verify_num_parameters(3, 3, "#{keyword} <Width or AUTO> <Height or AUTO> <Polling Period>")
261
+ parser.verify_num_parameters(3, 4, "#{keyword} <Width or AUTO> <Height or AUTO> <Polling Period> <FIXED>")
258
262
  @width = parameters[0].to_i
259
263
  @height = parameters[1].to_i
260
264
  @widgets.polling_period = parameters[2].to_f
265
+ if parameters.length == 4
266
+ @fixed = true
267
+ else
268
+ @fixed = false
269
+ end
261
270
 
262
271
  setWindowTitle(@full_name)
263
272
  top_widget = Qt::Widget.new()
@@ -329,6 +338,10 @@ module Cosmos
329
338
  elsif @width > 0 and height <= 0
330
339
  resize(@width, self.height)
331
340
  end
341
+ if @fixed
342
+ setWindowFlags(windowFlags() | Qt::MSWindowsFixedSizeDialogHint)
343
+ setFixedSize(self.width, self.height)
344
+ end
332
345
 
333
346
  if @x_pos or @y_pos
334
347
  x = @x_pos || 0
@@ -482,5 +495,4 @@ module Cosmos
482
495
  end
483
496
 
484
497
  end
485
-
486
- end # module Cosmos
498
+ end
@@ -34,6 +34,10 @@ module Cosmos
34
34
  def clear(display_name)
35
35
  TlmViewer.instance.clear(display_name)
36
36
  end
37
+
38
+ def clear_all(target = nil)
39
+ TlmViewer.instance.clear_all(target)
40
+ end
37
41
  end
38
42
  end
39
43
  end
@@ -93,18 +97,11 @@ module Cosmos
93
97
  setMinimumWidth(300)
94
98
  @@instance = self
95
99
 
96
- # Get Params from Config File
97
- if options.config_file
98
- filename = File.join(::Cosmos::USERPATH, 'config', 'tools', 'tlm_viewer', options.config_file)
99
- else
100
- filename = File.join(::Cosmos::USERPATH, 'config', 'tools', 'tlm_viewer', 'tlm_viewer.txt')
101
- end
102
-
103
100
  Splash.execute(self, true) do |splash|
104
101
  ConfigParser.splash = splash
105
102
  splash.message = "Starting TlmViewer"
106
103
  System.telemetry
107
- @tlm_viewer_config = self.class.load_config(filename)
104
+ @tlm_viewer_config = self.class.load_config(options.config_file)
108
105
  ConfigParser.splash = nil
109
106
  end
110
107
 
@@ -132,7 +129,8 @@ module Cosmos
132
129
  @json_drb.acl = acl
133
130
  whitelist = [
134
131
  'display',
135
- 'clear']
132
+ 'clear',
133
+ 'clear_all']
136
134
  @json_drb.method_whitelist = whitelist
137
135
  begin
138
136
  @json_drb.start_service "localhost", port, self
@@ -483,10 +481,23 @@ module Cosmos
483
481
 
484
482
  # Close the specified screen
485
483
  def clear(screen_full_name)
486
- # Find the specified screen
487
- screen_info = find_screen_info(screen_full_name)
484
+ close_screen(find_screen_info(screen_full_name))
485
+ end
486
+
487
+ # Close all screens
488
+ def clear_all(target_name = nil)
489
+ if target_name
490
+ screens = @tlm_viewer_config.screen_infos.values.select do |screen_info|
491
+ screen_info.target_name == target_name.upcase
492
+ end
493
+ raise "Unknown screen target: #{target_name.upcase}" if screens.length == 0
494
+ screens.each { |screen_info| close_screen(screen_info) }
495
+ else
496
+ Qt.execute_in_main_thread(true) { Screen.close_all_screens(self) }
497
+ end
498
+ end
488
499
 
489
- # Close the screen
500
+ def close_screen(screen_info)
490
501
  Qt.execute_in_main_thread(true) do
491
502
  begin
492
503
  screen_info.screen.window.close if screen_info.screen
@@ -1,12 +1,12 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- COSMOS_VERSION = '3.9.1'
3
+ COSMOS_VERSION = '3.9.2'
4
4
  module Cosmos
5
5
  module Version
6
6
  MAJOR = '3'
7
7
  MINOR = '9'
8
- PATCH = '1'
9
- BUILD = '0d2d495007138d6145a42b4cba9176f3e606640d'
8
+ PATCH = '2'
9
+ BUILD = '82298a42b756edd3783b51c2d7d17535b6ab8f1a'
10
10
  end
11
- VERSION = '3.9.1'
11
+ VERSION = '3.9.2'
12
12
  end
@@ -84,11 +84,25 @@ module Cosmos
84
84
  end
85
85
 
86
86
  it "complains about persistence_setting = nil" do
87
- expect { @l.persistence_setting = nil}.to raise_error(ArgumentError, "persistence_setting must be a Fixnum but is a NilClass")
87
+ if 0.class == Integer
88
+ # Ruby version >= 2.4.0
89
+ expect { @l.persistence_setting = nil}.to raise_error(ArgumentError, "persistence_setting must be an Integer but is a NilClass")
90
+ else
91
+ # Ruby version < 2.4.0
92
+ expect { @l.persistence_setting = nil}.to raise_error(ArgumentError, "persistence_setting must be a Fixnum but is a NilClass")
93
+ end
88
94
  end
89
95
 
90
- it "complains about persistence_setting that aren't Fixnum" do
91
- expect { @l.persistence_setting = 5.5}.to raise_error(ArgumentError, "persistence_setting must be a Fixnum but is a Float")
96
+ if 0.class == Integer
97
+ # Ruby version >= 2.4.0
98
+ it "complains about persistence_setting that aren't Integer" do
99
+ expect { @l.persistence_setting = 5.5}.to raise_error(ArgumentError, "persistence_setting must be an Integer but is a Float")
100
+ end
101
+ else
102
+ # Ruby version < 2.4.0
103
+ it "complains about persistence_setting that aren't Fixnum" do
104
+ expect { @l.persistence_setting = 5.5}.to raise_error(ArgumentError, "persistence_setting must be a Fixnum but is a Float")
105
+ end
92
106
  end
93
107
  end
94
108
 
@@ -100,11 +114,24 @@ module Cosmos
100
114
  end
101
115
 
102
116
  it "complains about persistence_count = nil" do
103
- expect { @l.persistence_count = nil}.to raise_error(ArgumentError, "persistence_count must be a Fixnum but is a NilClass")
117
+ if 0.class == Integer
118
+ # Ruby version >= 2.4.0
119
+ expect { @l.persistence_count = nil}.to raise_error(ArgumentError, "persistence_count must be an Integer but is a NilClass")
120
+ else
121
+ # Ruby version < 2.4.0
122
+ expect { @l.persistence_count = nil}.to raise_error(ArgumentError, "persistence_count must be a Fixnum but is a NilClass")
123
+ end
104
124
  end
105
125
 
106
- it "complains about persistence_count that aren't Fixnum" do
107
- expect { @l.persistence_count = 5.5}.to raise_error(ArgumentError, "persistence_count must be a Fixnum but is a Float")
126
+ if 0.class == Integer
127
+ it "complains about persistence_count that aren't Integer" do
128
+ expect { @l.persistence_count = 5.5}.to raise_error(ArgumentError, "persistence_count must be an Integer but is a Float")
129
+ end
130
+ else
131
+ # Ruby version < 2.4.0
132
+ it "complains about persistence_count that aren't Fixnum" do
133
+ expect { @l.persistence_count = 5.5}.to raise_error(ArgumentError, "persistence_count must be a Fixnum but is a Float")
134
+ end
108
135
  end
109
136
  end
110
137
 
@@ -32,7 +32,7 @@ module Cosmos
32
32
  end
33
33
 
34
34
  it "complains about non String format_strings" do
35
- expect { @pi.format_string = 5 }.to raise_error(ArgumentError, "#{@pi.name}: format_string must be a String but is a Fixnum")
35
+ expect { @pi.format_string = 5.1 }.to raise_error(ArgumentError, "#{@pi.name}: format_string must be a String but is a Float")
36
36
  end
37
37
 
38
38
  it "complains about badly formatted format_strings" do
@@ -130,7 +130,7 @@ module Cosmos
130
130
  end
131
131
 
132
132
  it "complains about description that aren't Strings" do
133
- expect { @pi.description = 5}.to raise_error(ArgumentError, "#{@pi.name}: description must be a String but is a Fixnum")
133
+ expect { @pi.description = 5.1}.to raise_error(ArgumentError, "#{@pi.name}: description must be a String but is a Float")
134
134
  end
135
135
  end
136
136
 
@@ -147,7 +147,7 @@ module Cosmos
147
147
  end
148
148
 
149
149
  it "complains about units_full that aren't Strings" do
150
- expect { @pi.units_full = 5}.to raise_error(ArgumentError, "#{@pi.name}: units_full must be a String but is a Fixnum")
150
+ expect { @pi.units_full = 5.1}.to raise_error(ArgumentError, "#{@pi.name}: units_full must be a String but is a Float")
151
151
  end
152
152
  end
153
153
 
@@ -164,7 +164,7 @@ module Cosmos
164
164
  end
165
165
 
166
166
  it "complains about units that aren't Strings" do
167
- expect { @pi.units = 5}.to raise_error(ArgumentError, "#{@pi.name}: units must be a String but is a Fixnum")
167
+ expect { @pi.units = 5.1}.to raise_error(ArgumentError, "#{@pi.name}: units must be a String but is a Float")
168
168
  end
169
169
  end
170
170
 
@@ -193,8 +193,8 @@ module Cosmos
193
193
  describe "check_default_and_range_data_types" do
194
194
  it "complains about default not matching data_type" do
195
195
  pi = PacketItem.new("test", 0, 8, :UINT, :BIG_ENDIAN, 16)
196
- pi.default = 1
197
- expect { pi.check_default_and_range_data_types }.to raise_error(ArgumentError, "TEST: default must be an Array but is a Fixnum")
196
+ pi.default = 1.1
197
+ expect { pi.check_default_and_range_data_types }.to raise_error(ArgumentError, "TEST: default must be an Array but is a Float")
198
198
  pi = PacketItem.new("test", 0, 8, :UINT, :BIG_ENDIAN, 16)
199
199
  pi.default = []
200
200
  expect { pi.check_default_and_range_data_types }.to_not raise_error
@@ -214,8 +214,8 @@ module Cosmos
214
214
  pi.default = 5.5
215
215
  expect { pi.check_default_and_range_data_types }.to_not raise_error
216
216
  pi = PacketItem.new("test", 0, 32, :STRING, :BIG_ENDIAN, nil)
217
- pi.default = 5
218
- expect { pi.check_default_and_range_data_types }.to raise_error(ArgumentError, "TEST: default must be a String but is a Fixnum")
217
+ pi.default = 5.1
218
+ expect { pi.check_default_and_range_data_types }.to raise_error(ArgumentError, "TEST: default must be a String but is a Float")
219
219
  pi = PacketItem.new("test", 0, 32, :STRING, :BIG_ENDIAN, nil)
220
220
  pi.default = ''
221
221
  expect { pi.check_default_and_range_data_types }.to_not raise_error
@@ -258,7 +258,7 @@ module Cosmos
258
258
  end
259
259
 
260
260
  it "complains about ranges that aren't Ranges" do
261
- expect { @pi.range = 5}.to raise_error(ArgumentError, "#{@pi.name}: range must be a Range but is a Fixnum")
261
+ expect { @pi.range = 5.1}.to raise_error(ArgumentError, "#{@pi.name}: range must be a Range but is a Float")
262
262
  end
263
263
  end
264
264