cosmos 3.5.1 → 3.5.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 (1158) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -1
  3. data/.gitattributes +3 -3
  4. data/.gitignore +48 -48
  5. data/.travis.yml +8 -8
  6. data/CONTRIBUTING.txt +50 -50
  7. data/Gemfile +10 -10
  8. data/Guardfile +27 -27
  9. data/LICENSE.txt +879 -879
  10. data/Manifest.txt +1414 -1414
  11. data/README.md +111 -111
  12. data/Rakefile +218 -214
  13. data/autohotkey/config/data/diamond.STL +57 -57
  14. data/autohotkey/config/system/system.txt +34 -34
  15. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  16. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  17. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  18. data/autohotkey/config/targets/COSMOS/target.txt +5 -5
  19. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  20. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +270 -270
  21. data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
  22. data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
  23. data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -305
  24. data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
  25. data/autohotkey/config/targets/INST/screens/array.txt +7 -7
  26. data/autohotkey/config/targets/INST/screens/block.txt +8 -8
  27. data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
  28. data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
  29. data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
  30. data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
  31. data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
  32. data/autohotkey/config/targets/INST/screens/image.txt +21 -21
  33. data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
  34. data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
  35. data/autohotkey/config/targets/INST/screens/other.txt +25 -25
  36. data/autohotkey/config/targets/INST/screens/params.txt +25 -25
  37. data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
  38. data/autohotkey/config/targets/INST/target.txt +26 -26
  39. data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  40. data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
  41. data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  42. data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
  43. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
  44. data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
  45. data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
  46. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  47. data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  48. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  49. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
  50. data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  51. data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  52. data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  53. data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  54. data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  55. data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  56. data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  57. data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  58. data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
  59. data/autohotkey/config/tools/launcher/launcher.txt +38 -38
  60. data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
  61. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
  62. data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
  63. data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
  64. data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
  65. data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
  66. data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
  67. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  68. data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  69. data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
  70. data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
  71. data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
  72. data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
  73. data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
  74. data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
  75. data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
  76. data/autohotkey/lib/example_background_task.rb +42 -42
  77. data/autohotkey/lib/user_version.rb +3 -3
  78. data/autohotkey/procedures/clear_util.rb +7 -7
  79. data/autohotkey/procedures/collect_util.rb +14 -14
  80. data/autohotkey/procedures/example_test.rb +67 -67
  81. data/autohotkey/procedures/example_test2.rb +74 -74
  82. data/autohotkey/procedures/script_test.rb +17 -17
  83. data/autohotkey/procedures/syntax_error.rb +18 -18
  84. data/autohotkey/tools/CmdExtractorAHK +16 -16
  85. data/autohotkey/tools/CmdSender +14 -14
  86. data/autohotkey/tools/CmdSenderAHK +18 -18
  87. data/autohotkey/tools/CmdTlmServer +14 -14
  88. data/autohotkey/tools/CmdTlmServerAHK +28 -28
  89. data/autohotkey/tools/CmdTlmServerAHK2 +17 -17
  90. data/autohotkey/tools/DataViewer +14 -14
  91. data/autohotkey/tools/DataViewerAHK +17 -17
  92. data/autohotkey/tools/HandbookCreatorAHK +20 -20
  93. data/autohotkey/tools/LauncherAHK +17 -17
  94. data/autohotkey/tools/LimitsMonitorAHK +20 -20
  95. data/autohotkey/tools/OpenGLBuilderAHK +24 -24
  96. data/autohotkey/tools/PacketViewer +14 -14
  97. data/autohotkey/tools/PacketViewerAHK +18 -18
  98. data/autohotkey/tools/PacketViewerAHK2 +17 -17
  99. data/autohotkey/tools/Replay +14 -14
  100. data/autohotkey/tools/ReplayAHK +17 -17
  101. data/autohotkey/tools/ScriptRunner +14 -14
  102. data/autohotkey/tools/ScriptRunnerAHK +20 -20
  103. data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
  104. data/autohotkey/tools/TableManager +14 -14
  105. data/autohotkey/tools/TableManagerAHK +30 -30
  106. data/autohotkey/tools/TestRunner +15 -15
  107. data/autohotkey/tools/TestRunnerAHK +17 -17
  108. data/autohotkey/tools/TestRunnerAHK2 +17 -17
  109. data/autohotkey/tools/TestRunnerAHK3 +17 -17
  110. data/autohotkey/tools/TestRunnerAHK4 +17 -17
  111. data/autohotkey/tools/TestRunnerAHK5 +17 -17
  112. data/autohotkey/tools/TestRunnerAHK6 +17 -17
  113. data/autohotkey/tools/TlmExtractor +15 -15
  114. data/autohotkey/tools/TlmExtractorAHK +19 -19
  115. data/autohotkey/tools/TlmExtractorAHK2 +16 -16
  116. data/autohotkey/tools/TlmExtractorAHK3 +16 -16
  117. data/autohotkey/tools/TlmGrapher +14 -14
  118. data/autohotkey/tools/TlmGrapherAHK +19 -19
  119. data/autohotkey/tools/TlmGrapherAHK2 +23 -23
  120. data/autohotkey/tools/TlmGrapherAHK3 +17 -17
  121. data/autohotkey/tools/TlmGrapherAHK4 +17 -17
  122. data/autohotkey/tools/TlmViewer +14 -14
  123. data/autohotkey/tools/TlmViewerAHK +28 -28
  124. data/autohotkey/tools/TlmViewerAHK2 +22 -22
  125. data/autohotkey/tools/TlmViewerAHK3 +23 -23
  126. data/autohotkey/tools/TlmViewerAHK4 +22 -22
  127. data/autohotkey/tools/TlmViewerAHK5 +18 -18
  128. data/autohotkey/tools/autohotkey.rb +37 -37
  129. data/autohotkey/tools/cmd_extractor.ahk +33 -33
  130. data/autohotkey/tools/cmd_sender.ahk +182 -182
  131. data/autohotkey/tools/cmd_tlm_server.ahk +90 -90
  132. data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
  133. data/autohotkey/tools/data_viewer.ahk +141 -141
  134. data/autohotkey/tools/handbook_creator.ahk +32 -32
  135. data/autohotkey/tools/launcher.ahk +41 -41
  136. data/autohotkey/tools/limits_monitor.ahk +123 -123
  137. data/autohotkey/tools/open_gl_builder.ahk +134 -134
  138. data/autohotkey/tools/packet_viewer.ahk +196 -196
  139. data/autohotkey/tools/packet_viewer2.ahk +9 -9
  140. data/autohotkey/tools/replay.ahk +104 -104
  141. data/autohotkey/tools/script_runner.ahk +589 -589
  142. data/autohotkey/tools/script_runner2.ahk +38 -38
  143. data/autohotkey/tools/table_manager.ahk +220 -220
  144. data/autohotkey/tools/test_runner.ahk +262 -262
  145. data/autohotkey/tools/test_runner2.ahk +53 -53
  146. data/autohotkey/tools/test_runner3.ahk +13 -13
  147. data/autohotkey/tools/test_runner5.ahk +8 -8
  148. data/autohotkey/tools/test_runner6.ahk +5 -5
  149. data/autohotkey/tools/tlm_extractor.ahk +296 -296
  150. data/autohotkey/tools/tlm_grapher.ahk +660 -660
  151. data/autohotkey/tools/tlm_grapher2.ahk +115 -115
  152. data/autohotkey/tools/tlm_grapher3.ahk +24 -24
  153. data/autohotkey/tools/tlm_viewer.ahk +133 -133
  154. data/autohotkey/tools/tlm_viewer2.ahk +50 -50
  155. data/autohotkey/tools/tlm_viewer4.ahk +4 -4
  156. data/autohotkey/tools/tlm_viewer5.ahk +20 -20
  157. data/bin/cosmos +96 -96
  158. data/bin/cstol_converter +1166 -1166
  159. data/bin/rubysloc +85 -85
  160. data/cosmos.gemspec +99 -99
  161. data/data/about.txt +4 -4
  162. data/data/crc.txt +326 -326
  163. data/data/diamond.STL +57 -57
  164. data/data/legal.txt +9 -9
  165. data/demo/Gemfile +10 -10
  166. data/demo/Launcher +16 -16
  167. data/demo/Launcher.bat +0 -0
  168. data/demo/Rakefile +77 -77
  169. data/demo/config/data/crc.txt +224 -226
  170. data/demo/config/data/diamond.STL +57 -57
  171. data/demo/config/data/meta_init.txt +4 -4
  172. data/demo/config/system/system.txt +35 -35
  173. data/demo/config/system/system2.txt +33 -33
  174. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  175. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  176. data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  177. data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
  178. data/demo/config/targets/COSMOS/screens/version.txt +19 -19
  179. data/demo/config/targets/COSMOS/target.txt +11 -11
  180. data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
  181. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +5 -5
  182. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
  183. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
  184. data/demo/config/targets/EXAMPLE/target.txt +6 -6
  185. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  186. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  187. data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
  188. data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
  189. data/demo/config/targets/INST/lib/sim_inst.rb +305 -305
  190. data/demo/config/targets/INST/screens/adcs.txt +46 -46
  191. data/demo/config/targets/INST/screens/array.txt +15 -15
  192. data/demo/config/targets/INST/screens/block.txt +8 -8
  193. data/demo/config/targets/INST/screens/commanding.txt +30 -30
  194. data/demo/config/targets/INST/screens/graphs.txt +14 -14
  195. data/demo/config/targets/INST/screens/ground.txt +25 -25
  196. data/demo/config/targets/INST/screens/hs.txt +44 -44
  197. data/demo/config/targets/INST/screens/latest.txt +23 -23
  198. data/demo/config/targets/INST/screens/other.txt +29 -29
  199. data/demo/config/targets/INST/screens/tabs.txt +70 -70
  200. data/demo/config/targets/INST/target.txt +33 -33
  201. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  202. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
  203. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  204. data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
  205. data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
  206. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -13
  207. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
  208. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
  209. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +56 -56
  210. data/demo/config/targets/TEMPLATED/target.txt +6 -6
  211. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +39 -39
  212. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +34 -34
  213. data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
  214. data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
  215. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +88 -88
  216. data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  217. data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  218. data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
  219. data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  220. data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  221. data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  222. data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  223. data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  224. data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  225. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +82 -82
  226. data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  227. data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
  228. data/demo/config/tools/launcher/launcher.txt +45 -45
  229. data/demo/config/tools/launcher/launcher2.txt +45 -45
  230. data/demo/config/tools/script_runner/script_runner.txt +3 -3
  231. data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
  232. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  233. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  234. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  235. data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  236. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  237. data/demo/config/tools/test_runner/test_runner.txt +17 -17
  238. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  239. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  240. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  241. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  242. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
  243. data/demo/lib/example_background_task.rb +57 -57
  244. data/demo/lib/example_target.rb +113 -113
  245. data/demo/lib/scpi_target.rb +74 -74
  246. data/demo/lib/user_version.rb +3 -3
  247. data/demo/procedures/checks.rb +11 -11
  248. data/demo/procedures/clear_util.rb +7 -7
  249. data/demo/procedures/collect.rb +18 -18
  250. data/demo/procedures/collect_util.rb +14 -14
  251. data/demo/procedures/cosmos_api_test.rb +293 -293
  252. data/demo/procedures/disconnect.rb +29 -29
  253. data/demo/procedures/example_test.rb +183 -183
  254. data/demo/procedures/plot_test.rb +8 -8
  255. data/demo/procedures/run_example_test.rb +3 -3
  256. data/demo/procedures/test.rb +51 -51
  257. data/demo/tools/CmdExtractor +16 -16
  258. data/demo/tools/CmdExtractor.bat +0 -0
  259. data/demo/tools/CmdSender +16 -16
  260. data/demo/tools/CmdSender.bat +0 -0
  261. data/demo/tools/CmdTlmServer +16 -16
  262. data/demo/tools/CmdTlmServer.bat +0 -0
  263. data/demo/tools/DataViewer +16 -16
  264. data/demo/tools/DataViewer.bat +0 -0
  265. data/demo/tools/ExampleTarget +16 -16
  266. data/demo/tools/ExampleTarget.bat +0 -0
  267. data/demo/tools/HandbookCreator +16 -16
  268. data/demo/tools/HandbookCreator.bat +0 -0
  269. data/demo/tools/Launcher +16 -16
  270. data/demo/tools/Launcher.bat +0 -0
  271. data/demo/tools/LimitsMonitor +16 -16
  272. data/demo/tools/LimitsMonitor.bat +0 -0
  273. data/demo/tools/OpenGLBuilder +16 -16
  274. data/demo/tools/OpenGLBuilder.bat +0 -0
  275. data/demo/tools/PacketViewer +16 -16
  276. data/demo/tools/PacketViewer.bat +0 -0
  277. data/demo/tools/Replay +16 -16
  278. data/demo/tools/Replay.bat +0 -0
  279. data/demo/tools/ScpiTarget +16 -16
  280. data/demo/tools/ScpiTarget.bat +0 -0
  281. data/demo/tools/ScriptRunner +16 -16
  282. data/demo/tools/ScriptRunner.bat +0 -0
  283. data/demo/tools/TableManager +16 -16
  284. data/demo/tools/TableManager.bat +0 -0
  285. data/demo/tools/TestRunner +16 -16
  286. data/demo/tools/TestRunner.bat +0 -0
  287. data/demo/tools/TlmExtractor +16 -16
  288. data/demo/tools/TlmExtractor.bat +0 -0
  289. data/demo/tools/TlmGrapher +16 -16
  290. data/demo/tools/TlmGrapher.bat +0 -0
  291. data/demo/tools/TlmViewer +16 -16
  292. data/demo/tools/TlmViewer.bat +0 -0
  293. data/demo/tools/ToolLaunch.bat +14 -5
  294. data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  295. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +16 -16
  296. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +10 -10
  297. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  298. data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  299. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +16 -16
  300. data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +10 -10
  301. data/demo/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -38
  302. data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  303. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +16 -16
  304. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +10 -10
  305. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -38
  306. data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  307. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +16 -16
  308. data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +10 -10
  309. data/demo/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  310. data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  311. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +16 -16
  312. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +10 -10
  313. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -38
  314. data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  315. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +16 -16
  316. data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +10 -10
  317. data/demo/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -38
  318. data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  319. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +16 -16
  320. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +10 -10
  321. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -38
  322. data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  323. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +16 -16
  324. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +10 -10
  325. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -38
  326. data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  327. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +16 -16
  328. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +10 -10
  329. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  330. data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
  331. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +16 -16
  332. data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +10 -10
  333. data/demo/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -38
  334. data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  335. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +16 -16
  336. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +10 -10
  337. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  338. data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  339. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +16 -16
  340. data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +10 -10
  341. data/demo/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -38
  342. data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  343. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +16 -16
  344. data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +10 -10
  345. data/demo/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  346. data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  347. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +16 -16
  348. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +10 -10
  349. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  350. data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  351. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +16 -16
  352. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +10 -10
  353. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -38
  354. data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  355. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +16 -16
  356. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +10 -10
  357. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  358. data/demo/tools/tool_launch.rb +38 -38
  359. data/ext/cosmos/ext/array/array.c +111 -111
  360. data/ext/cosmos/ext/array/extconf.rb +13 -13
  361. data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
  362. data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
  363. data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
  364. data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
  365. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
  366. data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
  367. data/ext/cosmos/ext/crc/crc.c +341 -341
  368. data/ext/cosmos/ext/crc/extconf.rb +12 -12
  369. data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
  370. data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
  371. data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
  372. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +265 -265
  373. data/ext/cosmos/ext/packet/extconf.rb +13 -13
  374. data/ext/cosmos/ext/packet/packet.c +339 -339
  375. data/ext/cosmos/ext/platform/extconf.rb +13 -13
  376. data/ext/cosmos/ext/platform/platform.c +101 -101
  377. data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
  378. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
  379. data/ext/cosmos/ext/string/extconf.rb +13 -13
  380. data/ext/cosmos/ext/string/string.c +49 -49
  381. data/ext/cosmos/ext/structure/structure.c +1428 -1428
  382. data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
  383. data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
  384. data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
  385. data/ext/cosmos/ext/telemetry/telemetry.c +307 -307
  386. data/ext/mkrf_conf.rb +40 -40
  387. data/install/Gemfile +10 -10
  388. data/install/Launcher +16 -16
  389. data/install/Launcher.bat +0 -0
  390. data/install/Rakefile +77 -77
  391. data/install/config/data/crc.txt +151 -151
  392. data/install/config/system/system.txt +29 -29
  393. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  394. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  395. data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  396. data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  397. data/install/config/targets/COSMOS/screens/version.txt +19 -19
  398. data/install/config/targets/COSMOS/target.txt +8 -8
  399. data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  400. data/install/config/tools/data_viewer/data_viewer.txt +3 -3
  401. data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
  402. data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  403. data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  404. data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  405. data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
  406. data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  407. data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  408. data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  409. data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  410. data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  411. data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  412. data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  413. data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  414. data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
  415. data/install/config/tools/launcher/launcher.txt +40 -40
  416. data/install/config/tools/script_runner/script_runner.txt +3 -3
  417. data/install/config/tools/test_runner/test_runner.txt +8 -8
  418. data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  419. data/install/lib/user_version.rb +3 -3
  420. data/install/tools/CmdExtractor +16 -16
  421. data/install/tools/CmdExtractor.bat +0 -0
  422. data/install/tools/CmdSender +16 -16
  423. data/install/tools/CmdSender.bat +0 -0
  424. data/install/tools/CmdTlmServer +16 -16
  425. data/install/tools/CmdTlmServer.bat +0 -0
  426. data/install/tools/DataViewer +16 -16
  427. data/install/tools/DataViewer.bat +0 -0
  428. data/install/tools/HandbookCreator +16 -16
  429. data/install/tools/HandbookCreator.bat +0 -0
  430. data/install/tools/Launcher +16 -16
  431. data/install/tools/Launcher.bat +0 -0
  432. data/install/tools/LimitsMonitor +16 -16
  433. data/install/tools/LimitsMonitor.bat +0 -0
  434. data/install/tools/OpenGLBuilder +16 -16
  435. data/install/tools/OpenGLBuilder.bat +0 -0
  436. data/install/tools/PacketViewer +16 -16
  437. data/install/tools/PacketViewer.bat +0 -0
  438. data/install/tools/Replay +16 -16
  439. data/install/tools/Replay.bat +0 -0
  440. data/install/tools/ScriptRunner +16 -16
  441. data/install/tools/ScriptRunner.bat +0 -0
  442. data/install/tools/TableManager +16 -16
  443. data/install/tools/TableManager.bat +0 -0
  444. data/install/tools/TestRunner +16 -16
  445. data/install/tools/TestRunner.bat +0 -0
  446. data/install/tools/TlmExtractor +16 -16
  447. data/install/tools/TlmExtractor.bat +0 -0
  448. data/install/tools/TlmGrapher +16 -16
  449. data/install/tools/TlmGrapher.bat +0 -0
  450. data/install/tools/TlmViewer +16 -16
  451. data/install/tools/TlmViewer.bat +0 -0
  452. data/install/tools/ToolLaunch.bat +14 -5
  453. data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  454. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +16 -16
  455. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +10 -10
  456. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  457. data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  458. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +16 -16
  459. data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +10 -10
  460. data/install/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -38
  461. data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  462. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +16 -16
  463. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +10 -10
  464. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -38
  465. data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  466. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +16 -16
  467. data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +10 -10
  468. data/install/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  469. data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  470. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +16 -16
  471. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +10 -10
  472. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -38
  473. data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  474. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +16 -16
  475. data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +10 -10
  476. data/install/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -38
  477. data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  478. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +16 -16
  479. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +10 -10
  480. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -38
  481. data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  482. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +16 -16
  483. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +10 -10
  484. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -38
  485. data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  486. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +16 -16
  487. data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +10 -10
  488. data/install/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  489. data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
  490. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +16 -16
  491. data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +10 -10
  492. data/install/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -38
  493. data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  494. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +16 -16
  495. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +10 -10
  496. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  497. data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  498. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +16 -16
  499. data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +10 -10
  500. data/install/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -38
  501. data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  502. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +16 -16
  503. data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +10 -10
  504. data/install/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  505. data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  506. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +16 -16
  507. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +10 -10
  508. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  509. data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  510. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +16 -16
  511. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +10 -10
  512. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -38
  513. data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  514. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +16 -16
  515. data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +10 -10
  516. data/install/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  517. data/install/tools/tool_launch.rb +38 -38
  518. data/lib/cosmos.rb +63 -63
  519. data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
  520. data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
  521. data/lib/cosmos/config/config_parser.rb +324 -324
  522. data/lib/cosmos/conversions.rb +13 -13
  523. data/lib/cosmos/conversions/conversion.rb +47 -47
  524. data/lib/cosmos/conversions/generic_conversion.rb +55 -55
  525. data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
  526. data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
  527. data/lib/cosmos/conversions/processor_conversion.rb +46 -46
  528. data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
  529. data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
  530. data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
  531. data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
  532. data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
  533. data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
  534. data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
  535. data/lib/cosmos/core_ext.rb +18 -18
  536. data/lib/cosmos/core_ext/array.rb +354 -354
  537. data/lib/cosmos/core_ext/class.rb +51 -51
  538. data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
  539. data/lib/cosmos/core_ext/exception.rb +52 -52
  540. data/lib/cosmos/core_ext/file.rb +75 -75
  541. data/lib/cosmos/core_ext/hash.rb +28 -28
  542. data/lib/cosmos/core_ext/io.rb +75 -75
  543. data/lib/cosmos/core_ext/kernel.rb +38 -38
  544. data/lib/cosmos/core_ext/math.rb +119 -119
  545. data/lib/cosmos/core_ext/matrix.rb +146 -146
  546. data/lib/cosmos/core_ext/objectspace.rb +29 -29
  547. data/lib/cosmos/core_ext/range.rb +22 -22
  548. data/lib/cosmos/core_ext/socket.rb +32 -32
  549. data/lib/cosmos/core_ext/string.rb +311 -311
  550. data/lib/cosmos/core_ext/stringio.rb +24 -24
  551. data/lib/cosmos/core_ext/time.rb +448 -448
  552. data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
  553. data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
  554. data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
  555. data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
  556. data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
  557. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +326 -326
  558. data/lib/cosmos/gui/dialogs/about_dialog.rb +137 -137
  559. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
  560. data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
  561. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
  562. data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
  563. data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
  564. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
  565. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +260 -260
  566. data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -169
  567. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
  568. data/lib/cosmos/gui/dialogs/progress_dialog.rb +276 -276
  569. data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -165
  570. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
  571. data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
  572. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
  573. data/lib/cosmos/gui/dialogs/splash.rb +135 -135
  574. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
  575. data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
  576. data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
  577. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
  578. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +473 -473
  579. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
  580. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +451 -451
  581. data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
  582. data/lib/cosmos/gui/line_graph/lines.rb +290 -290
  583. data/lib/cosmos/gui/line_graph/overview_graph.rb +469 -469
  584. data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
  585. data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
  586. data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
  587. data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
  588. data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
  589. data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
  590. data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -724
  591. data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
  592. data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
  593. data/lib/cosmos/gui/opengl/opengl.rb +8 -8
  594. data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
  595. data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
  596. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
  597. data/lib/cosmos/gui/qt.rb +860 -860
  598. data/lib/cosmos/gui/qt_tool.rb +380 -380
  599. data/lib/cosmos/gui/text/completion.rb +381 -381
  600. data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
  601. data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
  602. data/lib/cosmos/gui/text/ruby_editor.rb +415 -415
  603. data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
  604. data/lib/cosmos/gui/utilities/script_module_gui.rb +330 -330
  605. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
  606. data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
  607. data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
  608. data/lib/cosmos/interfaces.rb +11 -11
  609. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -153
  610. data/lib/cosmos/interfaces/interface.rb +225 -225
  611. data/lib/cosmos/interfaces/linc_interface.rb +360 -360
  612. data/lib/cosmos/interfaces/serial_interface.rb +76 -76
  613. data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -129
  614. data/lib/cosmos/interfaces/stream_interface.rb +136 -136
  615. data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
  616. data/lib/cosmos/interfaces/tcpip_server_interface.rb +164 -164
  617. data/lib/cosmos/interfaces/udp_interface.rb +161 -161
  618. data/lib/cosmos/io/buffered_file.rb +11 -11
  619. data/lib/cosmos/io/cosmos_snmp.rb +50 -50
  620. data/lib/cosmos/io/io_multiplexer.rb +89 -89
  621. data/lib/cosmos/io/json_drb.rb +376 -376
  622. data/lib/cosmos/io/json_drb_object.rb +198 -198
  623. data/lib/cosmos/io/json_rpc.rb +365 -365
  624. data/lib/cosmos/io/posix_serial_driver.rb +145 -145
  625. data/lib/cosmos/io/raw_logger.rb +174 -174
  626. data/lib/cosmos/io/raw_logger_pair.rb +71 -71
  627. data/lib/cosmos/io/serial_driver.rb +85 -85
  628. data/lib/cosmos/io/stderr.rb +36 -36
  629. data/lib/cosmos/io/stdout.rb +36 -36
  630. data/lib/cosmos/io/tcpip_server.rb +571 -571
  631. data/lib/cosmos/io/udp_sockets.rb +152 -152
  632. data/lib/cosmos/io/win32_serial_driver.rb +145 -145
  633. data/lib/cosmos/packet_logs.rb +7 -7
  634. data/lib/cosmos/packet_logs/ccsds_log_reader.rb +104 -104
  635. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
  636. data/lib/cosmos/packet_logs/packet_log_reader.rb +450 -450
  637. data/lib/cosmos/packet_logs/packet_log_writer.rb +323 -323
  638. data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
  639. data/lib/cosmos/packets/binary_accessor.rb +634 -634
  640. data/lib/cosmos/packets/commands.rb +293 -293
  641. data/lib/cosmos/packets/limits.rb +267 -267
  642. data/lib/cosmos/packets/limits_response.rb +38 -38
  643. data/lib/cosmos/packets/packet.rb +786 -786
  644. data/lib/cosmos/packets/packet_config.rb +482 -482
  645. data/lib/cosmos/packets/packet_item.rb +317 -317
  646. data/lib/cosmos/packets/packet_item_limits.rb +128 -128
  647. data/lib/cosmos/packets/parsers/format_string_parser.rb +58 -58
  648. data/lib/cosmos/packets/parsers/limits_parser.rb +146 -146
  649. data/lib/cosmos/packets/parsers/limits_response_parser.rb +52 -52
  650. data/lib/cosmos/packets/parsers/macro_parser.rb +116 -116
  651. data/lib/cosmos/packets/parsers/packet_item_parser.rb +215 -215
  652. data/lib/cosmos/packets/parsers/packet_parser.rb +123 -123
  653. data/lib/cosmos/packets/parsers/processor_parser.rb +63 -63
  654. data/lib/cosmos/packets/parsers/state_parser.rb +116 -116
  655. data/lib/cosmos/packets/structure.rb +458 -458
  656. data/lib/cosmos/packets/structure_item.rb +233 -233
  657. data/lib/cosmos/packets/telemetry.rb +350 -350
  658. data/lib/cosmos/processors.rb +6 -6
  659. data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
  660. data/lib/cosmos/processors/processor.rb +71 -71
  661. data/lib/cosmos/processors/statistics_processor.rb +65 -65
  662. data/lib/cosmos/processors/watermark_processor.rb +44 -44
  663. data/lib/cosmos/script.rb +9 -9
  664. data/lib/cosmos/script/cmd_tlm_server.rb +110 -110
  665. data/lib/cosmos/script/commands.rb +184 -184
  666. data/lib/cosmos/script/extract.rb +123 -123
  667. data/lib/cosmos/script/limits.rb +114 -114
  668. data/lib/cosmos/script/script.rb +76 -76
  669. data/lib/cosmos/script/scripting.rb +897 -897
  670. data/lib/cosmos/script/telemetry.rb +174 -174
  671. data/lib/cosmos/script/tools.rb +138 -138
  672. data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
  673. data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
  674. data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
  675. data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
  676. data/lib/cosmos/streams/serial_stream.rb +157 -157
  677. data/lib/cosmos/streams/stream.rb +63 -63
  678. data/lib/cosmos/streams/stream_protocol.rb +373 -373
  679. data/lib/cosmos/streams/tcpip_client_stream.rb +113 -113
  680. data/lib/cosmos/streams/tcpip_socket_stream.rb +143 -143
  681. data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
  682. data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
  683. data/lib/cosmos/system.rb +4 -4
  684. data/lib/cosmos/system/system.rb +618 -618
  685. data/lib/cosmos/system/target.rb +197 -197
  686. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +255 -255
  687. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +717 -717
  688. data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
  689. data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
  690. data/lib/cosmos/tools/cmd_tlm_server/api.rb +1034 -1034
  691. data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
  692. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -67
  693. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +515 -515
  694. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +253 -253
  695. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +408 -408
  696. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
  697. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +175 -175
  698. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +200 -200
  699. data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +176 -176
  700. data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +150 -150
  701. data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +244 -244
  702. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +90 -90
  703. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +266 -266
  704. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
  705. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
  706. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
  707. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
  708. data/lib/cosmos/tools/data_viewer/data_viewer.rb +621 -621
  709. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +134 -134
  710. data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
  711. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +156 -156
  712. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +382 -382
  713. data/lib/cosmos/tools/launcher/launcher.rb +188 -188
  714. data/lib/cosmos/tools/launcher/launcher_config.rb +256 -256
  715. data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -40
  716. data/lib/cosmos/tools/launcher/launcher_tool.rb +116 -116
  717. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +837 -837
  718. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
  719. data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
  720. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +542 -542
  721. data/lib/cosmos/tools/replay/replay.rb +501 -501
  722. data/lib/cosmos/tools/replay/replay_server.rb +91 -91
  723. data/lib/cosmos/tools/script_runner/script_audit.rb +147 -147
  724. data/lib/cosmos/tools/script_runner/script_runner.rb +922 -922
  725. data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
  726. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1798 -1798
  727. data/lib/cosmos/tools/table_manager/table.rb +70 -70
  728. data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
  729. data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
  730. data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
  731. data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
  732. data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
  733. data/lib/cosmos/tools/test_runner/test.rb +539 -539
  734. data/lib/cosmos/tools/test_runner/test_runner.rb +1189 -1189
  735. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +341 -341
  736. data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
  737. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1016 -1016
  738. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
  739. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
  740. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
  741. data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
  742. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +95 -95
  743. data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
  744. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +181 -181
  745. data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
  746. data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
  747. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +174 -174
  748. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +193 -193
  749. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +407 -407
  750. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
  751. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
  752. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -323
  753. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
  754. data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
  755. data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
  756. data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
  757. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
  758. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
  759. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
  760. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
  761. data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
  762. data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
  763. data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
  764. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1291 -1291
  765. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
  766. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
  767. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +114 -114
  768. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
  769. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +78 -78
  770. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
  771. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
  772. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
  773. data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -486
  774. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +561 -561
  775. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +290 -290
  776. data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
  777. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
  778. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +66 -66
  779. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +57 -57
  780. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
  781. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
  782. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
  783. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
  784. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
  785. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
  786. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
  787. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
  788. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
  789. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
  790. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
  791. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
  792. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
  793. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
  794. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
  795. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
  796. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
  797. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
  798. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
  799. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
  800. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
  801. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
  802. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
  803. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
  804. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
  805. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
  806. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
  807. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
  808. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
  809. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
  810. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
  811. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
  812. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
  813. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
  814. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
  815. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
  816. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
  817. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
  818. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
  819. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
  820. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
  821. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
  822. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
  823. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
  824. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
  825. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
  826. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
  827. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
  828. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
  829. data/lib/cosmos/top_level.rb +759 -759
  830. data/lib/cosmos/utilities.rb +11 -11
  831. data/lib/cosmos/utilities/crc.rb +166 -166
  832. data/lib/cosmos/utilities/csv.rb +83 -83
  833. data/lib/cosmos/utilities/logger.rb +137 -137
  834. data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
  835. data/lib/cosmos/utilities/message_log.rb +79 -79
  836. data/lib/cosmos/utilities/quaternion.rb +258 -258
  837. data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
  838. data/lib/cosmos/utilities/simulated_target.rb +99 -99
  839. data/lib/cosmos/utilities/sleeper.rb +44 -44
  840. data/lib/cosmos/version.rb +12 -12
  841. data/lib/cosmos/win32/excel.rb +66 -66
  842. data/lib/cosmos/win32/win32.rb +387 -387
  843. data/lib/cosmos/win32/win32_main.rb +321 -321
  844. data/roodi.yml +24 -24
  845. data/run_gui_tests.bat +0 -0
  846. data/spec/ccsds/ccsds_packet_spec.rb +67 -67
  847. data/spec/ccsds/ccsds_parser_spec.rb +148 -148
  848. data/spec/config/config_parser_spec.rb +322 -322
  849. data/spec/conversions/conversion_spec.rb +31 -31
  850. data/spec/conversions/generic_conversion_spec.rb +45 -45
  851. data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
  852. data/spec/conversions/polynomial_conversion_spec.rb +40 -40
  853. data/spec/conversions/processor_conversion_spec.rb +45 -45
  854. data/spec/conversions/received_count_conversion_spec.rb +43 -43
  855. data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
  856. data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
  857. data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
  858. data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
  859. data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
  860. data/spec/core_ext/array_spec.rb +186 -186
  861. data/spec/core_ext/class_spec.rb +36 -36
  862. data/spec/core_ext/cosmos_io_spec.rb +77 -77
  863. data/spec/core_ext/exception_spec.rb +91 -91
  864. data/spec/core_ext/file_spec.rb +72 -72
  865. data/spec/core_ext/hash_spec.rb +24 -24
  866. data/spec/core_ext/io_spec.rb +46 -46
  867. data/spec/core_ext/kernel_spec.rb +54 -54
  868. data/spec/core_ext/math_spec.rb +116 -116
  869. data/spec/core_ext/matrix_spec.rb +66 -66
  870. data/spec/core_ext/objectspace_spec.rb +29 -29
  871. data/spec/core_ext/range_spec.rb +21 -21
  872. data/spec/core_ext/socket_spec.rb +32 -32
  873. data/spec/core_ext/string_spec.rb +223 -223
  874. data/spec/core_ext/stringio_spec.rb +21 -21
  875. data/spec/core_ext/time_spec.rb +202 -202
  876. data/spec/gui/line_graph/line_clip_spec.rb +322 -322
  877. data/spec/gui/qt_spec.rb +102 -102
  878. data/spec/install/config/system/system.txt +33 -33
  879. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  880. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  881. data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  882. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  883. data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
  884. data/spec/install/config/targets/COSMOS/target.txt +5 -5
  885. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
  886. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
  887. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
  888. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
  889. data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
  890. data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -305
  891. data/spec/install/config/targets/INST/target.txt +10 -10
  892. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
  893. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
  894. data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  895. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
  896. data/spec/interfaces/interface_spec.rb +130 -130
  897. data/spec/interfaces/linc_interface_spec.rb +259 -259
  898. data/spec/interfaces/serial_interface_spec.rb +56 -56
  899. data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
  900. data/spec/interfaces/stream_interface_spec.rb +157 -157
  901. data/spec/interfaces/tcpip_client_interface_spec.rb +55 -55
  902. data/spec/interfaces/tcpip_server_interface_spec.rb +160 -160
  903. data/spec/interfaces/udp_interface_spec.rb +175 -175
  904. data/spec/io/buffered_file_spec.rb +113 -113
  905. data/spec/io/io_multiplexer_spec.rb +94 -94
  906. data/spec/io/json_drb_object_spec.rb +119 -119
  907. data/spec/io/json_drb_spec.rb +311 -311
  908. data/spec/io/json_rpc_spec.rb +264 -264
  909. data/spec/io/raw_logger_pair_spec.rb +76 -76
  910. data/spec/io/raw_logger_spec.rb +133 -133
  911. data/spec/io/serial_driver_spec.rb +60 -60
  912. data/spec/io/stderr_spec.rb +32 -32
  913. data/spec/io/stdout_spec.rb +32 -32
  914. data/spec/io/tcpip_server_spec.rb +338 -338
  915. data/spec/io/udp_sockets_spec.rb +94 -94
  916. data/spec/io/win32_serial_driver_spec.rb +88 -88
  917. data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
  918. data/spec/packet_logs/packet_log_reader_spec.rb +468 -468
  919. data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
  920. data/spec/packet_logs/packet_log_writer_spec.rb +225 -225
  921. data/spec/packets/binary_accessor_spec.rb +2326 -2326
  922. data/spec/packets/commands_spec.rb +369 -369
  923. data/spec/packets/limits_response_spec.rb +25 -25
  924. data/spec/packets/limits_spec.rb +344 -344
  925. data/spec/packets/packet_config_spec.rb +805 -805
  926. data/spec/packets/packet_item_limits_spec.rb +161 -161
  927. data/spec/packets/packet_item_spec.rb +386 -386
  928. data/spec/packets/packet_spec.rb +1317 -1317
  929. data/spec/packets/parsers/format_string_parser_spec.rb +122 -122
  930. data/spec/packets/parsers/limits_parser_spec.rb +282 -282
  931. data/spec/packets/parsers/limits_response_parser_spec.rb +149 -149
  932. data/spec/packets/parsers/macro_parser_spec.rb +212 -212
  933. data/spec/packets/parsers/packet_item_parser_spec.rb +306 -306
  934. data/spec/packets/parsers/packet_parser_spec.rb +99 -99
  935. data/spec/packets/parsers/processor_parser_spec.rb +114 -114
  936. data/spec/packets/parsers/state_parser_spec.rb +156 -156
  937. data/spec/packets/structure_item_spec.rb +195 -195
  938. data/spec/packets/structure_spec.rb +565 -565
  939. data/spec/packets/telemetry_spec.rb +578 -578
  940. data/spec/processors/new_packet_log_processor_spec.rb +39 -39
  941. data/spec/processors/processor_spec.rb +55 -55
  942. data/spec/processors/statistics_processor_spec.rb +60 -60
  943. data/spec/processors/watermark_processor_spec.rb +51 -51
  944. data/spec/script/cmd_tlm_server_spec.rb +110 -110
  945. data/spec/script/commands_disconnect_spec.rb +270 -270
  946. data/spec/script/commands_spec.rb +302 -302
  947. data/spec/script/limits_spec.rb +153 -153
  948. data/spec/script/script_spec.rb +86 -86
  949. data/spec/script/scripting_spec.rb +440 -440
  950. data/spec/script/telemetry_spec.rb +165 -165
  951. data/spec/script/tools_spec.rb +117 -117
  952. data/spec/spec_helper.rb +190 -190
  953. data/spec/streams/burst_stream_protocol_spec.rb +32 -32
  954. data/spec/streams/fixed_stream_protocol_spec.rb +113 -113
  955. data/spec/streams/length_stream_protocol_spec.rb +300 -300
  956. data/spec/streams/preidentified_stream_protocol_spec.rb +121 -121
  957. data/spec/streams/serial_stream_spec.rb +117 -117
  958. data/spec/streams/stream_protocol_spec.rb +346 -346
  959. data/spec/streams/stream_spec.rb +30 -30
  960. data/spec/streams/tcpip_client_stream_spec.rb +57 -57
  961. data/spec/streams/tcpip_socket_stream_spec.rb +193 -193
  962. data/spec/streams/template_stream_protocol_spec.rb +156 -156
  963. data/spec/streams/terminated_stream_protocol_spec.rb +127 -127
  964. data/spec/system/system_spec.rb +665 -665
  965. data/spec/system/target_spec.rb +250 -250
  966. data/spec/tools/cmd_tlm_server/api_spec.rb +1117 -1117
  967. data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
  968. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
  969. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +453 -453
  970. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
  971. data/spec/tools/cmd_tlm_server/commanding_spec.rb +151 -151
  972. data/spec/tools/cmd_tlm_server/connections_spec.rb +235 -235
  973. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
  974. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -252
  975. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
  976. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +151 -151
  977. data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -223
  978. data/spec/tools/launcher/launcher_config_spec.rb +464 -464
  979. data/spec/top_level/top_level_spec.rb +334 -334
  980. data/spec/utilities/crc_spec.rb +45 -45
  981. data/spec/utilities/csv_spec.rb +97 -97
  982. data/spec/utilities/logger_spec.rb +102 -102
  983. data/spec/utilities/message_log_spec.rb +89 -89
  984. data/spec/utilities/quaternion_spec.rb +107 -107
  985. data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
  986. data/tasks/manifest.rake +22 -22
  987. data/tasks/spec.rake +23 -23
  988. data/test/benchmarks/binary_accessor_benchmark.rb +14 -14
  989. data/test/benchmarks/gsub_benchmark.rb +152 -152
  990. data/test/benchmarks/is_a_benchmark.rb +34 -34
  991. data/test/performance/PACKETS.bat +0 -0
  992. data/test/performance/Rakefile +77 -77
  993. data/test/performance/THREADS.bat +0 -0
  994. data/test/performance/config/data/crc.txt +196 -196
  995. data/test/performance/config/data/diamond.STL +57 -57
  996. data/test/performance/config/data/meta_init.txt +4 -4
  997. data/test/performance/config/system/system_packets.txt +39 -39
  998. data/test/performance/config/system/system_threads.txt +59 -59
  999. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +46 -46
  1000. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  1001. data/test/performance/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  1002. data/test/performance/config/targets/COSMOS/screens/limits_change.txt +20 -20
  1003. data/test/performance/config/targets/COSMOS/screens/version.txt +19 -19
  1004. data/test/performance/config/targets/COSMOS/target.txt +11 -11
  1005. data/test/performance/config/targets/PACKET/cmd_tlm/packet_cmds.txt +20 -20
  1006. data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +98 -98
  1007. data/test/performance/config/targets/PACKET/cmd_tlm_server.txt +6 -6
  1008. data/test/performance/config/targets/PACKET/lib/packet_interface.rb +22 -22
  1009. data/test/performance/config/targets/PACKET/lib/packet_limits_response.rb +24 -24
  1010. data/test/performance/config/targets/PACKET/screens/status.txt +25 -25
  1011. data/test/performance/config/targets/PACKET/target.txt +28 -28
  1012. data/test/performance/config/targets/SYSTEM/screens/status.txt +12 -12
  1013. data/test/performance/config/targets/THREAD/cmd_tlm/thread_cmds.txt +17 -17
  1014. data/test/performance/config/targets/THREAD/cmd_tlm/thread_tlm.txt +18 -18
  1015. data/test/performance/config/targets/THREAD/cmd_tlm_server.txt +6 -6
  1016. data/test/performance/config/targets/THREAD/lib/thread_interface.rb +22 -22
  1017. data/test/performance/config/targets/THREAD/screens/status.txt +25 -25
  1018. data/test/performance/config/targets/THREAD/target.txt +6 -6
  1019. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_packets.txt +28 -28
  1020. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_threads.txt +68 -68
  1021. data/test/performance/config/tools/data_viewer/data_viewer.txt +11 -11
  1022. data/test/performance/config/tools/handbook_creator/handbook_creator.txt +66 -66
  1023. data/test/performance/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  1024. data/test/performance/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  1025. data/test/performance/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  1026. data/test/performance/config/tools/handbook_creator/templates/header.html.erb +25 -25
  1027. data/test/performance/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  1028. data/test/performance/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  1029. data/test/performance/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  1030. data/test/performance/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  1031. data/test/performance/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  1032. data/test/performance/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  1033. data/test/performance/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  1034. data/test/performance/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  1035. data/test/performance/config/tools/handbook_creator/templates/title.html.erb +1 -1
  1036. data/test/performance/config/tools/launcher/launcher_packets.txt +34 -34
  1037. data/test/performance/config/tools/launcher/launcher_threads.txt +83 -83
  1038. data/test/performance/config/tools/script_runner/script_runner.txt +3 -3
  1039. data/test/performance/config/tools/table_manager/ConfigTables_def.txt +8 -8
  1040. data/test/performance/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  1041. data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  1042. data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  1043. data/test/performance/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  1044. data/test/performance/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  1045. data/test/performance/config/tools/test_runner/test_runner.txt +17 -17
  1046. data/test/performance/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  1047. data/test/performance/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  1048. data/test/performance/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  1049. data/test/performance/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  1050. data/test/performance/config/tools/tlm_grapher/tlm_grapher.txt +204 -204
  1051. data/test/performance/config/tools/tlm_viewer/tlm_viewer.txt +13 -13
  1052. data/test/performance/lib/packet_target.rb +126 -126
  1053. data/test/performance/lib/thread_target.rb +120 -120
  1054. data/test/performance/lib/user_version.rb +3 -3
  1055. data/test/performance/procedures/checks.rb +11 -11
  1056. data/test/performance/procedures/clear_util.rb +7 -7
  1057. data/test/performance/procedures/collect.rb +18 -18
  1058. data/test/performance/procedures/collect_util.rb +14 -14
  1059. data/test/performance/procedures/cosmos_api_test.rb +293 -293
  1060. data/test/performance/procedures/disconnect.rb +29 -29
  1061. data/test/performance/procedures/example_test.rb +182 -182
  1062. data/test/performance/procedures/plot_test.rb +8 -8
  1063. data/test/performance/procedures/procedure.rb +2 -2
  1064. data/test/performance/procedures/run_example_test.rb +3 -3
  1065. data/test/performance/procedures/test.rb +51 -51
  1066. data/test/performance/tools/CmdExtractor +14 -14
  1067. data/test/performance/tools/CmdExtractor.bat +0 -0
  1068. data/test/performance/tools/CmdSender +14 -14
  1069. data/test/performance/tools/CmdSender.bat +0 -0
  1070. data/test/performance/tools/CmdTlmServer +16 -16
  1071. data/test/performance/tools/CmdTlmServer.bat +0 -0
  1072. data/test/performance/tools/CmdTlmServerMemProf +20 -20
  1073. data/test/performance/tools/CmdTlmServerMemProf.bat +0 -0
  1074. data/test/performance/tools/DataViewer +14 -14
  1075. data/test/performance/tools/DataViewer.bat +0 -0
  1076. data/test/performance/tools/HandbookCreator +14 -14
  1077. data/test/performance/tools/HandbookCreator.bat +0 -0
  1078. data/test/performance/tools/Launcher +14 -14
  1079. data/test/performance/tools/Launcher.bat +0 -0
  1080. data/test/performance/tools/LimitsMonitor +14 -14
  1081. data/test/performance/tools/LimitsMonitor.bat +0 -0
  1082. data/test/performance/tools/OpenGLBuilder +14 -14
  1083. data/test/performance/tools/OpenGLBuilder.bat +0 -0
  1084. data/test/performance/tools/PacketTarget +14 -14
  1085. data/test/performance/tools/PacketTarget.bat +0 -0
  1086. data/test/performance/tools/PacketViewer +14 -14
  1087. data/test/performance/tools/PacketViewer.bat +0 -0
  1088. data/test/performance/tools/Replay +14 -14
  1089. data/test/performance/tools/Replay.bat +0 -0
  1090. data/test/performance/tools/ScpiTarget +14 -14
  1091. data/test/performance/tools/ScpiTarget.bat +0 -0
  1092. data/test/performance/tools/ScriptRunner +14 -14
  1093. data/test/performance/tools/ScriptRunner.bat +0 -0
  1094. data/test/performance/tools/TableManager +14 -14
  1095. data/test/performance/tools/TableManager.bat +0 -0
  1096. data/test/performance/tools/TestRunner +14 -14
  1097. data/test/performance/tools/TestRunner.bat +0 -0
  1098. data/test/performance/tools/ThreadTarget +14 -14
  1099. data/test/performance/tools/ThreadTarget.bat +0 -0
  1100. data/test/performance/tools/TlmExtractor +14 -14
  1101. data/test/performance/tools/TlmExtractor.bat +0 -0
  1102. data/test/performance/tools/TlmGrapher +14 -14
  1103. data/test/performance/tools/TlmGrapher.bat +0 -0
  1104. data/test/performance/tools/TlmGrapherMemProf +19 -19
  1105. data/test/performance/tools/TlmGrapherMemProf.bat +0 -0
  1106. data/test/performance/tools/TlmViewer +14 -14
  1107. data/test/performance/tools/TlmViewer.bat +0 -0
  1108. data/test/performance/tools/TlmViewerMemProf +19 -19
  1109. data/test/performance/tools/TlmViewerMemProf.bat +0 -0
  1110. data/test/performance/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  1111. data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  1112. data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  1113. data/test/performance/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  1114. data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  1115. data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  1116. data/test/performance/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  1117. data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  1118. data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  1119. data/test/performance/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  1120. data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  1121. data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  1122. data/test/performance/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  1123. data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  1124. data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  1125. data/test/performance/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  1126. data/test/performance/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  1127. data/test/performance/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  1128. data/test/performance/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  1129. data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  1130. data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  1131. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  1132. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  1133. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  1134. data/test/performance/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  1135. data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  1136. data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  1137. data/test/performance/tools/mac/Replay.app/Contents/Info.plist +38 -38
  1138. data/test/performance/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  1139. data/test/performance/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  1140. data/test/performance/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  1141. data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  1142. data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  1143. data/test/performance/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  1144. data/test/performance/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  1145. data/test/performance/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  1146. data/test/performance/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  1147. data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  1148. data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  1149. data/test/performance/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  1150. data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  1151. data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  1152. data/test/performance/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  1153. data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  1154. data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  1155. data/test/performance/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  1156. data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  1157. data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  1158. metadata +3 -3
