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.
- checksums.yaml +4 -4
- data/.coveralls.yml +1 -1
- data/.gitattributes +3 -3
- data/.gitignore +48 -48
- data/.travis.yml +8 -8
- data/CONTRIBUTING.txt +50 -50
- data/Gemfile +10 -10
- data/Guardfile +27 -27
- data/LICENSE.txt +879 -879
- data/Manifest.txt +1414 -1414
- data/README.md +111 -111
- data/Rakefile +218 -214
- data/autohotkey/config/data/diamond.STL +57 -57
- data/autohotkey/config/system/system.txt +34 -34
- data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
- data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
- data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
- data/autohotkey/config/targets/COSMOS/target.txt +5 -5
- data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
- data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +270 -270
- data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
- data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
- data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -305
- data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
- data/autohotkey/config/targets/INST/screens/array.txt +7 -7
- data/autohotkey/config/targets/INST/screens/block.txt +8 -8
- data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
- data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
- data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
- data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
- data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
- data/autohotkey/config/targets/INST/screens/image.txt +21 -21
- data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
- data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
- data/autohotkey/config/targets/INST/screens/other.txt +25 -25
- data/autohotkey/config/targets/INST/screens/params.txt +25 -25
- data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
- data/autohotkey/config/targets/INST/target.txt +26 -26
- data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
- data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
- data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
- data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
- data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
- data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
- data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
- data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
- data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
- data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
- data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
- data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
- data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
- data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
- data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
- data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
- data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
- data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
- data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
- data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
- data/autohotkey/config/tools/launcher/launcher.txt +38 -38
- data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
- data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
- data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
- data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
- data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
- data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
- data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
- data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
- data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
- data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
- data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
- data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
- data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
- data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
- data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
- data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
- data/autohotkey/lib/example_background_task.rb +42 -42
- data/autohotkey/lib/user_version.rb +3 -3
- data/autohotkey/procedures/clear_util.rb +7 -7
- data/autohotkey/procedures/collect_util.rb +14 -14
- data/autohotkey/procedures/example_test.rb +67 -67
- data/autohotkey/procedures/example_test2.rb +74 -74
- data/autohotkey/procedures/script_test.rb +17 -17
- data/autohotkey/procedures/syntax_error.rb +18 -18
- data/autohotkey/tools/CmdExtractorAHK +16 -16
- data/autohotkey/tools/CmdSender +14 -14
- data/autohotkey/tools/CmdSenderAHK +18 -18
- data/autohotkey/tools/CmdTlmServer +14 -14
- data/autohotkey/tools/CmdTlmServerAHK +28 -28
- data/autohotkey/tools/CmdTlmServerAHK2 +17 -17
- data/autohotkey/tools/DataViewer +14 -14
- data/autohotkey/tools/DataViewerAHK +17 -17
- data/autohotkey/tools/HandbookCreatorAHK +20 -20
- data/autohotkey/tools/LauncherAHK +17 -17
- data/autohotkey/tools/LimitsMonitorAHK +20 -20
- data/autohotkey/tools/OpenGLBuilderAHK +24 -24
- data/autohotkey/tools/PacketViewer +14 -14
- data/autohotkey/tools/PacketViewerAHK +18 -18
- data/autohotkey/tools/PacketViewerAHK2 +17 -17
- data/autohotkey/tools/Replay +14 -14
- data/autohotkey/tools/ReplayAHK +17 -17
- data/autohotkey/tools/ScriptRunner +14 -14
- data/autohotkey/tools/ScriptRunnerAHK +20 -20
- data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
- data/autohotkey/tools/TableManager +14 -14
- data/autohotkey/tools/TableManagerAHK +30 -30
- data/autohotkey/tools/TestRunner +15 -15
- data/autohotkey/tools/TestRunnerAHK +17 -17
- data/autohotkey/tools/TestRunnerAHK2 +17 -17
- data/autohotkey/tools/TestRunnerAHK3 +17 -17
- data/autohotkey/tools/TestRunnerAHK4 +17 -17
- data/autohotkey/tools/TestRunnerAHK5 +17 -17
- data/autohotkey/tools/TestRunnerAHK6 +17 -17
- data/autohotkey/tools/TlmExtractor +15 -15
- data/autohotkey/tools/TlmExtractorAHK +19 -19
- data/autohotkey/tools/TlmExtractorAHK2 +16 -16
- data/autohotkey/tools/TlmExtractorAHK3 +16 -16
- data/autohotkey/tools/TlmGrapher +14 -14
- data/autohotkey/tools/TlmGrapherAHK +19 -19
- data/autohotkey/tools/TlmGrapherAHK2 +23 -23
- data/autohotkey/tools/TlmGrapherAHK3 +17 -17
- data/autohotkey/tools/TlmGrapherAHK4 +17 -17
- data/autohotkey/tools/TlmViewer +14 -14
- data/autohotkey/tools/TlmViewerAHK +28 -28
- data/autohotkey/tools/TlmViewerAHK2 +22 -22
- data/autohotkey/tools/TlmViewerAHK3 +23 -23
- data/autohotkey/tools/TlmViewerAHK4 +22 -22
- data/autohotkey/tools/TlmViewerAHK5 +18 -18
- data/autohotkey/tools/autohotkey.rb +37 -37
- data/autohotkey/tools/cmd_extractor.ahk +33 -33
- data/autohotkey/tools/cmd_sender.ahk +182 -182
- data/autohotkey/tools/cmd_tlm_server.ahk +90 -90
- data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
- data/autohotkey/tools/data_viewer.ahk +141 -141
- data/autohotkey/tools/handbook_creator.ahk +32 -32
- data/autohotkey/tools/launcher.ahk +41 -41
- data/autohotkey/tools/limits_monitor.ahk +123 -123
- data/autohotkey/tools/open_gl_builder.ahk +134 -134
- data/autohotkey/tools/packet_viewer.ahk +196 -196
- data/autohotkey/tools/packet_viewer2.ahk +9 -9
- data/autohotkey/tools/replay.ahk +104 -104
- data/autohotkey/tools/script_runner.ahk +589 -589
- data/autohotkey/tools/script_runner2.ahk +38 -38
- data/autohotkey/tools/table_manager.ahk +220 -220
- data/autohotkey/tools/test_runner.ahk +262 -262
- data/autohotkey/tools/test_runner2.ahk +53 -53
- data/autohotkey/tools/test_runner3.ahk +13 -13
- data/autohotkey/tools/test_runner5.ahk +8 -8
- data/autohotkey/tools/test_runner6.ahk +5 -5
- data/autohotkey/tools/tlm_extractor.ahk +296 -296
- data/autohotkey/tools/tlm_grapher.ahk +660 -660
- data/autohotkey/tools/tlm_grapher2.ahk +115 -115
- data/autohotkey/tools/tlm_grapher3.ahk +24 -24
- data/autohotkey/tools/tlm_viewer.ahk +133 -133
- data/autohotkey/tools/tlm_viewer2.ahk +50 -50
- data/autohotkey/tools/tlm_viewer4.ahk +4 -4
- data/autohotkey/tools/tlm_viewer5.ahk +20 -20
- data/bin/cosmos +96 -96
- data/bin/cstol_converter +1166 -1166
- data/bin/rubysloc +85 -85
- data/cosmos.gemspec +99 -99
- data/data/about.txt +4 -4
- data/data/crc.txt +326 -326
- data/data/diamond.STL +57 -57
- data/data/legal.txt +9 -9
- data/demo/Gemfile +10 -10
- data/demo/Launcher +16 -16
- data/demo/Launcher.bat +0 -0
- data/demo/Rakefile +77 -77
- data/demo/config/data/crc.txt +224 -226
- data/demo/config/data/diamond.STL +57 -57
- data/demo/config/data/meta_init.txt +4 -4
- data/demo/config/system/system.txt +35 -35
- data/demo/config/system/system2.txt +33 -33
- data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
- data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
- data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
- data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
- data/demo/config/targets/COSMOS/screens/version.txt +19 -19
- data/demo/config/targets/COSMOS/target.txt +11 -11
- data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
- data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +5 -5
- data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
- data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
- data/demo/config/targets/EXAMPLE/target.txt +6 -6
- data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
- data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
- data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
- data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
- data/demo/config/targets/INST/lib/sim_inst.rb +305 -305
- data/demo/config/targets/INST/screens/adcs.txt +46 -46
- data/demo/config/targets/INST/screens/array.txt +15 -15
- data/demo/config/targets/INST/screens/block.txt +8 -8
- data/demo/config/targets/INST/screens/commanding.txt +30 -30
- data/demo/config/targets/INST/screens/graphs.txt +14 -14
- data/demo/config/targets/INST/screens/ground.txt +25 -25
- data/demo/config/targets/INST/screens/hs.txt +44 -44
- data/demo/config/targets/INST/screens/latest.txt +23 -23
- data/demo/config/targets/INST/screens/other.txt +29 -29
- data/demo/config/targets/INST/screens/tabs.txt +70 -70
- data/demo/config/targets/INST/target.txt +33 -33
- data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
- data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
- data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
- data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
- data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
- data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -13
- data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
- data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
- data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +56 -56
- data/demo/config/targets/TEMPLATED/target.txt +6 -6
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +39 -39
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +34 -34
- data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
- data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
- data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +88 -88
- data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
- data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
- data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
- data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
- data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
- data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
- data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
- data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
- data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
- data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +82 -82
- data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
- data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
- data/demo/config/tools/launcher/launcher.txt +45 -45
- data/demo/config/tools/launcher/launcher2.txt +45 -45
- data/demo/config/tools/script_runner/script_runner.txt +3 -3
- data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
- data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
- data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
- data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
- data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
- data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
- data/demo/config/tools/test_runner/test_runner.txt +17 -17
- data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
- data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
- data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
- data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
- data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
- data/demo/lib/example_background_task.rb +57 -57
- data/demo/lib/example_target.rb +113 -113
- data/demo/lib/scpi_target.rb +74 -74
- data/demo/lib/user_version.rb +3 -3
- data/demo/procedures/checks.rb +11 -11
- data/demo/procedures/clear_util.rb +7 -7
- data/demo/procedures/collect.rb +18 -18
- data/demo/procedures/collect_util.rb +14 -14
- data/demo/procedures/cosmos_api_test.rb +293 -293
- data/demo/procedures/disconnect.rb +29 -29
- data/demo/procedures/example_test.rb +183 -183
- data/demo/procedures/plot_test.rb +8 -8
- data/demo/procedures/run_example_test.rb +3 -3
- data/demo/procedures/test.rb +51 -51
- data/demo/tools/CmdExtractor +16 -16
- data/demo/tools/CmdExtractor.bat +0 -0
- data/demo/tools/CmdSender +16 -16
- data/demo/tools/CmdSender.bat +0 -0
- data/demo/tools/CmdTlmServer +16 -16
- data/demo/tools/CmdTlmServer.bat +0 -0
- data/demo/tools/DataViewer +16 -16
- data/demo/tools/DataViewer.bat +0 -0
- data/demo/tools/ExampleTarget +16 -16
- data/demo/tools/ExampleTarget.bat +0 -0
- data/demo/tools/HandbookCreator +16 -16
- data/demo/tools/HandbookCreator.bat +0 -0
- data/demo/tools/Launcher +16 -16
- data/demo/tools/Launcher.bat +0 -0
- data/demo/tools/LimitsMonitor +16 -16
- data/demo/tools/LimitsMonitor.bat +0 -0
- data/demo/tools/OpenGLBuilder +16 -16
- data/demo/tools/OpenGLBuilder.bat +0 -0
- data/demo/tools/PacketViewer +16 -16
- data/demo/tools/PacketViewer.bat +0 -0
- data/demo/tools/Replay +16 -16
- data/demo/tools/Replay.bat +0 -0
- data/demo/tools/ScpiTarget +16 -16
- data/demo/tools/ScpiTarget.bat +0 -0
- data/demo/tools/ScriptRunner +16 -16
- data/demo/tools/ScriptRunner.bat +0 -0
- data/demo/tools/TableManager +16 -16
- data/demo/tools/TableManager.bat +0 -0
- data/demo/tools/TestRunner +16 -16
- data/demo/tools/TestRunner.bat +0 -0
- data/demo/tools/TlmExtractor +16 -16
- data/demo/tools/TlmExtractor.bat +0 -0
- data/demo/tools/TlmGrapher +16 -16
- data/demo/tools/TlmGrapher.bat +0 -0
- data/demo/tools/TlmViewer +16 -16
- data/demo/tools/TlmViewer.bat +0 -0
- data/demo/tools/ToolLaunch.bat +14 -5
- data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +16 -16
- data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +16 -16
- data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +16 -16
- data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +16 -16
- data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +16 -16
- data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +16 -16
- data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +16 -16
- data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +16 -16
- data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +16 -16
- data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +16 -16
- data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +16 -16
- data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +16 -16
- data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +16 -16
- data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +16 -16
- data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +16 -16
- data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +16 -16
- data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +10 -10
- data/demo/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -38
- data/demo/tools/tool_launch.rb +38 -38
- data/ext/cosmos/ext/array/array.c +111 -111
- data/ext/cosmos/ext/array/extconf.rb +13 -13
- data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
- data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
- data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
- data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
- data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
- data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
- data/ext/cosmos/ext/crc/crc.c +341 -341
- data/ext/cosmos/ext/crc/extconf.rb +12 -12
- data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
- data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
- data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
- data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +265 -265
- data/ext/cosmos/ext/packet/extconf.rb +13 -13
- data/ext/cosmos/ext/packet/packet.c +339 -339
- data/ext/cosmos/ext/platform/extconf.rb +13 -13
- data/ext/cosmos/ext/platform/platform.c +101 -101
- data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
- data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
- data/ext/cosmos/ext/string/extconf.rb +13 -13
- data/ext/cosmos/ext/string/string.c +49 -49
- data/ext/cosmos/ext/structure/structure.c +1428 -1428
- data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
- data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
- data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
- data/ext/cosmos/ext/telemetry/telemetry.c +307 -307
- data/ext/mkrf_conf.rb +40 -40
- data/install/Gemfile +10 -10
- data/install/Launcher +16 -16
- data/install/Launcher.bat +0 -0
- data/install/Rakefile +77 -77
- data/install/config/data/crc.txt +151 -151
- data/install/config/system/system.txt +29 -29
- data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
- data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
- data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
- data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
- data/install/config/targets/COSMOS/screens/version.txt +19 -19
- data/install/config/targets/COSMOS/target.txt +8 -8
- data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
- data/install/config/tools/data_viewer/data_viewer.txt +3 -3
- data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
- data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
- data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
- data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
- data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
- data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
- data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
- data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
- data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
- data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
- data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
- data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
- data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
- data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
- data/install/config/tools/launcher/launcher.txt +40 -40
- data/install/config/tools/script_runner/script_runner.txt +3 -3
- data/install/config/tools/test_runner/test_runner.txt +8 -8
- data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
- data/install/lib/user_version.rb +3 -3
- data/install/tools/CmdExtractor +16 -16
- data/install/tools/CmdExtractor.bat +0 -0
- data/install/tools/CmdSender +16 -16
- data/install/tools/CmdSender.bat +0 -0
- data/install/tools/CmdTlmServer +16 -16
- data/install/tools/CmdTlmServer.bat +0 -0
- data/install/tools/DataViewer +16 -16
- data/install/tools/DataViewer.bat +0 -0
- data/install/tools/HandbookCreator +16 -16
- data/install/tools/HandbookCreator.bat +0 -0
- data/install/tools/Launcher +16 -16
- data/install/tools/Launcher.bat +0 -0
- data/install/tools/LimitsMonitor +16 -16
- data/install/tools/LimitsMonitor.bat +0 -0
- data/install/tools/OpenGLBuilder +16 -16
- data/install/tools/OpenGLBuilder.bat +0 -0
- data/install/tools/PacketViewer +16 -16
- data/install/tools/PacketViewer.bat +0 -0
- data/install/tools/Replay +16 -16
- data/install/tools/Replay.bat +0 -0
- data/install/tools/ScriptRunner +16 -16
- data/install/tools/ScriptRunner.bat +0 -0
- data/install/tools/TableManager +16 -16
- data/install/tools/TableManager.bat +0 -0
- data/install/tools/TestRunner +16 -16
- data/install/tools/TestRunner.bat +0 -0
- data/install/tools/TlmExtractor +16 -16
- data/install/tools/TlmExtractor.bat +0 -0
- data/install/tools/TlmGrapher +16 -16
- data/install/tools/TlmGrapher.bat +0 -0
- data/install/tools/TlmViewer +16 -16
- data/install/tools/TlmViewer.bat +0 -0
- data/install/tools/ToolLaunch.bat +14 -5
- data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
- data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +16 -16
- data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
- data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +16 -16
- data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +16 -16
- data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +16 -16
- data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
- data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +16 -16
- data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
- data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +16 -16
- data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
- data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +16 -16
- data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
- data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +16 -16
- data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +16 -16
- data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
- data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +16 -16
- data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
- data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +16 -16
- data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +16 -16
- data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +16 -16
- data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +16 -16
- data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +16 -16
- data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +16 -16
- data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +10 -10
- data/install/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -38
- data/install/tools/tool_launch.rb +38 -38
- data/lib/cosmos.rb +63 -63
- data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
- data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
- data/lib/cosmos/config/config_parser.rb +324 -324
- data/lib/cosmos/conversions.rb +13 -13
- data/lib/cosmos/conversions/conversion.rb +47 -47
- data/lib/cosmos/conversions/generic_conversion.rb +55 -55
- data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
- data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
- data/lib/cosmos/conversions/processor_conversion.rb +46 -46
- data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
- data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
- data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
- data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
- data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
- data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
- data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
- data/lib/cosmos/core_ext.rb +18 -18
- data/lib/cosmos/core_ext/array.rb +354 -354
- data/lib/cosmos/core_ext/class.rb +51 -51
- data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
- data/lib/cosmos/core_ext/exception.rb +52 -52
- data/lib/cosmos/core_ext/file.rb +75 -75
- data/lib/cosmos/core_ext/hash.rb +28 -28
- data/lib/cosmos/core_ext/io.rb +75 -75
- data/lib/cosmos/core_ext/kernel.rb +38 -38
- data/lib/cosmos/core_ext/math.rb +119 -119
- data/lib/cosmos/core_ext/matrix.rb +146 -146
- data/lib/cosmos/core_ext/objectspace.rb +29 -29
- data/lib/cosmos/core_ext/range.rb +22 -22
- data/lib/cosmos/core_ext/socket.rb +32 -32
- data/lib/cosmos/core_ext/string.rb +311 -311
- data/lib/cosmos/core_ext/stringio.rb +24 -24
- data/lib/cosmos/core_ext/time.rb +448 -448
- data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
- data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
- data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
- data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
- data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
- data/lib/cosmos/gui/choosers/telemetry_chooser.rb +326 -326
- data/lib/cosmos/gui/dialogs/about_dialog.rb +137 -137
- data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
- data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
- data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
- data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
- data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
- data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
- data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +260 -260
- data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -169
- data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
- data/lib/cosmos/gui/dialogs/progress_dialog.rb +276 -276
- data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -165
- data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
- data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
- data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
- data/lib/cosmos/gui/dialogs/splash.rb +135 -135
- data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
- data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
- data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
- data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
- data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +473 -473
- data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
- data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +451 -451
- data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
- data/lib/cosmos/gui/line_graph/lines.rb +290 -290
- data/lib/cosmos/gui/line_graph/overview_graph.rb +469 -469
- data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
- data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
- data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
- data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
- data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
- data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
- data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -724
- data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
- data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
- data/lib/cosmos/gui/opengl/opengl.rb +8 -8
- data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
- data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
- data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
- data/lib/cosmos/gui/qt.rb +860 -860
- data/lib/cosmos/gui/qt_tool.rb +380 -380
- data/lib/cosmos/gui/text/completion.rb +381 -381
- data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
- data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
- data/lib/cosmos/gui/text/ruby_editor.rb +415 -415
- data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
- data/lib/cosmos/gui/utilities/script_module_gui.rb +330 -330
- data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
- data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
- data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
- data/lib/cosmos/interfaces.rb +11 -11
- data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -153
- data/lib/cosmos/interfaces/interface.rb +225 -225
- data/lib/cosmos/interfaces/linc_interface.rb +360 -360
- data/lib/cosmos/interfaces/serial_interface.rb +76 -76
- data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -129
- data/lib/cosmos/interfaces/stream_interface.rb +136 -136
- data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
- data/lib/cosmos/interfaces/tcpip_server_interface.rb +164 -164
- data/lib/cosmos/interfaces/udp_interface.rb +161 -161
- data/lib/cosmos/io/buffered_file.rb +11 -11
- data/lib/cosmos/io/cosmos_snmp.rb +50 -50
- data/lib/cosmos/io/io_multiplexer.rb +89 -89
- data/lib/cosmos/io/json_drb.rb +376 -376
- data/lib/cosmos/io/json_drb_object.rb +198 -198
- data/lib/cosmos/io/json_rpc.rb +365 -365
- data/lib/cosmos/io/posix_serial_driver.rb +145 -145
- data/lib/cosmos/io/raw_logger.rb +174 -174
- data/lib/cosmos/io/raw_logger_pair.rb +71 -71
- data/lib/cosmos/io/serial_driver.rb +85 -85
- data/lib/cosmos/io/stderr.rb +36 -36
- data/lib/cosmos/io/stdout.rb +36 -36
- data/lib/cosmos/io/tcpip_server.rb +571 -571
- data/lib/cosmos/io/udp_sockets.rb +152 -152
- data/lib/cosmos/io/win32_serial_driver.rb +145 -145
- data/lib/cosmos/packet_logs.rb +7 -7
- data/lib/cosmos/packet_logs/ccsds_log_reader.rb +104 -104
- data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
- data/lib/cosmos/packet_logs/packet_log_reader.rb +450 -450
- data/lib/cosmos/packet_logs/packet_log_writer.rb +323 -323
- data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
- data/lib/cosmos/packets/binary_accessor.rb +634 -634
- data/lib/cosmos/packets/commands.rb +293 -293
- data/lib/cosmos/packets/limits.rb +267 -267
- data/lib/cosmos/packets/limits_response.rb +38 -38
- data/lib/cosmos/packets/packet.rb +786 -786
- data/lib/cosmos/packets/packet_config.rb +482 -482
- data/lib/cosmos/packets/packet_item.rb +317 -317
- data/lib/cosmos/packets/packet_item_limits.rb +128 -128
- data/lib/cosmos/packets/parsers/format_string_parser.rb +58 -58
- data/lib/cosmos/packets/parsers/limits_parser.rb +146 -146
- data/lib/cosmos/packets/parsers/limits_response_parser.rb +52 -52
- data/lib/cosmos/packets/parsers/macro_parser.rb +116 -116
- data/lib/cosmos/packets/parsers/packet_item_parser.rb +215 -215
- data/lib/cosmos/packets/parsers/packet_parser.rb +123 -123
- data/lib/cosmos/packets/parsers/processor_parser.rb +63 -63
- data/lib/cosmos/packets/parsers/state_parser.rb +116 -116
- data/lib/cosmos/packets/structure.rb +458 -458
- data/lib/cosmos/packets/structure_item.rb +233 -233
- data/lib/cosmos/packets/telemetry.rb +350 -350
- data/lib/cosmos/processors.rb +6 -6
- data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
- data/lib/cosmos/processors/processor.rb +71 -71
- data/lib/cosmos/processors/statistics_processor.rb +65 -65
- data/lib/cosmos/processors/watermark_processor.rb +44 -44
- data/lib/cosmos/script.rb +9 -9
- data/lib/cosmos/script/cmd_tlm_server.rb +110 -110
- data/lib/cosmos/script/commands.rb +184 -184
- data/lib/cosmos/script/extract.rb +123 -123
- data/lib/cosmos/script/limits.rb +114 -114
- data/lib/cosmos/script/script.rb +76 -76
- data/lib/cosmos/script/scripting.rb +897 -897
- data/lib/cosmos/script/telemetry.rb +174 -174
- data/lib/cosmos/script/tools.rb +138 -138
- data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
- data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
- data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
- data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
- data/lib/cosmos/streams/serial_stream.rb +157 -157
- data/lib/cosmos/streams/stream.rb +63 -63
- data/lib/cosmos/streams/stream_protocol.rb +373 -373
- data/lib/cosmos/streams/tcpip_client_stream.rb +113 -113
- data/lib/cosmos/streams/tcpip_socket_stream.rb +143 -143
- data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
- data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
- data/lib/cosmos/system.rb +4 -4
- data/lib/cosmos/system/system.rb +618 -618
- data/lib/cosmos/system/target.rb +197 -197
- data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +255 -255
- data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +717 -717
- data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
- data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
- data/lib/cosmos/tools/cmd_tlm_server/api.rb +1034 -1034
- data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
- data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -67
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +515 -515
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +253 -253
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +408 -408
- data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
- data/lib/cosmos/tools/cmd_tlm_server/connections.rb +175 -175
- data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +200 -200
- data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +176 -176
- data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +150 -150
- data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +244 -244
- data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +90 -90
- data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +266 -266
- data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
- data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
- data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
- data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
- data/lib/cosmos/tools/data_viewer/data_viewer.rb +621 -621
- data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +134 -134
- data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
- data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +156 -156
- data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +382 -382
- data/lib/cosmos/tools/launcher/launcher.rb +188 -188
- data/lib/cosmos/tools/launcher/launcher_config.rb +256 -256
- data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -40
- data/lib/cosmos/tools/launcher/launcher_tool.rb +116 -116
- data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +837 -837
- data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
- data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
- data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +542 -542
- data/lib/cosmos/tools/replay/replay.rb +501 -501
- data/lib/cosmos/tools/replay/replay_server.rb +91 -91
- data/lib/cosmos/tools/script_runner/script_audit.rb +147 -147
- data/lib/cosmos/tools/script_runner/script_runner.rb +922 -922
- data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
- data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1798 -1798
- data/lib/cosmos/tools/table_manager/table.rb +70 -70
- data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
- data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
- data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
- data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
- data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
- data/lib/cosmos/tools/test_runner/test.rb +539 -539
- data/lib/cosmos/tools/test_runner/test_runner.rb +1189 -1189
- data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +341 -341
- data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1016 -1016
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
- data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
- data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
- data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +95 -95
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +181 -181
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +174 -174
- data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +193 -193
- data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +407 -407
- data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
- data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
- data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -323
- data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
- data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
- data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
- data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
- data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
- data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
- data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
- data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
- data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
- data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
- data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1291 -1291
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +114 -114
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +78 -78
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
- data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
- data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -486
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +561 -561
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +290 -290
- data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
- data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
- data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +66 -66
- data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +57 -57
- data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
- data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
- data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
- data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
- data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
- data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
- data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
- data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
- data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
- data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
- data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
- data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
- data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
- data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
- data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
- data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
- data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
- data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
- data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
- data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
- data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
- data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
- data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
- data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
- data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
- data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
- data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
- data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
- data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
- data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
- data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
- data/lib/cosmos/top_level.rb +759 -759
- data/lib/cosmos/utilities.rb +11 -11
- data/lib/cosmos/utilities/crc.rb +166 -166
- data/lib/cosmos/utilities/csv.rb +83 -83
- data/lib/cosmos/utilities/logger.rb +137 -137
- data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
- data/lib/cosmos/utilities/message_log.rb +79 -79
- data/lib/cosmos/utilities/quaternion.rb +258 -258
- data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
- data/lib/cosmos/utilities/simulated_target.rb +99 -99
- data/lib/cosmos/utilities/sleeper.rb +44 -44
- data/lib/cosmos/version.rb +12 -12
- data/lib/cosmos/win32/excel.rb +66 -66
- data/lib/cosmos/win32/win32.rb +387 -387
- data/lib/cosmos/win32/win32_main.rb +321 -321
- data/roodi.yml +24 -24
- data/run_gui_tests.bat +0 -0
- data/spec/ccsds/ccsds_packet_spec.rb +67 -67
- data/spec/ccsds/ccsds_parser_spec.rb +148 -148
- data/spec/config/config_parser_spec.rb +322 -322
- data/spec/conversions/conversion_spec.rb +31 -31
- data/spec/conversions/generic_conversion_spec.rb +45 -45
- data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
- data/spec/conversions/polynomial_conversion_spec.rb +40 -40
- data/spec/conversions/processor_conversion_spec.rb +45 -45
- data/spec/conversions/received_count_conversion_spec.rb +43 -43
- data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
- data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
- data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
- data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
- data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
- data/spec/core_ext/array_spec.rb +186 -186
- data/spec/core_ext/class_spec.rb +36 -36
- data/spec/core_ext/cosmos_io_spec.rb +77 -77
- data/spec/core_ext/exception_spec.rb +91 -91
- data/spec/core_ext/file_spec.rb +72 -72
- data/spec/core_ext/hash_spec.rb +24 -24
- data/spec/core_ext/io_spec.rb +46 -46
- data/spec/core_ext/kernel_spec.rb +54 -54
- data/spec/core_ext/math_spec.rb +116 -116
- data/spec/core_ext/matrix_spec.rb +66 -66
- data/spec/core_ext/objectspace_spec.rb +29 -29
- data/spec/core_ext/range_spec.rb +21 -21
- data/spec/core_ext/socket_spec.rb +32 -32
- data/spec/core_ext/string_spec.rb +223 -223
- data/spec/core_ext/stringio_spec.rb +21 -21
- data/spec/core_ext/time_spec.rb +202 -202
- data/spec/gui/line_graph/line_clip_spec.rb +322 -322
- data/spec/gui/qt_spec.rb +102 -102
- data/spec/install/config/system/system.txt +33 -33
- data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
- data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
- data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
- data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
- data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
- data/spec/install/config/targets/COSMOS/target.txt +5 -5
- data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
- data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
- data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
- data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
- data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
- data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -305
- data/spec/install/config/targets/INST/target.txt +10 -10
- data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
- data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
- data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
- data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
- data/spec/interfaces/interface_spec.rb +130 -130
- data/spec/interfaces/linc_interface_spec.rb +259 -259
- data/spec/interfaces/serial_interface_spec.rb +56 -56
- data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
- data/spec/interfaces/stream_interface_spec.rb +157 -157
- data/spec/interfaces/tcpip_client_interface_spec.rb +55 -55
- data/spec/interfaces/tcpip_server_interface_spec.rb +160 -160
- data/spec/interfaces/udp_interface_spec.rb +175 -175
- data/spec/io/buffered_file_spec.rb +113 -113
- data/spec/io/io_multiplexer_spec.rb +94 -94
- data/spec/io/json_drb_object_spec.rb +119 -119
- data/spec/io/json_drb_spec.rb +311 -311
- data/spec/io/json_rpc_spec.rb +264 -264
- data/spec/io/raw_logger_pair_spec.rb +76 -76
- data/spec/io/raw_logger_spec.rb +133 -133
- data/spec/io/serial_driver_spec.rb +60 -60
- data/spec/io/stderr_spec.rb +32 -32
- data/spec/io/stdout_spec.rb +32 -32
- data/spec/io/tcpip_server_spec.rb +338 -338
- data/spec/io/udp_sockets_spec.rb +94 -94
- data/spec/io/win32_serial_driver_spec.rb +88 -88
- data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
- data/spec/packet_logs/packet_log_reader_spec.rb +468 -468
- data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
- data/spec/packet_logs/packet_log_writer_spec.rb +225 -225
- data/spec/packets/binary_accessor_spec.rb +2326 -2326
- data/spec/packets/commands_spec.rb +369 -369
- data/spec/packets/limits_response_spec.rb +25 -25
- data/spec/packets/limits_spec.rb +344 -344
- data/spec/packets/packet_config_spec.rb +805 -805
- data/spec/packets/packet_item_limits_spec.rb +161 -161
- data/spec/packets/packet_item_spec.rb +386 -386
- data/spec/packets/packet_spec.rb +1317 -1317
- data/spec/packets/parsers/format_string_parser_spec.rb +122 -122
- data/spec/packets/parsers/limits_parser_spec.rb +282 -282
- data/spec/packets/parsers/limits_response_parser_spec.rb +149 -149
- data/spec/packets/parsers/macro_parser_spec.rb +212 -212
- data/spec/packets/parsers/packet_item_parser_spec.rb +306 -306
- data/spec/packets/parsers/packet_parser_spec.rb +99 -99
- data/spec/packets/parsers/processor_parser_spec.rb +114 -114
- data/spec/packets/parsers/state_parser_spec.rb +156 -156
- data/spec/packets/structure_item_spec.rb +195 -195
- data/spec/packets/structure_spec.rb +565 -565
- data/spec/packets/telemetry_spec.rb +578 -578
- data/spec/processors/new_packet_log_processor_spec.rb +39 -39
- data/spec/processors/processor_spec.rb +55 -55
- data/spec/processors/statistics_processor_spec.rb +60 -60
- data/spec/processors/watermark_processor_spec.rb +51 -51
- data/spec/script/cmd_tlm_server_spec.rb +110 -110
- data/spec/script/commands_disconnect_spec.rb +270 -270
- data/spec/script/commands_spec.rb +302 -302
- data/spec/script/limits_spec.rb +153 -153
- data/spec/script/script_spec.rb +86 -86
- data/spec/script/scripting_spec.rb +440 -440
- data/spec/script/telemetry_spec.rb +165 -165
- data/spec/script/tools_spec.rb +117 -117
- data/spec/spec_helper.rb +190 -190
- data/spec/streams/burst_stream_protocol_spec.rb +32 -32
- data/spec/streams/fixed_stream_protocol_spec.rb +113 -113
- data/spec/streams/length_stream_protocol_spec.rb +300 -300
- data/spec/streams/preidentified_stream_protocol_spec.rb +121 -121
- data/spec/streams/serial_stream_spec.rb +117 -117
- data/spec/streams/stream_protocol_spec.rb +346 -346
- data/spec/streams/stream_spec.rb +30 -30
- data/spec/streams/tcpip_client_stream_spec.rb +57 -57
- data/spec/streams/tcpip_socket_stream_spec.rb +193 -193
- data/spec/streams/template_stream_protocol_spec.rb +156 -156
- data/spec/streams/terminated_stream_protocol_spec.rb +127 -127
- data/spec/system/system_spec.rb +665 -665
- data/spec/system/target_spec.rb +250 -250
- data/spec/tools/cmd_tlm_server/api_spec.rb +1117 -1117
- data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
- data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +453 -453
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
- data/spec/tools/cmd_tlm_server/commanding_spec.rb +151 -151
- data/spec/tools/cmd_tlm_server/connections_spec.rb +235 -235
- data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
- data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -252
- data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
- data/spec/tools/cmd_tlm_server/router_thread_spec.rb +151 -151
- data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -223
- data/spec/tools/launcher/launcher_config_spec.rb +464 -464
- data/spec/top_level/top_level_spec.rb +334 -334
- data/spec/utilities/crc_spec.rb +45 -45
- data/spec/utilities/csv_spec.rb +97 -97
- data/spec/utilities/logger_spec.rb +102 -102
- data/spec/utilities/message_log_spec.rb +89 -89
- data/spec/utilities/quaternion_spec.rb +107 -107
- data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
- data/tasks/manifest.rake +22 -22
- data/tasks/spec.rake +23 -23
- data/test/benchmarks/binary_accessor_benchmark.rb +14 -14
- data/test/benchmarks/gsub_benchmark.rb +152 -152
- data/test/benchmarks/is_a_benchmark.rb +34 -34
- data/test/performance/PACKETS.bat +0 -0
- data/test/performance/Rakefile +77 -77
- data/test/performance/THREADS.bat +0 -0
- data/test/performance/config/data/crc.txt +196 -196
- data/test/performance/config/data/diamond.STL +57 -57
- data/test/performance/config/data/meta_init.txt +4 -4
- data/test/performance/config/system/system_packets.txt +39 -39
- data/test/performance/config/system/system_threads.txt +59 -59
- data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +46 -46
- data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
- data/test/performance/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
- data/test/performance/config/targets/COSMOS/screens/limits_change.txt +20 -20
- data/test/performance/config/targets/COSMOS/screens/version.txt +19 -19
- data/test/performance/config/targets/COSMOS/target.txt +11 -11
- data/test/performance/config/targets/PACKET/cmd_tlm/packet_cmds.txt +20 -20
- data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +98 -98
- data/test/performance/config/targets/PACKET/cmd_tlm_server.txt +6 -6
- data/test/performance/config/targets/PACKET/lib/packet_interface.rb +22 -22
- data/test/performance/config/targets/PACKET/lib/packet_limits_response.rb +24 -24
- data/test/performance/config/targets/PACKET/screens/status.txt +25 -25
- data/test/performance/config/targets/PACKET/target.txt +28 -28
- data/test/performance/config/targets/SYSTEM/screens/status.txt +12 -12
- data/test/performance/config/targets/THREAD/cmd_tlm/thread_cmds.txt +17 -17
- data/test/performance/config/targets/THREAD/cmd_tlm/thread_tlm.txt +18 -18
- data/test/performance/config/targets/THREAD/cmd_tlm_server.txt +6 -6
- data/test/performance/config/targets/THREAD/lib/thread_interface.rb +22 -22
- data/test/performance/config/targets/THREAD/screens/status.txt +25 -25
- data/test/performance/config/targets/THREAD/target.txt +6 -6
- data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_packets.txt +28 -28
- data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_threads.txt +68 -68
- data/test/performance/config/tools/data_viewer/data_viewer.txt +11 -11
- data/test/performance/config/tools/handbook_creator/handbook_creator.txt +66 -66
- data/test/performance/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
- data/test/performance/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
- data/test/performance/config/tools/handbook_creator/templates/footer.html.erb +9 -9
- data/test/performance/config/tools/handbook_creator/templates/header.html.erb +25 -25
- data/test/performance/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
- data/test/performance/config/tools/handbook_creator/templates/nav.html.erb +27 -27
- data/test/performance/config/tools/handbook_creator/templates/overview.html.erb +1 -1
- data/test/performance/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
- data/test/performance/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
- data/test/performance/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
- data/test/performance/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
- data/test/performance/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
- data/test/performance/config/tools/handbook_creator/templates/title.html.erb +1 -1
- data/test/performance/config/tools/launcher/launcher_packets.txt +34 -34
- data/test/performance/config/tools/launcher/launcher_threads.txt +83 -83
- data/test/performance/config/tools/script_runner/script_runner.txt +3 -3
- data/test/performance/config/tools/table_manager/ConfigTables_def.txt +8 -8
- data/test/performance/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
- data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
- data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
- data/test/performance/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
- data/test/performance/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
- data/test/performance/config/tools/test_runner/test_runner.txt +17 -17
- data/test/performance/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
- data/test/performance/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
- data/test/performance/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
- data/test/performance/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
- data/test/performance/config/tools/tlm_grapher/tlm_grapher.txt +204 -204
- data/test/performance/config/tools/tlm_viewer/tlm_viewer.txt +13 -13
- data/test/performance/lib/packet_target.rb +126 -126
- data/test/performance/lib/thread_target.rb +120 -120
- data/test/performance/lib/user_version.rb +3 -3
- data/test/performance/procedures/checks.rb +11 -11
- data/test/performance/procedures/clear_util.rb +7 -7
- data/test/performance/procedures/collect.rb +18 -18
- data/test/performance/procedures/collect_util.rb +14 -14
- data/test/performance/procedures/cosmos_api_test.rb +293 -293
- data/test/performance/procedures/disconnect.rb +29 -29
- data/test/performance/procedures/example_test.rb +182 -182
- data/test/performance/procedures/plot_test.rb +8 -8
- data/test/performance/procedures/procedure.rb +2 -2
- data/test/performance/procedures/run_example_test.rb +3 -3
- data/test/performance/procedures/test.rb +51 -51
- data/test/performance/tools/CmdExtractor +14 -14
- data/test/performance/tools/CmdExtractor.bat +0 -0
- data/test/performance/tools/CmdSender +14 -14
- data/test/performance/tools/CmdSender.bat +0 -0
- data/test/performance/tools/CmdTlmServer +16 -16
- data/test/performance/tools/CmdTlmServer.bat +0 -0
- data/test/performance/tools/CmdTlmServerMemProf +20 -20
- data/test/performance/tools/CmdTlmServerMemProf.bat +0 -0
- data/test/performance/tools/DataViewer +14 -14
- data/test/performance/tools/DataViewer.bat +0 -0
- data/test/performance/tools/HandbookCreator +14 -14
- data/test/performance/tools/HandbookCreator.bat +0 -0
- data/test/performance/tools/Launcher +14 -14
- data/test/performance/tools/Launcher.bat +0 -0
- data/test/performance/tools/LimitsMonitor +14 -14
- data/test/performance/tools/LimitsMonitor.bat +0 -0
- data/test/performance/tools/OpenGLBuilder +14 -14
- data/test/performance/tools/OpenGLBuilder.bat +0 -0
- data/test/performance/tools/PacketTarget +14 -14
- data/test/performance/tools/PacketTarget.bat +0 -0
- data/test/performance/tools/PacketViewer +14 -14
- data/test/performance/tools/PacketViewer.bat +0 -0
- data/test/performance/tools/Replay +14 -14
- data/test/performance/tools/Replay.bat +0 -0
- data/test/performance/tools/ScpiTarget +14 -14
- data/test/performance/tools/ScpiTarget.bat +0 -0
- data/test/performance/tools/ScriptRunner +14 -14
- data/test/performance/tools/ScriptRunner.bat +0 -0
- data/test/performance/tools/TableManager +14 -14
- data/test/performance/tools/TableManager.bat +0 -0
- data/test/performance/tools/TestRunner +14 -14
- data/test/performance/tools/TestRunner.bat +0 -0
- data/test/performance/tools/ThreadTarget +14 -14
- data/test/performance/tools/ThreadTarget.bat +0 -0
- data/test/performance/tools/TlmExtractor +14 -14
- data/test/performance/tools/TlmExtractor.bat +0 -0
- data/test/performance/tools/TlmGrapher +14 -14
- data/test/performance/tools/TlmGrapher.bat +0 -0
- data/test/performance/tools/TlmGrapherMemProf +19 -19
- data/test/performance/tools/TlmGrapherMemProf.bat +0 -0
- data/test/performance/tools/TlmViewer +14 -14
- data/test/performance/tools/TlmViewer.bat +0 -0
- data/test/performance/tools/TlmViewerMemProf +19 -19
- data/test/performance/tools/TlmViewerMemProf.bat +0 -0
- data/test/performance/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
- data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
- data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
- data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
- data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
- data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/Launcher.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
- data/test/performance/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
- data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
- data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
- data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/Replay.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
- data/test/performance/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
- data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/TableManager.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
- data/test/performance/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
- data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
- data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
- data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
- data/test/performance/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
- data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
- data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
- 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
|