diff --git a/lib/sphero/request.rb b/lib/sphero/request.rb index 2ff0857..b7651fe 100644 --- a/lib/sphero/request.rb +++ b/lib/sphero/request.rb @@ -31,7 +31,8 @@ def response header, body end def packet_header - header.pack 'CCCCCC' + format = "C" * header.length + header.pack format end def packet_body @@ -39,7 +40,11 @@ def packet_body end def checksum - ~((packet_header + packet_body).unpack('C*').drop(2).reduce(:+) % 256) & 0xFF + unpacked_header_and_body = (packet_header + packet_body).unpack "C*" + dropped_sops = unpacked_header_and_body.drop 2 + reduced = dropped_sops.reduce(:+) % 256 + ones_complement = ~reduced + ones_complement & 0xFF end def bytes diff --git a/test/test_request.rb b/test/test_request.rb new file mode 100644 index 0000000..db12282 --- /dev/null +++ b/test/test_request.rb @@ -0,0 +1,49 @@ +require 'minitest/autorun' +require 'sphero/request' + +class TestRequest < MiniTest::Unit::TestCase + STUB_REQUEST_ID = 0x05 + + def setup + @stub_request_class = Sphero::Request. + make_command Sphero::Request, STUB_REQUEST_ID + end + + def test_request_checksum + stub_request = @stub_request_class.new 0x01, 1, 2 + assert_equal 243, stub_request.checksum + end + + def test_packet_body + auto_reconnect = @stub_request_class.new 0x01, 0, 0x00 + assert_equal [0, 0x00].pack("C*"), auto_reconnect.packet_body + end + + def test_request_dlen + auto_reconnect = @stub_request_class.new 0x01, 0, 0x00 + assert_equal 3, auto_reconnect.dlen + end + + def test_request_header + stub_request = @stub_request_class.new 0x01, 1, 2 + expected_header = [Sphero::Request::SOP1, Sphero::Request::SOP2, + 0x00, STUB_REQUEST_ID, 0x01, 3] + + assert_equal expected_header, stub_request.header + end + + def test_ping_to_str + ping = Sphero::Request::Ping.new 0 + assert_equal "\xFF\xFF\x00\x01\x00\x01\xFD", ping.to_str + end + + def test_ping_checksum + ping = Sphero::Request::Ping.new 0 + assert_equal "\xFD", ping.checksum.chr + end + + def test_sleep_dlen + sleep = Sphero::Request::Sleep.new 0, 0, 0 + assert_equal 0x04, sleep.dlen + end +end diff --git a/test/test_sphero.rb b/test/test_sphero.rb deleted file mode 100644 index ecdca09..0000000 --- a/test/test_sphero.rb +++ /dev/null @@ -1,14 +0,0 @@ -require 'minitest/autorun' -require 'sphero' - -class TestSphero < MiniTest::Unit::TestCase - def test_ping_checksum - ping = Sphero::Request::Ping.new 0 - assert_equal "\xFF\xFF\x00\x01\x00\x01\xFD".bytes, ping.to_str.bytes - end - - def test_sleep_dlen - sleep = Sphero::Request::Sleep.new 0, 0, 0 - assert_equal 0x04, sleep.dlen - end -end