@@ -1,2326 +1,2326 @@
1
- # encoding: ascii-8bit
2
-
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
4
- # All Rights Reserved.
5
- #
6
- # This program is free software; you can modify and/or redistribute it
7
- # under the terms of the GNU General Public License
8
- # as published by the Free Software Foundation; version 3 with
9
- # attribution addendums as found in the LICENSE.txt
10
-
11
- require 'spec_helper'
12
- require 'cosmos'
13
- require 'cosmos/packets/binary_accessor'
14
-
15
- module Cosmos
16
-
17
- describe BinaryAccessor do
18
-
19
- describe "read only" do
20
-
21
- before(:each) do
22
- @data = "\x80\x81\x82\x83\x84\x85\x86\x87\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F"
23
- end
24
-
25
- it "complains about unrecognized data types" do
26
- expect { BinaryAccessor.read(0, 32, :BLOB, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "data_type BLOB is not recognized")
27
- end
28
-
29
- it "complains about bit_offsets before the beginning of the buffer" do
30
- expect { BinaryAccessor.read(-((@data.length * 8) + 8), 32, :STRING, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "#{@data.length} byte buffer insufficient to read STRING at bit_offset #{-((@data.length * 8) + 8)} with bit_size 32")
31
- end
32
-
33
- it "complains about a negative bit_offset and zero bit_size" do
34
- expect { BinaryAccessor.read(-8, 0, :STRING, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "negative or zero bit_sizes (0) cannot be given with negative bit_offsets (-8)")
35
- end
36
-
37
- it "complains about a negative bit_offset and negative bit_size" do
38
- expect { BinaryAccessor.read(-8, -8, :STRING, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "negative or zero bit_sizes (-8) cannot be given with negative bit_offsets (-8)")
39
- end
40
-
41
- it "complains about negative bit_sizes larger than the size of the buffer" do
42
- expect { BinaryAccessor.read(0, -((@data.length * 8) + 8), :STRING, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "#{@data.length} byte buffer insufficient to read STRING at bit_offset 0 with bit_size #{-((@data.length * 8) + 8)}")
43
- end
44
-
45
- it "complains about negative or zero bit_sizes with data_types other than STRING and BLOCK" do
46
- expect { BinaryAccessor.read(0, -8, :INT, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "bit_size -8 must be positive for data types other than :STRING and :BLOCK")
47
- expect { BinaryAccessor.read(0, -8, :UINT, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "bit_size -8 must be positive for data types other than :STRING and :BLOCK")
48
- expect { BinaryAccessor.read(0, -8, :FLOAT, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "bit_size -8 must be positive for data types other than :STRING and :BLOCK")
49
- end
50
-
51
- it "reads aligned strings" do
52
- 0.step((@data.length - 1) * 8, 8) do |bit_offset|
53
- if (bit_offset / 8) <= 7
54
- expect(BinaryAccessor.read(bit_offset, (@data.length * 8) - bit_offset, :STRING, @data, :BIG_ENDIAN)).to eql(@data[(bit_offset / 8)..7])
55
- elsif (bit_offset / 8) == 8
56
- expect(BinaryAccessor.read(bit_offset, (@data.length * 8) - bit_offset, :STRING, @data, :BIG_ENDIAN)).to eql('')
57
- else
58
- expect(BinaryAccessor.read(bit_offset, (@data.length * 8) - bit_offset, :STRING, @data, :BIG_ENDIAN)).to eql(@data[(bit_offset / 8)..-1])
59
- end
60
- end
61
- end
62
-
63
- it "reads variable length strings with a zero and negative bit_size" do
64
- 0.step(-(@data.length * 8), -8) do |bit_size|
65
- if (bit_size / 8) >= -8
66
- expect(BinaryAccessor.read(0, bit_size, :STRING, @data, :BIG_ENDIAN)).to eql(@data[0..7])
67
- else
68
- expect(BinaryAccessor.read(0, bit_size, :STRING, @data, :BIG_ENDIAN)).to eql(@data[0..((bit_size / 8) - 1)])
69
- end
70
- end
71
- end
72
-
73
- it "reads strings with negative bit_offsets" do
74
- expect(BinaryAccessor.read(-16, 16, :STRING, @data, :BIG_ENDIAN)).to eql(@data[-2..-1])
75
- end
76
-
77
- it "complains about unaligned strings" do
78
- expect { BinaryAccessor.read(1, 32, :STRING, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "bit_offset 1 is not byte aligned for data_type STRING")
79
- end
80
-
81
- it "reads aligned blocks" do
82
- 0.step((@data.length - 1) * 8, 8) do |bit_offset|
83
- expect(BinaryAccessor.read(bit_offset, (@data.length * 8) - bit_offset, :BLOCK, @data, :BIG_ENDIAN)).to eql(@data[(bit_offset / 8)..-1])
84
- end
85
- end
86
-
87
- it "reads variable length blocks with a zero and negative bit_size" do
88
- 0.step(-(@data.length * 8), -8) do |bit_size|
89
- expect(BinaryAccessor.read(0, bit_size, :BLOCK, @data, :BIG_ENDIAN)).to eql(@data[0..((bit_size / 8) - 1)])
90
- end
91
- end
92
-
93
- it "reads blocks with negative bit_offsets" do
94
- expect(BinaryAccessor.read(-16, 16, :BLOCK, @data, :BIG_ENDIAN)).to eql(@data[-2..-1])
95
- end
96
-
97
- it "complains about unaligned blocks" do
98
- expect { BinaryAccessor.read(7, 16, :BLOCK, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "bit_offset 7 is not byte aligned for data_type BLOCK")
99
- end
100
-
101
- it "complains if read exceeds the size of the buffer" do
102
- expect { BinaryAccessor.read(8, 800, :STRING, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "16 byte buffer insufficient to read STRING at bit_offset 8 with bit_size 800")
103
- end
104
-
105
- it "reads aligned 8-bit unsigned integers" do
106
- 0.step((@data.length - 1) * 8, 8) do |bit_offset|
107
- expect(BinaryAccessor.read(bit_offset, 8, :UINT, @data, :BIG_ENDIAN)).to eql(@data.getbyte(bit_offset / 8))
108
- end
109
- end
110
-
111
- it "reads aligned 8-bit signed integers" do
112
- 0.step((@data.length - 1) * 8, 8) do |bit_offset|
113
- expected = @data.getbyte(bit_offset / 8)
114
- expected = expected - 256 if expected >= 128
115
- expect(BinaryAccessor.read(bit_offset, 8, :INT, @data, :BIG_ENDIAN)).to eql(expected)
116
- end
117
- end
118
-
119
- describe "given big endian data" do
120
-
121
- it "reads 1-bit unsigned integers" do
122
- expected = [0x1, 0x0]
123
- bit_size = 1
124
- expect(BinaryAccessor.read(8, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[0])
125
- expect(BinaryAccessor.read(9, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[1])
126
- end
127
-
128
- it "reads 1-bit signed integers" do
129
- expected = [0x1, 0x0]
130
- bit_size = 1
131
- expect(BinaryAccessor.read(8, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[0])
132
- expect(BinaryAccessor.read(9, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[1])
133
- end
134
-
135
- it "reads 7-bit unsigned integers" do
136
- expected = [0x40, 0x02]
137
- bit_size = 7
138
- expect(BinaryAccessor.read(8, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[0])
139
- expect(BinaryAccessor.read(3, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[1])
140
- end
141
-
142
- it "reads 7-bit signed integers" do
143
- expected = [0x40, 0x02]
144
- bit_size = 7
145
- expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
146
- expect(BinaryAccessor.read(8, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[0])
147
- expect(BinaryAccessor.read(3, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[1])
148
- end
149
-
150
- it "reads 13-bit unsigned integers" do
151
- expected = [0x1C24, 0x20]
152
- bit_size = 13
153
- expect(BinaryAccessor.read(30, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[0])
154
- expect(BinaryAccessor.read(1, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[1])
155
- end
156
-
157
- it "reads 13-bit signed integers" do
158
- expected = [0x1C24, 0x20]
159
- bit_size = 13
160
- expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
161
- expect(BinaryAccessor.read(30, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[0])
162
- expect(BinaryAccessor.read(1, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[1])
163
- end
164
-
165
- it "reads aligned 16-bit unsigned integers" do
166
- expected_array = [0x8081, 0x8283, 0x8485, 0x8687, 0x0009, 0x0A0B, 0x0C0D, 0x0E0F]
167
- index = 0
168
- 0.step((@data.length - 1) * 8, 16) do |bit_offset|
169
- expect(BinaryAccessor.read(bit_offset, 16, :UINT, @data, :BIG_ENDIAN)).to eql(expected_array[index])
170
- index += 1
171
- end
172
- end
173
-
174
- it "reads aligned 16-bit signed integers" do
175
- expected_array = [0x8081, 0x8283, 0x8485, 0x8687, 0x0009, 0x0A0B, 0x0C0D, 0x0E0F]
176
- index = 0
177
- 0.step((@data.length - 1) * 8, 16) do |bit_offset|
178
- expected = expected_array[index]
179
- expected = expected - 2**16 if expected >= 2**15
180
- expect(BinaryAccessor.read(bit_offset, 16, :INT, @data, :BIG_ENDIAN)).to eql(expected)
181
- index += 1
182
- end
183
- end
184
-
185
- it "reads aligned 32-bit unsigned integers" do
186
- expected_array = [0x80818283, 0x84858687, 0x00090A0B, 0x0C0D0E0F]
187
- index = 0
188
- 0.step((@data.length - 1) * 8, 32) do |bit_offset|
189
- expect(BinaryAccessor.read(bit_offset, 32, :UINT, @data, :BIG_ENDIAN)).to eql(expected_array[index])
190
- index += 1
191
- end
192
- end
193
-
194
- it "reads aligned 32-bit signed integers" do
195
- expected_array = [0x80818283, 0x84858687, 0x00090A0B, 0x0C0D0E0F]
196
- index = 0
197
- 0.step((@data.length - 1) * 8, 32) do |bit_offset|
198
- expected = expected_array[index]
199
- expected = expected - 2**32 if expected >= 2**31
200
- expect(BinaryAccessor.read(bit_offset, 32, :INT, @data, :BIG_ENDIAN)).to eql(expected)
201
- index += 1
202
- end
203
- end
204
-
205
- it "reads aligned 32-bit floats" do
206
- expected_array = [-1.189360e-038, -3.139169e-036, 8.301067e-040, 1.086646e-031]
207
- expect(BinaryAccessor.read(0, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-038).of(expected_array[0])
208
- expect(BinaryAccessor.read(32, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-036).of(expected_array[1])
209
- expect(BinaryAccessor.read(64, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-040).of(expected_array[2])
210
- expect(BinaryAccessor.read(96, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-031).of(expected_array[3])
211
- end
212
-
213
- it "reads 37-bit unsigned integers" do
214
- expected = [0x8182838485 >> 3, 0x00090A0B0C]
215
- bit_size = 37
216
- expect(BinaryAccessor.read(8, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[0])
217
- expect(BinaryAccessor.read(67, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[1])
218
- end
219
-
220
- it "reads 37-bit signed integers" do
221
- expected = [0x8182838485 >> 3, 0x00090A0B0C]
222
- bit_size = 37
223
- expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
224
- expect(BinaryAccessor.read(8, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[0])
225
- expect(BinaryAccessor.read(67, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[1])
226
- end
227
-
228
- it "reads 63-bit unsigned integers" do
229
- expected = [0x8081828384858687 >> 1, 0x00090A0B0C0D0E0F]
230
- bit_size = 63
231
- expect(BinaryAccessor.read(0, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[0])
232
- expect(BinaryAccessor.read(65, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[1])
233
- end
234
-
235
- it "reads 63-bit signed integers" do
236
- expected = [0x8081828384858687 >> 1, 0x00090A0B0C0D0E0F]
237
- bit_size = 63
238
- expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
239
- expect(BinaryAccessor.read(0, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[0])
240
- expect(BinaryAccessor.read(65, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[1])
241
- end
242
-
243
- it "reads 67-bit unsigned integers" do
244
- expected = [0x808182838485868700 >> 5, 0x8700090A0B0C0D0E0F >> 5]
245
- bit_size = 67
246
- expect(BinaryAccessor.read(0, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[0])
247
- expect(BinaryAccessor.read(56, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[1])
248
- end
249
-
250
- it "reads 67-bit signed integers" do
251
- expected = [0x808182838485868700 >> 5, 0x8700090A0B0C0D0E0F >> 5]
252
- bit_size = 67
253
- expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
254
- expect(BinaryAccessor.read(0, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[0])
255
- expect(BinaryAccessor.read(56, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[1])
256
- end
257
-
258
- it "reads aligned 64-bit unsigned integers" do
259
- expected_array = [0x8081828384858687, 0x00090A0B0C0D0E0F]
260
- index = 0
261
- 0.step((@data.length - 1) * 8, 64) do |bit_offset|
262
- expect(BinaryAccessor.read(bit_offset, 64, :UINT, @data, :BIG_ENDIAN)).to eql(expected_array[index])
263
- index += 1
264
- end
265
- end
266
-
267
- it "reads aligned 64-bit signed integers" do
268
- expected_array = [0x8081828384858687, 0x00090A0B0C0D0E0F]
269
- index = 0
270
- 0.step((@data.length - 1) * 8, 64) do |bit_offset|
271
- expected = expected_array[index]
272
- expected = expected - 2**64 if expected >= 2**63
273
- expect(BinaryAccessor.read(bit_offset, 64, :INT, @data, :BIG_ENDIAN)).to eql(expected)
274
- index += 1
275
- end
276
- end
277
-
278
- it "reads aligned 64-bit floats" do
279
- expected_array = [-3.116851e-306, 1.257060e-308]
280
- expect(BinaryAccessor.read(0, 64, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-306).of(expected_array[0])
281
- expect(BinaryAccessor.read(64, 64, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-308).of(expected_array[1])
282
- end
283
-
284
- it "complains about unaligned floats" do
285
- expect { BinaryAccessor.read(17, 32, :FLOAT, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "bit_offset 17 is not byte aligned for data_type FLOAT")
286
- end
287
-
288
- it "complains about mis-sized floats" do
289
- expect { BinaryAccessor.read(0, 33, :FLOAT, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "bit_size is 33 but must be 32 or 64 for data_type FLOAT")
290
- end
291
-
292
- end # given big endian data
293
-
294
- describe "given little endian data" do
295
-
296
- it "complains about ill-defined little endian bitfields" do
297
- expect { BinaryAccessor.read(3, 7, :UINT, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "LITTLE_ENDIAN bitfield with bit_offset 3 and bit_size 7 is invalid")
298
- end
299
-
300
- it "reads 1-bit unsigned integers" do
301
- expected = [0x1, 0x0]
302
- bit_size = 1
303
- expect(BinaryAccessor.read(8, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
304
- expect(BinaryAccessor.read(9, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
305
- end
306
-
307
- it "reads 1-bit signed integers" do
308
- expected = [0x1, 0x0]
309
- bit_size = 1
310
- expect(BinaryAccessor.read(8, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
311
- expect(BinaryAccessor.read(9, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
312
- end
313
-
314
- it "reads 7-bit unsigned integers" do
315
- expected = [0x40, 0x60]
316
- bit_size = 7
317
- expect(BinaryAccessor.read(8, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
318
- expect(BinaryAccessor.read(15, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
319
- end
320
-
321
- it "reads 7-bit signed integers" do
322
- expected = [0x40, 0x60]
323
- bit_size = 7
324
- expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
325
- expect(BinaryAccessor.read(8, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
326
- expect(BinaryAccessor.read(15, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
327
- end
328
-
329
- it "reads 13-bit unsigned integers" do
330
- expected = [0x038281 >> 5, 0x0180 >> 2]
331
- bit_size = 13
332
- expect(BinaryAccessor.read(30, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
333
- expect(BinaryAccessor.read(9, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
334
- end
335
-
336
- it "reads 13-bit signed integers" do
337
- expected = [0x038281 >> 5, 0x0180 >> 2]
338
- bit_size = 13
339
- expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
340
- expect(BinaryAccessor.read(30, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
341
- expect(BinaryAccessor.read(9, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
342
- end
343
-
344
- it "reads aligned 16-bit unsigned integers" do
345
- expected_array = [0x8180, 0x8382, 0x8584, 0x8786, 0x0900, 0x0B0A, 0x0D0C, 0x0F0E]
346
- index = 0
347
- 0.step((@data.length - 1) * 8, 16) do |bit_offset|
348
- expect(BinaryAccessor.read(bit_offset, 16, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected_array[index])
349
- index += 1
350
- end
351
- end
352
-
353
- it "reads aligned 16-bit signed integers" do
354
- expected_array = [0x8180, 0x8382, 0x8584, 0x8786, 0x0900, 0x0B0A, 0x0D0C, 0x0F0E]
355
- index = 0
356
- 0.step((@data.length - 1) * 8, 16) do |bit_offset|
357
- expected = expected_array[index]
358
- expected = expected - 2**16 if expected >= 2**15
359
- expect(BinaryAccessor.read(bit_offset, 16, :INT, @data, :LITTLE_ENDIAN)).to eql(expected)
360
- index += 1
361
- end
362
- end
363
-
364
- it "reads aligned 32-bit unsigned integers" do
365
- expected_array = [0x83828180, 0x87868584, 0x0B0A0900, 0x0F0E0D0C]
366
- index = 0
367
- 0.step((@data.length - 1) * 8, 32) do |bit_offset|
368
- expect(BinaryAccessor.read(bit_offset, 32, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected_array[index])
369
- index += 1
370
- end
371
- end
372
-
373
- it "reads aligned 32-bit signed integers" do
374
- expected_array = [0x83828180, 0x87868584, 0x0B0A0900, 0x0F0E0D0C]
375
- index = 0
376
- 0.step((@data.length - 1) * 8, 32) do |bit_offset|
377
- expected = expected_array[index]
378
- expected = expected - 2**32 if expected >= 2**31
379
- expect(BinaryAccessor.read(bit_offset, 32, :INT, @data, :LITTLE_ENDIAN)).to eql(expected)
380
- index += 1
381
- end
382
- end
383
-
384
- it "reads aligned 32-bit floats" do
385
- expected_array = [-7.670445e-037, -2.024055e-034, 2.658460e-032, 7.003653e-030]
386
- expect(BinaryAccessor.read(0, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-037).of(expected_array[0])
387
- expect(BinaryAccessor.read(32, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-034).of(expected_array[1])
388
- expect(BinaryAccessor.read(64, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-032).of(expected_array[2])
389
- expect(BinaryAccessor.read(96, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-030).of(expected_array[3])
390
- end
391
-
392
- it "reads 37-bit unsigned integers" do
393
- expected = [0x8584838281 >> 3, 0x0F0E0D0C0B]
394
- bit_size = 37
395
- expect(BinaryAccessor.read(40, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
396
- expect(BinaryAccessor.read(123, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
397
- end
398
-
399
- it "reads 37-bit signed integers" do
400
- expected = [0x8584838281 >> 3, 0x0F0E0D0C0B]
401
- bit_size = 37
402
- expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
403
- expect(BinaryAccessor.read(40, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
404
- expect(BinaryAccessor.read(123, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
405
- end
406
-
407
- it "reads 63-bit unsigned integers" do
408
- expected = [0x0F0E0D0C0B0A0900 >> 1, 0x0786858483828180]
409
- bit_size = 63
410
- expect(BinaryAccessor.read(120, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
411
- expect(BinaryAccessor.read(57, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
412
- end
413
-
414
- it "reads 63-bit signed integers" do
415
- expected = [0x0F0E0D0C0B0A0900 >> 1, 0x0786858483828180]
416
- bit_size = 63
417
- expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
418
- expect(BinaryAccessor.read(120, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
419
- expect(BinaryAccessor.read(57, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
420
- end
421
-
422
- it "reads 67-bit unsigned integers" do
423
- expected = [0x0F0E0D0C0B0A090087 >> 5]
424
- bit_size = 67
425
- expect(BinaryAccessor.read(120, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
426
- end
427
-
428
- it "reads 67-bit signed integers" do
429
- expected = [0x0F0E0D0C0B0A090087 >> 5]
430
- bit_size = 67
431
- expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
432
- expect(BinaryAccessor.read(120, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
433
- end
434
-
435
- it "reads aligned 64-bit unsigned integers" do
436
- expected_array = [0x8786858483828180, 0x0F0E0D0C0B0A0900]
437
- index = 0
438
- 0.step((@data.length - 1) * 8, 64) do |bit_offset|
439
- expect(BinaryAccessor.read(bit_offset, 64, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected_array[index])
440
- index += 1
441
- end
442
- end
443
-
444
- it "reads aligned 64-bit signed integers" do
445
- expected_array = [0x8786858483828180, 0x0F0E0D0C0B0A0900]
446
- index = 0
447
- 0.step((@data.length - 1) * 8, 64) do |bit_offset|
448
- expected = expected_array[index]
449
- expected = expected - 2**64 if expected >= 2**63
450
- expect(BinaryAccessor.read(bit_offset, 64, :INT, @data, :LITTLE_ENDIAN)).to eql(expected)
451
- index += 1
452
- end
453
- end
454
-
455
- it "reads aligned 64-bit floats" do
456
- expected_array = [-2.081577e-272, 3.691916e-236]
457
- expect(BinaryAccessor.read(0, 64, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-272).of(expected_array[0])
458
- expect(BinaryAccessor.read(64, 64, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-236).of(expected_array[1])
459
- end
460
-
461
- it "complains about unaligned floats" do
462
- expect { BinaryAccessor.read(1, 32, :FLOAT, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "bit_offset 1 is not byte aligned for data_type FLOAT")
463
- end
464
-
465
- it "complains about mis-sized floats" do
466
- expect { BinaryAccessor.read(0, 65, :FLOAT, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "bit_size is 65 but must be 32 or 64 for data_type FLOAT")
467
- end
468
-
469
- end # little endian
470
- end # describe 'read'
471
-
472
- describe "read_array" do
473
-
474
- before(:each) do
475
- @data = "\x80\x81\x82\x83\x84\x85\x86\x87\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F"
476
- end
477
-
478
- it "complains with unknown data_type" do
479
- expect { BinaryAccessor.read_array(0, 8, :BLAH, 0, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "data_type BLAH is not recognized")
480
- end
481
-
482
- describe "given little endian data" do
483
-
484
- it "complains about negative bit sizes" do
485
- expect { BinaryAccessor.read_array(0, -8, :UINT, @data.length*8, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "bit_size -8 must be positive for arrays")
486
- end
487
-
488
- context "when positive or zero bit_offset" do
489
- it "reads the given array_size amount of items" do
490
- data = @data.unpack('C*')
491
- expect(BinaryAccessor.read_array(0, 8, :UINT, 32, @data, :LITTLE_ENDIAN)).to eql(data[0..3])
492
- end
493
-
494
- it "reads the given array_size amount of items" do
495
- data = @data.unpack('C*')
496
- expect(BinaryAccessor.read_array(32, 8, :UINT, 32, @data, :LITTLE_ENDIAN)).to eql(data[4..7])
497
- end
498
-
499
- it "reads the total buffer given array_size = buffer size" do
500
- data = @data.unpack('c*')
501
-
502
- expect(BinaryAccessor.read_array(0, 8, :INT, @data.length*8, @data, :LITTLE_ENDIAN)).to eql(data)
503
- end
504
-
505
- it "complains with an array_size not a multiple of bit_size" do
506
- data = @data.unpack('C*')
507
- expect { BinaryAccessor.read_array(0, 8, :UINT, 10, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "array_size 10 not a multiple of bit_size 8")
508
- end
509
-
510
- it "reads as many items as possible with a zero array_size" do
511
- data = @data.unpack('C*')
512
- expect(BinaryAccessor.read_array(0, 8, :UINT, 0, @data, :LITTLE_ENDIAN)).to eql(data)
513
- end
514
-
515
- it "excludes the remaining bits if array_size is negative" do
516
- data = @data.unpack('C*')
517
- expect(BinaryAccessor.read_array(0, 8, :UINT, -32, @data, :LITTLE_ENDIAN)).to eql(data[0..-5])
518
- end
519
-
520
- it "returns an empty array if the offset equals the negative array size" do
521
- data = @data.unpack('C*')
522
- expect(BinaryAccessor.read_array(@data.length*8-32, 8, :UINT, -32, @data, :LITTLE_ENDIAN)).to eql([])
523
- end
524
-
525
- it "complains if the offset is greater than the negative array size" do
526
- data = @data.unpack('C*')
527
- offset = @data.length * 8 - 16
528
- expect { BinaryAccessor.read_array(offset, 8, :UINT, -32, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "16 byte buffer insufficient to read UINT at bit_offset #{offset} with bit_size 8")
529
- end
530
- end
531
-
532
- context "when negative bit_offset" do
533
- it "reads an array of aligned 8 bit unsigned integers" do
534
- data = @data.unpack('C*')
535
- expect(BinaryAccessor.read_array(-32, 8, :UINT, 32, @data, :LITTLE_ENDIAN)).to eql(data[-4..-1])
536
- end
537
-
538
- it "reads an array if the negative offset is the size of the array" do
539
- data = @data.unpack('C*')
540
- expect(BinaryAccessor.read_array(-(@data.length*8), 8, :UINT, @data.length*8, @data, :LITTLE_ENDIAN)).to eql(data)
541
- end
542
-
543
- it "complains if the offset is larger than the buffer" do
544
- expect { BinaryAccessor.read_array(-(@data.length*8+1), 8, :UINT, @data.length*8, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "#{@data.length} byte buffer insufficient to read #{:UINT} at bit_offset -#{@data.length*8+1} with bit_size 8")
545
- end
546
-
547
- it "complains with zero array_size" do
548
- expect { BinaryAccessor.read_array(-32, 8, :UINT, 0, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "negative or zero array_size (0) cannot be given with negative bit_offset (-32)")
549
- end
550
-
551
- it "complains with negative array_size" do
552
- expect { BinaryAccessor.read_array(-32, 8, :UINT, -8, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "negative or zero array_size (-8) cannot be given with negative bit_offset (-32)")
553
- end
554
- end
555
-
556
- it "complains about accessing data from a buffer which is too small" do
557
- expect { BinaryAccessor.read_array(0, 256, :STRING, 256, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "16 byte buffer insufficient to read STRING at bit_offset 0 with bit_size 256")
558
- end
559
-
560
- it "returns an empty array when passed a zero length buffer" do
561
- expect(BinaryAccessor.read_array(0, 8, :UINT, 32, "", :LITTLE_ENDIAN)).to eql([])
562
- end
563
-
564
- it "complains about unaligned strings" do
565
- expect { BinaryAccessor.read_array(1, 32, :STRING, 32, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "bit_offset 1 is not byte aligned for data_type STRING")
566
- end
567
-
568
- it "reads a single STRING item" do
569
- expect(BinaryAccessor.read_array(0, 128, :STRING, 0, @data, :LITTLE_ENDIAN)).to eql([@data[0..7]])
570
- end
571
-
572
- it "reads a single BLOCK item" do
573
- expect(BinaryAccessor.read_array(0, 128, :BLOCK, 0, @data, :LITTLE_ENDIAN)).to eql([@data])
574
- end
575
-
576
- it "reads BLOCK items" do
577
- data = BinaryAccessor.read_array(0, 8, :BLOCK, 0, @data, :LITTLE_ENDIAN)
578
- data.each_with_index {|val, i| expect(val).to eql(@data[i]) }
579
- end
580
-
581
- it "reads 1-bit integers" do
582
- expected = [0x1, 0x0, 0x0, 0x0]
583
- expect(BinaryAccessor.read_array(0, 1, :INT, 4, @data, :LITTLE_ENDIAN)).to eql(expected)
584
- expect(BinaryAccessor.read_array(0, 1, :INT, 2, @data, :LITTLE_ENDIAN)).to eql(expected[0..1])
585
- end
586
-
587
- it "complains about little endian bit-fields greater than 1-bit" do
588
- expect { BinaryAccessor.read_array(8, 7, :UINT, 21, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "read_array does not support little endian bit fields with bit_size greater than 1-bit")
589
- end
590
-
591
- it "reads 16 bit UINT items" do
592
- data = [0x8180, 0x8382, 0x8584, 0x8786, 0x0900, 0x0B0A, 0x0D0C, 0x0F0E]
593
- expect(BinaryAccessor.read_array(0, 16, :UINT, 0, @data, :LITTLE_ENDIAN)).to eql(data)
594
- end
595
-
596
- it "reads 16 bit INT items" do
597
- data = [0x8180, 0x8382, 0x8584, 0x8786, 0x0900, 0x0B0A, 0x0D0C, 0x0F0E]
598
- data.map! {|x| (x & ~(1 << 15)) - (x & (1 << 15)) } # convert to negative
599
- expect(BinaryAccessor.read_array(0, 16, :INT, 0, @data, :LITTLE_ENDIAN)).to eql(data)
600
- end
601
-
602
- it "reads 32 bit UINT items" do
603
- data = [0x83828180, 0x87868584, 0x0B0A0900, 0x0F0E0D0C]
604
- expect(BinaryAccessor.read_array(0, 32, :UINT, 0, @data, :LITTLE_ENDIAN)).to eql(data)
605
- end
606
-
607
- it "reads 32 bit INT items" do
608
- data = [0x83828180, 0x87868584, 0x0B0A0900, 0x0F0E0D0C]
609
- data.map! {|x| (x & ~(1 << 31)) - (x & (1 << 31)) } # convert to negative
610
- expect(BinaryAccessor.read_array(0, 32, :INT, 0, @data, :LITTLE_ENDIAN)).to eql(data)
611
- end
612
-
613
- it "reads 64 bit UINT items" do
614
- data = [0x8786858483828180, 0x0F0E0D0C0B0A0900]
615
- expect(BinaryAccessor.read_array(0, 64, :UINT, 0, @data, :LITTLE_ENDIAN)).to eql(data)
616
- end
617
-
618
- it "reads 64 bit INT items" do
619
- data = [0x8786858483828180, 0x0F0E0D0C0B0A0900]
620
- data.map! {|x| (x & ~(1 << 63)) - (x & (1 << 63)) } # convert to negative
621
- expect(BinaryAccessor.read_array(0, 64, :INT, 0, @data, :LITTLE_ENDIAN)).to eql(data)
622
- end
623
-
624
- it "reads aligned 32-bit floats" do
625
- expected_array = [-7.670445e-037, -2.024055e-034, 2.658460e-032, 7.003653e-030]
626
- actual = BinaryAccessor.read_array(0, 32, :FLOAT, 0, @data, :LITTLE_ENDIAN)
627
- actual.each_with_index do |val, index|
628
- expect(val).to be_within(1.0e-030).of(expected_array[index])
629
- end
630
- end
631
-
632
- it "reads aligned 64-bit floats" do
633
- expected_array = [-2.081577e-272, 3.691916e-236]
634
- actual = BinaryAccessor.read_array(0, 64, :FLOAT, 0, @data, :LITTLE_ENDIAN)
635
- actual.each_with_index do |val, index|
636
- expect(val).to be_within(1.0e-236).of(expected_array[index])
637
- end
638
- end
639
-
640
- it "complains about unaligned floats" do
641
- expect { BinaryAccessor.read_array(1, 32, :FLOAT, 32, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "bit_offset 1 is not byte aligned for data_type FLOAT")
642
- end
643
-
644
- it "complains about mis-sized floats" do
645
- expect { BinaryAccessor.read_array(0, 65, :FLOAT, 65, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "bit_size is 65 but must be 32 or 64 for data_type FLOAT")
646
- end
647
- end # given little endian data
648
-
649
- describe "given big endian data" do
650
-
651
- it "reads 7-bit unsigned integers" do
652
- expected = [0x40, 0x60, 0x50]
653
- bit_size = 7
654
- expect(BinaryAccessor.read_array(8, bit_size, :UINT, 21, @data, :BIG_ENDIAN)).to eql(expected)
655
- end
656
-
657
- it "reads 16 bit UINT items" do
658
- data = [0x8081, 0x8283, 0x8485, 0x8687, 0x0009, 0x0A0B, 0x0C0D, 0x0E0F]
659
- expect(BinaryAccessor.read_array(0, 16, :UINT, 0, @data, :BIG_ENDIAN)).to eql(data)
660
- end
661
-
662
- it "reads 16 bit INT items" do
663
- data = [0x8081, 0x8283, 0x8485, 0x8687, 0x0009, 0x0A0B, 0x0C0D, 0x0E0F]
664
- data.map! {|x| (x & ~(1 << 15)) - (x & (1 << 15)) } # convert to negative
665
- expect(BinaryAccessor.read_array(0, 16, :INT, 0, @data, :BIG_ENDIAN)).to eql(data)
666
- end
667
-
668
- it "reads 32 bit UINT items" do
669
- data = [0x80818283, 0x84858687, 0x00090A0B, 0x0C0D0E0F]
670
- expect(BinaryAccessor.read_array(0, 32, :UINT, 0, @data, :BIG_ENDIAN)).to eql(data)
671
- end
672
-
673
- it "reads 32 bit INT items" do
674
- data = [0x80818283, 0x84858687, 0x00090A0B, 0x0C0D0E0F]
675
- data.map! {|x| (x & ~(1 << 31)) - (x & (1 << 31)) } # convert to negative
676
- expect(BinaryAccessor.read_array(0, 32, :INT, 0, @data, :BIG_ENDIAN)).to eql(data)
677
- end
678
-
679
- it "reads 64 bit UINT items" do
680
- data = [0x8081828384858687, 0x00090A0B0C0D0E0F]
681
- expect(BinaryAccessor.read_array(0, 64, :UINT, 0, @data, :BIG_ENDIAN)).to eql(data)
682
- end
683
-
684
- it "reads 64 bit INT items" do
685
- data = [0x8081828384858687, 0x00090A0B0C0D0E0F]
686
- data.map! {|x| (x & ~(1 << 63)) - (x & (1 << 63)) } # convert to negative
687
- expect(BinaryAccessor.read_array(0, 64, :INT, 0, @data, :BIG_ENDIAN)).to eql(data)
688
- end
689
-
690
- it "reads aligned 32-bit floats" do
691
- expected_array = [-1.189360e-038, -3.139169e-036, 8.301067e-040, 1.086646e-031]
692
- actual = BinaryAccessor.read_array(0, 32, :FLOAT, 0, @data, :BIG_ENDIAN)
693
- actual.each_with_index do |val, index|
694
- expect(val).to be_within(1.0e-030).of(expected_array[index])
695
- end
696
- end
697
-
698
- it "reads aligned 64-bit floats" do
699
- expected_array = [-3.116851e-306, 1.257060e-308]
700
- actual = BinaryAccessor.read_array(0, 64, :FLOAT, 0, @data, :BIG_ENDIAN)
701
- actual.each_with_index do |val, index|
702
- expect(val).to be_within(1.0e-236).of(expected_array[index])
703
- end
704
- end
705
- end # given big endian data
706
- end # describe "read_array"
707
-
708
- describe "write only" do
709
-
710
- before(:each) do
711
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
712
- @baseline_data = "\x80\x81\x82\x83\x84\x85\x86\x87\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F"
713
- end
714
-
715
- it "complains about unrecognized data types" do
716
- expect { BinaryAccessor.write(0, 0, 32, :BLOB, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "data_type BLOB is not recognized")
717
- end
718
-
719
- it "complains about bit_offsets before the beginning of the buffer" do
720
- expect { BinaryAccessor.write('', -((@data.length * 8) + 8), 32, :STRING, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "#{@data.length} byte buffer insufficient to write STRING at bit_offset #{-((@data.length * 8) + 8)} with bit_size 32")
721
- end
722
-
723
- it "complains about a negative bit_offset and zero bit_size" do
724
- expect { BinaryAccessor.write('', -8, 0, :STRING, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "negative or zero bit_sizes (0) cannot be given with negative bit_offsets (-8)")
725
- end
726
-
727
- it "complains about a negative bit_offset and negative bit_size" do
728
- expect { BinaryAccessor.write('', -8, -8, :STRING, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "negative or zero bit_sizes (-8) cannot be given with negative bit_offsets (-8)")
729
- end
730
-
731
- it "complains about negative or zero bit_sizes with data_types other than STRING and BLOCK" do
732
- expect { BinaryAccessor.write(0, 0, -8, :INT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_size -8 must be positive for data types other than :STRING and :BLOCK")
733
- expect { BinaryAccessor.write(0, 0, -8, :UINT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_size -8 must be positive for data types other than :STRING and :BLOCK")
734
- expect { BinaryAccessor.write(0, 0, -8, :FLOAT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_size -8 must be positive for data types other than :STRING and :BLOCK")
735
- end
736
-
737
- it "writes aligned strings" do
738
- 0.step((@data.length - 1) * 8, 8) do |bit_offset|
739
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
740
- @expected_data = @baseline_data.clone
741
- first_byte_index = bit_offset / 8
742
- if first_byte_index > 0
743
- @expected_data[0..(first_byte_index - 1)] = "\x00" * first_byte_index
744
- end
745
- BinaryAccessor.write(@baseline_data[first_byte_index..-1], bit_offset, (@data.length * 8) - bit_offset, :STRING, @data, :BIG_ENDIAN, :ERROR)
746
- expect(@data).to eql(@expected_data)
747
- end
748
- end
749
-
750
- it "writes variable length strings with a zero and negative bit_size" do
751
- 0.step(-(@baseline_data.length * 8), -8) do |bit_size|
752
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
753
- @expected_data = @baseline_data.clone + ("\x00" * -(bit_size / 8))
754
- BinaryAccessor.write(@baseline_data, 0, bit_size, :STRING, @data, :BIG_ENDIAN, :ERROR)
755
- expect(@data).to eql(@expected_data)
756
- end
757
- end
758
-
759
- it "writes strings with negative bit_offsets" do
760
- BinaryAccessor.write(@baseline_data[14..15], -16, 16, :STRING, @data, :BIG_ENDIAN, :ERROR)
761
- expect(@data).to eql(("\x00" * 14) + @baseline_data[14..15])
762
- end
763
-
764
- it "complains about unaligned strings" do
765
- expect { BinaryAccessor.write('', 1, 32, :STRING, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_offset 1 is not byte aligned for data_type STRING")
766
- end
767
-
768
- it "writes aligned blocks" do
769
- 0.step((@data.length - 1) * 8, 8) do |bit_offset|
770
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
771
- @expected_data = @baseline_data.clone
772
- first_byte_index = bit_offset / 8
773
- if first_byte_index > 0
774
- @expected_data[0..(first_byte_index - 1)] = "\x00" * first_byte_index
775
- end
776
- BinaryAccessor.write(@baseline_data[first_byte_index..-1], bit_offset, (@data.length * 8) - bit_offset, :BLOCK, @data, :BIG_ENDIAN, :ERROR)
777
- expect(@data).to eql(@expected_data)
778
- end
779
- end
780
-
781
- it "writes variable length blocks with a zero and negative bit_size" do
782
- 0.step(-(@data.length * 8), -8) do |bit_size|
783
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
784
- @expected_data = @baseline_data.clone + ("\x00" * -(bit_size / 8))
785
- BinaryAccessor.write(@baseline_data, 0, bit_size, :BLOCK, @data, :BIG_ENDIAN, :ERROR)
786
- expect(@data).to eql(@expected_data)
787
- end
788
- end
789
-
790
- context "when negative bit size" do
791
- it "writes a block to an empty buffer" do
792
- data = ''
793
- 512.times do |index|
794
- data << [index].pack("n")
795
- end
796
- buffer = ""
797
- expect { BinaryAccessor.write(data, 0, -16, :BLOCK, buffer, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "0 byte buffer insufficient to write BLOCK at bit_offset 0 with bit_size -16")
798
- end
799
-
800
- it "handles a huge bit offset with small buffer" do
801
- data = ''
802
- 512.times do |index|
803
- data << [index].pack("n")
804
- end
805
- buffer = ""
806
- expect { BinaryAccessor.write(data, 1024, 0, :BLOCK, buffer, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "0 byte buffer insufficient to write BLOCK at bit_offset 1024 with bit_size 0")
807
- end
808
-
809
- it "handles an edge case bit offset" do
810
- data = ''
811
- 512.times do |index|
812
- data << [index].pack("n")
813
- end
814
- buffer = "\x00" * 127
815
- expect { BinaryAccessor.write(data, 1024, 0, :BLOCK, buffer, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "127 byte buffer insufficient to write BLOCK at bit_offset 1024 with bit_size 0")
816
- end
817
-
818
- it "writes a block to a small buffer preserving the end" do
819
- data = ''
820
- 512.times do |index|
821
- data << [index].pack("n")
822
- end
823
- preserve = [0xBEEF].pack("n")
824
- buffer = preserve.clone # Should preserve this
825
- BinaryAccessor.write(data, 0, -16, :BLOCK, buffer, :BIG_ENDIAN, :ERROR)
826
- expect(buffer[0..-3]).to eql data
827
- expect(buffer[-2..-1]).to eql preserve
828
- data = BinaryAccessor.read(0, data.length*8 + 16, :BLOCK, buffer, :BIG_ENDIAN)
829
- expect(data).to eql buffer
830
- end
831
-
832
- it "writes a block to another small buffer preserving the end" do
833
- data = ''
834
- 512.times do |index|
835
- data << [index].pack("n")
836
- end
837
- preserve = [0xBEEF0123].pack("N")
838
- buffer = "\x00\x01" + preserve.clone # Should preserve this
839
- BinaryAccessor.write(data, 16, -32, :BLOCK, buffer, :BIG_ENDIAN, :ERROR)
840
- expect(buffer[0..1]).to eql "\x00\x01"
841
- expect(buffer[2..-5]).to eql data
842
- expect(buffer[-4..-1]).to eql preserve
843
- data = BinaryAccessor.read(0, 16 + data.length*8 + 32, :BLOCK, buffer, :BIG_ENDIAN)
844
- expect(data).to eql buffer
845
- end
846
-
847
- it "writes a block to a small buffer overwriting the end" do
848
- data = ''
849
- 512.times do |index|
850
- data << [index].pack("n")
851
- end
852
- preserve = [0xBEEF].pack("n")
853
- buffer = [0xDEAD].pack("n") # Should write over this
854
- buffer << preserve.clone # Should preserve this
855
- BinaryAccessor.write(data, 0, -16, :BLOCK, buffer, :BIG_ENDIAN, :ERROR)
856
- expect(buffer[0..-3]).to eql data
857
- expect(buffer[-2..-1]).to eql preserve
858
- data = BinaryAccessor.read(0, data.length*8 + 16, :BLOCK, buffer, :BIG_ENDIAN)
859
- expect(data).to eql buffer
860
- end
861
-
862
- it "writes a smaller block in the middle of a buffer" do
863
- data = ''
864
- buffer = ''
865
- 256.times do |index|
866
- data << [index].pack("n")
867
- end
868
- 512.times do
869
- buffer << [0xDEAD].pack("n")
870
- end
871
- expected = buffer.clone
872
- BinaryAccessor.write(data, 128*8, -128*8, :BLOCK, buffer, :BIG_ENDIAN, :ERROR)
873
- expect(buffer.length).to eql (128 + 512 + 128)
874
- expect(buffer[0...128]).to eql expected[0...128]
875
- expect(buffer[128...-128]).to eql data
876
- expect(buffer[-128..-1]).to eql expected[0...128]
877
- end
878
-
879
- it "writes a larger block in the middle of a buffer" do
880
- data = ''
881
- buffer = ''
882
- 256.times do |index|
883
- data << [index].pack("n")
884
- end
885
- 512.times do
886
- buffer << [0xDEAD].pack("n")
887
- end
888
- expected = buffer.clone
889
- BinaryAccessor.write(data, 384*8, -384*8, :BLOCK, buffer, :BIG_ENDIAN, :ERROR)
890
- expect(buffer.length).to eql (384 + 512 + 384)
891
- expect(buffer[0...384]).to eql expected[0...384]
892
- expect(buffer[384...-384]).to eql data
893
- expect(buffer[-384..-1]).to eql expected[0...384]
894
- end
895
-
896
- it "complains when the negative index exceeds the buffer length" do
897
- data = "\x01"
898
- buffer = ''
899
- 16.times do
900
- buffer << [0xDEAD].pack("n")
901
- end
902
- expect { BinaryAccessor.write(data, 0, -2024*8, :BLOCK, buffer, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "32 byte buffer insufficient to write BLOCK at bit_offset 0 with bit_size -16192")
903
- end
904
- end
905
-
906
- it "writes blocks with negative bit_offsets" do
907
- BinaryAccessor.write(@baseline_data[0..1], -16, 16, :BLOCK, @data, :BIG_ENDIAN, :ERROR)
908
- expect(@data[-2..-1]).to eql(@baseline_data[0..1])
909
- end
910
-
911
- it "writes a blank string with zero bit size" do
912
- BinaryAccessor.write('', 0, 0, :STRING, @data, :BIG_ENDIAN, :ERROR)
913
- expect(@data).to eql('')
914
- end
915
-
916
- it "writes a blank block with zero bit size" do
917
- BinaryAccessor.write('', 0, 0, :BLOCK, @data, :BIG_ENDIAN, :ERROR)
918
- expect(@data).to eql('')
919
- end
920
-
921
- it "writes a shorter string with zero bit size" do
922
- BinaryAccessor.write("\x00\x00\x00\x00\x00\x00\x00\x00", 0, 0, :STRING, @data, :BIG_ENDIAN, :ERROR)
923
- expect(@data).to eql("\x00\x00\x00\x00\x00\x00\x00\x00")
924
- end
925
-
926
- it "writes a shorter block with zero bit size" do
927
- BinaryAccessor.write("\x00\x00\x00\x00\x00\x00\x00\x00", 0, 0, :BLOCK, @data, :BIG_ENDIAN, :ERROR)
928
- expect(@data).to eql("\x00\x00\x00\x00\x00\x00\x00\x00")
929
- end
930
-
931
- it "writes a shorter string and zero fill to the given bit size" do
932
- @data = "\x80\x81\x82\x83\x84\x85\x86\x87\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F"
933
- BinaryAccessor.write("\x01\x02\x03\x04\x05\x06\x07\x08", 0, 128, :STRING, @data, :BIG_ENDIAN, :ERROR)
934
- expect(@data).to eql("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00")
935
- end
936
-
937
- it "writes a shorter block and zero fill to the given bit size" do
938
- @data = "\x80\x81\x82\x83\x84\x85\x86\x87\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F"
939
- BinaryAccessor.write("\x01\x02\x03\x04\x05\x06\x07\x08", 0, 128, :BLOCK, @data, :BIG_ENDIAN, :ERROR)
940
- expect(@data).to eql("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00")
941
- end
942
-
943
- it "complains about unaligned blocks" do
944
- expect { BinaryAccessor.write(@baseline_data, 7, 16, :BLOCK, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_offset 7 is not byte aligned for data_type BLOCK")
945
- end
946
-
947
- it "complains if write exceeds the size of the buffer" do
948
- expect { BinaryAccessor.write(@baseline_data, 8, 800, :STRING, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "16 byte buffer insufficient to write STRING at bit_offset 8 with bit_size 800")
949
- end
950
-
951
- it "truncates the buffer for 0 bitsize" do
952
- expect(@data.length).to eql 16
953
- BinaryAccessor.write("\x01\x02\x03", 8, 0, :BLOCK, @data, :BIG_ENDIAN, :ERROR)
954
- expect(@data).to eql("\x00\x01\x02\x03")
955
- expect(@data.length).to eql 4
956
- end
957
-
958
- it "expands the buffer for 0 bitsize" do
959
- expect(@data.length).to eql 16
960
- BinaryAccessor.write("\x01\x02\x03", (14 * 8), 0, :BLOCK, @data, :BIG_ENDIAN, :ERROR)
961
- expect(@data).to eql("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03")
962
- expect(@data.length).to eql 17
963
- end
964
-
965
- it "writes a frozen string" do
966
- buffer = "BLANKxxxWORLD"
967
- string = "HELLO".freeze
968
- # Specify 3 more bytes than given to exercise the padding logic
969
- string = BinaryAccessor.write(string, 0, (string.length + 3)*8, :STRING, buffer, :BIG_ENDIAN, :ERROR)
970
- expect(buffer).to eql("HELLO\x00\x00\x00WORLD")
971
- expect(string).to eql("HELLO")
972
- expect(string.frozen?).to be true
973
- end
974
-
975
- it "complains about writing a frozen buffer" do
976
- buffer = "BLANK WORLD".freeze
977
- string = "HELLO"
978
- expect {BinaryAccessor.write(string, 0, string.length*8, :STRING, buffer, :BIG_ENDIAN, :ERROR) }.to raise_error(RuntimeError, "can't modify frozen String")
979
- end
980
-
981
- it "writes aligned 8-bit unsigned integers" do
982
- 0.step((@data.length - 1) * 8, 8) do |bit_offset|
983
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
984
- byte_index = bit_offset / 8
985
- BinaryAccessor.write(@baseline_data.getbyte(byte_index), bit_offset, 8, :UINT, @data, :BIG_ENDIAN, :ERROR)
986
- expect(@data[byte_index..byte_index]).to eq(@baseline_data[byte_index..byte_index])
987
- end
988
- end
989
-
990
- it "writes aligned 8-bit signed integers" do
991
- 0.step((@data.length - 1) * 8, 8) do |bit_offset|
992
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
993
- byte_index = bit_offset / 8
994
- value = @baseline_data.getbyte(byte_index)
995
- value = value - 256 if value >= 128
996
- BinaryAccessor.write(value, bit_offset, 8, :INT, @data, :BIG_ENDIAN, :ERROR)
997
- expect(@data[byte_index..byte_index]).to eql(@baseline_data[byte_index..byte_index])
998
- end
999
- end
1000
-
1001
- it "converts floats when writing integers" do
1002
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1003
- BinaryAccessor.write(1.0, 0, 8, :UINT, @data, :BIG_ENDIAN, :ERROR)
1004
- BinaryAccessor.write(2.5, 8, 8, :INT, @data, :BIG_ENDIAN, :ERROR)
1005
- BinaryAccessor.write(4.99, 16, 8, :UINT, @data, :BIG_ENDIAN, :ERROR)
1006
- expect(@data).to eql("\x01\x02\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1007
- end
1008
-
1009
- it "converts integer strings when writing integers" do
1010
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1011
- BinaryAccessor.write("1", 0, 8, :UINT, @data, :BIG_ENDIAN, :ERROR)
1012
- BinaryAccessor.write("2", 8, 8, :INT, @data, :BIG_ENDIAN, :ERROR)
1013
- BinaryAccessor.write("4", 16, 8, :UINT, @data, :BIG_ENDIAN, :ERROR)
1014
- expect(@data).to eql("\x01\x02\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1015
- end
1016
-
1017
- it "complains about non-integer strings when writing integers" do
1018
- expect { BinaryAccessor.write("1.0", 0, 8, :UINT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError)
1019
- expect { BinaryAccessor.write("abc123", 0, 8, :UINT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError)
1020
- end
1021
-
1022
- describe "given big endian data" do
1023
-
1024
- it "writes 1-bit unsigned integers" do
1025
- BinaryAccessor.write(0x1, 8, 1, :UINT, @data, :BIG_ENDIAN, :ERROR)
1026
- BinaryAccessor.write(0x0, 9, 1, :UINT, @data, :BIG_ENDIAN, :ERROR)
1027
- BinaryAccessor.write(0x1, 10, 1, :UINT, @data, :BIG_ENDIAN, :ERROR)
1028
- expect(@data).to eql("\x00\xA0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1029
- end
1030
-
1031
- it "writes 1-bit signed integers" do
1032
- @data[1] = "\x55"
1033
- BinaryAccessor.write(0x1, 8, 1, :INT, @data, :BIG_ENDIAN, :ERROR)
1034
- BinaryAccessor.write(0x0, 9, 1, :INT, @data, :BIG_ENDIAN, :ERROR)
1035
- BinaryAccessor.write(0x1, 10, 1, :INT, @data, :BIG_ENDIAN, :ERROR)
1036
- BinaryAccessor.write(0x0, 11, 1, :INT, @data, :BIG_ENDIAN, :ERROR)
1037
- expect(@data).to eql("\x00\xA5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1038
- end
1039
-
1040
- it "writes 7-bit unsigned integers" do
1041
- BinaryAccessor.write(0x40, 8, 7, :UINT, @data, :BIG_ENDIAN, :ERROR)
1042
- expect(@data).to eql("\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1043
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1044
- BinaryAccessor.write(0x20, 3, 7, :UINT, @data, :BIG_ENDIAN, :ERROR)
1045
- expect(@data).to eql("\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1046
- end
1047
-
1048
- it "writes 7-bit signed integers" do
1049
- BinaryAccessor.write(-64, 8, 7, :INT, @data, :BIG_ENDIAN, :ERROR)
1050
- expect(@data).to eql("\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1051
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1052
- BinaryAccessor.write(32, 3, 7, :INT, @data, :BIG_ENDIAN, :ERROR)
1053
- expect(@data).to eql("\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1054
- end
1055
-
1056
- it "writes 13-bit unsigned integers" do
1057
- BinaryAccessor.write(0x1C24, 30, 13, :UINT, @data, :BIG_ENDIAN, :ERROR)
1058
- expect(@data).to eql("\x00\x00\x00\x03\x84\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1059
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1060
- BinaryAccessor.write(0x0020, 1, 13, :UINT, @data, :BIG_ENDIAN, :ERROR)
1061
- expect(@data).to eql("\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1062
- end
1063
-
1064
- it "writes 13-bit signed integers" do
1065
- BinaryAccessor.write(-988, 30, 13, :INT, @data, :BIG_ENDIAN, :ERROR)
1066
- expect(@data).to eql("\x00\x00\x00\x03\x84\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1067
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1068
- BinaryAccessor.write(32, 1, 13, :INT, @data, :BIG_ENDIAN, :ERROR)
1069
- expect(@data).to eql("\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1070
- end
1071
-
1072
- it "writes aligned 16-bit unsigned integers" do
1073
- expected_array = [0x8081, 0x8283, 0x8485, 0x8687, 0x0009, 0x0A0B, 0x0C0D, 0x0E0F]
1074
- index = 0
1075
- 0.step((@data.length - 1) * 8, 16) do |bit_offset|
1076
- BinaryAccessor.write(expected_array[index], bit_offset, 16, :UINT, @data, :BIG_ENDIAN, :ERROR)
1077
- index += 1
1078
- end
1079
- expect(@data).to eql(@baseline_data)
1080
- end
1081
-
1082
- it "writes aligned 16-bit signed integers" do
1083
- expected_array = [0x8081, 0x8283, 0x8485, 0x8687, 0x0009, 0x0A0B, 0x0C0D, 0x0E0F]
1084
- index = 0
1085
- 0.step((@data.length - 1) * 8, 16) do |bit_offset|
1086
- expected = expected_array[index]
1087
- expected = expected - 2**16 if expected >= 2**15
1088
- BinaryAccessor.write(expected, bit_offset, 16, :INT, @data, :BIG_ENDIAN, :ERROR)
1089
- index += 1
1090
- end
1091
- expect(@data).to eql(@baseline_data)
1092
- end
1093
-
1094
- it "writes aligned 32-bit unsigned integers" do
1095
- expected_array = [0x80818283, 0x84858687, 0x00090A0B, 0x0C0D0E0F]
1096
- index = 0
1097
- 0.step((@data.length - 1) * 8, 32) do |bit_offset|
1098
- BinaryAccessor.write(expected_array[index], bit_offset, 32, :UINT, @data, :BIG_ENDIAN, :ERROR)
1099
- index += 1
1100
- end
1101
- expect(@data).to eql(@baseline_data)
1102
- end
1103
-
1104
- it "writes aligned 32-bit signed integers" do
1105
- expected_array = [0x80818283, 0x84858687, 0x00090A0B, 0x0C0D0E0F]
1106
- index = 0
1107
- 0.step((@data.length - 1) * 8, 32) do |bit_offset|
1108
- expected = expected_array[index]
1109
- expected = expected - 2**32 if expected >= 2**31
1110
- BinaryAccessor.write(expected_array[index], bit_offset, 32, :INT, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
1111
- index += 1
1112
- end
1113
- expect(@data).to eql(@baseline_data)
1114
- end
1115
-
1116
- it "writes aligned 32-bit negative integers" do
1117
- BinaryAccessor.write(-2147483648, 0, 32, :INT, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
1118
- expect(@data).to eql("\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1119
- end
1120
-
1121
- it "writes aligned 32-bit floats" do
1122
- expected_array = [-1.189360e-038, -3.139169e-036, 8.301067e-040, 1.086646e-031]
1123
- BinaryAccessor.write(expected_array[0], 0, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1124
- BinaryAccessor.write(expected_array[1], 32, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1125
- BinaryAccessor.write(expected_array[2], 64, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1126
- BinaryAccessor.write(expected_array[3], 96, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1127
- expect(BinaryAccessor.read(0, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-038).of(expected_array[0])
1128
- expect(BinaryAccessor.read(32, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-036).of(expected_array[1])
1129
- expect(BinaryAccessor.read(64, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-040).of(expected_array[2])
1130
- expect(BinaryAccessor.read(96, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-031).of(expected_array[3])
1131
- end
1132
-
1133
- it "writes 37-bit unsigned integers" do
1134
- BinaryAccessor.write(0x8182838485 >> 3, 8, 37, :UINT, @data, :BIG_ENDIAN, :ERROR)
1135
- BinaryAccessor.write(0x00090A0B0C, 67, 37, :UINT, @data, :BIG_ENDIAN, :ERROR)
1136
- expect(@data).to eql("\x00\x81\x82\x83\x84\x80\x00\x00\x00\x09\x0A\x0B\x0C\x00\x00\x00")
1137
- end
1138
-
1139
- it "writes 37-bit signed integers" do
1140
- BinaryAccessor.write((0x8182838485 >> 3) - 2**37, 8, 37, :INT, @data, :BIG_ENDIAN, :ERROR)
1141
- BinaryAccessor.write(0x00090A0B0C, 67, 37, :INT, @data, :BIG_ENDIAN, :ERROR)
1142
- expect(@data).to eql("\x00\x81\x82\x83\x84\x80\x00\x00\x00\x09\x0A\x0B\x0C\x00\x00\x00")
1143
- end
1144
-
1145
- it "writes 63-bit unsigned integers" do
1146
- @data[-1] = "\xFF"
1147
- BinaryAccessor.write(0x8081828384858687 >> 1, 0, 63, :UINT, @data, :BIG_ENDIAN, :ERROR)
1148
- expect(@data).to eql("\x80\x81\x82\x83\x84\x85\x86\x86\x00\x00\x00\x00\x00\x00\x00\xFF")
1149
- @data[0] = "\xFF"
1150
- BinaryAccessor.write(0x08090A0B0C0D0E0F, 65, 63, :UINT, @data, :BIG_ENDIAN, :ERROR)
1151
- expect(@data).to eql("\xFF\x81\x82\x83\x84\x85\x86\x86\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F")
1152
- end
1153
-
1154
- it "writes 63-bit signed integers" do
1155
- BinaryAccessor.write((0x8081828384858687 >> 1) - 2**63, 0, 63, :INT, @data, :BIG_ENDIAN, :ERROR)
1156
- BinaryAccessor.write(0x00090A0B0C0D0E0F, 65, 63, :INT, @data, :BIG_ENDIAN, :ERROR)
1157
- expect(@data).to eql("\x80\x81\x82\x83\x84\x85\x86\x86\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F")
1158
- end
1159
-
1160
- it "writes 67-bit unsigned integers" do
1161
- BinaryAccessor.write(0x8081828384858687FF >> 5, 0, 67, :UINT, @data, :BIG_ENDIAN, :ERROR)
1162
- expect(@data).to eql("\x80\x81\x82\x83\x84\x85\x86\x87\xE0\x00\x00\x00\x00\x00\x00\x00")
1163
- end
1164
-
1165
- it "writes 67-bit signed integers" do
1166
- BinaryAccessor.write((0x8081828384858687FF >> 5) - 2**67, 0, 67, :INT, @data, :BIG_ENDIAN, :ERROR)
1167
- expect(@data).to eql("\x80\x81\x82\x83\x84\x85\x86\x87\xE0\x00\x00\x00\x00\x00\x00\x00")
1168
- end
1169
-
1170
- it "writes aligned 64-bit unsigned integers" do
1171
- expected_array = [0x8081828384858687, 0x00090A0B0C0D0E0F]
1172
- index = 0
1173
- 0.step((@data.length - 1) * 8, 64) do |bit_offset|
1174
- BinaryAccessor.write(expected_array[index], bit_offset, 64, :UINT, @data, :BIG_ENDIAN, :ERROR)
1175
- index += 1
1176
- end
1177
- expect(@data).to eql(@baseline_data)
1178
- end
1179
-
1180
- it "writes aligned 64-bit signed integers" do
1181
- expected_array = [0x8081828384858687, 0x00090A0B0C0D0E0F]
1182
- index = 0
1183
- 0.step((@data.length - 1) * 8, 64) do |bit_offset|
1184
- expected = expected_array[index]
1185
- expected = expected - 2**64 if expected >= 2**63
1186
- BinaryAccessor.write(expected_array[index], bit_offset, 64, :INT, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
1187
- index += 1
1188
- end
1189
- expect(@data).to eql(@baseline_data)
1190
- end
1191
-
1192
- it "writes aligned 64-bit floats" do
1193
- expected_array = [-3.116851e-306, 1.257060e-308]
1194
- BinaryAccessor.write(expected_array[0], 0, 64, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1195
- BinaryAccessor.write(expected_array[1], 64, 64, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1196
- expect(BinaryAccessor.read(0, 64, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-306).of(expected_array[0])
1197
- expect(BinaryAccessor.read(64, 64, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-308).of(expected_array[1])
1198
- end
1199
-
1200
- it "converts integers to floats" do
1201
- BinaryAccessor.write(1, 0, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1202
- value = BinaryAccessor.read(0, 32, :FLOAT, @data, :BIG_ENDIAN)
1203
- expect(value).to eql(1.0)
1204
- expect(value).to be_a(Float)
1205
- BinaryAccessor.write(4, 32, 64, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1206
- value = BinaryAccessor.read(32, 64, :FLOAT, @data, :BIG_ENDIAN)
1207
- expect(value).to eql(4.0)
1208
- expect(value).to be_a(Float)
1209
- end
1210
-
1211
- it "converts strings when writing floats" do
1212
- BinaryAccessor.write("1", 0, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1213
- value = BinaryAccessor.read(0, 32, :FLOAT, @data, :BIG_ENDIAN)
1214
- expect(value).to eql(1.0)
1215
- expect(value).to be_a(Float)
1216
- BinaryAccessor.write("4.5", 32, 64, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1217
- value = BinaryAccessor.read(32, 64, :FLOAT, @data, :BIG_ENDIAN)
1218
- expect(value).to eql(4.5)
1219
- expect(value).to be_a(Float)
1220
- end
1221
-
1222
- it "complains about non-float strings when writing floats" do
1223
- expect { BinaryAccessor.write("abc123", 0, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError)
1224
- end
1225
-
1226
- it "complains about unaligned floats" do
1227
- expect { BinaryAccessor.write(0.0, 17, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_offset 17 is not byte aligned for data_type FLOAT")
1228
- end
1229
-
1230
- it "complains about mis-sized floats" do
1231
- expect { BinaryAccessor.write(0.0, 0, 33, :FLOAT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_size is 33 but must be 32 or 64 for data_type FLOAT")
1232
- end
1233
-
1234
- end # given big endian data
1235
-
1236
- describe "given little endian data" do
1237
-
1238
- it "complains about ill-defined little endian bitfields" do
1239
- expect { BinaryAccessor.write(0x1, 3, 7, :UINT, @data, :LITTLE_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "LITTLE_ENDIAN bitfield with bit_offset 3 and bit_size 7 is invalid")
1240
- end
1241
-
1242
- it "writes 1-bit unsigned integers" do
1243
- @data[1] = "\x55"
1244
- BinaryAccessor.write(0x1, 8, 1, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1245
- BinaryAccessor.write(0x0, 9, 1, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1246
- BinaryAccessor.write(0x1, 10, 1, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1247
- BinaryAccessor.write(0x0, 11, 1, :INT, @data, :BIG_ENDIAN, :ERROR)
1248
- expect(@data).to eql("\x00\xA5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1249
- end
1250
-
1251
- it "writes 1-bit signed integers" do
1252
- BinaryAccessor.write(0x1, 8, 1, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1253
- BinaryAccessor.write(0x0, 9, 1, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1254
- BinaryAccessor.write(0x1, 10, 1, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1255
- expect(@data).to eql("\x00\xA0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1256
- end
1257
-
1258
- it "writes 7-bit unsigned integers" do
1259
- BinaryAccessor.write(0x40, 8, 7, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1260
- expect(@data).to eql("\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1261
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1262
- BinaryAccessor.write(0x7F, 11, 7, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1263
- expect(@data).to eql("\xC0\x1F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1264
- end
1265
-
1266
- it "writes 7-bit signed integers" do
1267
- BinaryAccessor.write(-64, 8, 7, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1268
- expect(@data).to eql("\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1269
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1270
- BinaryAccessor.write(32, 11, 7, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1271
- expect(@data).to eql("\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1272
- end
1273
-
1274
- it "writes 13-bit unsigned integers" do
1275
- BinaryAccessor.write(0x1C24, 30, 13, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1276
- expect(@data).to eql("\x00\x80\x84\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1277
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1278
- BinaryAccessor.write(0x0020, 9, 13, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1279
- expect(@data).to eql("\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1280
- end
1281
-
1282
- it "writes 13-bit signed integers" do
1283
- BinaryAccessor.write(-988, 30, 13, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1284
- expect(@data).to eql("\x00\x80\x84\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1285
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1286
- BinaryAccessor.write(32, 9, 13, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1287
- expect(@data).to eql("\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1288
- end
1289
-
1290
- it "writes aligned 16-bit unsigned integers" do
1291
- expected_array = [0x8180, 0x8382, 0x8584, 0x8786, 0x0900, 0x0B0A, 0x0D0C, 0x0F0E]
1292
- index = 0
1293
- 0.step((@data.length - 1) * 8, 16) do |bit_offset|
1294
- BinaryAccessor.write(expected_array[index], bit_offset, 16, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1295
- index += 1
1296
- end
1297
- expect(@data).to eql(@baseline_data)
1298
- end
1299
-
1300
- it "writes aligned 16-bit signed integers" do
1301
- expected_array = [0x8180, 0x8382, 0x8584, 0x8786, 0x0900, 0x0B0A, 0x0D0C, 0x0F0E]
1302
- index = 0
1303
- 0.step((@data.length - 1) * 8, 16) do |bit_offset|
1304
- expected = expected_array[index]
1305
- expected = expected - 2**16 if expected >= 2**15
1306
- BinaryAccessor.write(expected, bit_offset, 16, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1307
- index += 1
1308
- end
1309
- expect(@data).to eql(@baseline_data)
1310
- end
1311
-
1312
- it "writes aligned 32-bit unsigned integers" do
1313
- expected_array = [0x83828180, 0x87868584, 0x0B0A0900, 0x0F0E0D0C]
1314
- index = 0
1315
- 0.step((@data.length - 1) * 8, 32) do |bit_offset|
1316
- BinaryAccessor.write(expected_array[index], bit_offset, 32, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1317
- index += 1
1318
- end
1319
- expect(@data).to eql(@baseline_data)
1320
- end
1321
-
1322
- it "writes aligned 32-bit signed integers" do
1323
- expected_array = [0x83828180, 0x87868584, 0x0B0A0900, 0x0F0E0D0C]
1324
- index = 0
1325
- 0.step((@data.length - 1) * 8, 32) do |bit_offset|
1326
- expected = expected_array[index]
1327
- expected = expected - 2**32 if expected >= 2**31
1328
- BinaryAccessor.write(expected_array[index], bit_offset, 32, :INT, @data, :LITTLE_ENDIAN, :ERROR_ALLOW_HEX)
1329
- index += 1
1330
- end
1331
- expect(@data).to eql(@baseline_data)
1332
- end
1333
-
1334
- it "writes aligned 32-bit floats" do
1335
- expected_array = [-7.670445e-037, -2.024055e-034, 2.658460e-032, 7.003653e-030]
1336
- BinaryAccessor.write(expected_array[0], 0, 32, :FLOAT, @data, :LITTLE_ENDIAN, :ERROR)
1337
- BinaryAccessor.write(expected_array[1], 32, 32, :FLOAT, @data, :LITTLE_ENDIAN, :ERROR)
1338
- BinaryAccessor.write(expected_array[2], 64, 32, :FLOAT, @data, :LITTLE_ENDIAN, :ERROR)
1339
- BinaryAccessor.write(expected_array[3], 96, 32, :FLOAT, @data, :LITTLE_ENDIAN, :ERROR)
1340
- expect(BinaryAccessor.read(0, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-037).of(expected_array[0])
1341
- expect(BinaryAccessor.read(32, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-034).of(expected_array[1])
1342
- expect(BinaryAccessor.read(64, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-032).of(expected_array[2])
1343
- expect(BinaryAccessor.read(96, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-030).of(expected_array[3])
1344
- end
1345
-
1346
- it "writes 37-bit unsigned integers" do
1347
- BinaryAccessor.write(0x1584838281, 43, 37, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1348
- BinaryAccessor.write(0x0C0B0A0900 >> 3, 96, 37, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1349
- expect(@data).to eql("\x00\x81\x82\x83\x84\x15\x00\x00\x00\x09\x0A\x0B\x0C\x00\x00\x00")
1350
- end
1351
-
1352
- it "writes 37-bit signed integers" do
1353
- BinaryAccessor.write(0x1584838281 - 2**37, 43, 37, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1354
- BinaryAccessor.write(0x0C0B0A0900 >> 3, 96, 37, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1355
- expect(@data).to eql("\x00\x81\x82\x83\x84\x15\x00\x00\x00\x09\x0A\x0B\x0C\x00\x00\x00")
1356
- end
1357
-
1358
- it "writes 63-bit unsigned integers" do
1359
- BinaryAccessor.write(0x4786858483828180, 57, 63, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1360
- BinaryAccessor.write(0x0F0E0D0C0B0A0900 >> 1, 120, 63, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1361
- expect(@data).to eql("\x80\x81\x82\x83\x84\x85\x86\x47\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F")
1362
- end
1363
-
1364
- it "writes 63-bit signed integers" do
1365
- BinaryAccessor.write(0x4786858483828180 - 2**63, 57, 63, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1366
- BinaryAccessor.write(0x0F0E0D0C0B0A0900 >> 1, 120, 63, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1367
- expect(@data).to eql("\x80\x81\x82\x83\x84\x85\x86\x47\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F")
1368
- end
1369
-
1370
- it "writes 67-bit unsigned integers" do
1371
- BinaryAccessor.write(0x0F0E0D0C0B0A0900FF >> 5, 120, 67, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1372
- expect(@data).to eql("\x00\x00\x00\x00\x00\x00\x00\xE0\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F")
1373
- end
1374
-
1375
- it "writes 67-bit signed integers" do
1376
- BinaryAccessor.write(0x0F0E0D0C0B0A0900FF >> 5, 120, 67, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1377
- expect(@data).to eql("\x00\x00\x00\x00\x00\x00\x00\xE0\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F")
1378
- end
1379
-
1380
- it "writes aligned 64-bit unsigned integers" do
1381
- expected_array = [0x8786858483828180, 0x0F0E0D0C0B0A0900]
1382
- index = 0
1383
- 0.step((@data.length - 1) * 8, 64) do |bit_offset|
1384
- BinaryAccessor.write(expected_array[index], bit_offset, 64, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1385
- index += 1
1386
- end
1387
- expect(@data).to eql(@baseline_data)
1388
- end
1389
-
1390
- it "writes aligned 64-bit signed integers" do
1391
- expected_array = [0x8786858483828180, 0x0F0E0D0C0B0A0900]
1392
- index = 0
1393
- 0.step((@data.length - 1) * 8, 64) do |bit_offset|
1394
- expected = expected_array[index]
1395
- expected = expected - 2**64 if expected >= 2**63
1396
- BinaryAccessor.write(expected_array[index], bit_offset, 64, :INT, @data, :LITTLE_ENDIAN, :ERROR_ALLOW_HEX)
1397
- index += 1
1398
- end
1399
- expect(@data).to eql(@baseline_data)
1400
- end
1401
-
1402
- it "writes aligned 64-bit floats" do
1403
- expected_array = [-2.081577e-272, 3.691916e-236]
1404
- BinaryAccessor.write(expected_array[0], 0, 64, :FLOAT, @data, :LITTLE_ENDIAN, :ERROR)
1405
- BinaryAccessor.write(expected_array[1], 64, 64, :FLOAT, @data, :LITTLE_ENDIAN, :ERROR)
1406
- expect(BinaryAccessor.read(0, 64, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-272).of(expected_array[0])
1407
- expect(BinaryAccessor.read(64, 64, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-236).of(expected_array[1])
1408
- end
1409
-
1410
- it "complains about unaligned floats" do
1411
- expect { BinaryAccessor.write(0.0, 1, 32, :FLOAT, @data, :LITTLE_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_offset 1 is not byte aligned for data_type FLOAT")
1412
- end
1413
-
1414
- it "complains about mis-sized floats" do
1415
- expect { BinaryAccessor.write(0.0, 0, 65, :FLOAT, @data, :LITTLE_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_size is 65 but must be 32 or 64 for data_type FLOAT")
1416
- end
1417
-
1418
- end # given little endian data
1419
-
1420
- describe "should support overflow types" do
1421
- before(:each) do
1422
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1423
- end
1424
-
1425
- it "prevents overflow of STRING" do
1426
- expect { BinaryAccessor.write("abcde", 0, 32, :STRING, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of 5 bytes does not fit into 4 bytes for data_type STRING")
1427
- end
1428
-
1429
- it "prevents overflow of BLOCK" do
1430
- expect { BinaryAccessor.write("abcde", 0, 32, :BLOCK, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of 5 bytes does not fit into 4 bytes for data_type BLOCK")
1431
- end
1432
-
1433
- it "prevents overflow of 8-bit INT" do
1434
- bit_size = 8; data_type = :INT; value = 2 ** (bit_size - 1)
1435
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1436
- value = -(value + 1)
1437
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1438
- end
1439
-
1440
- it "prevents overflow of 16-bit INT" do
1441
- bit_size = 16; data_type = :INT; value = 2 ** (bit_size - 1)
1442
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1443
- value = -(value + 1)
1444
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1445
- end
1446
-
1447
- it "prevents overflow of 32-bit INT" do
1448
- bit_size = 32; data_type = :INT; value = 2 ** (bit_size - 1)
1449
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1450
- value = -(value + 1)
1451
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1452
- end
1453
-
1454
- it "prevents overflow of 64-bit INT" do
1455
- bit_size = 64; data_type = :INT; value = 2 ** (bit_size - 1)
1456
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1457
- value = -(value + 1)
1458
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1459
- end
1460
-
1461
- it "prevents overflow of 3-bit INT" do
1462
- bit_size = 3; data_type = :INT; value = 2 ** (bit_size - 1)
1463
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1464
- value = -(value + 1)
1465
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1466
- end
1467
-
1468
- it "prevents overflow of 8-bit UINT" do
1469
- bit_size = 8; data_type = :UINT; value = 2 ** bit_size
1470
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1471
- value = -1
1472
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1473
- end
1474
-
1475
- it "prevents overflow of 16-bit UINT" do
1476
- bit_size = 16; data_type = :UINT; value = 2 ** bit_size
1477
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1478
- value = -1
1479
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1480
- end
1481
-
1482
- it "prevents overflow of 32-bit UINT" do
1483
- bit_size = 32; data_type = :UINT; value = 2 ** bit_size
1484
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1485
- value = -1
1486
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1487
- end
1488
-
1489
- it "prevents overflow of 64-bit UINT" do
1490
- bit_size = 64; data_type = :UINT; value = 2 ** bit_size
1491
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1492
- value = -1
1493
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1494
- end
1495
-
1496
- it "prevents overflow of 3-bit UINT" do
1497
- bit_size = 3; data_type = :UINT; value = 2 ** bit_size
1498
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1499
- value = -1
1500
- expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1501
- end
1502
-
1503
- it "truncates STRING" do
1504
- BinaryAccessor.write("abcde", 0, 32, :STRING, @data, :BIG_ENDIAN, :TRUNCATE)
1505
- expect(@data[0..4]).to eql "abcd\x00"
1506
- end
1507
-
1508
- it "truncates BLOCK" do
1509
- BinaryAccessor.write("abcde", 0, 32, :BLOCK, @data, :BIG_ENDIAN, :TRUNCATE)
1510
- expect(@data[0..4]).to eql "abcd\x00"
1511
- end
1512
-
1513
- it "truncates 8-bit INT" do
1514
- bit_size = 8; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
1515
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1516
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1517
- end
1518
-
1519
- it "truncates 16-bit INT" do
1520
- bit_size = 16; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
1521
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1522
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1523
- end
1524
-
1525
- it "truncates 32-bit INT" do
1526
- bit_size = 32; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
1527
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1528
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1529
- end
1530
-
1531
- it "truncates 64-bit INT" do
1532
- bit_size = 64; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
1533
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1534
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1535
- end
1536
-
1537
- it "truncates 3-bit INT" do
1538
- bit_size = 3; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
1539
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1540
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1541
- end
1542
-
1543
- it "truncates 8-bit UINT" do
1544
- bit_size = 8; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
1545
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1546
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1547
- end
1548
-
1549
- it "truncates 16-bit UINT" do
1550
- bit_size = 16; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
1551
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1552
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1553
- end
1554
-
1555
- it "truncates 32-bit UINT" do
1556
- bit_size = 32; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
1557
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1558
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1559
- end
1560
-
1561
- it "truncates 64-bit UINT" do
1562
- bit_size = 64; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
1563
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1564
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1565
- end
1566
-
1567
- it "truncates 3-bit UINT" do
1568
- bit_size = 3; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
1569
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1570
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1571
- end
1572
-
1573
- it "saturates 8-bit INT" do
1574
- bit_size = 8; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
1575
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1576
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1577
- value = -(value + 1); saturated_value = value + 1
1578
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1579
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1580
- end
1581
-
1582
- it "saturates 16-bit INT" do
1583
- bit_size = 16; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
1584
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1585
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1586
- value = -(value + 1); saturated_value = value + 1
1587
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1588
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1589
- end
1590
-
1591
- it "saturates 32-bit INT" do
1592
- bit_size = 32; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
1593
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1594
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1595
- value = -(value + 1); saturated_value = value + 1
1596
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1597
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1598
- end
1599
-
1600
- it "saturates 64-bit INT" do
1601
- bit_size = 64; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
1602
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1603
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1604
- value = -(value + 1); saturated_value = value + 1
1605
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1606
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1607
- end
1608
-
1609
- it "saturates 3-bit INT" do
1610
- bit_size = 3; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
1611
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1612
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1613
- value = -(value + 1); saturated_value = value + 1
1614
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1615
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1616
- end
1617
-
1618
- it "saturates 8-bit UINT" do
1619
- bit_size = 8; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
1620
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1621
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1622
- value = -1; saturated_value = 0
1623
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1624
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1625
- end
1626
-
1627
- it "saturates 16-bit UINT" do
1628
- bit_size = 16; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
1629
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1630
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1631
- value = -1; saturated_value = 0
1632
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1633
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1634
- end
1635
-
1636
- it "saturates 32-bit UINT" do
1637
- bit_size = 32; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
1638
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1639
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1640
- value = -1; saturated_value = 0
1641
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1642
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1643
- end
1644
-
1645
- it "saturates 64-bit UINT" do
1646
- bit_size = 64; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
1647
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1648
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1649
- value = -1; saturated_value = 0
1650
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1651
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1652
- end
1653
-
1654
- it "saturates 3-bit UINT" do
1655
- bit_size = 3; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
1656
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1657
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1658
- value = -1; saturated_value = 0
1659
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1660
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1661
- end
1662
-
1663
- it "allows hex value entry of 8-bit INT" do
1664
- bit_size = 8; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
1665
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
1666
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
1667
- end
1668
-
1669
- it "allows hex value entry of 16-bit INT" do
1670
- bit_size = 16; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
1671
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
1672
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
1673
- end
1674
-
1675
- it "allows hex value entry of 32-bit INT" do
1676
- bit_size = 32; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
1677
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
1678
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
1679
- end
1680
-
1681
- it "allows hex value entry of 64-bit INT" do
1682
- bit_size = 64; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
1683
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
1684
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
1685
- end
1686
-
1687
- it "allows hex value entry of 3-bit INT" do
1688
- bit_size = 3; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
1689
- BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
1690
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
1691
- end
1692
-
1693
- end
1694
-
1695
- end # describe "write"
1696
-
1697
- describe "write_array" do
1698
- before(:each) do
1699
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1700
- @data_array = []
1701
- @data.length.times {|i| @data_array << @data[i] }
1702
- @baseline_data = "\x80\x81\x82\x83\x84\x85\x86\x87\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F"
1703
- @baseline_data_array = []
1704
- @baseline_data.length.times {|i| @baseline_data_array << @baseline_data[i] }
1705
- end
1706
-
1707
- it "complains about value other than Array" do
1708
- expect { BinaryAccessor.write_array("", 0, 32, :STRING, 0, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "values must be an Array type class is String")
1709
- end
1710
-
1711
- it "complains about unrecognized data types" do
1712
- expect { BinaryAccessor.write_array([0], 0, 32, :BLOB, 0, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "data_type BLOB is not recognized")
1713
- end
1714
-
1715
- it "complains about bit_offsets before the beginning of the buffer" do
1716
- expect { BinaryAccessor.write_array([''], -((@data.length * 8) + 8), 32, :STRING, 0, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "#{@data.length} byte buffer insufficient to write STRING at bit_offset #{-((@data.length * 8) + 8)} with bit_size 32")
1717
- end
1718
-
1719
- it "writes if a negative bit_offset is equal to length of buffer" do
1720
- BinaryAccessor.write_array(@baseline_data_array, -(@data.length * 8), 8, :BLOCK, @baseline_data_array.length*8, @data, :BIG_ENDIAN, :ERROR)
1721
- expect(@data).to eql @baseline_data
1722
- end
1723
-
1724
- it "complains about a negative or zero bit_size" do
1725
- expect { BinaryAccessor.write_array([''], 0, 0, :STRING, 0, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_size 0 must be positive for arrays")
1726
- expect { BinaryAccessor.write_array([''], 0, -8, :STRING, 0, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_size -8 must be positive for arrays")
1727
- end
1728
-
1729
- it "writes aligned strings with fixed array_size" do
1730
- data = @data.clone
1731
- BinaryAccessor.write_array(@baseline_data_array, 0, 8, :STRING, @baseline_data_array.length*8, data, :BIG_ENDIAN, :ERROR)
1732
- expect(data).to eql(@baseline_data)
1733
- end
1734
-
1735
- it "writes aligned strings with zero array_size" do
1736
- BinaryAccessor.write_array(@baseline_data_array, 0, 8, :STRING, 0, @data, :BIG_ENDIAN, :ERROR)
1737
- expect(@data).to eql(@baseline_data)
1738
- end
1739
-
1740
- it "writes strings with negative bit_offsets" do
1741
- BinaryAccessor.write_array(@baseline_data_array[14..15], -16, 8, :STRING, 16, @data, :BIG_ENDIAN, :ERROR)
1742
- expect(@data).to eql(("\x00" * 14) + @baseline_data[14..15])
1743
- end
1744
-
1745
- it "complains about unaligned strings" do
1746
- expect { BinaryAccessor.write_array([], 1, 32, :STRING, 32, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_offset 1 is not byte aligned for data_type STRING")
1747
- end
1748
-
1749
- it "complains if pass more values than the given array_size can hold" do
1750
- expect { BinaryAccessor.write_array(@baseline_data_array, 0, 8, :BLOCK, 32, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "too many values #{@baseline_data_array.length} for given array_size 32 and bit_size 8")
1751
- end
1752
-
1753
- it "writes blocks with fixed array_size" do
1754
- BinaryAccessor.write_array(@baseline_data_array, 0, 8, :BLOCK, @baseline_data_array.length*8, @data, :BIG_ENDIAN, :ERROR)
1755
- expect(@data).to eql(@baseline_data)
1756
- end
1757
-
1758
- it "zeros fill if array_size > number of values passed" do
1759
- data = @baseline_data.clone
1760
- BinaryAccessor.write_array(["\x01","\x02","\x03","\x04"], 0, 8, :BLOCK, 64, @baseline_data, :BIG_ENDIAN, :ERROR)
1761
- expect(@baseline_data).to eql("\x01\x02\x03\x04" + "\x00" * 4 + data[8..-1])
1762
- end
1763
-
1764
- it "writes blocks with fixed array_size at non zero offset" do
1765
- BinaryAccessor.write_array(@baseline_data_array[0..-5], 32, 8, :BLOCK, @baseline_data_array.length*8-32, @data, :BIG_ENDIAN, :ERROR)
1766
- expect(@data).to eql(("\x00" * 4) + @baseline_data[0..-5])
1767
- end
1768
-
1769
- it "writes blocks with zero array_size" do
1770
- BinaryAccessor.write_array(@baseline_data_array, 0, 8, :BLOCK, 0, @data, :BIG_ENDIAN, :ERROR)
1771
- expect(@data).to eql(@baseline_data)
1772
- end
1773
-
1774
- it "writes blocks with negative bit_offsets" do
1775
- BinaryAccessor.write_array(["\x80\x81","\x82\x83"], -32, 16, :BLOCK, 32, @data, :BIG_ENDIAN, :ERROR)
1776
- expect(@data).to eql(("\x00" * 12) + @baseline_data[0..3])
1777
- end
1778
-
1779
- it "complains with an array_size not a multiple of bit_size" do
1780
- data = @data.unpack('C*')
1781
- expect { BinaryAccessor.write_array([1,2], 0, 8, :UINT, 10, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "array_size 10 not a multiple of bit_size 8")
1782
- end
1783
-
1784
- it "complains with an array_size not a multiple of bit_size" do
1785
- data = @data.unpack('C*')
1786
- expect { BinaryAccessor.write_array([1,2], 0, 8, :UINT, -10, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "array_size -10 not a multiple of bit_size 8")
1787
- end
1788
-
1789
- it "excludes the remaining bits if array_size is negative" do
1790
- data = @data.clone
1791
- BinaryAccessor.write_array(@baseline_data_array[0..-5], 0, 8, :BLOCK, -32, @data, :BIG_ENDIAN, :ERROR)
1792
- expect(@data).to eql(@baseline_data[0..-5] + data[-4..-1])
1793
- end
1794
-
1795
- it "does not write if the offset equals the negative array size" do
1796
- data = @data.clone
1797
- BinaryAccessor.write_array([], @data.length*8-32, 8, :BLOCK, -32, @data, :LITTLE_ENDIAN, :ERROR)
1798
- expect(@data).to eql(data)
1799
- end
1800
-
1801
- it "expands the buffer to handle negative array size" do
1802
- @data = "\x00\x01\x02\x00\x03"
1803
- BinaryAccessor.write_array([1,2,3,4], 0, 32, :UINT, -8, @data, :BIG_ENDIAN, :ERROR)
1804
- expect(@data).to eql("\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x03")
1805
- end
1806
-
1807
- it "shrinks the buffer when handling negative array size" do
1808
- # Start with one array item
1809
- @data = "\x00\x01\x02\x00\x03"
1810
- # Goto 4 array items array item
1811
- BinaryAccessor.write_array([1,2,3,4], 0, 32, :UINT, -8, @data, :BIG_ENDIAN, :ERROR)
1812
- expect(@data).to eql("\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x03")
1813
- # Goto 2 array items
1814
- BinaryAccessor.write_array([1,2], 0, 32, :UINT, -8, @data, :BIG_ENDIAN, :ERROR)
1815
- expect(@data).to eql("\x00\x00\x00\x01\x00\x00\x00\x02\x03")
1816
- # Goto 0 array items
1817
- BinaryAccessor.write_array([], 0, 32, :UINT, -8, @data, :BIG_ENDIAN, :ERROR)
1818
- expect(@data).to eql("\x03")
1819
- # Go back to 1 array items
1820
- BinaryAccessor.write_array([1], 0, 32, :UINT, -8, @data, :BIG_ENDIAN, :ERROR)
1821
- expect(@data).to eql("\x00\x00\x00\x01\x03")
1822
- end
1823
-
1824
- it "complain when passed a zero length buffer" do
1825
- expect { BinaryAccessor.write_array([1,2,3], 0, 8, :UINT, 32, "", :LITTLE_ENDIAN, :ERROR) }.to raise_error(ArgumentError)
1826
- end
1827
-
1828
- it "expands the buffer if the offset is greater than the negative array size" do
1829
- offset = @data.length * 8 - 16
1830
- data = @data.clone
1831
- BinaryAccessor.write_array([1,2], offset, 8, :UINT, -32, @data, :LITTLE_ENDIAN, :ERROR)
1832
- expect(@data).to eql(data[0..-3] + "\x01\x02" + data[-4..-1])
1833
- end
1834
-
1835
- it "complains with negative bit_offset and zero array_size" do
1836
- expect { BinaryAccessor.write_array([1,2], -32, 8, :UINT, 0, @data, :LITTLE_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "negative or zero array_size (0) cannot be given with negative bit_offset (-32)")
1837
- end
1838
-
1839
- it "complains with negative array_size" do
1840
- expect { BinaryAccessor.write_array([1,2], -32, 8, :UINT, -8, @data, :LITTLE_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "negative or zero array_size (-8) cannot be given with negative bit_offset (-32)")
1841
- end
1842
-
1843
- it "writes a shorter string and zero fill to the given bit size" do
1844
- @data = "\x80\x81\x82\x83\x84\x85\x86\x87\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F"
1845
- BinaryAccessor.write_array(["\x01\x02","\x01\x02","\x01\x02","\x01\x02"], 0, 32, :STRING, 128, @data, :BIG_ENDIAN, :ERROR)
1846
- expect(@data).to eql("\x01\x02\x00\x00\x01\x02\x00\x00\x01\x02\x00\x00\x01\x02\x00\x00")
1847
- end
1848
-
1849
- it "writes a shorter string and zero fill to the given bit size" do
1850
- @data = "\x80\x81\x82\x83\x84\x85\x86\x87\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F"
1851
- BinaryAccessor.write_array(["\x01\x02","\x01\x02","\x01\x02","\x01\x02"], 0, 32, :BLOCK, 128, @data, :BIG_ENDIAN, :ERROR)
1852
- expect(@data).to eql("\x01\x02\x00\x00\x01\x02\x00\x00\x01\x02\x00\x00\x01\x02\x00\x00")
1853
- end
1854
-
1855
- it "complains about unaligned blocks" do
1856
- expect { BinaryAccessor.write_array(@baseline_data_array[0..1], 7, 16, :BLOCK, 32, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_offset 7 is not byte aligned for data_type BLOCK")
1857
- end
1858
-
1859
- it "complains if write exceeds the size of the buffer" do
1860
- expect { BinaryAccessor.write_array([], 8, 800, :STRING, 800, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "16 byte buffer insufficient to write STRING at bit_offset 8 with bit_size 800")
1861
- end
1862
-
1863
- it "writes aligned 8-bit unsigned integers" do
1864
- data = @data.clone
1865
- BinaryAccessor.write_array([0,1,2,3,4,5,255,255], 0, 8, :UINT, 0, @data, :BIG_ENDIAN, :ERROR)
1866
- expect(@data).to eql("\x00\x01\x02\x03\x04\x05\xFF\xFF")
1867
- end
1868
-
1869
- it "writes aligned 8-bit signed integers" do
1870
- data = @data.clone
1871
- BinaryAccessor.write_array([0,1,2,3,4,5,-1,127], 0, 8, :INT, 0, @data, :BIG_ENDIAN, :ERROR)
1872
- expect(@data).to eql("\x00\x01\x02\x03\x04\x05\xFF\x7F")
1873
- end
1874
-
1875
- it "complains about unaligned strings" do
1876
- expect { BinaryAccessor.write_array(['X'], 1, 32, :STRING, 32, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_offset 1 is not byte aligned for data_type STRING")
1877
- end
1878
-
1879
- it "writes STRING items" do
1880
- data = @baseline_data.clone
1881
- BinaryAccessor.write_array(['a'], 0, 64, :STRING, 0, @baseline_data, :BIG_ENDIAN, :ERROR)
1882
- expect(@baseline_data).to eql("a\x00\x00\x00\x00\x00\x00\x00")
1883
- end
1884
-
1885
- it "writes BLOCK items" do
1886
- BinaryAccessor.write_array(["\x01","\x02","\x03","\x04"], 0, 32, :BLOCK, 0, @baseline_data, :BIG_ENDIAN, :ERROR)
1887
- expect(@baseline_data).to eql("\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00")
1888
- end
1889
-
1890
- it "writes variable length arrays with a zero and negative array_size" do
1891
- baseline_data_array_uint8 = []
1892
- @baseline_data.length.times {|i| baseline_data_array_uint8 << @baseline_data[i].ord }
1893
- 0.step(-(@baseline_data.length * 8), -8) do |array_size|
1894
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1895
- @expected_data = @baseline_data.clone + ("\x00" * -(array_size / 8))
1896
- BinaryAccessor.write_array(baseline_data_array_uint8, 0, 8, :UINT, array_size, @data, :BIG_ENDIAN, :ERROR)
1897
- expect(@data).to eql(@expected_data)
1898
- end
1899
- end
1900
-
1901
- it "writes variable length arrays or 32-bit UINTS with a zero and negative array_size" do
1902
- baseline_data = "\x01\x01\x01\x01\x02\x02\x02\x02\x03\x03\x03\x03\x04\x04\x04\x04"
1903
- data_array_uint32 = [0x01010101, 0x02020202, 0x03030303, 0x04040404]
1904
- 0.step(-(baseline_data.length * 8), -8) do |array_size|
1905
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1906
- @expected_data = baseline_data.clone + ("\x00" * -(array_size / 8))
1907
- BinaryAccessor.write_array(data_array_uint32, 0, 32, :UINT, array_size, @data, :BIG_ENDIAN, :ERROR)
1908
- expect(@data).to eql(@expected_data)
1909
- end
1910
- end
1911
-
1912
- it "writes variable length arrays of 32-bit UINTS with a zero and negative array_size and non-zero bit offset" do
1913
- baseline_data = "\x01\x01\x01\x01\x02\x02\x02\x02\x03\x03\x03\x03\x04\x04\x04\x04"
1914
- data_array_uint32 = [0x01010101, 0x02020202, 0x03030303, 0x04040404]
1915
- 0.step(-(baseline_data.length * 8), -8) do |array_size|
1916
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1917
- @expected_data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + baseline_data.clone + ("\x00" * -(array_size / 8))
1918
- BinaryAccessor.write_array(data_array_uint32, 128, 32, :UINT, array_size, @data, :BIG_ENDIAN, :ERROR)
1919
- expect(@data).to eql(@expected_data)
1920
- end
1921
- end
1922
-
1923
- it "writes variable length arrays of 32-bit UINTS with a zero and negative array_size and non-zero bit offset and grow the buffer" do
1924
- baseline_data = "\x01\x01\x01\x01\x02\x02\x02\x02\x03\x03\x03\x03\x04\x04\x04\x04"
1925
- data_array_uint32 = [0x01010101, 0x02020202, 0x03030303, 0x04040404]
1926
- 0.step(-(baseline_data.length * 8), -8) do |array_size|
1927
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1928
- @expected_data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + baseline_data.clone + ("\x00" * -(array_size / 8))
1929
- BinaryAccessor.write_array(data_array_uint32, 128, 32, :UINT, array_size, @data, :BIG_ENDIAN, :ERROR)
1930
- expect(@data).to eql(@expected_data)
1931
- end
1932
- end
1933
-
1934
- describe "given big endian data" do
1935
-
1936
- it "writes 1-bit unsigned integers" do
1937
- BinaryAccessor.write_array([1,0,1], 8, 1, :UINT, 3, @data, :BIG_ENDIAN, :ERROR)
1938
- expect(@data).to eql("\x00\xA0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1939
- end
1940
-
1941
- it "writes 1-bit signed integers" do
1942
- BinaryAccessor.write_array([1,0,1], 8, 1, :INT, 0, @data, :BIG_ENDIAN, :ERROR)
1943
- expect(@data).to eql("\x00\xA0")
1944
- end
1945
-
1946
- it "writes 7-bit unsigned integers" do
1947
- BinaryAccessor.write_array([0x40,0x60,0x50], 8, 7, :UINT, 21, @data, :BIG_ENDIAN, :ERROR)
1948
- expect(@data).to eql("\x00\x81\x82\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1949
- end
1950
-
1951
- it "writes aligned 16-bit unsigned integers" do
1952
- data = [0x8081, 0x8283, 0x8485, 0x8687, 0x0009, 0x0A0B, 0x0C0D, 0x0E0F]
1953
- BinaryAccessor.write_array(data, 0, 16, :UINT, 0, @data, :BIG_ENDIAN, :ERROR)
1954
- expect(@data).to eql(@baseline_data)
1955
- end
1956
-
1957
- it "writes aligned 16-bit signed integers" do
1958
- data = [0x8081, 0x8283, 0x8485, 0x8687, 0x0009, 0x0A0B, 0x0C0D, 0x0E0F]
1959
- data.map! {|x| (x & ~(1 << 15)) - (x & (1 << 15)) } # convert to negative
1960
- BinaryAccessor.write_array(data, 0, 16, :INT, 0, @data, :BIG_ENDIAN, :ERROR)
1961
- expect(@data).to eql(@baseline_data)
1962
- end
1963
-
1964
- it "writes aligned 32-bit unsigned integers" do
1965
- data = [0x80818283, 0x84858687, 0x00090A0B, 0x0C0D0E0F]
1966
- BinaryAccessor.write_array(data, 0, 32, :UINT, 0, @data, :BIG_ENDIAN, :ERROR)
1967
- expect(@data).to eql(@baseline_data)
1968
- end
1969
-
1970
- it "writes aligned 32-bit signed integers" do
1971
- data = [0x80818283, 0x84858687, 0x00090A0B, 0x0C0D0E0F]
1972
- data.map! {|x| (x & ~(1 << 31)) - (x & (1 << 31)) } # convert to negative
1973
- BinaryAccessor.write_array(data, 0, 32, :INT, 0, @data, :BIG_ENDIAN, :ERROR)
1974
- expect(@data).to eql(@baseline_data)
1975
- end
1976
-
1977
- it "writes aligned 32-bit floats" do
1978
- data = [-1.189360e-038, -3.139169e-036, 8.301067e-040, 1.086646e-031]
1979
- BinaryAccessor.write_array(data, 0, 32, :FLOAT, 0, @data, :BIG_ENDIAN, :ERROR)
1980
- expect(BinaryAccessor.read(0, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-038).of(data[0])
1981
- expect(BinaryAccessor.read(32, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-036).of(data[1])
1982
- expect(BinaryAccessor.read(64, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-040).of(data[2])
1983
- expect(BinaryAccessor.read(96, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-031).of(data[3])
1984
- end
1985
-
1986
- it "writes aligned 64-bit unsigned integers" do
1987
- data = [0x8081828384858687, 0x00090A0B0C0D0E0F]
1988
- BinaryAccessor.write_array(data, 0, 64, :UINT, 0, @data, :BIG_ENDIAN, :ERROR)
1989
- expect(@data).to eql(@baseline_data)
1990
- end
1991
-
1992
- it "writes aligned 64-bit signed integers" do
1993
- data = [0x8081828384858687, 0x00090A0B0C0D0E0F]
1994
- data.map! {|x| (x & ~(1 << 63)) - (x & (1 << 63)) } # convert to negative
1995
- BinaryAccessor.write_array(data, 0, 64, :INT, 0, @data, :BIG_ENDIAN, :ERROR)
1996
- expect(@data).to eql(@baseline_data)
1997
- end
1998
-
1999
- it "writes aligned 64-bit floats" do
2000
- data = [-3.116851e-306, 1.257060e-308]
2001
- BinaryAccessor.write_array(data, 0, 64, :FLOAT, 0, @data, :BIG_ENDIAN, :ERROR)
2002
- expect(BinaryAccessor.read(0, 64, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-306).of(data[0])
2003
- expect(BinaryAccessor.read(64, 64, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-308).of(data[1])
2004
- end
2005
-
2006
- it "complains about unaligned floats" do
2007
- expect { BinaryAccessor.write_array([0.0], 17, 32, :FLOAT, 32, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_offset 17 is not byte aligned for data_type FLOAT")
2008
- end
2009
-
2010
- it "complains about mis-sized floats" do
2011
- expect { BinaryAccessor.write_array([0.0], 0, 33, :FLOAT, 33, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_size is 33 but must be 32 or 64 for data_type FLOAT")
2012
- end
2013
-
2014
- end # given big endian data
2015
-
2016
- describe "given little endian data" do
2017
-
2018
- it "writes 1-bit unsigned integers" do
2019
- BinaryAccessor.write_array([1,0,1], 8, 1, :UINT, 3, @data, :LITTLE_ENDIAN, :ERROR)
2020
- expect(@data).to eql("\x00\xA0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
2021
- end
2022
-
2023
- it "writes 1-bit signed integers" do
2024
- BinaryAccessor.write_array([1,0,1], 8, 1, :INT, 0, @data, :LITTLE_ENDIAN, :ERROR)
2025
- expect(@data).to eql("\x00\xA0")
2026
- end
2027
-
2028
- it "complains about little endian bit-fields greater than 1-bit" do
2029
- expect { BinaryAccessor.write_array([0x40,0x60,0x50], 8, 7, :UINT, 21, @data, :LITTLE_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "write_array does not support little endian bit fields with bit_size greater than 1-bit")
2030
- end
2031
-
2032
- it "writes aligned 16-bit unsigned integers" do
2033
- data = [0x8180, 0x8382, 0x8584, 0x8786, 0x0900, 0x0B0A, 0x0D0C, 0x0F0E]
2034
- BinaryAccessor.write_array(data, 0, 16, :UINT, 0, @data, :LITTLE_ENDIAN, :ERROR)
2035
- expect(@data).to eql(@baseline_data)
2036
- end
2037
-
2038
- it "writes aligned 16-bit signed integers" do
2039
- data = [0x8180, 0x8382, 0x8584, 0x8786, 0x0900, 0x0B0A, 0x0D0C, 0x0F0E]
2040
- data.map! {|x| (x & ~(1 << 15)) - (x & (1 << 15)) } # convert to negative
2041
- BinaryAccessor.write_array(data, 0, 16, :INT, 0, @data, :LITTLE_ENDIAN, :ERROR)
2042
- expect(@data).to eql(@baseline_data)
2043
- end
2044
-
2045
- it "writes aligned 32-bit unsigned integers" do
2046
- data = [0x83828180, 0x87868584, 0x0B0A0900, 0x0F0E0D0C]
2047
- BinaryAccessor.write_array(data, 0, 32, :UINT, 0, @data, :LITTLE_ENDIAN, :ERROR)
2048
- expect(@data).to eql(@baseline_data)
2049
- end
2050
-
2051
- it "writes aligned 32-bit signed integers" do
2052
- data= [0x83828180, 0x87868584, 0x0B0A0900, 0x0F0E0D0C]
2053
- data.map! {|x| (x & ~(1 << 31)) - (x & (1 << 31)) } # convert to negative
2054
- BinaryAccessor.write_array(data, 0, 32, :INT, 0, @data, :LITTLE_ENDIAN, :ERROR)
2055
- expect(@data).to eql(@baseline_data)
2056
- end
2057
-
2058
- it "writes aligned 32-bit floats" do
2059
- data = [-7.670445e-037, -2.024055e-034, 2.658460e-032, 7.003653e-030]
2060
- BinaryAccessor.write_array(data, 0, 32, :FLOAT, 0, @data, :LITTLE_ENDIAN, :ERROR)
2061
- expect(BinaryAccessor.read(0, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-037).of(data[0])
2062
- expect(BinaryAccessor.read(32, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-034).of(data[1])
2063
- expect(BinaryAccessor.read(64, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-032).of(data[2])
2064
- expect(BinaryAccessor.read(96, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-030).of(data[3])
2065
- end
2066
-
2067
- it "writes aligned 64-bit unsigned integers" do
2068
- data = [0x8786858483828180, 0x0F0E0D0C0B0A0900]
2069
- BinaryAccessor.write_array(data, 0, 64, :UINT, 0, @data, :LITTLE_ENDIAN, :ERROR)
2070
- expect(@data).to eql(@baseline_data)
2071
- end
2072
-
2073
- it "writes aligned 64-bit signed integers" do
2074
- data = [0x8786858483828180, 0x0F0E0D0C0B0A0900]
2075
- data.map! {|x| (x & ~(1 << 63)) - (x & (1 << 63)) } # convert to negative
2076
- BinaryAccessor.write_array(data, 0, 64, :INT, 0, @data, :LITTLE_ENDIAN, :ERROR)
2077
- expect(@data).to eql(@baseline_data)
2078
- end
2079
-
2080
- it "writes aligned 64-bit floats" do
2081
- data = [-2.081577e-272, 3.691916e-236]
2082
- BinaryAccessor.write_array(data, 0, 64, :FLOAT, 0, @data, :LITTLE_ENDIAN, :ERROR)
2083
- expect(BinaryAccessor.read(0, 64, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-272).of(data[0])
2084
- expect(BinaryAccessor.read(64, 64, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-236).of(data[1])
2085
- end
2086
-
2087
- it "complains about unaligned floats" do
2088
- expect { BinaryAccessor.write_array([0.0], 1, 32, :FLOAT, 32, @data, :LITTLE_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_offset 1 is not byte aligned for data_type FLOAT")
2089
- end
2090
-
2091
- it "complains about mis-sized floats" do
2092
- expect { BinaryAccessor.write_array([0.0], 0, 65, :FLOAT, 65, @data, :LITTLE_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_size is 65 but must be 32 or 64 for data_type FLOAT")
2093
- end
2094
-
2095
- end # given little endian data
2096
-
2097
- describe "should support overflow types" do
2098
- before(:each) do
2099
- @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2100
- end
2101
-
2102
- it "prevents overflow of STRING" do
2103
- expect { BinaryAccessor.write_array(["abcde"], 0, 32, :STRING, 32, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of 5 bytes does not fit into 4 bytes for data_type STRING")
2104
- end
2105
-
2106
- it "prevents overflow of BLOCK" do
2107
- expect { BinaryAccessor.write_array(["abcde"], 0, 32, :BLOCK, 32, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of 5 bytes does not fit into 4 bytes for data_type BLOCK")
2108
- end
2109
-
2110
- it "prevents overflow of 8-bit INT" do
2111
- bit_size = 8; data_type = :INT; value = 2 ** (bit_size - 1)
2112
- expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2113
- end
2114
-
2115
- it "prevents overflow of 16-bit INT" do
2116
- bit_size = 16; data_type = :INT; value = 2 ** (bit_size - 1)
2117
- expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2118
- end
2119
-
2120
- it "prevents overflow of 32-bit INT" do
2121
- bit_size = 32; data_type = :INT; value = 2 ** (bit_size - 1)
2122
- expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2123
- end
2124
-
2125
- it "prevents overflow of 64-bit INT" do
2126
- bit_size = 64; data_type = :INT; value = 2 ** (bit_size - 1)
2127
- expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2128
- end
2129
-
2130
- it "prevents overflow of 3-bit INT" do
2131
- bit_size = 3; data_type = :INT; value = 2 ** (bit_size - 1)
2132
- expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2133
- end
2134
-
2135
- it "prevents overflow of 8-bit UINT" do
2136
- bit_size = 8; data_type = :UINT; value = 2 ** bit_size
2137
- expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2138
- end
2139
-
2140
- it "prevents overflow of 16-bit UINT" do
2141
- bit_size = 16; data_type = :UINT; value = 2 ** bit_size
2142
- expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2143
- end
2144
-
2145
- it "prevents overflow of 32-bit UINT" do
2146
- bit_size = 32; data_type = :UINT; value = 2 ** bit_size
2147
- expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2148
- end
2149
-
2150
- it "prevents overflow of 64-bit UINT" do
2151
- bit_size = 64; data_type = :UINT; value = 2 ** bit_size
2152
- expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2153
- end
2154
-
2155
- it "prevents overflow of 3-bit UINT" do
2156
- bit_size = 3; data_type = :UINT; value = 2 ** bit_size
2157
- expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2158
- end
2159
-
2160
- it "truncates STRING" do
2161
- BinaryAccessor.write_array(["abcde"], 0, 32, :STRING, 32, @data, :BIG_ENDIAN, :TRUNCATE)
2162
- expect(@data[0..4]).to eql "abcd\x00"
2163
- end
2164
-
2165
- it "truncates BLOCK" do
2166
- BinaryAccessor.write_array(["abcde"], 0, 32, :BLOCK, 32, @data, :BIG_ENDIAN, :TRUNCATE)
2167
- expect(@data[0..4]).to eql "abcd\x00"
2168
- end
2169
-
2170
- it "truncates 8-bit INT" do
2171
- bit_size = 8; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
2172
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2173
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2174
- end
2175
-
2176
- it "truncates 16-bit INT" do
2177
- bit_size = 16; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
2178
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2179
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2180
- end
2181
-
2182
- it "truncates 32-bit INT" do
2183
- bit_size = 32; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
2184
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2185
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2186
- end
2187
-
2188
- it "truncates 64-bit INT" do
2189
- bit_size = 64; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
2190
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2191
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2192
- end
2193
-
2194
- it "truncates 3-bit INT" do
2195
- bit_size = 3; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
2196
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2197
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2198
- end
2199
-
2200
- it "truncates 8-bit UINT" do
2201
- bit_size = 8; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
2202
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2203
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2204
- end
2205
-
2206
- it "truncates 16-bit UINT" do
2207
- bit_size = 16; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
2208
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2209
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2210
- end
2211
-
2212
- it "truncates 32-bit UINT" do
2213
- bit_size = 32; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
2214
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2215
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2216
- end
2217
-
2218
- it "truncates 64-bit UINT" do
2219
- bit_size = 64; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
2220
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2221
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2222
- end
2223
-
2224
- it "truncates 3-bit UINT" do
2225
- bit_size = 3; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
2226
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2227
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2228
- end
2229
-
2230
- it "saturates 8-bit INT" do
2231
- bit_size = 8; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
2232
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2233
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2234
- end
2235
-
2236
- it "saturates 16-bit INT" do
2237
- bit_size = 16; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
2238
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2239
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2240
- end
2241
-
2242
- it "saturates 32-bit INT" do
2243
- bit_size = 32; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
2244
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2245
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2246
- end
2247
-
2248
- it "saturates 64-bit INT" do
2249
- bit_size = 64; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
2250
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2251
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2252
- end
2253
-
2254
- it "saturates 3-bit INT" do
2255
- bit_size = 3; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
2256
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2257
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2258
- end
2259
-
2260
- it "saturates 8-bit UINT" do
2261
- bit_size = 8; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
2262
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2263
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2264
- end
2265
-
2266
- it "saturates 16-bit UINT" do
2267
- bit_size = 16; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
2268
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2269
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2270
- end
2271
-
2272
- it "saturates 32-bit UINT" do
2273
- bit_size = 32; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
2274
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2275
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2276
- end
2277
-
2278
- it "saturates 64-bit UINT" do
2279
- bit_size = 64; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
2280
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2281
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2282
- end
2283
-
2284
- it "saturates 3-bit UINT" do
2285
- bit_size = 3; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
2286
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2287
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2288
- end
2289
-
2290
- it "allows hex value entry of 8-bit INT" do
2291
- bit_size = 8; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
2292
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
2293
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
2294
- end
2295
-
2296
- it "allows hex value entry of 16-bit INT" do
2297
- bit_size = 16; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
2298
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
2299
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
2300
- end
2301
-
2302
- it "allows hex value entry of 32-bit INT" do
2303
- bit_size = 32; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
2304
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
2305
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
2306
- end
2307
-
2308
- it "allows hex value entry of 64-bit INT" do
2309
- bit_size = 64; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
2310
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
2311
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
2312
- end
2313
-
2314
- it "allows hex value entry of 3-bit INT" do
2315
- bit_size = 3; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
2316
- BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
2317
- expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
2318
- end
2319
-
2320
- end
2321
-
2322
- end # describe "write_array"
2323
-
2324
- end # describe BinaryAccessor
2325
-
2326
- end # module Cosmos
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'spec_helper'
12
+ require 'cosmos'
13
+ require 'cosmos/packets/binary_accessor'
14
+
15
+ module Cosmos
16
+
17
+ describe BinaryAccessor do
18
+
19
+ describe "read only" do
20
+
21
+ before(:each) do
22
+ @data = "\x80\x81\x82\x83\x84\x85\x86\x87\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F"
23
+ end
24
+
25
+ it "complains about unrecognized data types" do
26
+ expect { BinaryAccessor.read(0, 32, :BLOB, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "data_type BLOB is not recognized")
27
+ end
28
+
29
+ it "complains about bit_offsets before the beginning of the buffer" do
30
+ expect { BinaryAccessor.read(-((@data.length * 8) + 8), 32, :STRING, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "#{@data.length} byte buffer insufficient to read STRING at bit_offset #{-((@data.length * 8) + 8)} with bit_size 32")
31
+ end
32
+
33
+ it "complains about a negative bit_offset and zero bit_size" do
34
+ expect { BinaryAccessor.read(-8, 0, :STRING, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "negative or zero bit_sizes (0) cannot be given with negative bit_offsets (-8)")
35
+ end
36
+
37
+ it "complains about a negative bit_offset and negative bit_size" do
38
+ expect { BinaryAccessor.read(-8, -8, :STRING, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "negative or zero bit_sizes (-8) cannot be given with negative bit_offsets (-8)")
39
+ end
40
+
41
+ it "complains about negative bit_sizes larger than the size of the buffer" do
42
+ expect { BinaryAccessor.read(0, -((@data.length * 8) + 8), :STRING, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "#{@data.length} byte buffer insufficient to read STRING at bit_offset 0 with bit_size #{-((@data.length * 8) + 8)}")
43
+ end
44
+
45
+ it "complains about negative or zero bit_sizes with data_types other than STRING and BLOCK" do
46
+ expect { BinaryAccessor.read(0, -8, :INT, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "bit_size -8 must be positive for data types other than :STRING and :BLOCK")
47
+ expect { BinaryAccessor.read(0, -8, :UINT, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "bit_size -8 must be positive for data types other than :STRING and :BLOCK")
48
+ expect { BinaryAccessor.read(0, -8, :FLOAT, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "bit_size -8 must be positive for data types other than :STRING and :BLOCK")
49
+ end
50
+
51
+ it "reads aligned strings" do
52
+ 0.step((@data.length - 1) * 8, 8) do |bit_offset|
53
+ if (bit_offset / 8) <= 7
54
+ expect(BinaryAccessor.read(bit_offset, (@data.length * 8) - bit_offset, :STRING, @data, :BIG_ENDIAN)).to eql(@data[(bit_offset / 8)..7])
55
+ elsif (bit_offset / 8) == 8
56
+ expect(BinaryAccessor.read(bit_offset, (@data.length * 8) - bit_offset, :STRING, @data, :BIG_ENDIAN)).to eql('')
57
+ else
58
+ expect(BinaryAccessor.read(bit_offset, (@data.length * 8) - bit_offset, :STRING, @data, :BIG_ENDIAN)).to eql(@data[(bit_offset / 8)..-1])
59
+ end
60
+ end
61
+ end
62
+
63
+ it "reads variable length strings with a zero and negative bit_size" do
64
+ 0.step(-(@data.length * 8), -8) do |bit_size|
65
+ if (bit_size / 8) >= -8
66
+ expect(BinaryAccessor.read(0, bit_size, :STRING, @data, :BIG_ENDIAN)).to eql(@data[0..7])
67
+ else
68
+ expect(BinaryAccessor.read(0, bit_size, :STRING, @data, :BIG_ENDIAN)).to eql(@data[0..((bit_size / 8) - 1)])
69
+ end
70
+ end
71
+ end
72
+
73
+ it "reads strings with negative bit_offsets" do
74
+ expect(BinaryAccessor.read(-16, 16, :STRING, @data, :BIG_ENDIAN)).to eql(@data[-2..-1])
75
+ end
76
+
77
+ it "complains about unaligned strings" do
78
+ expect { BinaryAccessor.read(1, 32, :STRING, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "bit_offset 1 is not byte aligned for data_type STRING")
79
+ end
80
+
81
+ it "reads aligned blocks" do
82
+ 0.step((@data.length - 1) * 8, 8) do |bit_offset|
83
+ expect(BinaryAccessor.read(bit_offset, (@data.length * 8) - bit_offset, :BLOCK, @data, :BIG_ENDIAN)).to eql(@data[(bit_offset / 8)..-1])
84
+ end
85
+ end
86
+
87
+ it "reads variable length blocks with a zero and negative bit_size" do
88
+ 0.step(-(@data.length * 8), -8) do |bit_size|
89
+ expect(BinaryAccessor.read(0, bit_size, :BLOCK, @data, :BIG_ENDIAN)).to eql(@data[0..((bit_size / 8) - 1)])
90
+ end
91
+ end
92
+
93
+ it "reads blocks with negative bit_offsets" do
94
+ expect(BinaryAccessor.read(-16, 16, :BLOCK, @data, :BIG_ENDIAN)).to eql(@data[-2..-1])
95
+ end
96
+
97
+ it "complains about unaligned blocks" do
98
+ expect { BinaryAccessor.read(7, 16, :BLOCK, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "bit_offset 7 is not byte aligned for data_type BLOCK")
99
+ end
100
+
101
+ it "complains if read exceeds the size of the buffer" do
102
+ expect { BinaryAccessor.read(8, 800, :STRING, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "16 byte buffer insufficient to read STRING at bit_offset 8 with bit_size 800")
103
+ end
104
+
105
+ it "reads aligned 8-bit unsigned integers" do
106
+ 0.step((@data.length - 1) * 8, 8) do |bit_offset|
107
+ expect(BinaryAccessor.read(bit_offset, 8, :UINT, @data, :BIG_ENDIAN)).to eql(@data.getbyte(bit_offset / 8))
108
+ end
109
+ end
110
+
111
+ it "reads aligned 8-bit signed integers" do
112
+ 0.step((@data.length - 1) * 8, 8) do |bit_offset|
113
+ expected = @data.getbyte(bit_offset / 8)
114
+ expected = expected - 256 if expected >= 128
115
+ expect(BinaryAccessor.read(bit_offset, 8, :INT, @data, :BIG_ENDIAN)).to eql(expected)
116
+ end
117
+ end
118
+
119
+ describe "given big endian data" do
120
+
121
+ it "reads 1-bit unsigned integers" do
122
+ expected = [0x1, 0x0]
123
+ bit_size = 1
124
+ expect(BinaryAccessor.read(8, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[0])
125
+ expect(BinaryAccessor.read(9, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[1])
126
+ end
127
+
128
+ it "reads 1-bit signed integers" do
129
+ expected = [0x1, 0x0]
130
+ bit_size = 1
131
+ expect(BinaryAccessor.read(8, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[0])
132
+ expect(BinaryAccessor.read(9, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[1])
133
+ end
134
+
135
+ it "reads 7-bit unsigned integers" do
136
+ expected = [0x40, 0x02]
137
+ bit_size = 7
138
+ expect(BinaryAccessor.read(8, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[0])
139
+ expect(BinaryAccessor.read(3, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[1])
140
+ end
141
+
142
+ it "reads 7-bit signed integers" do
143
+ expected = [0x40, 0x02]
144
+ bit_size = 7
145
+ expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
146
+ expect(BinaryAccessor.read(8, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[0])
147
+ expect(BinaryAccessor.read(3, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[1])
148
+ end
149
+
150
+ it "reads 13-bit unsigned integers" do
151
+ expected = [0x1C24, 0x20]
152
+ bit_size = 13
153
+ expect(BinaryAccessor.read(30, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[0])
154
+ expect(BinaryAccessor.read(1, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[1])
155
+ end
156
+
157
+ it "reads 13-bit signed integers" do
158
+ expected = [0x1C24, 0x20]
159
+ bit_size = 13
160
+ expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
161
+ expect(BinaryAccessor.read(30, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[0])
162
+ expect(BinaryAccessor.read(1, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[1])
163
+ end
164
+
165
+ it "reads aligned 16-bit unsigned integers" do
166
+ expected_array = [0x8081, 0x8283, 0x8485, 0x8687, 0x0009, 0x0A0B, 0x0C0D, 0x0E0F]
167
+ index = 0
168
+ 0.step((@data.length - 1) * 8, 16) do |bit_offset|
169
+ expect(BinaryAccessor.read(bit_offset, 16, :UINT, @data, :BIG_ENDIAN)).to eql(expected_array[index])
170
+ index += 1
171
+ end
172
+ end
173
+
174
+ it "reads aligned 16-bit signed integers" do
175
+ expected_array = [0x8081, 0x8283, 0x8485, 0x8687, 0x0009, 0x0A0B, 0x0C0D, 0x0E0F]
176
+ index = 0
177
+ 0.step((@data.length - 1) * 8, 16) do |bit_offset|
178
+ expected = expected_array[index]
179
+ expected = expected - 2**16 if expected >= 2**15
180
+ expect(BinaryAccessor.read(bit_offset, 16, :INT, @data, :BIG_ENDIAN)).to eql(expected)
181
+ index += 1
182
+ end
183
+ end
184
+
185
+ it "reads aligned 32-bit unsigned integers" do
186
+ expected_array = [0x80818283, 0x84858687, 0x00090A0B, 0x0C0D0E0F]
187
+ index = 0
188
+ 0.step((@data.length - 1) * 8, 32) do |bit_offset|
189
+ expect(BinaryAccessor.read(bit_offset, 32, :UINT, @data, :BIG_ENDIAN)).to eql(expected_array[index])
190
+ index += 1
191
+ end
192
+ end
193
+
194
+ it "reads aligned 32-bit signed integers" do
195
+ expected_array = [0x80818283, 0x84858687, 0x00090A0B, 0x0C0D0E0F]
196
+ index = 0
197
+ 0.step((@data.length - 1) * 8, 32) do |bit_offset|
198
+ expected = expected_array[index]
199
+ expected = expected - 2**32 if expected >= 2**31
200
+ expect(BinaryAccessor.read(bit_offset, 32, :INT, @data, :BIG_ENDIAN)).to eql(expected)
201
+ index += 1
202
+ end
203
+ end
204
+
205
+ it "reads aligned 32-bit floats" do
206
+ expected_array = [-1.189360e-038, -3.139169e-036, 8.301067e-040, 1.086646e-031]
207
+ expect(BinaryAccessor.read(0, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-038).of(expected_array[0])
208
+ expect(BinaryAccessor.read(32, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-036).of(expected_array[1])
209
+ expect(BinaryAccessor.read(64, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-040).of(expected_array[2])
210
+ expect(BinaryAccessor.read(96, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-031).of(expected_array[3])
211
+ end
212
+
213
+ it "reads 37-bit unsigned integers" do
214
+ expected = [0x8182838485 >> 3, 0x00090A0B0C]
215
+ bit_size = 37
216
+ expect(BinaryAccessor.read(8, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[0])
217
+ expect(BinaryAccessor.read(67, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[1])
218
+ end
219
+
220
+ it "reads 37-bit signed integers" do
221
+ expected = [0x8182838485 >> 3, 0x00090A0B0C]
222
+ bit_size = 37
223
+ expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
224
+ expect(BinaryAccessor.read(8, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[0])
225
+ expect(BinaryAccessor.read(67, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[1])
226
+ end
227
+
228
+ it "reads 63-bit unsigned integers" do
229
+ expected = [0x8081828384858687 >> 1, 0x00090A0B0C0D0E0F]
230
+ bit_size = 63
231
+ expect(BinaryAccessor.read(0, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[0])
232
+ expect(BinaryAccessor.read(65, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[1])
233
+ end
234
+
235
+ it "reads 63-bit signed integers" do
236
+ expected = [0x8081828384858687 >> 1, 0x00090A0B0C0D0E0F]
237
+ bit_size = 63
238
+ expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
239
+ expect(BinaryAccessor.read(0, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[0])
240
+ expect(BinaryAccessor.read(65, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[1])
241
+ end
242
+
243
+ it "reads 67-bit unsigned integers" do
244
+ expected = [0x808182838485868700 >> 5, 0x8700090A0B0C0D0E0F >> 5]
245
+ bit_size = 67
246
+ expect(BinaryAccessor.read(0, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[0])
247
+ expect(BinaryAccessor.read(56, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[1])
248
+ end
249
+
250
+ it "reads 67-bit signed integers" do
251
+ expected = [0x808182838485868700 >> 5, 0x8700090A0B0C0D0E0F >> 5]
252
+ bit_size = 67
253
+ expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
254
+ expect(BinaryAccessor.read(0, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[0])
255
+ expect(BinaryAccessor.read(56, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[1])
256
+ end
257
+
258
+ it "reads aligned 64-bit unsigned integers" do
259
+ expected_array = [0x8081828384858687, 0x00090A0B0C0D0E0F]
260
+ index = 0
261
+ 0.step((@data.length - 1) * 8, 64) do |bit_offset|
262
+ expect(BinaryAccessor.read(bit_offset, 64, :UINT, @data, :BIG_ENDIAN)).to eql(expected_array[index])
263
+ index += 1
264
+ end
265
+ end
266
+
267
+ it "reads aligned 64-bit signed integers" do
268
+ expected_array = [0x8081828384858687, 0x00090A0B0C0D0E0F]
269
+ index = 0
270
+ 0.step((@data.length - 1) * 8, 64) do |bit_offset|
271
+ expected = expected_array[index]
272
+ expected = expected - 2**64 if expected >= 2**63
273
+ expect(BinaryAccessor.read(bit_offset, 64, :INT, @data, :BIG_ENDIAN)).to eql(expected)
274
+ index += 1
275
+ end
276
+ end
277
+
278
+ it "reads aligned 64-bit floats" do
279
+ expected_array = [-3.116851e-306, 1.257060e-308]
280
+ expect(BinaryAccessor.read(0, 64, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-306).of(expected_array[0])
281
+ expect(BinaryAccessor.read(64, 64, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-308).of(expected_array[1])
282
+ end
283
+
284
+ it "complains about unaligned floats" do
285
+ expect { BinaryAccessor.read(17, 32, :FLOAT, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "bit_offset 17 is not byte aligned for data_type FLOAT")
286
+ end
287
+
288
+ it "complains about mis-sized floats" do
289
+ expect { BinaryAccessor.read(0, 33, :FLOAT, @data, :BIG_ENDIAN) }.to raise_error(ArgumentError, "bit_size is 33 but must be 32 or 64 for data_type FLOAT")
290
+ end
291
+
292
+ end # given big endian data
293
+
294
+ describe "given little endian data" do
295
+
296
+ it "complains about ill-defined little endian bitfields" do
297
+ expect { BinaryAccessor.read(3, 7, :UINT, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "LITTLE_ENDIAN bitfield with bit_offset 3 and bit_size 7 is invalid")
298
+ end
299
+
300
+ it "reads 1-bit unsigned integers" do
301
+ expected = [0x1, 0x0]
302
+ bit_size = 1
303
+ expect(BinaryAccessor.read(8, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
304
+ expect(BinaryAccessor.read(9, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
305
+ end
306
+
307
+ it "reads 1-bit signed integers" do
308
+ expected = [0x1, 0x0]
309
+ bit_size = 1
310
+ expect(BinaryAccessor.read(8, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
311
+ expect(BinaryAccessor.read(9, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
312
+ end
313
+
314
+ it "reads 7-bit unsigned integers" do
315
+ expected = [0x40, 0x60]
316
+ bit_size = 7
317
+ expect(BinaryAccessor.read(8, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
318
+ expect(BinaryAccessor.read(15, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
319
+ end
320
+
321
+ it "reads 7-bit signed integers" do
322
+ expected = [0x40, 0x60]
323
+ bit_size = 7
324
+ expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
325
+ expect(BinaryAccessor.read(8, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
326
+ expect(BinaryAccessor.read(15, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
327
+ end
328
+
329
+ it "reads 13-bit unsigned integers" do
330
+ expected = [0x038281 >> 5, 0x0180 >> 2]
331
+ bit_size = 13
332
+ expect(BinaryAccessor.read(30, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
333
+ expect(BinaryAccessor.read(9, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
334
+ end
335
+
336
+ it "reads 13-bit signed integers" do
337
+ expected = [0x038281 >> 5, 0x0180 >> 2]
338
+ bit_size = 13
339
+ expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
340
+ expect(BinaryAccessor.read(30, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
341
+ expect(BinaryAccessor.read(9, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
342
+ end
343
+
344
+ it "reads aligned 16-bit unsigned integers" do
345
+ expected_array = [0x8180, 0x8382, 0x8584, 0x8786, 0x0900, 0x0B0A, 0x0D0C, 0x0F0E]
346
+ index = 0
347
+ 0.step((@data.length - 1) * 8, 16) do |bit_offset|
348
+ expect(BinaryAccessor.read(bit_offset, 16, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected_array[index])
349
+ index += 1
350
+ end
351
+ end
352
+
353
+ it "reads aligned 16-bit signed integers" do
354
+ expected_array = [0x8180, 0x8382, 0x8584, 0x8786, 0x0900, 0x0B0A, 0x0D0C, 0x0F0E]
355
+ index = 0
356
+ 0.step((@data.length - 1) * 8, 16) do |bit_offset|
357
+ expected = expected_array[index]
358
+ expected = expected - 2**16 if expected >= 2**15
359
+ expect(BinaryAccessor.read(bit_offset, 16, :INT, @data, :LITTLE_ENDIAN)).to eql(expected)
360
+ index += 1
361
+ end
362
+ end
363
+
364
+ it "reads aligned 32-bit unsigned integers" do
365
+ expected_array = [0x83828180, 0x87868584, 0x0B0A0900, 0x0F0E0D0C]
366
+ index = 0
367
+ 0.step((@data.length - 1) * 8, 32) do |bit_offset|
368
+ expect(BinaryAccessor.read(bit_offset, 32, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected_array[index])
369
+ index += 1
370
+ end
371
+ end
372
+
373
+ it "reads aligned 32-bit signed integers" do
374
+ expected_array = [0x83828180, 0x87868584, 0x0B0A0900, 0x0F0E0D0C]
375
+ index = 0
376
+ 0.step((@data.length - 1) * 8, 32) do |bit_offset|
377
+ expected = expected_array[index]
378
+ expected = expected - 2**32 if expected >= 2**31
379
+ expect(BinaryAccessor.read(bit_offset, 32, :INT, @data, :LITTLE_ENDIAN)).to eql(expected)
380
+ index += 1
381
+ end
382
+ end
383
+
384
+ it "reads aligned 32-bit floats" do
385
+ expected_array = [-7.670445e-037, -2.024055e-034, 2.658460e-032, 7.003653e-030]
386
+ expect(BinaryAccessor.read(0, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-037).of(expected_array[0])
387
+ expect(BinaryAccessor.read(32, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-034).of(expected_array[1])
388
+ expect(BinaryAccessor.read(64, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-032).of(expected_array[2])
389
+ expect(BinaryAccessor.read(96, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-030).of(expected_array[3])
390
+ end
391
+
392
+ it "reads 37-bit unsigned integers" do
393
+ expected = [0x8584838281 >> 3, 0x0F0E0D0C0B]
394
+ bit_size = 37
395
+ expect(BinaryAccessor.read(40, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
396
+ expect(BinaryAccessor.read(123, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
397
+ end
398
+
399
+ it "reads 37-bit signed integers" do
400
+ expected = [0x8584838281 >> 3, 0x0F0E0D0C0B]
401
+ bit_size = 37
402
+ expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
403
+ expect(BinaryAccessor.read(40, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
404
+ expect(BinaryAccessor.read(123, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
405
+ end
406
+
407
+ it "reads 63-bit unsigned integers" do
408
+ expected = [0x0F0E0D0C0B0A0900 >> 1, 0x0786858483828180]
409
+ bit_size = 63
410
+ expect(BinaryAccessor.read(120, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
411
+ expect(BinaryAccessor.read(57, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
412
+ end
413
+
414
+ it "reads 63-bit signed integers" do
415
+ expected = [0x0F0E0D0C0B0A0900 >> 1, 0x0786858483828180]
416
+ bit_size = 63
417
+ expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
418
+ expect(BinaryAccessor.read(120, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
419
+ expect(BinaryAccessor.read(57, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
420
+ end
421
+
422
+ it "reads 67-bit unsigned integers" do
423
+ expected = [0x0F0E0D0C0B0A090087 >> 5]
424
+ bit_size = 67
425
+ expect(BinaryAccessor.read(120, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
426
+ end
427
+
428
+ it "reads 67-bit signed integers" do
429
+ expected = [0x0F0E0D0C0B0A090087 >> 5]
430
+ bit_size = 67
431
+ expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
432
+ expect(BinaryAccessor.read(120, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
433
+ end
434
+
435
+ it "reads aligned 64-bit unsigned integers" do
436
+ expected_array = [0x8786858483828180, 0x0F0E0D0C0B0A0900]
437
+ index = 0
438
+ 0.step((@data.length - 1) * 8, 64) do |bit_offset|
439
+ expect(BinaryAccessor.read(bit_offset, 64, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected_array[index])
440
+ index += 1
441
+ end
442
+ end
443
+
444
+ it "reads aligned 64-bit signed integers" do
445
+ expected_array = [0x8786858483828180, 0x0F0E0D0C0B0A0900]
446
+ index = 0
447
+ 0.step((@data.length - 1) * 8, 64) do |bit_offset|
448
+ expected = expected_array[index]
449
+ expected = expected - 2**64 if expected >= 2**63
450
+ expect(BinaryAccessor.read(bit_offset, 64, :INT, @data, :LITTLE_ENDIAN)).to eql(expected)
451
+ index += 1
452
+ end
453
+ end
454
+
455
+ it "reads aligned 64-bit floats" do
456
+ expected_array = [-2.081577e-272, 3.691916e-236]
457
+ expect(BinaryAccessor.read(0, 64, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-272).of(expected_array[0])
458
+ expect(BinaryAccessor.read(64, 64, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-236).of(expected_array[1])
459
+ end
460
+
461
+ it "complains about unaligned floats" do
462
+ expect { BinaryAccessor.read(1, 32, :FLOAT, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "bit_offset 1 is not byte aligned for data_type FLOAT")
463
+ end
464
+
465
+ it "complains about mis-sized floats" do
466
+ expect { BinaryAccessor.read(0, 65, :FLOAT, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "bit_size is 65 but must be 32 or 64 for data_type FLOAT")
467
+ end
468
+
469
+ end # little endian
470
+ end # describe 'read'
471
+
472
+ describe "read_array" do
473
+
474
+ before(:each) do
475
+ @data = "\x80\x81\x82\x83\x84\x85\x86\x87\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F"
476
+ end
477
+
478
+ it "complains with unknown data_type" do
479
+ expect { BinaryAccessor.read_array(0, 8, :BLAH, 0, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "data_type BLAH is not recognized")
480
+ end
481
+
482
+ describe "given little endian data" do
483
+
484
+ it "complains about negative bit sizes" do
485
+ expect { BinaryAccessor.read_array(0, -8, :UINT, @data.length*8, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "bit_size -8 must be positive for arrays")
486
+ end
487
+
488
+ context "when positive or zero bit_offset" do
489
+ it "reads the given array_size amount of items" do
490
+ data = @data.unpack('C*')
491
+ expect(BinaryAccessor.read_array(0, 8, :UINT, 32, @data, :LITTLE_ENDIAN)).to eql(data[0..3])
492
+ end
493
+
494
+ it "reads the given array_size amount of items" do
495
+ data = @data.unpack('C*')
496
+ expect(BinaryAccessor.read_array(32, 8, :UINT, 32, @data, :LITTLE_ENDIAN)).to eql(data[4..7])
497
+ end
498
+
499
+ it "reads the total buffer given array_size = buffer size" do
500
+ data = @data.unpack('c*')
501
+
502
+ expect(BinaryAccessor.read_array(0, 8, :INT, @data.length*8, @data, :LITTLE_ENDIAN)).to eql(data)
503
+ end
504
+
505
+ it "complains with an array_size not a multiple of bit_size" do
506
+ data = @data.unpack('C*')
507
+ expect { BinaryAccessor.read_array(0, 8, :UINT, 10, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "array_size 10 not a multiple of bit_size 8")
508
+ end
509
+
510
+ it "reads as many items as possible with a zero array_size" do
511
+ data = @data.unpack('C*')
512
+ expect(BinaryAccessor.read_array(0, 8, :UINT, 0, @data, :LITTLE_ENDIAN)).to eql(data)
513
+ end
514
+
515
+ it "excludes the remaining bits if array_size is negative" do
516
+ data = @data.unpack('C*')
517
+ expect(BinaryAccessor.read_array(0, 8, :UINT, -32, @data, :LITTLE_ENDIAN)).to eql(data[0..-5])
518
+ end
519
+
520
+ it "returns an empty array if the offset equals the negative array size" do
521
+ data = @data.unpack('C*')
522
+ expect(BinaryAccessor.read_array(@data.length*8-32, 8, :UINT, -32, @data, :LITTLE_ENDIAN)).to eql([])
523
+ end
524
+
525
+ it "complains if the offset is greater than the negative array size" do
526
+ data = @data.unpack('C*')
527
+ offset = @data.length * 8 - 16
528
+ expect { BinaryAccessor.read_array(offset, 8, :UINT, -32, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "16 byte buffer insufficient to read UINT at bit_offset #{offset} with bit_size 8")
529
+ end
530
+ end
531
+
532
+ context "when negative bit_offset" do
533
+ it "reads an array of aligned 8 bit unsigned integers" do
534
+ data = @data.unpack('C*')
535
+ expect(BinaryAccessor.read_array(-32, 8, :UINT, 32, @data, :LITTLE_ENDIAN)).to eql(data[-4..-1])
536
+ end
537
+
538
+ it "reads an array if the negative offset is the size of the array" do
539
+ data = @data.unpack('C*')
540
+ expect(BinaryAccessor.read_array(-(@data.length*8), 8, :UINT, @data.length*8, @data, :LITTLE_ENDIAN)).to eql(data)
541
+ end
542
+
543
+ it "complains if the offset is larger than the buffer" do
544
+ expect { BinaryAccessor.read_array(-(@data.length*8+1), 8, :UINT, @data.length*8, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "#{@data.length} byte buffer insufficient to read #{:UINT} at bit_offset -#{@data.length*8+1} with bit_size 8")
545
+ end
546
+
547
+ it "complains with zero array_size" do
548
+ expect { BinaryAccessor.read_array(-32, 8, :UINT, 0, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "negative or zero array_size (0) cannot be given with negative bit_offset (-32)")
549
+ end
550
+
551
+ it "complains with negative array_size" do
552
+ expect { BinaryAccessor.read_array(-32, 8, :UINT, -8, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "negative or zero array_size (-8) cannot be given with negative bit_offset (-32)")
553
+ end
554
+ end
555
+
556
+ it "complains about accessing data from a buffer which is too small" do
557
+ expect { BinaryAccessor.read_array(0, 256, :STRING, 256, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "16 byte buffer insufficient to read STRING at bit_offset 0 with bit_size 256")
558
+ end
559
+
560
+ it "returns an empty array when passed a zero length buffer" do
561
+ expect(BinaryAccessor.read_array(0, 8, :UINT, 32, "", :LITTLE_ENDIAN)).to eql([])
562
+ end
563
+
564
+ it "complains about unaligned strings" do
565
+ expect { BinaryAccessor.read_array(1, 32, :STRING, 32, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "bit_offset 1 is not byte aligned for data_type STRING")
566
+ end
567
+
568
+ it "reads a single STRING item" do
569
+ expect(BinaryAccessor.read_array(0, 128, :STRING, 0, @data, :LITTLE_ENDIAN)).to eql([@data[0..7]])
570
+ end
571
+
572
+ it "reads a single BLOCK item" do
573
+ expect(BinaryAccessor.read_array(0, 128, :BLOCK, 0, @data, :LITTLE_ENDIAN)).to eql([@data])
574
+ end
575
+
576
+ it "reads BLOCK items" do
577
+ data = BinaryAccessor.read_array(0, 8, :BLOCK, 0, @data, :LITTLE_ENDIAN)
578
+ data.each_with_index {|val, i| expect(val).to eql(@data[i]) }
579
+ end
580
+
581
+ it "reads 1-bit integers" do
582
+ expected = [0x1, 0x0, 0x0, 0x0]
583
+ expect(BinaryAccessor.read_array(0, 1, :INT, 4, @data, :LITTLE_ENDIAN)).to eql(expected)
584
+ expect(BinaryAccessor.read_array(0, 1, :INT, 2, @data, :LITTLE_ENDIAN)).to eql(expected[0..1])
585
+ end
586
+
587
+ it "complains about little endian bit-fields greater than 1-bit" do
588
+ expect { BinaryAccessor.read_array(8, 7, :UINT, 21, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "read_array does not support little endian bit fields with bit_size greater than 1-bit")
589
+ end
590
+
591
+ it "reads 16 bit UINT items" do
592
+ data = [0x8180, 0x8382, 0x8584, 0x8786, 0x0900, 0x0B0A, 0x0D0C, 0x0F0E]
593
+ expect(BinaryAccessor.read_array(0, 16, :UINT, 0, @data, :LITTLE_ENDIAN)).to eql(data)
594
+ end
595
+
596
+ it "reads 16 bit INT items" do
597
+ data = [0x8180, 0x8382, 0x8584, 0x8786, 0x0900, 0x0B0A, 0x0D0C, 0x0F0E]
598
+ data.map! {|x| (x & ~(1 << 15)) - (x & (1 << 15)) } # convert to negative
599
+ expect(BinaryAccessor.read_array(0, 16, :INT, 0, @data, :LITTLE_ENDIAN)).to eql(data)
600
+ end
601
+
602
+ it "reads 32 bit UINT items" do
603
+ data = [0x83828180, 0x87868584, 0x0B0A0900, 0x0F0E0D0C]
604
+ expect(BinaryAccessor.read_array(0, 32, :UINT, 0, @data, :LITTLE_ENDIAN)).to eql(data)
605
+ end
606
+
607
+ it "reads 32 bit INT items" do
608
+ data = [0x83828180, 0x87868584, 0x0B0A0900, 0x0F0E0D0C]
609
+ data.map! {|x| (x & ~(1 << 31)) - (x & (1 << 31)) } # convert to negative
610
+ expect(BinaryAccessor.read_array(0, 32, :INT, 0, @data, :LITTLE_ENDIAN)).to eql(data)
611
+ end
612
+
613
+ it "reads 64 bit UINT items" do
614
+ data = [0x8786858483828180, 0x0F0E0D0C0B0A0900]
615
+ expect(BinaryAccessor.read_array(0, 64, :UINT, 0, @data, :LITTLE_ENDIAN)).to eql(data)
616
+ end
617
+
618
+ it "reads 64 bit INT items" do
619
+ data = [0x8786858483828180, 0x0F0E0D0C0B0A0900]
620
+ data.map! {|x| (x & ~(1 << 63)) - (x & (1 << 63)) } # convert to negative
621
+ expect(BinaryAccessor.read_array(0, 64, :INT, 0, @data, :LITTLE_ENDIAN)).to eql(data)
622
+ end
623
+
624
+ it "reads aligned 32-bit floats" do
625
+ expected_array = [-7.670445e-037, -2.024055e-034, 2.658460e-032, 7.003653e-030]
626
+ actual = BinaryAccessor.read_array(0, 32, :FLOAT, 0, @data, :LITTLE_ENDIAN)
627
+ actual.each_with_index do |val, index|
628
+ expect(val).to be_within(1.0e-030).of(expected_array[index])
629
+ end
630
+ end
631
+
632
+ it "reads aligned 64-bit floats" do
633
+ expected_array = [-2.081577e-272, 3.691916e-236]
634
+ actual = BinaryAccessor.read_array(0, 64, :FLOAT, 0, @data, :LITTLE_ENDIAN)
635
+ actual.each_with_index do |val, index|
636
+ expect(val).to be_within(1.0e-236).of(expected_array[index])
637
+ end
638
+ end
639
+
640
+ it "complains about unaligned floats" do
641
+ expect { BinaryAccessor.read_array(1, 32, :FLOAT, 32, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "bit_offset 1 is not byte aligned for data_type FLOAT")
642
+ end
643
+
644
+ it "complains about mis-sized floats" do
645
+ expect { BinaryAccessor.read_array(0, 65, :FLOAT, 65, @data, :LITTLE_ENDIAN) }.to raise_error(ArgumentError, "bit_size is 65 but must be 32 or 64 for data_type FLOAT")
646
+ end
647
+ end # given little endian data
648
+
649
+ describe "given big endian data" do
650
+
651
+ it "reads 7-bit unsigned integers" do
652
+ expected = [0x40, 0x60, 0x50]
653
+ bit_size = 7
654
+ expect(BinaryAccessor.read_array(8, bit_size, :UINT, 21, @data, :BIG_ENDIAN)).to eql(expected)
655
+ end
656
+
657
+ it "reads 16 bit UINT items" do
658
+ data = [0x8081, 0x8283, 0x8485, 0x8687, 0x0009, 0x0A0B, 0x0C0D, 0x0E0F]
659
+ expect(BinaryAccessor.read_array(0, 16, :UINT, 0, @data, :BIG_ENDIAN)).to eql(data)
660
+ end
661
+
662
+ it "reads 16 bit INT items" do
663
+ data = [0x8081, 0x8283, 0x8485, 0x8687, 0x0009, 0x0A0B, 0x0C0D, 0x0E0F]
664
+ data.map! {|x| (x & ~(1 << 15)) - (x & (1 << 15)) } # convert to negative
665
+ expect(BinaryAccessor.read_array(0, 16, :INT, 0, @data, :BIG_ENDIAN)).to eql(data)
666
+ end
667
+
668
+ it "reads 32 bit UINT items" do
669
+ data = [0x80818283, 0x84858687, 0x00090A0B, 0x0C0D0E0F]
670
+ expect(BinaryAccessor.read_array(0, 32, :UINT, 0, @data, :BIG_ENDIAN)).to eql(data)
671
+ end
672
+
673
+ it "reads 32 bit INT items" do
674
+ data = [0x80818283, 0x84858687, 0x00090A0B, 0x0C0D0E0F]
675
+ data.map! {|x| (x & ~(1 << 31)) - (x & (1 << 31)) } # convert to negative
676
+ expect(BinaryAccessor.read_array(0, 32, :INT, 0, @data, :BIG_ENDIAN)).to eql(data)
677
+ end
678
+
679
+ it "reads 64 bit UINT items" do
680
+ data = [0x8081828384858687, 0x00090A0B0C0D0E0F]
681
+ expect(BinaryAccessor.read_array(0, 64, :UINT, 0, @data, :BIG_ENDIAN)).to eql(data)
682
+ end
683
+
684
+ it "reads 64 bit INT items" do
685
+ data = [0x8081828384858687, 0x00090A0B0C0D0E0F]
686
+ data.map! {|x| (x & ~(1 << 63)) - (x & (1 << 63)) } # convert to negative
687
+ expect(BinaryAccessor.read_array(0, 64, :INT, 0, @data, :BIG_ENDIAN)).to eql(data)
688
+ end
689
+
690
+ it "reads aligned 32-bit floats" do
691
+ expected_array = [-1.189360e-038, -3.139169e-036, 8.301067e-040, 1.086646e-031]
692
+ actual = BinaryAccessor.read_array(0, 32, :FLOAT, 0, @data, :BIG_ENDIAN)
693
+ actual.each_with_index do |val, index|
694
+ expect(val).to be_within(1.0e-030).of(expected_array[index])
695
+ end
696
+ end
697
+
698
+ it "reads aligned 64-bit floats" do
699
+ expected_array = [-3.116851e-306, 1.257060e-308]
700
+ actual = BinaryAccessor.read_array(0, 64, :FLOAT, 0, @data, :BIG_ENDIAN)
701
+ actual.each_with_index do |val, index|
702
+ expect(val).to be_within(1.0e-236).of(expected_array[index])
703
+ end
704
+ end
705
+ end # given big endian data
706
+ end # describe "read_array"
707
+
708
+ describe "write only" do
709
+
710
+ before(:each) do
711
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
712
+ @baseline_data = "\x80\x81\x82\x83\x84\x85\x86\x87\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F"
713
+ end
714
+
715
+ it "complains about unrecognized data types" do
716
+ expect { BinaryAccessor.write(0, 0, 32, :BLOB, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "data_type BLOB is not recognized")
717
+ end
718
+
719
+ it "complains about bit_offsets before the beginning of the buffer" do
720
+ expect { BinaryAccessor.write('', -((@data.length * 8) + 8), 32, :STRING, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "#{@data.length} byte buffer insufficient to write STRING at bit_offset #{-((@data.length * 8) + 8)} with bit_size 32")
721
+ end
722
+
723
+ it "complains about a negative bit_offset and zero bit_size" do
724
+ expect { BinaryAccessor.write('', -8, 0, :STRING, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "negative or zero bit_sizes (0) cannot be given with negative bit_offsets (-8)")
725
+ end
726
+
727
+ it "complains about a negative bit_offset and negative bit_size" do
728
+ expect { BinaryAccessor.write('', -8, -8, :STRING, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "negative or zero bit_sizes (-8) cannot be given with negative bit_offsets (-8)")
729
+ end
730
+
731
+ it "complains about negative or zero bit_sizes with data_types other than STRING and BLOCK" do
732
+ expect { BinaryAccessor.write(0, 0, -8, :INT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_size -8 must be positive for data types other than :STRING and :BLOCK")
733
+ expect { BinaryAccessor.write(0, 0, -8, :UINT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_size -8 must be positive for data types other than :STRING and :BLOCK")
734
+ expect { BinaryAccessor.write(0, 0, -8, :FLOAT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_size -8 must be positive for data types other than :STRING and :BLOCK")
735
+ end
736
+
737
+ it "writes aligned strings" do
738
+ 0.step((@data.length - 1) * 8, 8) do |bit_offset|
739
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
740
+ @expected_data = @baseline_data.clone
741
+ first_byte_index = bit_offset / 8
742
+ if first_byte_index > 0
743
+ @expected_data[0..(first_byte_index - 1)] = "\x00" * first_byte_index
744
+ end
745
+ BinaryAccessor.write(@baseline_data[first_byte_index..-1], bit_offset, (@data.length * 8) - bit_offset, :STRING, @data, :BIG_ENDIAN, :ERROR)
746
+ expect(@data).to eql(@expected_data)
747
+ end
748
+ end
749
+
750
+ it "writes variable length strings with a zero and negative bit_size" do
751
+ 0.step(-(@baseline_data.length * 8), -8) do |bit_size|
752
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
753
+ @expected_data = @baseline_data.clone + ("\x00" * -(bit_size / 8))
754
+ BinaryAccessor.write(@baseline_data, 0, bit_size, :STRING, @data, :BIG_ENDIAN, :ERROR)
755
+ expect(@data).to eql(@expected_data)
756
+ end
757
+ end
758
+
759
+ it "writes strings with negative bit_offsets" do
760
+ BinaryAccessor.write(@baseline_data[14..15], -16, 16, :STRING, @data, :BIG_ENDIAN, :ERROR)
761
+ expect(@data).to eql(("\x00" * 14) + @baseline_data[14..15])
762
+ end
763
+
764
+ it "complains about unaligned strings" do
765
+ expect { BinaryAccessor.write('', 1, 32, :STRING, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_offset 1 is not byte aligned for data_type STRING")
766
+ end
767
+
768
+ it "writes aligned blocks" do
769
+ 0.step((@data.length - 1) * 8, 8) do |bit_offset|
770
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
771
+ @expected_data = @baseline_data.clone
772
+ first_byte_index = bit_offset / 8
773
+ if first_byte_index > 0
774
+ @expected_data[0..(first_byte_index - 1)] = "\x00" * first_byte_index
775
+ end
776
+ BinaryAccessor.write(@baseline_data[first_byte_index..-1], bit_offset, (@data.length * 8) - bit_offset, :BLOCK, @data, :BIG_ENDIAN, :ERROR)
777
+ expect(@data).to eql(@expected_data)
778
+ end
779
+ end
780
+
781
+ it "writes variable length blocks with a zero and negative bit_size" do
782
+ 0.step(-(@data.length * 8), -8) do |bit_size|
783
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
784
+ @expected_data = @baseline_data.clone + ("\x00" * -(bit_size / 8))
785
+ BinaryAccessor.write(@baseline_data, 0, bit_size, :BLOCK, @data, :BIG_ENDIAN, :ERROR)
786
+ expect(@data).to eql(@expected_data)
787
+ end
788
+ end
789
+
790
+ context "when negative bit size" do
791
+ it "writes a block to an empty buffer" do
792
+ data = ''
793
+ 512.times do |index|
794
+ data << [index].pack("n")
795
+ end
796
+ buffer = ""
797
+ expect { BinaryAccessor.write(data, 0, -16, :BLOCK, buffer, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "0 byte buffer insufficient to write BLOCK at bit_offset 0 with bit_size -16")
798
+ end
799
+
800
+ it "handles a huge bit offset with small buffer" do
801
+ data = ''
802
+ 512.times do |index|
803
+ data << [index].pack("n")
804
+ end
805
+ buffer = ""
806
+ expect { BinaryAccessor.write(data, 1024, 0, :BLOCK, buffer, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "0 byte buffer insufficient to write BLOCK at bit_offset 1024 with bit_size 0")
807
+ end
808
+
809
+ it "handles an edge case bit offset" do
810
+ data = ''
811
+ 512.times do |index|
812
+ data << [index].pack("n")
813
+ end
814
+ buffer = "\x00" * 127
815
+ expect { BinaryAccessor.write(data, 1024, 0, :BLOCK, buffer, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "127 byte buffer insufficient to write BLOCK at bit_offset 1024 with bit_size 0")
816
+ end
817
+
818
+ it "writes a block to a small buffer preserving the end" do
819
+ data = ''
820
+ 512.times do |index|
821
+ data << [index].pack("n")
822
+ end
823
+ preserve = [0xBEEF].pack("n")
824
+ buffer = preserve.clone # Should preserve this
825
+ BinaryAccessor.write(data, 0, -16, :BLOCK, buffer, :BIG_ENDIAN, :ERROR)
826
+ expect(buffer[0..-3]).to eql data
827
+ expect(buffer[-2..-1]).to eql preserve
828
+ data = BinaryAccessor.read(0, data.length*8 + 16, :BLOCK, buffer, :BIG_ENDIAN)
829
+ expect(data).to eql buffer
830
+ end
831
+
832
+ it "writes a block to another small buffer preserving the end" do
833
+ data = ''
834
+ 512.times do |index|
835
+ data << [index].pack("n")
836
+ end
837
+ preserve = [0xBEEF0123].pack("N")
838
+ buffer = "\x00\x01" + preserve.clone # Should preserve this
839
+ BinaryAccessor.write(data, 16, -32, :BLOCK, buffer, :BIG_ENDIAN, :ERROR)
840
+ expect(buffer[0..1]).to eql "\x00\x01"
841
+ expect(buffer[2..-5]).to eql data
842
+ expect(buffer[-4..-1]).to eql preserve
843
+ data = BinaryAccessor.read(0, 16 + data.length*8 + 32, :BLOCK, buffer, :BIG_ENDIAN)
844
+ expect(data).to eql buffer
845
+ end
846
+
847
+ it "writes a block to a small buffer overwriting the end" do
848
+ data = ''
849
+ 512.times do |index|
850
+ data << [index].pack("n")
851
+ end
852
+ preserve = [0xBEEF].pack("n")
853
+ buffer = [0xDEAD].pack("n") # Should write over this
854
+ buffer << preserve.clone # Should preserve this
855
+ BinaryAccessor.write(data, 0, -16, :BLOCK, buffer, :BIG_ENDIAN, :ERROR)
856
+ expect(buffer[0..-3]).to eql data
857
+ expect(buffer[-2..-1]).to eql preserve
858
+ data = BinaryAccessor.read(0, data.length*8 + 16, :BLOCK, buffer, :BIG_ENDIAN)
859
+ expect(data).to eql buffer
860
+ end
861
+
862
+ it "writes a smaller block in the middle of a buffer" do
863
+ data = ''
864
+ buffer = ''
865
+ 256.times do |index|
866
+ data << [index].pack("n")
867
+ end
868
+ 512.times do
869
+ buffer << [0xDEAD].pack("n")
870
+ end
871
+ expected = buffer.clone
872
+ BinaryAccessor.write(data, 128*8, -128*8, :BLOCK, buffer, :BIG_ENDIAN, :ERROR)
873
+ expect(buffer.length).to eql (128 + 512 + 128)
874
+ expect(buffer[0...128]).to eql expected[0...128]
875
+ expect(buffer[128...-128]).to eql data
876
+ expect(buffer[-128..-1]).to eql expected[0...128]
877
+ end
878
+
879
+ it "writes a larger block in the middle of a buffer" do
880
+ data = ''
881
+ buffer = ''
882
+ 256.times do |index|
883
+ data << [index].pack("n")
884
+ end
885
+ 512.times do
886
+ buffer << [0xDEAD].pack("n")
887
+ end
888
+ expected = buffer.clone
889
+ BinaryAccessor.write(data, 384*8, -384*8, :BLOCK, buffer, :BIG_ENDIAN, :ERROR)
890
+ expect(buffer.length).to eql (384 + 512 + 384)
891
+ expect(buffer[0...384]).to eql expected[0...384]
892
+ expect(buffer[384...-384]).to eql data
893
+ expect(buffer[-384..-1]).to eql expected[0...384]
894
+ end
895
+
896
+ it "complains when the negative index exceeds the buffer length" do
897
+ data = "\x01"
898
+ buffer = ''
899
+ 16.times do
900
+ buffer << [0xDEAD].pack("n")
901
+ end
902
+ expect { BinaryAccessor.write(data, 0, -2024*8, :BLOCK, buffer, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "32 byte buffer insufficient to write BLOCK at bit_offset 0 with bit_size -16192")
903
+ end
904
+ end
905
+
906
+ it "writes blocks with negative bit_offsets" do
907
+ BinaryAccessor.write(@baseline_data[0..1], -16, 16, :BLOCK, @data, :BIG_ENDIAN, :ERROR)
908
+ expect(@data[-2..-1]).to eql(@baseline_data[0..1])
909
+ end
910
+
911
+ it "writes a blank string with zero bit size" do
912
+ BinaryAccessor.write('', 0, 0, :STRING, @data, :BIG_ENDIAN, :ERROR)
913
+ expect(@data).to eql('')
914
+ end
915
+
916
+ it "writes a blank block with zero bit size" do
917
+ BinaryAccessor.write('', 0, 0, :BLOCK, @data, :BIG_ENDIAN, :ERROR)
918
+ expect(@data).to eql('')
919
+ end
920
+
921
+ it "writes a shorter string with zero bit size" do
922
+ BinaryAccessor.write("\x00\x00\x00\x00\x00\x00\x00\x00", 0, 0, :STRING, @data, :BIG_ENDIAN, :ERROR)
923
+ expect(@data).to eql("\x00\x00\x00\x00\x00\x00\x00\x00")
924
+ end
925
+
926
+ it "writes a shorter block with zero bit size" do
927
+ BinaryAccessor.write("\x00\x00\x00\x00\x00\x00\x00\x00", 0, 0, :BLOCK, @data, :BIG_ENDIAN, :ERROR)
928
+ expect(@data).to eql("\x00\x00\x00\x00\x00\x00\x00\x00")
929
+ end
930
+
931
+ it "writes a shorter string and zero fill to the given bit size" do
932
+ @data = "\x80\x81\x82\x83\x84\x85\x86\x87\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F"
933
+ BinaryAccessor.write("\x01\x02\x03\x04\x05\x06\x07\x08", 0, 128, :STRING, @data, :BIG_ENDIAN, :ERROR)
934
+ expect(@data).to eql("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00")
935
+ end
936
+
937
+ it "writes a shorter block and zero fill to the given bit size" do
938
+ @data = "\x80\x81\x82\x83\x84\x85\x86\x87\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F"
939
+ BinaryAccessor.write("\x01\x02\x03\x04\x05\x06\x07\x08", 0, 128, :BLOCK, @data, :BIG_ENDIAN, :ERROR)
940
+ expect(@data).to eql("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00")
941
+ end
942
+
943
+ it "complains about unaligned blocks" do
944
+ expect { BinaryAccessor.write(@baseline_data, 7, 16, :BLOCK, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_offset 7 is not byte aligned for data_type BLOCK")
945
+ end
946
+
947
+ it "complains if write exceeds the size of the buffer" do
948
+ expect { BinaryAccessor.write(@baseline_data, 8, 800, :STRING, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "16 byte buffer insufficient to write STRING at bit_offset 8 with bit_size 800")
949
+ end
950
+
951
+ it "truncates the buffer for 0 bitsize" do
952
+ expect(@data.length).to eql 16
953
+ BinaryAccessor.write("\x01\x02\x03", 8, 0, :BLOCK, @data, :BIG_ENDIAN, :ERROR)
954
+ expect(@data).to eql("\x00\x01\x02\x03")
955
+ expect(@data.length).to eql 4
956
+ end
957
+
958
+ it "expands the buffer for 0 bitsize" do
959
+ expect(@data.length).to eql 16
960
+ BinaryAccessor.write("\x01\x02\x03", (14 * 8), 0, :BLOCK, @data, :BIG_ENDIAN, :ERROR)
961
+ expect(@data).to eql("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03")
962
+ expect(@data.length).to eql 17
963
+ end
964
+
965
+ it "writes a frozen string" do
966
+ buffer = "BLANKxxxWORLD"
967
+ string = "HELLO".freeze
968
+ # Specify 3 more bytes than given to exercise the padding logic
969
+ string = BinaryAccessor.write(string, 0, (string.length + 3)*8, :STRING, buffer, :BIG_ENDIAN, :ERROR)
970
+ expect(buffer).to eql("HELLO\x00\x00\x00WORLD")
971
+ expect(string).to eql("HELLO")
972
+ expect(string.frozen?).to be true
973
+ end
974
+
975
+ it "complains about writing a frozen buffer" do
976
+ buffer = "BLANK WORLD".freeze
977
+ string = "HELLO"
978
+ expect {BinaryAccessor.write(string, 0, string.length*8, :STRING, buffer, :BIG_ENDIAN, :ERROR) }.to raise_error(RuntimeError, "can't modify frozen String")
979
+ end
980
+
981
+ it "writes aligned 8-bit unsigned integers" do
982
+ 0.step((@data.length - 1) * 8, 8) do |bit_offset|
983
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
984
+ byte_index = bit_offset / 8
985
+ BinaryAccessor.write(@baseline_data.getbyte(byte_index), bit_offset, 8, :UINT, @data, :BIG_ENDIAN, :ERROR)
986
+ expect(@data[byte_index..byte_index]).to eq(@baseline_data[byte_index..byte_index])
987
+ end
988
+ end
989
+
990
+ it "writes aligned 8-bit signed integers" do
991
+ 0.step((@data.length - 1) * 8, 8) do |bit_offset|
992
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
993
+ byte_index = bit_offset / 8
994
+ value = @baseline_data.getbyte(byte_index)
995
+ value = value - 256 if value >= 128
996
+ BinaryAccessor.write(value, bit_offset, 8, :INT, @data, :BIG_ENDIAN, :ERROR)
997
+ expect(@data[byte_index..byte_index]).to eql(@baseline_data[byte_index..byte_index])
998
+ end
999
+ end
1000
+
1001
+ it "converts floats when writing integers" do
1002
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1003
+ BinaryAccessor.write(1.0, 0, 8, :UINT, @data, :BIG_ENDIAN, :ERROR)
1004
+ BinaryAccessor.write(2.5, 8, 8, :INT, @data, :BIG_ENDIAN, :ERROR)
1005
+ BinaryAccessor.write(4.99, 16, 8, :UINT, @data, :BIG_ENDIAN, :ERROR)
1006
+ expect(@data).to eql("\x01\x02\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1007
+ end
1008
+
1009
+ it "converts integer strings when writing integers" do
1010
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1011
+ BinaryAccessor.write("1", 0, 8, :UINT, @data, :BIG_ENDIAN, :ERROR)
1012
+ BinaryAccessor.write("2", 8, 8, :INT, @data, :BIG_ENDIAN, :ERROR)
1013
+ BinaryAccessor.write("4", 16, 8, :UINT, @data, :BIG_ENDIAN, :ERROR)
1014
+ expect(@data).to eql("\x01\x02\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1015
+ end
1016
+
1017
+ it "complains about non-integer strings when writing integers" do
1018
+ expect { BinaryAccessor.write("1.0", 0, 8, :UINT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError)
1019
+ expect { BinaryAccessor.write("abc123", 0, 8, :UINT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError)
1020
+ end
1021
+
1022
+ describe "given big endian data" do
1023
+
1024
+ it "writes 1-bit unsigned integers" do
1025
+ BinaryAccessor.write(0x1, 8, 1, :UINT, @data, :BIG_ENDIAN, :ERROR)
1026
+ BinaryAccessor.write(0x0, 9, 1, :UINT, @data, :BIG_ENDIAN, :ERROR)
1027
+ BinaryAccessor.write(0x1, 10, 1, :UINT, @data, :BIG_ENDIAN, :ERROR)
1028
+ expect(@data).to eql("\x00\xA0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1029
+ end
1030
+
1031
+ it "writes 1-bit signed integers" do
1032
+ @data[1] = "\x55"
1033
+ BinaryAccessor.write(0x1, 8, 1, :INT, @data, :BIG_ENDIAN, :ERROR)
1034
+ BinaryAccessor.write(0x0, 9, 1, :INT, @data, :BIG_ENDIAN, :ERROR)
1035
+ BinaryAccessor.write(0x1, 10, 1, :INT, @data, :BIG_ENDIAN, :ERROR)
1036
+ BinaryAccessor.write(0x0, 11, 1, :INT, @data, :BIG_ENDIAN, :ERROR)
1037
+ expect(@data).to eql("\x00\xA5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1038
+ end
1039
+
1040
+ it "writes 7-bit unsigned integers" do
1041
+ BinaryAccessor.write(0x40, 8, 7, :UINT, @data, :BIG_ENDIAN, :ERROR)
1042
+ expect(@data).to eql("\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1043
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1044
+ BinaryAccessor.write(0x20, 3, 7, :UINT, @data, :BIG_ENDIAN, :ERROR)
1045
+ expect(@data).to eql("\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1046
+ end
1047
+
1048
+ it "writes 7-bit signed integers" do
1049
+ BinaryAccessor.write(-64, 8, 7, :INT, @data, :BIG_ENDIAN, :ERROR)
1050
+ expect(@data).to eql("\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1051
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1052
+ BinaryAccessor.write(32, 3, 7, :INT, @data, :BIG_ENDIAN, :ERROR)
1053
+ expect(@data).to eql("\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1054
+ end
1055
+
1056
+ it "writes 13-bit unsigned integers" do
1057
+ BinaryAccessor.write(0x1C24, 30, 13, :UINT, @data, :BIG_ENDIAN, :ERROR)
1058
+ expect(@data).to eql("\x00\x00\x00\x03\x84\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1059
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1060
+ BinaryAccessor.write(0x0020, 1, 13, :UINT, @data, :BIG_ENDIAN, :ERROR)
1061
+ expect(@data).to eql("\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1062
+ end
1063
+
1064
+ it "writes 13-bit signed integers" do
1065
+ BinaryAccessor.write(-988, 30, 13, :INT, @data, :BIG_ENDIAN, :ERROR)
1066
+ expect(@data).to eql("\x00\x00\x00\x03\x84\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1067
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1068
+ BinaryAccessor.write(32, 1, 13, :INT, @data, :BIG_ENDIAN, :ERROR)
1069
+ expect(@data).to eql("\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1070
+ end
1071
+
1072
+ it "writes aligned 16-bit unsigned integers" do
1073
+ expected_array = [0x8081, 0x8283, 0x8485, 0x8687, 0x0009, 0x0A0B, 0x0C0D, 0x0E0F]
1074
+ index = 0
1075
+ 0.step((@data.length - 1) * 8, 16) do |bit_offset|
1076
+ BinaryAccessor.write(expected_array[index], bit_offset, 16, :UINT, @data, :BIG_ENDIAN, :ERROR)
1077
+ index += 1
1078
+ end
1079
+ expect(@data).to eql(@baseline_data)
1080
+ end
1081
+
1082
+ it "writes aligned 16-bit signed integers" do
1083
+ expected_array = [0x8081, 0x8283, 0x8485, 0x8687, 0x0009, 0x0A0B, 0x0C0D, 0x0E0F]
1084
+ index = 0
1085
+ 0.step((@data.length - 1) * 8, 16) do |bit_offset|
1086
+ expected = expected_array[index]
1087
+ expected = expected - 2**16 if expected >= 2**15
1088
+ BinaryAccessor.write(expected, bit_offset, 16, :INT, @data, :BIG_ENDIAN, :ERROR)
1089
+ index += 1
1090
+ end
1091
+ expect(@data).to eql(@baseline_data)
1092
+ end
1093
+
1094
+ it "writes aligned 32-bit unsigned integers" do
1095
+ expected_array = [0x80818283, 0x84858687, 0x00090A0B, 0x0C0D0E0F]
1096
+ index = 0
1097
+ 0.step((@data.length - 1) * 8, 32) do |bit_offset|
1098
+ BinaryAccessor.write(expected_array[index], bit_offset, 32, :UINT, @data, :BIG_ENDIAN, :ERROR)
1099
+ index += 1
1100
+ end
1101
+ expect(@data).to eql(@baseline_data)
1102
+ end
1103
+
1104
+ it "writes aligned 32-bit signed integers" do
1105
+ expected_array = [0x80818283, 0x84858687, 0x00090A0B, 0x0C0D0E0F]
1106
+ index = 0
1107
+ 0.step((@data.length - 1) * 8, 32) do |bit_offset|
1108
+ expected = expected_array[index]
1109
+ expected = expected - 2**32 if expected >= 2**31
1110
+ BinaryAccessor.write(expected_array[index], bit_offset, 32, :INT, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
1111
+ index += 1
1112
+ end
1113
+ expect(@data).to eql(@baseline_data)
1114
+ end
1115
+
1116
+ it "writes aligned 32-bit negative integers" do
1117
+ BinaryAccessor.write(-2147483648, 0, 32, :INT, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
1118
+ expect(@data).to eql("\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1119
+ end
1120
+
1121
+ it "writes aligned 32-bit floats" do
1122
+ expected_array = [-1.189360e-038, -3.139169e-036, 8.301067e-040, 1.086646e-031]
1123
+ BinaryAccessor.write(expected_array[0], 0, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1124
+ BinaryAccessor.write(expected_array[1], 32, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1125
+ BinaryAccessor.write(expected_array[2], 64, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1126
+ BinaryAccessor.write(expected_array[3], 96, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1127
+ expect(BinaryAccessor.read(0, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-038).of(expected_array[0])
1128
+ expect(BinaryAccessor.read(32, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-036).of(expected_array[1])
1129
+ expect(BinaryAccessor.read(64, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-040).of(expected_array[2])
1130
+ expect(BinaryAccessor.read(96, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-031).of(expected_array[3])
1131
+ end
1132
+
1133
+ it "writes 37-bit unsigned integers" do
1134
+ BinaryAccessor.write(0x8182838485 >> 3, 8, 37, :UINT, @data, :BIG_ENDIAN, :ERROR)
1135
+ BinaryAccessor.write(0x00090A0B0C, 67, 37, :UINT, @data, :BIG_ENDIAN, :ERROR)
1136
+ expect(@data).to eql("\x00\x81\x82\x83\x84\x80\x00\x00\x00\x09\x0A\x0B\x0C\x00\x00\x00")
1137
+ end
1138
+
1139
+ it "writes 37-bit signed integers" do
1140
+ BinaryAccessor.write((0x8182838485 >> 3) - 2**37, 8, 37, :INT, @data, :BIG_ENDIAN, :ERROR)
1141
+ BinaryAccessor.write(0x00090A0B0C, 67, 37, :INT, @data, :BIG_ENDIAN, :ERROR)
1142
+ expect(@data).to eql("\x00\x81\x82\x83\x84\x80\x00\x00\x00\x09\x0A\x0B\x0C\x00\x00\x00")
1143
+ end
1144
+
1145
+ it "writes 63-bit unsigned integers" do
1146
+ @data[-1] = "\xFF"
1147
+ BinaryAccessor.write(0x8081828384858687 >> 1, 0, 63, :UINT, @data, :BIG_ENDIAN, :ERROR)
1148
+ expect(@data).to eql("\x80\x81\x82\x83\x84\x85\x86\x86\x00\x00\x00\x00\x00\x00\x00\xFF")
1149
+ @data[0] = "\xFF"
1150
+ BinaryAccessor.write(0x08090A0B0C0D0E0F, 65, 63, :UINT, @data, :BIG_ENDIAN, :ERROR)
1151
+ expect(@data).to eql("\xFF\x81\x82\x83\x84\x85\x86\x86\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F")
1152
+ end
1153
+
1154
+ it "writes 63-bit signed integers" do
1155
+ BinaryAccessor.write((0x8081828384858687 >> 1) - 2**63, 0, 63, :INT, @data, :BIG_ENDIAN, :ERROR)
1156
+ BinaryAccessor.write(0x00090A0B0C0D0E0F, 65, 63, :INT, @data, :BIG_ENDIAN, :ERROR)
1157
+ expect(@data).to eql("\x80\x81\x82\x83\x84\x85\x86\x86\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F")
1158
+ end
1159
+
1160
+ it "writes 67-bit unsigned integers" do
1161
+ BinaryAccessor.write(0x8081828384858687FF >> 5, 0, 67, :UINT, @data, :BIG_ENDIAN, :ERROR)
1162
+ expect(@data).to eql("\x80\x81\x82\x83\x84\x85\x86\x87\xE0\x00\x00\x00\x00\x00\x00\x00")
1163
+ end
1164
+
1165
+ it "writes 67-bit signed integers" do
1166
+ BinaryAccessor.write((0x8081828384858687FF >> 5) - 2**67, 0, 67, :INT, @data, :BIG_ENDIAN, :ERROR)
1167
+ expect(@data).to eql("\x80\x81\x82\x83\x84\x85\x86\x87\xE0\x00\x00\x00\x00\x00\x00\x00")
1168
+ end
1169
+
1170
+ it "writes aligned 64-bit unsigned integers" do
1171
+ expected_array = [0x8081828384858687, 0x00090A0B0C0D0E0F]
1172
+ index = 0
1173
+ 0.step((@data.length - 1) * 8, 64) do |bit_offset|
1174
+ BinaryAccessor.write(expected_array[index], bit_offset, 64, :UINT, @data, :BIG_ENDIAN, :ERROR)
1175
+ index += 1
1176
+ end
1177
+ expect(@data).to eql(@baseline_data)
1178
+ end
1179
+
1180
+ it "writes aligned 64-bit signed integers" do
1181
+ expected_array = [0x8081828384858687, 0x00090A0B0C0D0E0F]
1182
+ index = 0
1183
+ 0.step((@data.length - 1) * 8, 64) do |bit_offset|
1184
+ expected = expected_array[index]
1185
+ expected = expected - 2**64 if expected >= 2**63
1186
+ BinaryAccessor.write(expected_array[index], bit_offset, 64, :INT, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
1187
+ index += 1
1188
+ end
1189
+ expect(@data).to eql(@baseline_data)
1190
+ end
1191
+
1192
+ it "writes aligned 64-bit floats" do
1193
+ expected_array = [-3.116851e-306, 1.257060e-308]
1194
+ BinaryAccessor.write(expected_array[0], 0, 64, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1195
+ BinaryAccessor.write(expected_array[1], 64, 64, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1196
+ expect(BinaryAccessor.read(0, 64, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-306).of(expected_array[0])
1197
+ expect(BinaryAccessor.read(64, 64, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-308).of(expected_array[1])
1198
+ end
1199
+
1200
+ it "converts integers to floats" do
1201
+ BinaryAccessor.write(1, 0, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1202
+ value = BinaryAccessor.read(0, 32, :FLOAT, @data, :BIG_ENDIAN)
1203
+ expect(value).to eql(1.0)
1204
+ expect(value).to be_a(Float)
1205
+ BinaryAccessor.write(4, 32, 64, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1206
+ value = BinaryAccessor.read(32, 64, :FLOAT, @data, :BIG_ENDIAN)
1207
+ expect(value).to eql(4.0)
1208
+ expect(value).to be_a(Float)
1209
+ end
1210
+
1211
+ it "converts strings when writing floats" do
1212
+ BinaryAccessor.write("1", 0, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1213
+ value = BinaryAccessor.read(0, 32, :FLOAT, @data, :BIG_ENDIAN)
1214
+ expect(value).to eql(1.0)
1215
+ expect(value).to be_a(Float)
1216
+ BinaryAccessor.write("4.5", 32, 64, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
1217
+ value = BinaryAccessor.read(32, 64, :FLOAT, @data, :BIG_ENDIAN)
1218
+ expect(value).to eql(4.5)
1219
+ expect(value).to be_a(Float)
1220
+ end
1221
+
1222
+ it "complains about non-float strings when writing floats" do
1223
+ expect { BinaryAccessor.write("abc123", 0, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError)
1224
+ end
1225
+
1226
+ it "complains about unaligned floats" do
1227
+ expect { BinaryAccessor.write(0.0, 17, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_offset 17 is not byte aligned for data_type FLOAT")
1228
+ end
1229
+
1230
+ it "complains about mis-sized floats" do
1231
+ expect { BinaryAccessor.write(0.0, 0, 33, :FLOAT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_size is 33 but must be 32 or 64 for data_type FLOAT")
1232
+ end
1233
+
1234
+ end # given big endian data
1235
+
1236
+ describe "given little endian data" do
1237
+
1238
+ it "complains about ill-defined little endian bitfields" do
1239
+ expect { BinaryAccessor.write(0x1, 3, 7, :UINT, @data, :LITTLE_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "LITTLE_ENDIAN bitfield with bit_offset 3 and bit_size 7 is invalid")
1240
+ end
1241
+
1242
+ it "writes 1-bit unsigned integers" do
1243
+ @data[1] = "\x55"
1244
+ BinaryAccessor.write(0x1, 8, 1, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1245
+ BinaryAccessor.write(0x0, 9, 1, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1246
+ BinaryAccessor.write(0x1, 10, 1, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1247
+ BinaryAccessor.write(0x0, 11, 1, :INT, @data, :BIG_ENDIAN, :ERROR)
1248
+ expect(@data).to eql("\x00\xA5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1249
+ end
1250
+
1251
+ it "writes 1-bit signed integers" do
1252
+ BinaryAccessor.write(0x1, 8, 1, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1253
+ BinaryAccessor.write(0x0, 9, 1, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1254
+ BinaryAccessor.write(0x1, 10, 1, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1255
+ expect(@data).to eql("\x00\xA0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1256
+ end
1257
+
1258
+ it "writes 7-bit unsigned integers" do
1259
+ BinaryAccessor.write(0x40, 8, 7, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1260
+ expect(@data).to eql("\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1261
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1262
+ BinaryAccessor.write(0x7F, 11, 7, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1263
+ expect(@data).to eql("\xC0\x1F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1264
+ end
1265
+
1266
+ it "writes 7-bit signed integers" do
1267
+ BinaryAccessor.write(-64, 8, 7, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1268
+ expect(@data).to eql("\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1269
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1270
+ BinaryAccessor.write(32, 11, 7, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1271
+ expect(@data).to eql("\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1272
+ end
1273
+
1274
+ it "writes 13-bit unsigned integers" do
1275
+ BinaryAccessor.write(0x1C24, 30, 13, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1276
+ expect(@data).to eql("\x00\x80\x84\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1277
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1278
+ BinaryAccessor.write(0x0020, 9, 13, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1279
+ expect(@data).to eql("\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1280
+ end
1281
+
1282
+ it "writes 13-bit signed integers" do
1283
+ BinaryAccessor.write(-988, 30, 13, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1284
+ expect(@data).to eql("\x00\x80\x84\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1285
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1286
+ BinaryAccessor.write(32, 9, 13, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1287
+ expect(@data).to eql("\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1288
+ end
1289
+
1290
+ it "writes aligned 16-bit unsigned integers" do
1291
+ expected_array = [0x8180, 0x8382, 0x8584, 0x8786, 0x0900, 0x0B0A, 0x0D0C, 0x0F0E]
1292
+ index = 0
1293
+ 0.step((@data.length - 1) * 8, 16) do |bit_offset|
1294
+ BinaryAccessor.write(expected_array[index], bit_offset, 16, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1295
+ index += 1
1296
+ end
1297
+ expect(@data).to eql(@baseline_data)
1298
+ end
1299
+
1300
+ it "writes aligned 16-bit signed integers" do
1301
+ expected_array = [0x8180, 0x8382, 0x8584, 0x8786, 0x0900, 0x0B0A, 0x0D0C, 0x0F0E]
1302
+ index = 0
1303
+ 0.step((@data.length - 1) * 8, 16) do |bit_offset|
1304
+ expected = expected_array[index]
1305
+ expected = expected - 2**16 if expected >= 2**15
1306
+ BinaryAccessor.write(expected, bit_offset, 16, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1307
+ index += 1
1308
+ end
1309
+ expect(@data).to eql(@baseline_data)
1310
+ end
1311
+
1312
+ it "writes aligned 32-bit unsigned integers" do
1313
+ expected_array = [0x83828180, 0x87868584, 0x0B0A0900, 0x0F0E0D0C]
1314
+ index = 0
1315
+ 0.step((@data.length - 1) * 8, 32) do |bit_offset|
1316
+ BinaryAccessor.write(expected_array[index], bit_offset, 32, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1317
+ index += 1
1318
+ end
1319
+ expect(@data).to eql(@baseline_data)
1320
+ end
1321
+
1322
+ it "writes aligned 32-bit signed integers" do
1323
+ expected_array = [0x83828180, 0x87868584, 0x0B0A0900, 0x0F0E0D0C]
1324
+ index = 0
1325
+ 0.step((@data.length - 1) * 8, 32) do |bit_offset|
1326
+ expected = expected_array[index]
1327
+ expected = expected - 2**32 if expected >= 2**31
1328
+ BinaryAccessor.write(expected_array[index], bit_offset, 32, :INT, @data, :LITTLE_ENDIAN, :ERROR_ALLOW_HEX)
1329
+ index += 1
1330
+ end
1331
+ expect(@data).to eql(@baseline_data)
1332
+ end
1333
+
1334
+ it "writes aligned 32-bit floats" do
1335
+ expected_array = [-7.670445e-037, -2.024055e-034, 2.658460e-032, 7.003653e-030]
1336
+ BinaryAccessor.write(expected_array[0], 0, 32, :FLOAT, @data, :LITTLE_ENDIAN, :ERROR)
1337
+ BinaryAccessor.write(expected_array[1], 32, 32, :FLOAT, @data, :LITTLE_ENDIAN, :ERROR)
1338
+ BinaryAccessor.write(expected_array[2], 64, 32, :FLOAT, @data, :LITTLE_ENDIAN, :ERROR)
1339
+ BinaryAccessor.write(expected_array[3], 96, 32, :FLOAT, @data, :LITTLE_ENDIAN, :ERROR)
1340
+ expect(BinaryAccessor.read(0, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-037).of(expected_array[0])
1341
+ expect(BinaryAccessor.read(32, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-034).of(expected_array[1])
1342
+ expect(BinaryAccessor.read(64, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-032).of(expected_array[2])
1343
+ expect(BinaryAccessor.read(96, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-030).of(expected_array[3])
1344
+ end
1345
+
1346
+ it "writes 37-bit unsigned integers" do
1347
+ BinaryAccessor.write(0x1584838281, 43, 37, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1348
+ BinaryAccessor.write(0x0C0B0A0900 >> 3, 96, 37, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1349
+ expect(@data).to eql("\x00\x81\x82\x83\x84\x15\x00\x00\x00\x09\x0A\x0B\x0C\x00\x00\x00")
1350
+ end
1351
+
1352
+ it "writes 37-bit signed integers" do
1353
+ BinaryAccessor.write(0x1584838281 - 2**37, 43, 37, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1354
+ BinaryAccessor.write(0x0C0B0A0900 >> 3, 96, 37, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1355
+ expect(@data).to eql("\x00\x81\x82\x83\x84\x15\x00\x00\x00\x09\x0A\x0B\x0C\x00\x00\x00")
1356
+ end
1357
+
1358
+ it "writes 63-bit unsigned integers" do
1359
+ BinaryAccessor.write(0x4786858483828180, 57, 63, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1360
+ BinaryAccessor.write(0x0F0E0D0C0B0A0900 >> 1, 120, 63, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1361
+ expect(@data).to eql("\x80\x81\x82\x83\x84\x85\x86\x47\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F")
1362
+ end
1363
+
1364
+ it "writes 63-bit signed integers" do
1365
+ BinaryAccessor.write(0x4786858483828180 - 2**63, 57, 63, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1366
+ BinaryAccessor.write(0x0F0E0D0C0B0A0900 >> 1, 120, 63, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1367
+ expect(@data).to eql("\x80\x81\x82\x83\x84\x85\x86\x47\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F")
1368
+ end
1369
+
1370
+ it "writes 67-bit unsigned integers" do
1371
+ BinaryAccessor.write(0x0F0E0D0C0B0A0900FF >> 5, 120, 67, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1372
+ expect(@data).to eql("\x00\x00\x00\x00\x00\x00\x00\xE0\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F")
1373
+ end
1374
+
1375
+ it "writes 67-bit signed integers" do
1376
+ BinaryAccessor.write(0x0F0E0D0C0B0A0900FF >> 5, 120, 67, :INT, @data, :LITTLE_ENDIAN, :ERROR)
1377
+ expect(@data).to eql("\x00\x00\x00\x00\x00\x00\x00\xE0\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F")
1378
+ end
1379
+
1380
+ it "writes aligned 64-bit unsigned integers" do
1381
+ expected_array = [0x8786858483828180, 0x0F0E0D0C0B0A0900]
1382
+ index = 0
1383
+ 0.step((@data.length - 1) * 8, 64) do |bit_offset|
1384
+ BinaryAccessor.write(expected_array[index], bit_offset, 64, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
1385
+ index += 1
1386
+ end
1387
+ expect(@data).to eql(@baseline_data)
1388
+ end
1389
+
1390
+ it "writes aligned 64-bit signed integers" do
1391
+ expected_array = [0x8786858483828180, 0x0F0E0D0C0B0A0900]
1392
+ index = 0
1393
+ 0.step((@data.length - 1) * 8, 64) do |bit_offset|
1394
+ expected = expected_array[index]
1395
+ expected = expected - 2**64 if expected >= 2**63
1396
+ BinaryAccessor.write(expected_array[index], bit_offset, 64, :INT, @data, :LITTLE_ENDIAN, :ERROR_ALLOW_HEX)
1397
+ index += 1
1398
+ end
1399
+ expect(@data).to eql(@baseline_data)
1400
+ end
1401
+
1402
+ it "writes aligned 64-bit floats" do
1403
+ expected_array = [-2.081577e-272, 3.691916e-236]
1404
+ BinaryAccessor.write(expected_array[0], 0, 64, :FLOAT, @data, :LITTLE_ENDIAN, :ERROR)
1405
+ BinaryAccessor.write(expected_array[1], 64, 64, :FLOAT, @data, :LITTLE_ENDIAN, :ERROR)
1406
+ expect(BinaryAccessor.read(0, 64, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-272).of(expected_array[0])
1407
+ expect(BinaryAccessor.read(64, 64, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-236).of(expected_array[1])
1408
+ end
1409
+
1410
+ it "complains about unaligned floats" do
1411
+ expect { BinaryAccessor.write(0.0, 1, 32, :FLOAT, @data, :LITTLE_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_offset 1 is not byte aligned for data_type FLOAT")
1412
+ end
1413
+
1414
+ it "complains about mis-sized floats" do
1415
+ expect { BinaryAccessor.write(0.0, 0, 65, :FLOAT, @data, :LITTLE_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_size is 65 but must be 32 or 64 for data_type FLOAT")
1416
+ end
1417
+
1418
+ end # given little endian data
1419
+
1420
+ describe "should support overflow types" do
1421
+ before(:each) do
1422
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1423
+ end
1424
+
1425
+ it "prevents overflow of STRING" do
1426
+ expect { BinaryAccessor.write("abcde", 0, 32, :STRING, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of 5 bytes does not fit into 4 bytes for data_type STRING")
1427
+ end
1428
+
1429
+ it "prevents overflow of BLOCK" do
1430
+ expect { BinaryAccessor.write("abcde", 0, 32, :BLOCK, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of 5 bytes does not fit into 4 bytes for data_type BLOCK")
1431
+ end
1432
+
1433
+ it "prevents overflow of 8-bit INT" do
1434
+ bit_size = 8; data_type = :INT; value = 2 ** (bit_size - 1)
1435
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1436
+ value = -(value + 1)
1437
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1438
+ end
1439
+
1440
+ it "prevents overflow of 16-bit INT" do
1441
+ bit_size = 16; data_type = :INT; value = 2 ** (bit_size - 1)
1442
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1443
+ value = -(value + 1)
1444
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1445
+ end
1446
+
1447
+ it "prevents overflow of 32-bit INT" do
1448
+ bit_size = 32; data_type = :INT; value = 2 ** (bit_size - 1)
1449
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1450
+ value = -(value + 1)
1451
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1452
+ end
1453
+
1454
+ it "prevents overflow of 64-bit INT" do
1455
+ bit_size = 64; data_type = :INT; value = 2 ** (bit_size - 1)
1456
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1457
+ value = -(value + 1)
1458
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1459
+ end
1460
+
1461
+ it "prevents overflow of 3-bit INT" do
1462
+ bit_size = 3; data_type = :INT; value = 2 ** (bit_size - 1)
1463
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1464
+ value = -(value + 1)
1465
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1466
+ end
1467
+
1468
+ it "prevents overflow of 8-bit UINT" do
1469
+ bit_size = 8; data_type = :UINT; value = 2 ** bit_size
1470
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1471
+ value = -1
1472
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1473
+ end
1474
+
1475
+ it "prevents overflow of 16-bit UINT" do
1476
+ bit_size = 16; data_type = :UINT; value = 2 ** bit_size
1477
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1478
+ value = -1
1479
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1480
+ end
1481
+
1482
+ it "prevents overflow of 32-bit UINT" do
1483
+ bit_size = 32; data_type = :UINT; value = 2 ** bit_size
1484
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1485
+ value = -1
1486
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1487
+ end
1488
+
1489
+ it "prevents overflow of 64-bit UINT" do
1490
+ bit_size = 64; data_type = :UINT; value = 2 ** bit_size
1491
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1492
+ value = -1
1493
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1494
+ end
1495
+
1496
+ it "prevents overflow of 3-bit UINT" do
1497
+ bit_size = 3; data_type = :UINT; value = 2 ** bit_size
1498
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1499
+ value = -1
1500
+ expect { BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
1501
+ end
1502
+
1503
+ it "truncates STRING" do
1504
+ BinaryAccessor.write("abcde", 0, 32, :STRING, @data, :BIG_ENDIAN, :TRUNCATE)
1505
+ expect(@data[0..4]).to eql "abcd\x00"
1506
+ end
1507
+
1508
+ it "truncates BLOCK" do
1509
+ BinaryAccessor.write("abcde", 0, 32, :BLOCK, @data, :BIG_ENDIAN, :TRUNCATE)
1510
+ expect(@data[0..4]).to eql "abcd\x00"
1511
+ end
1512
+
1513
+ it "truncates 8-bit INT" do
1514
+ bit_size = 8; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
1515
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1516
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1517
+ end
1518
+
1519
+ it "truncates 16-bit INT" do
1520
+ bit_size = 16; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
1521
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1522
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1523
+ end
1524
+
1525
+ it "truncates 32-bit INT" do
1526
+ bit_size = 32; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
1527
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1528
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1529
+ end
1530
+
1531
+ it "truncates 64-bit INT" do
1532
+ bit_size = 64; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
1533
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1534
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1535
+ end
1536
+
1537
+ it "truncates 3-bit INT" do
1538
+ bit_size = 3; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
1539
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1540
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1541
+ end
1542
+
1543
+ it "truncates 8-bit UINT" do
1544
+ bit_size = 8; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
1545
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1546
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1547
+ end
1548
+
1549
+ it "truncates 16-bit UINT" do
1550
+ bit_size = 16; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
1551
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1552
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1553
+ end
1554
+
1555
+ it "truncates 32-bit UINT" do
1556
+ bit_size = 32; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
1557
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1558
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1559
+ end
1560
+
1561
+ it "truncates 64-bit UINT" do
1562
+ bit_size = 64; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
1563
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1564
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1565
+ end
1566
+
1567
+ it "truncates 3-bit UINT" do
1568
+ bit_size = 3; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
1569
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :TRUNCATE)
1570
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
1571
+ end
1572
+
1573
+ it "saturates 8-bit INT" do
1574
+ bit_size = 8; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
1575
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1576
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1577
+ value = -(value + 1); saturated_value = value + 1
1578
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1579
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1580
+ end
1581
+
1582
+ it "saturates 16-bit INT" do
1583
+ bit_size = 16; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
1584
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1585
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1586
+ value = -(value + 1); saturated_value = value + 1
1587
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1588
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1589
+ end
1590
+
1591
+ it "saturates 32-bit INT" do
1592
+ bit_size = 32; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
1593
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1594
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1595
+ value = -(value + 1); saturated_value = value + 1
1596
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1597
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1598
+ end
1599
+
1600
+ it "saturates 64-bit INT" do
1601
+ bit_size = 64; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
1602
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1603
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1604
+ value = -(value + 1); saturated_value = value + 1
1605
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1606
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1607
+ end
1608
+
1609
+ it "saturates 3-bit INT" do
1610
+ bit_size = 3; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
1611
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1612
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1613
+ value = -(value + 1); saturated_value = value + 1
1614
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1615
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1616
+ end
1617
+
1618
+ it "saturates 8-bit UINT" do
1619
+ bit_size = 8; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
1620
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1621
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1622
+ value = -1; saturated_value = 0
1623
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1624
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1625
+ end
1626
+
1627
+ it "saturates 16-bit UINT" do
1628
+ bit_size = 16; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
1629
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1630
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1631
+ value = -1; saturated_value = 0
1632
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1633
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1634
+ end
1635
+
1636
+ it "saturates 32-bit UINT" do
1637
+ bit_size = 32; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
1638
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1639
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1640
+ value = -1; saturated_value = 0
1641
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1642
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1643
+ end
1644
+
1645
+ it "saturates 64-bit UINT" do
1646
+ bit_size = 64; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
1647
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1648
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1649
+ value = -1; saturated_value = 0
1650
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1651
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1652
+ end
1653
+
1654
+ it "saturates 3-bit UINT" do
1655
+ bit_size = 3; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
1656
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1657
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1658
+ value = -1; saturated_value = 0
1659
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :SATURATE)
1660
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
1661
+ end
1662
+
1663
+ it "allows hex value entry of 8-bit INT" do
1664
+ bit_size = 8; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
1665
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
1666
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
1667
+ end
1668
+
1669
+ it "allows hex value entry of 16-bit INT" do
1670
+ bit_size = 16; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
1671
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
1672
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
1673
+ end
1674
+
1675
+ it "allows hex value entry of 32-bit INT" do
1676
+ bit_size = 32; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
1677
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
1678
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
1679
+ end
1680
+
1681
+ it "allows hex value entry of 64-bit INT" do
1682
+ bit_size = 64; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
1683
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
1684
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
1685
+ end
1686
+
1687
+ it "allows hex value entry of 3-bit INT" do
1688
+ bit_size = 3; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
1689
+ BinaryAccessor.write(value, 0, bit_size, data_type, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
1690
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
1691
+ end
1692
+
1693
+ end
1694
+
1695
+ end # describe "write"
1696
+
1697
+ describe "write_array" do
1698
+ before(:each) do
1699
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1700
+ @data_array = []
1701
+ @data.length.times {|i| @data_array << @data[i] }
1702
+ @baseline_data = "\x80\x81\x82\x83\x84\x85\x86\x87\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F"
1703
+ @baseline_data_array = []
1704
+ @baseline_data.length.times {|i| @baseline_data_array << @baseline_data[i] }
1705
+ end
1706
+
1707
+ it "complains about value other than Array" do
1708
+ expect { BinaryAccessor.write_array("", 0, 32, :STRING, 0, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "values must be an Array type class is String")
1709
+ end
1710
+
1711
+ it "complains about unrecognized data types" do
1712
+ expect { BinaryAccessor.write_array([0], 0, 32, :BLOB, 0, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "data_type BLOB is not recognized")
1713
+ end
1714
+
1715
+ it "complains about bit_offsets before the beginning of the buffer" do
1716
+ expect { BinaryAccessor.write_array([''], -((@data.length * 8) + 8), 32, :STRING, 0, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "#{@data.length} byte buffer insufficient to write STRING at bit_offset #{-((@data.length * 8) + 8)} with bit_size 32")
1717
+ end
1718
+
1719
+ it "writes if a negative bit_offset is equal to length of buffer" do
1720
+ BinaryAccessor.write_array(@baseline_data_array, -(@data.length * 8), 8, :BLOCK, @baseline_data_array.length*8, @data, :BIG_ENDIAN, :ERROR)
1721
+ expect(@data).to eql @baseline_data
1722
+ end
1723
+
1724
+ it "complains about a negative or zero bit_size" do
1725
+ expect { BinaryAccessor.write_array([''], 0, 0, :STRING, 0, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_size 0 must be positive for arrays")
1726
+ expect { BinaryAccessor.write_array([''], 0, -8, :STRING, 0, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_size -8 must be positive for arrays")
1727
+ end
1728
+
1729
+ it "writes aligned strings with fixed array_size" do
1730
+ data = @data.clone
1731
+ BinaryAccessor.write_array(@baseline_data_array, 0, 8, :STRING, @baseline_data_array.length*8, data, :BIG_ENDIAN, :ERROR)
1732
+ expect(data).to eql(@baseline_data)
1733
+ end
1734
+
1735
+ it "writes aligned strings with zero array_size" do
1736
+ BinaryAccessor.write_array(@baseline_data_array, 0, 8, :STRING, 0, @data, :BIG_ENDIAN, :ERROR)
1737
+ expect(@data).to eql(@baseline_data)
1738
+ end
1739
+
1740
+ it "writes strings with negative bit_offsets" do
1741
+ BinaryAccessor.write_array(@baseline_data_array[14..15], -16, 8, :STRING, 16, @data, :BIG_ENDIAN, :ERROR)
1742
+ expect(@data).to eql(("\x00" * 14) + @baseline_data[14..15])
1743
+ end
1744
+
1745
+ it "complains about unaligned strings" do
1746
+ expect { BinaryAccessor.write_array([], 1, 32, :STRING, 32, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_offset 1 is not byte aligned for data_type STRING")
1747
+ end
1748
+
1749
+ it "complains if pass more values than the given array_size can hold" do
1750
+ expect { BinaryAccessor.write_array(@baseline_data_array, 0, 8, :BLOCK, 32, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "too many values #{@baseline_data_array.length} for given array_size 32 and bit_size 8")
1751
+ end
1752
+
1753
+ it "writes blocks with fixed array_size" do
1754
+ BinaryAccessor.write_array(@baseline_data_array, 0, 8, :BLOCK, @baseline_data_array.length*8, @data, :BIG_ENDIAN, :ERROR)
1755
+ expect(@data).to eql(@baseline_data)
1756
+ end
1757
+
1758
+ it "zeros fill if array_size > number of values passed" do
1759
+ data = @baseline_data.clone
1760
+ BinaryAccessor.write_array(["\x01","\x02","\x03","\x04"], 0, 8, :BLOCK, 64, @baseline_data, :BIG_ENDIAN, :ERROR)
1761
+ expect(@baseline_data).to eql("\x01\x02\x03\x04" + "\x00" * 4 + data[8..-1])
1762
+ end
1763
+
1764
+ it "writes blocks with fixed array_size at non zero offset" do
1765
+ BinaryAccessor.write_array(@baseline_data_array[0..-5], 32, 8, :BLOCK, @baseline_data_array.length*8-32, @data, :BIG_ENDIAN, :ERROR)
1766
+ expect(@data).to eql(("\x00" * 4) + @baseline_data[0..-5])
1767
+ end
1768
+
1769
+ it "writes blocks with zero array_size" do
1770
+ BinaryAccessor.write_array(@baseline_data_array, 0, 8, :BLOCK, 0, @data, :BIG_ENDIAN, :ERROR)
1771
+ expect(@data).to eql(@baseline_data)
1772
+ end
1773
+
1774
+ it "writes blocks with negative bit_offsets" do
1775
+ BinaryAccessor.write_array(["\x80\x81","\x82\x83"], -32, 16, :BLOCK, 32, @data, :BIG_ENDIAN, :ERROR)
1776
+ expect(@data).to eql(("\x00" * 12) + @baseline_data[0..3])
1777
+ end
1778
+
1779
+ it "complains with an array_size not a multiple of bit_size" do
1780
+ data = @data.unpack('C*')
1781
+ expect { BinaryAccessor.write_array([1,2], 0, 8, :UINT, 10, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "array_size 10 not a multiple of bit_size 8")
1782
+ end
1783
+
1784
+ it "complains with an array_size not a multiple of bit_size" do
1785
+ data = @data.unpack('C*')
1786
+ expect { BinaryAccessor.write_array([1,2], 0, 8, :UINT, -10, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "array_size -10 not a multiple of bit_size 8")
1787
+ end
1788
+
1789
+ it "excludes the remaining bits if array_size is negative" do
1790
+ data = @data.clone
1791
+ BinaryAccessor.write_array(@baseline_data_array[0..-5], 0, 8, :BLOCK, -32, @data, :BIG_ENDIAN, :ERROR)
1792
+ expect(@data).to eql(@baseline_data[0..-5] + data[-4..-1])
1793
+ end
1794
+
1795
+ it "does not write if the offset equals the negative array size" do
1796
+ data = @data.clone
1797
+ BinaryAccessor.write_array([], @data.length*8-32, 8, :BLOCK, -32, @data, :LITTLE_ENDIAN, :ERROR)
1798
+ expect(@data).to eql(data)
1799
+ end
1800
+
1801
+ it "expands the buffer to handle negative array size" do
1802
+ @data = "\x00\x01\x02\x00\x03"
1803
+ BinaryAccessor.write_array([1,2,3,4], 0, 32, :UINT, -8, @data, :BIG_ENDIAN, :ERROR)
1804
+ expect(@data).to eql("\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x03")
1805
+ end
1806
+
1807
+ it "shrinks the buffer when handling negative array size" do
1808
+ # Start with one array item
1809
+ @data = "\x00\x01\x02\x00\x03"
1810
+ # Goto 4 array items array item
1811
+ BinaryAccessor.write_array([1,2,3,4], 0, 32, :UINT, -8, @data, :BIG_ENDIAN, :ERROR)
1812
+ expect(@data).to eql("\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x03")
1813
+ # Goto 2 array items
1814
+ BinaryAccessor.write_array([1,2], 0, 32, :UINT, -8, @data, :BIG_ENDIAN, :ERROR)
1815
+ expect(@data).to eql("\x00\x00\x00\x01\x00\x00\x00\x02\x03")
1816
+ # Goto 0 array items
1817
+ BinaryAccessor.write_array([], 0, 32, :UINT, -8, @data, :BIG_ENDIAN, :ERROR)
1818
+ expect(@data).to eql("\x03")
1819
+ # Go back to 1 array items
1820
+ BinaryAccessor.write_array([1], 0, 32, :UINT, -8, @data, :BIG_ENDIAN, :ERROR)
1821
+ expect(@data).to eql("\x00\x00\x00\x01\x03")
1822
+ end
1823
+
1824
+ it "complain when passed a zero length buffer" do
1825
+ expect { BinaryAccessor.write_array([1,2,3], 0, 8, :UINT, 32, "", :LITTLE_ENDIAN, :ERROR) }.to raise_error(ArgumentError)
1826
+ end
1827
+
1828
+ it "expands the buffer if the offset is greater than the negative array size" do
1829
+ offset = @data.length * 8 - 16
1830
+ data = @data.clone
1831
+ BinaryAccessor.write_array([1,2], offset, 8, :UINT, -32, @data, :LITTLE_ENDIAN, :ERROR)
1832
+ expect(@data).to eql(data[0..-3] + "\x01\x02" + data[-4..-1])
1833
+ end
1834
+
1835
+ it "complains with negative bit_offset and zero array_size" do
1836
+ expect { BinaryAccessor.write_array([1,2], -32, 8, :UINT, 0, @data, :LITTLE_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "negative or zero array_size (0) cannot be given with negative bit_offset (-32)")
1837
+ end
1838
+
1839
+ it "complains with negative array_size" do
1840
+ expect { BinaryAccessor.write_array([1,2], -32, 8, :UINT, -8, @data, :LITTLE_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "negative or zero array_size (-8) cannot be given with negative bit_offset (-32)")
1841
+ end
1842
+
1843
+ it "writes a shorter string and zero fill to the given bit size" do
1844
+ @data = "\x80\x81\x82\x83\x84\x85\x86\x87\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F"
1845
+ BinaryAccessor.write_array(["\x01\x02","\x01\x02","\x01\x02","\x01\x02"], 0, 32, :STRING, 128, @data, :BIG_ENDIAN, :ERROR)
1846
+ expect(@data).to eql("\x01\x02\x00\x00\x01\x02\x00\x00\x01\x02\x00\x00\x01\x02\x00\x00")
1847
+ end
1848
+
1849
+ it "writes a shorter string and zero fill to the given bit size" do
1850
+ @data = "\x80\x81\x82\x83\x84\x85\x86\x87\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F"
1851
+ BinaryAccessor.write_array(["\x01\x02","\x01\x02","\x01\x02","\x01\x02"], 0, 32, :BLOCK, 128, @data, :BIG_ENDIAN, :ERROR)
1852
+ expect(@data).to eql("\x01\x02\x00\x00\x01\x02\x00\x00\x01\x02\x00\x00\x01\x02\x00\x00")
1853
+ end
1854
+
1855
+ it "complains about unaligned blocks" do
1856
+ expect { BinaryAccessor.write_array(@baseline_data_array[0..1], 7, 16, :BLOCK, 32, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_offset 7 is not byte aligned for data_type BLOCK")
1857
+ end
1858
+
1859
+ it "complains if write exceeds the size of the buffer" do
1860
+ expect { BinaryAccessor.write_array([], 8, 800, :STRING, 800, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "16 byte buffer insufficient to write STRING at bit_offset 8 with bit_size 800")
1861
+ end
1862
+
1863
+ it "writes aligned 8-bit unsigned integers" do
1864
+ data = @data.clone
1865
+ BinaryAccessor.write_array([0,1,2,3,4,5,255,255], 0, 8, :UINT, 0, @data, :BIG_ENDIAN, :ERROR)
1866
+ expect(@data).to eql("\x00\x01\x02\x03\x04\x05\xFF\xFF")
1867
+ end
1868
+
1869
+ it "writes aligned 8-bit signed integers" do
1870
+ data = @data.clone
1871
+ BinaryAccessor.write_array([0,1,2,3,4,5,-1,127], 0, 8, :INT, 0, @data, :BIG_ENDIAN, :ERROR)
1872
+ expect(@data).to eql("\x00\x01\x02\x03\x04\x05\xFF\x7F")
1873
+ end
1874
+
1875
+ it "complains about unaligned strings" do
1876
+ expect { BinaryAccessor.write_array(['X'], 1, 32, :STRING, 32, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_offset 1 is not byte aligned for data_type STRING")
1877
+ end
1878
+
1879
+ it "writes STRING items" do
1880
+ data = @baseline_data.clone
1881
+ BinaryAccessor.write_array(['a'], 0, 64, :STRING, 0, @baseline_data, :BIG_ENDIAN, :ERROR)
1882
+ expect(@baseline_data).to eql("a\x00\x00\x00\x00\x00\x00\x00")
1883
+ end
1884
+
1885
+ it "writes BLOCK items" do
1886
+ BinaryAccessor.write_array(["\x01","\x02","\x03","\x04"], 0, 32, :BLOCK, 0, @baseline_data, :BIG_ENDIAN, :ERROR)
1887
+ expect(@baseline_data).to eql("\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00")
1888
+ end
1889
+
1890
+ it "writes variable length arrays with a zero and negative array_size" do
1891
+ baseline_data_array_uint8 = []
1892
+ @baseline_data.length.times {|i| baseline_data_array_uint8 << @baseline_data[i].ord }
1893
+ 0.step(-(@baseline_data.length * 8), -8) do |array_size|
1894
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1895
+ @expected_data = @baseline_data.clone + ("\x00" * -(array_size / 8))
1896
+ BinaryAccessor.write_array(baseline_data_array_uint8, 0, 8, :UINT, array_size, @data, :BIG_ENDIAN, :ERROR)
1897
+ expect(@data).to eql(@expected_data)
1898
+ end
1899
+ end
1900
+
1901
+ it "writes variable length arrays or 32-bit UINTS with a zero and negative array_size" do
1902
+ baseline_data = "\x01\x01\x01\x01\x02\x02\x02\x02\x03\x03\x03\x03\x04\x04\x04\x04"
1903
+ data_array_uint32 = [0x01010101, 0x02020202, 0x03030303, 0x04040404]
1904
+ 0.step(-(baseline_data.length * 8), -8) do |array_size|
1905
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1906
+ @expected_data = baseline_data.clone + ("\x00" * -(array_size / 8))
1907
+ BinaryAccessor.write_array(data_array_uint32, 0, 32, :UINT, array_size, @data, :BIG_ENDIAN, :ERROR)
1908
+ expect(@data).to eql(@expected_data)
1909
+ end
1910
+ end
1911
+
1912
+ it "writes variable length arrays of 32-bit UINTS with a zero and negative array_size and non-zero bit offset" do
1913
+ baseline_data = "\x01\x01\x01\x01\x02\x02\x02\x02\x03\x03\x03\x03\x04\x04\x04\x04"
1914
+ data_array_uint32 = [0x01010101, 0x02020202, 0x03030303, 0x04040404]
1915
+ 0.step(-(baseline_data.length * 8), -8) do |array_size|
1916
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1917
+ @expected_data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + baseline_data.clone + ("\x00" * -(array_size / 8))
1918
+ BinaryAccessor.write_array(data_array_uint32, 128, 32, :UINT, array_size, @data, :BIG_ENDIAN, :ERROR)
1919
+ expect(@data).to eql(@expected_data)
1920
+ end
1921
+ end
1922
+
1923
+ it "writes variable length arrays of 32-bit UINTS with a zero and negative array_size and non-zero bit offset and grow the buffer" do
1924
+ baseline_data = "\x01\x01\x01\x01\x02\x02\x02\x02\x03\x03\x03\x03\x04\x04\x04\x04"
1925
+ data_array_uint32 = [0x01010101, 0x02020202, 0x03030303, 0x04040404]
1926
+ 0.step(-(baseline_data.length * 8), -8) do |array_size|
1927
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
1928
+ @expected_data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + baseline_data.clone + ("\x00" * -(array_size / 8))
1929
+ BinaryAccessor.write_array(data_array_uint32, 128, 32, :UINT, array_size, @data, :BIG_ENDIAN, :ERROR)
1930
+ expect(@data).to eql(@expected_data)
1931
+ end
1932
+ end
1933
+
1934
+ describe "given big endian data" do
1935
+
1936
+ it "writes 1-bit unsigned integers" do
1937
+ BinaryAccessor.write_array([1,0,1], 8, 1, :UINT, 3, @data, :BIG_ENDIAN, :ERROR)
1938
+ expect(@data).to eql("\x00\xA0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1939
+ end
1940
+
1941
+ it "writes 1-bit signed integers" do
1942
+ BinaryAccessor.write_array([1,0,1], 8, 1, :INT, 0, @data, :BIG_ENDIAN, :ERROR)
1943
+ expect(@data).to eql("\x00\xA0")
1944
+ end
1945
+
1946
+ it "writes 7-bit unsigned integers" do
1947
+ BinaryAccessor.write_array([0x40,0x60,0x50], 8, 7, :UINT, 21, @data, :BIG_ENDIAN, :ERROR)
1948
+ expect(@data).to eql("\x00\x81\x82\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
1949
+ end
1950
+
1951
+ it "writes aligned 16-bit unsigned integers" do
1952
+ data = [0x8081, 0x8283, 0x8485, 0x8687, 0x0009, 0x0A0B, 0x0C0D, 0x0E0F]
1953
+ BinaryAccessor.write_array(data, 0, 16, :UINT, 0, @data, :BIG_ENDIAN, :ERROR)
1954
+ expect(@data).to eql(@baseline_data)
1955
+ end
1956
+
1957
+ it "writes aligned 16-bit signed integers" do
1958
+ data = [0x8081, 0x8283, 0x8485, 0x8687, 0x0009, 0x0A0B, 0x0C0D, 0x0E0F]
1959
+ data.map! {|x| (x & ~(1 << 15)) - (x & (1 << 15)) } # convert to negative
1960
+ BinaryAccessor.write_array(data, 0, 16, :INT, 0, @data, :BIG_ENDIAN, :ERROR)
1961
+ expect(@data).to eql(@baseline_data)
1962
+ end
1963
+
1964
+ it "writes aligned 32-bit unsigned integers" do
1965
+ data = [0x80818283, 0x84858687, 0x00090A0B, 0x0C0D0E0F]
1966
+ BinaryAccessor.write_array(data, 0, 32, :UINT, 0, @data, :BIG_ENDIAN, :ERROR)
1967
+ expect(@data).to eql(@baseline_data)
1968
+ end
1969
+
1970
+ it "writes aligned 32-bit signed integers" do
1971
+ data = [0x80818283, 0x84858687, 0x00090A0B, 0x0C0D0E0F]
1972
+ data.map! {|x| (x & ~(1 << 31)) - (x & (1 << 31)) } # convert to negative
1973
+ BinaryAccessor.write_array(data, 0, 32, :INT, 0, @data, :BIG_ENDIAN, :ERROR)
1974
+ expect(@data).to eql(@baseline_data)
1975
+ end
1976
+
1977
+ it "writes aligned 32-bit floats" do
1978
+ data = [-1.189360e-038, -3.139169e-036, 8.301067e-040, 1.086646e-031]
1979
+ BinaryAccessor.write_array(data, 0, 32, :FLOAT, 0, @data, :BIG_ENDIAN, :ERROR)
1980
+ expect(BinaryAccessor.read(0, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-038).of(data[0])
1981
+ expect(BinaryAccessor.read(32, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-036).of(data[1])
1982
+ expect(BinaryAccessor.read(64, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-040).of(data[2])
1983
+ expect(BinaryAccessor.read(96, 32, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-031).of(data[3])
1984
+ end
1985
+
1986
+ it "writes aligned 64-bit unsigned integers" do
1987
+ data = [0x8081828384858687, 0x00090A0B0C0D0E0F]
1988
+ BinaryAccessor.write_array(data, 0, 64, :UINT, 0, @data, :BIG_ENDIAN, :ERROR)
1989
+ expect(@data).to eql(@baseline_data)
1990
+ end
1991
+
1992
+ it "writes aligned 64-bit signed integers" do
1993
+ data = [0x8081828384858687, 0x00090A0B0C0D0E0F]
1994
+ data.map! {|x| (x & ~(1 << 63)) - (x & (1 << 63)) } # convert to negative
1995
+ BinaryAccessor.write_array(data, 0, 64, :INT, 0, @data, :BIG_ENDIAN, :ERROR)
1996
+ expect(@data).to eql(@baseline_data)
1997
+ end
1998
+
1999
+ it "writes aligned 64-bit floats" do
2000
+ data = [-3.116851e-306, 1.257060e-308]
2001
+ BinaryAccessor.write_array(data, 0, 64, :FLOAT, 0, @data, :BIG_ENDIAN, :ERROR)
2002
+ expect(BinaryAccessor.read(0, 64, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-306).of(data[0])
2003
+ expect(BinaryAccessor.read(64, 64, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-308).of(data[1])
2004
+ end
2005
+
2006
+ it "complains about unaligned floats" do
2007
+ expect { BinaryAccessor.write_array([0.0], 17, 32, :FLOAT, 32, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_offset 17 is not byte aligned for data_type FLOAT")
2008
+ end
2009
+
2010
+ it "complains about mis-sized floats" do
2011
+ expect { BinaryAccessor.write_array([0.0], 0, 33, :FLOAT, 33, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_size is 33 but must be 32 or 64 for data_type FLOAT")
2012
+ end
2013
+
2014
+ end # given big endian data
2015
+
2016
+ describe "given little endian data" do
2017
+
2018
+ it "writes 1-bit unsigned integers" do
2019
+ BinaryAccessor.write_array([1,0,1], 8, 1, :UINT, 3, @data, :LITTLE_ENDIAN, :ERROR)
2020
+ expect(@data).to eql("\x00\xA0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
2021
+ end
2022
+
2023
+ it "writes 1-bit signed integers" do
2024
+ BinaryAccessor.write_array([1,0,1], 8, 1, :INT, 0, @data, :LITTLE_ENDIAN, :ERROR)
2025
+ expect(@data).to eql("\x00\xA0")
2026
+ end
2027
+
2028
+ it "complains about little endian bit-fields greater than 1-bit" do
2029
+ expect { BinaryAccessor.write_array([0x40,0x60,0x50], 8, 7, :UINT, 21, @data, :LITTLE_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "write_array does not support little endian bit fields with bit_size greater than 1-bit")
2030
+ end
2031
+
2032
+ it "writes aligned 16-bit unsigned integers" do
2033
+ data = [0x8180, 0x8382, 0x8584, 0x8786, 0x0900, 0x0B0A, 0x0D0C, 0x0F0E]
2034
+ BinaryAccessor.write_array(data, 0, 16, :UINT, 0, @data, :LITTLE_ENDIAN, :ERROR)
2035
+ expect(@data).to eql(@baseline_data)
2036
+ end
2037
+
2038
+ it "writes aligned 16-bit signed integers" do
2039
+ data = [0x8180, 0x8382, 0x8584, 0x8786, 0x0900, 0x0B0A, 0x0D0C, 0x0F0E]
2040
+ data.map! {|x| (x & ~(1 << 15)) - (x & (1 << 15)) } # convert to negative
2041
+ BinaryAccessor.write_array(data, 0, 16, :INT, 0, @data, :LITTLE_ENDIAN, :ERROR)
2042
+ expect(@data).to eql(@baseline_data)
2043
+ end
2044
+
2045
+ it "writes aligned 32-bit unsigned integers" do
2046
+ data = [0x83828180, 0x87868584, 0x0B0A0900, 0x0F0E0D0C]
2047
+ BinaryAccessor.write_array(data, 0, 32, :UINT, 0, @data, :LITTLE_ENDIAN, :ERROR)
2048
+ expect(@data).to eql(@baseline_data)
2049
+ end
2050
+
2051
+ it "writes aligned 32-bit signed integers" do
2052
+ data= [0x83828180, 0x87868584, 0x0B0A0900, 0x0F0E0D0C]
2053
+ data.map! {|x| (x & ~(1 << 31)) - (x & (1 << 31)) } # convert to negative
2054
+ BinaryAccessor.write_array(data, 0, 32, :INT, 0, @data, :LITTLE_ENDIAN, :ERROR)
2055
+ expect(@data).to eql(@baseline_data)
2056
+ end
2057
+
2058
+ it "writes aligned 32-bit floats" do
2059
+ data = [-7.670445e-037, -2.024055e-034, 2.658460e-032, 7.003653e-030]
2060
+ BinaryAccessor.write_array(data, 0, 32, :FLOAT, 0, @data, :LITTLE_ENDIAN, :ERROR)
2061
+ expect(BinaryAccessor.read(0, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-037).of(data[0])
2062
+ expect(BinaryAccessor.read(32, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-034).of(data[1])
2063
+ expect(BinaryAccessor.read(64, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-032).of(data[2])
2064
+ expect(BinaryAccessor.read(96, 32, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-030).of(data[3])
2065
+ end
2066
+
2067
+ it "writes aligned 64-bit unsigned integers" do
2068
+ data = [0x8786858483828180, 0x0F0E0D0C0B0A0900]
2069
+ BinaryAccessor.write_array(data, 0, 64, :UINT, 0, @data, :LITTLE_ENDIAN, :ERROR)
2070
+ expect(@data).to eql(@baseline_data)
2071
+ end
2072
+
2073
+ it "writes aligned 64-bit signed integers" do
2074
+ data = [0x8786858483828180, 0x0F0E0D0C0B0A0900]
2075
+ data.map! {|x| (x & ~(1 << 63)) - (x & (1 << 63)) } # convert to negative
2076
+ BinaryAccessor.write_array(data, 0, 64, :INT, 0, @data, :LITTLE_ENDIAN, :ERROR)
2077
+ expect(@data).to eql(@baseline_data)
2078
+ end
2079
+
2080
+ it "writes aligned 64-bit floats" do
2081
+ data = [-2.081577e-272, 3.691916e-236]
2082
+ BinaryAccessor.write_array(data, 0, 64, :FLOAT, 0, @data, :LITTLE_ENDIAN, :ERROR)
2083
+ expect(BinaryAccessor.read(0, 64, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-272).of(data[0])
2084
+ expect(BinaryAccessor.read(64, 64, :FLOAT, @data, :LITTLE_ENDIAN)).to be_within(1.0e-236).of(data[1])
2085
+ end
2086
+
2087
+ it "complains about unaligned floats" do
2088
+ expect { BinaryAccessor.write_array([0.0], 1, 32, :FLOAT, 32, @data, :LITTLE_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_offset 1 is not byte aligned for data_type FLOAT")
2089
+ end
2090
+
2091
+ it "complains about mis-sized floats" do
2092
+ expect { BinaryAccessor.write_array([0.0], 0, 65, :FLOAT, 65, @data, :LITTLE_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_size is 65 but must be 32 or 64 for data_type FLOAT")
2093
+ end
2094
+
2095
+ end # given little endian data
2096
+
2097
+ describe "should support overflow types" do
2098
+ before(:each) do
2099
+ @data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2100
+ end
2101
+
2102
+ it "prevents overflow of STRING" do
2103
+ expect { BinaryAccessor.write_array(["abcde"], 0, 32, :STRING, 32, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of 5 bytes does not fit into 4 bytes for data_type STRING")
2104
+ end
2105
+
2106
+ it "prevents overflow of BLOCK" do
2107
+ expect { BinaryAccessor.write_array(["abcde"], 0, 32, :BLOCK, 32, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of 5 bytes does not fit into 4 bytes for data_type BLOCK")
2108
+ end
2109
+
2110
+ it "prevents overflow of 8-bit INT" do
2111
+ bit_size = 8; data_type = :INT; value = 2 ** (bit_size - 1)
2112
+ expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2113
+ end
2114
+
2115
+ it "prevents overflow of 16-bit INT" do
2116
+ bit_size = 16; data_type = :INT; value = 2 ** (bit_size - 1)
2117
+ expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2118
+ end
2119
+
2120
+ it "prevents overflow of 32-bit INT" do
2121
+ bit_size = 32; data_type = :INT; value = 2 ** (bit_size - 1)
2122
+ expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2123
+ end
2124
+
2125
+ it "prevents overflow of 64-bit INT" do
2126
+ bit_size = 64; data_type = :INT; value = 2 ** (bit_size - 1)
2127
+ expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2128
+ end
2129
+
2130
+ it "prevents overflow of 3-bit INT" do
2131
+ bit_size = 3; data_type = :INT; value = 2 ** (bit_size - 1)
2132
+ expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2133
+ end
2134
+
2135
+ it "prevents overflow of 8-bit UINT" do
2136
+ bit_size = 8; data_type = :UINT; value = 2 ** bit_size
2137
+ expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2138
+ end
2139
+
2140
+ it "prevents overflow of 16-bit UINT" do
2141
+ bit_size = 16; data_type = :UINT; value = 2 ** bit_size
2142
+ expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2143
+ end
2144
+
2145
+ it "prevents overflow of 32-bit UINT" do
2146
+ bit_size = 32; data_type = :UINT; value = 2 ** bit_size
2147
+ expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2148
+ end
2149
+
2150
+ it "prevents overflow of 64-bit UINT" do
2151
+ bit_size = 64; data_type = :UINT; value = 2 ** bit_size
2152
+ expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2153
+ end
2154
+
2155
+ it "prevents overflow of 3-bit UINT" do
2156
+ bit_size = 3; data_type = :UINT; value = 2 ** bit_size
2157
+ expect { BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "value of #{value} invalid for #{bit_size}-bit #{data_type}")
2158
+ end
2159
+
2160
+ it "truncates STRING" do
2161
+ BinaryAccessor.write_array(["abcde"], 0, 32, :STRING, 32, @data, :BIG_ENDIAN, :TRUNCATE)
2162
+ expect(@data[0..4]).to eql "abcd\x00"
2163
+ end
2164
+
2165
+ it "truncates BLOCK" do
2166
+ BinaryAccessor.write_array(["abcde"], 0, 32, :BLOCK, 32, @data, :BIG_ENDIAN, :TRUNCATE)
2167
+ expect(@data[0..4]).to eql "abcd\x00"
2168
+ end
2169
+
2170
+ it "truncates 8-bit INT" do
2171
+ bit_size = 8; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
2172
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2173
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2174
+ end
2175
+
2176
+ it "truncates 16-bit INT" do
2177
+ bit_size = 16; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
2178
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2179
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2180
+ end
2181
+
2182
+ it "truncates 32-bit INT" do
2183
+ bit_size = 32; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
2184
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2185
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2186
+ end
2187
+
2188
+ it "truncates 64-bit INT" do
2189
+ bit_size = 64; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
2190
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2191
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2192
+ end
2193
+
2194
+ it "truncates 3-bit INT" do
2195
+ bit_size = 3; data_type = :INT; value = 2 ** (bit_size - 1); truncated_value = -value
2196
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2197
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2198
+ end
2199
+
2200
+ it "truncates 8-bit UINT" do
2201
+ bit_size = 8; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
2202
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2203
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2204
+ end
2205
+
2206
+ it "truncates 16-bit UINT" do
2207
+ bit_size = 16; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
2208
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2209
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2210
+ end
2211
+
2212
+ it "truncates 32-bit UINT" do
2213
+ bit_size = 32; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
2214
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2215
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2216
+ end
2217
+
2218
+ it "truncates 64-bit UINT" do
2219
+ bit_size = 64; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
2220
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2221
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2222
+ end
2223
+
2224
+ it "truncates 3-bit UINT" do
2225
+ bit_size = 3; data_type = :UINT; value = 2 ** bit_size + 1; truncated_value = 1
2226
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :TRUNCATE)
2227
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql truncated_value
2228
+ end
2229
+
2230
+ it "saturates 8-bit INT" do
2231
+ bit_size = 8; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
2232
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2233
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2234
+ end
2235
+
2236
+ it "saturates 16-bit INT" do
2237
+ bit_size = 16; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
2238
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2239
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2240
+ end
2241
+
2242
+ it "saturates 32-bit INT" do
2243
+ bit_size = 32; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
2244
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2245
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2246
+ end
2247
+
2248
+ it "saturates 64-bit INT" do
2249
+ bit_size = 64; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
2250
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2251
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2252
+ end
2253
+
2254
+ it "saturates 3-bit INT" do
2255
+ bit_size = 3; data_type = :INT; value = 2 ** (bit_size - 1); saturated_value = value - 1
2256
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2257
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2258
+ end
2259
+
2260
+ it "saturates 8-bit UINT" do
2261
+ bit_size = 8; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
2262
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2263
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2264
+ end
2265
+
2266
+ it "saturates 16-bit UINT" do
2267
+ bit_size = 16; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
2268
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2269
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2270
+ end
2271
+
2272
+ it "saturates 32-bit UINT" do
2273
+ bit_size = 32; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
2274
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2275
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2276
+ end
2277
+
2278
+ it "saturates 64-bit UINT" do
2279
+ bit_size = 64; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
2280
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2281
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2282
+ end
2283
+
2284
+ it "saturates 3-bit UINT" do
2285
+ bit_size = 3; data_type = :UINT; value = 2 ** bit_size; saturated_value = value - 1
2286
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :SATURATE)
2287
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql saturated_value
2288
+ end
2289
+
2290
+ it "allows hex value entry of 8-bit INT" do
2291
+ bit_size = 8; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
2292
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
2293
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
2294
+ end
2295
+
2296
+ it "allows hex value entry of 16-bit INT" do
2297
+ bit_size = 16; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
2298
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
2299
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
2300
+ end
2301
+
2302
+ it "allows hex value entry of 32-bit INT" do
2303
+ bit_size = 32; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
2304
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
2305
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
2306
+ end
2307
+
2308
+ it "allows hex value entry of 64-bit INT" do
2309
+ bit_size = 64; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
2310
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
2311
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
2312
+ end
2313
+
2314
+ it "allows hex value entry of 3-bit INT" do
2315
+ bit_size = 3; data_type = :INT; value = 2 ** bit_size - 1; allowed_value = -1
2316
+ BinaryAccessor.write_array([value], 0, bit_size, data_type, bit_size, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
2317
+ expect(BinaryAccessor.read(0, bit_size, data_type, @data, :BIG_ENDIAN)).to eql allowed_value
2318
+ end
2319
+
2320
+ end
2321
+
2322
+ end # describe "write_array"
2323
+
2324
+ end # describe BinaryAccessor
2325
+
2326
+ end # module Cosmos