summaryrefslogtreecommitdiffstats
path: root/glucometerutils/drivers
diff options
context:
space:
mode:
authorDiego Elio Pettenò <flameeyes@flameeyes.com>2020-03-16 19:51:27 +0100
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2020-03-16 20:06:33 +0100
commitf5143327b243fc616f37252d76bd31f2690b088d (patch)
tree0c165ca6b5a6a0783d594b2beeb50295e52f6a5f /glucometerutils/drivers
parentMergify: configuration update (diff)
downloadglucometerutils-f5143327b243fc616f37252d76bd31f2690b088d.tar
glucometerutils-f5143327b243fc616f37252d76bd31f2690b088d.tar.gz
glucometerutils-f5143327b243fc616f37252d76bd31f2690b088d.tar.bz2
glucometerutils-f5143327b243fc616f37252d76bd31f2690b088d.tar.lz
glucometerutils-f5143327b243fc616f37252d76bd31f2690b088d.tar.xz
glucometerutils-f5143327b243fc616f37252d76bd31f2690b088d.tar.zst
glucometerutils-f5143327b243fc616f37252d76bd31f2690b088d.zip
Diffstat (limited to 'glucometerutils/drivers')
-rw-r--r--glucometerutils/drivers/tests/__init__.py0
-rw-r--r--glucometerutils/drivers/tests/test_contourusb.py114
-rw-r--r--glucometerutils/drivers/tests/test_fsoptium.py32
-rw-r--r--glucometerutils/drivers/tests/test_otultra2.py43
-rw-r--r--glucometerutils/drivers/tests/test_otultraeasy.py23
-rw-r--r--glucometerutils/drivers/tests/test_td4277.py28
6 files changed, 240 insertions, 0 deletions
diff --git a/glucometerutils/drivers/tests/__init__.py b/glucometerutils/drivers/tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/glucometerutils/drivers/tests/__init__.py
diff --git a/glucometerutils/drivers/tests/test_contourusb.py b/glucometerutils/drivers/tests/test_contourusb.py
new file mode 100644
index 0000000..3b8b547
--- /dev/null
+++ b/glucometerutils/drivers/tests/test_contourusb.py
@@ -0,0 +1,114 @@
+# -*- coding: utf-8 -*-
+#
+# SPDX-License-Identifier: MIT
+"""Tests for the common ContourUSB functions.."""
+
+# pylint: disable=protected-access,missing-docstring
+
+from unittest.mock import Mock
+
+from absl.testing import absltest
+from glucometerutils.support import contourusb
+
+
+class TestContourUSB(absltest.TestCase):
+
+ header_record = b"\x04\x021H|\\^&||7w3LBL|Bayer7390^01.24\\01.04\\09.02.20^7390-2336773^7403-|A=1^C=63^G=1^I=0200^R=0^S=1^U=0^V=10600^X=070070070070180130150250^Y=360126090050099050300089^Z=1|1714||||||1|201909221304\r\x17D7\r\n\x05"
+
+ mock_dev = Mock()
+
+ def test_get_datetime(self):
+ import datetime
+
+ self.datetime = "201908071315" # returned by
+ self.assertEqual(
+ datetime.datetime(2019, 8, 7, 13, 15),
+ contourusb.ContourHidDevice.get_datetime(self),
+ )
+
+ def test_RECORD_FORMAT_match(self):
+ # first decode the header record frame
+ header_record_decoded = self.header_record.decode()
+ stx = header_record_decoded.find("\x02")
+
+ _RECORD_FORMAT = contourusb._RECORD_FORMAT
+ result = _RECORD_FORMAT.match(header_record_decoded[stx:]).group("text")
+
+ self.assertEqual(
+ "H|\\^&||7w3LBL|Bayer7390^01.24\\01.04\\09.02.20^7390-2336773^7403-|A=1^C=63^G=1^I=0200^R=0^S=1^U=0^V=10600^X=070070070070180130150250^Y=360126090050099050300089^Z=1|1714||||||1|201909221304",
+ result,
+ )
+
+ def test_parse_header_record(self):
+
+ _HEADER_RECORD_RE = contourusb._HEADER_RECORD_RE
+ _RECORD_FORMAT = contourusb._RECORD_FORMAT
+
+ header_record_decoded = self.header_record.decode()
+ stx = header_record_decoded.find("\x02")
+
+ result = _RECORD_FORMAT.match(header_record_decoded[stx:]).group("text")
+ contourusb.ContourHidDevice.parse_header_record(self.mock_dev, result)
+
+ self.assertEqual(self.mock_dev.field_del, "\\")
+ self.assertEqual(self.mock_dev.repeat_del, "^")
+ self.assertEqual(self.mock_dev.component_del, "&")
+ self.assertEqual(self.mock_dev.escape_del, "|")
+
+ self.assertEqual(self.mock_dev.product_code, "Bayer7390")
+
+ self.assertEqual(self.mock_dev.dig_ver, "01.24")
+ self.assertEqual(self.mock_dev.anlg_ver, "01.04")
+ self.assertEqual(self.mock_dev.agp_ver, "09.02.20")
+ self.assertEqual(self.mock_dev.serial_num, "7390-2336773")
+ self.assertEqual(self.mock_dev.sku_id, "7403-")
+ self.assertEqual(self.mock_dev.res_marking, "1")
+ self.assertEqual(self.mock_dev.config_bits, "63")
+ self.assertEqual(self.mock_dev.lang, "1")
+ self.assertEqual(self.mock_dev.interv, "0200")
+ self.assertEqual(self.mock_dev.ref_method, "0")
+ self.assertEqual(self.mock_dev.internal, "1")
+ self.assertEqual(self.mock_dev.unit, "0")
+ self.assertEqual(self.mock_dev.lo_bound, "10")
+ self.assertEqual(self.mock_dev.hi_bound, "600")
+
+ self.assertEqual(self.mock_dev.hypo_limit, "070")
+ self.assertEqual(self.mock_dev.overall_low, "070")
+ self.assertEqual(self.mock_dev.pre_food_low, "070")
+ self.assertEqual(self.mock_dev.post_food_low, "070")
+ self.assertEqual(self.mock_dev.overall_high, "180")
+ self.assertEqual(self.mock_dev.pre_food_high, "130")
+ self.assertEqual(self.mock_dev.post_food_high, "150")
+ self.assertEqual(self.mock_dev.hyper_limit, "250")
+
+ self.assertEqual(self.mock_dev.upp_hyper, "360")
+ self.assertEqual(self.mock_dev.low_hyper, "126")
+ self.assertEqual(self.mock_dev.upp_hypo, "090")
+ self.assertEqual(self.mock_dev.low_hypo, "050")
+ self.assertEqual(self.mock_dev.upp_low_target, "099")
+ self.assertEqual(self.mock_dev.low_low_target, "050")
+ self.assertEqual(self.mock_dev.upp_hi_target, "300")
+ self.assertEqual(self.mock_dev.low_hi_target, "089")
+ self.assertEqual(self.mock_dev.trends, "1")
+ self.assertEqual(self.mock_dev.total, "1714")
+ self.assertEqual(self.mock_dev.spec_ver, "1")
+
+ self.assertEqual(self.mock_dev.datetime, "201909221304")
+
+ # TO-DO checksum and checkframe unit tests
+
+ def test_parse_result_record(self):
+ # first decode the header record frame
+ result_record = "R|8|^^^Glucose|133|mg/dL^P||B/X||201202052034"
+ result_dict = contourusb.ContourHidDevice.parse_result_record(
+ self.mock_dev, result_record
+ )
+
+ self.assertEqual(result_dict["record_type"], "R")
+ self.assertEqual(result_dict["seq_num"], "8")
+ self.assertEqual(result_dict["test_id"], "Glucose")
+ self.assertEqual(result_dict["value"], "133")
+ self.assertEqual(result_dict["unit"], "mg/dL")
+ self.assertEqual(result_dict["ref_method"], "P")
+ self.assertEqual(result_dict["markers"], "B/X")
+ self.assertEqual(result_dict["datetime"], "201202052034")
diff --git a/glucometerutils/drivers/tests/test_fsoptium.py b/glucometerutils/drivers/tests/test_fsoptium.py
new file mode 100644
index 0000000..bdc76f8
--- /dev/null
+++ b/glucometerutils/drivers/tests/test_fsoptium.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+#
+# SPDX-License-Identifier: MIT
+"""Tests for the FreeStyle Optium driver."""
+
+# pylint: disable=protected-access,missing-docstring
+
+import datetime
+
+from absl.testing import parameterized
+from glucometerutils import exceptions
+from glucometerutils.drivers import fsoptium
+
+
+class TestFreeStyleOptium(parameterized.TestCase):
+ @parameterized.parameters(
+ ("Clock:\tApr 22 2014\t02:14:37", datetime.datetime(2014, 4, 22, 2, 14, 37)),
+ ("Clock:\tJul 10 2013\t14:26:44", datetime.datetime(2013, 7, 10, 14, 26, 44)),
+ ("Clock:\tSep 29 2013\t17:35:34", datetime.datetime(2013, 9, 29, 17, 35, 34)),
+ )
+ def test_parse_clock(self, datestr, datevalue):
+ self.assertEqual(fsoptium._parse_clock(datestr), datevalue)
+
+ @parameterized.parameters(
+ ("Apr 22 2014 02:14:37",),
+ ("Clock:\tXxx 10 2013\t14:26",),
+ ("Clock:\tSep 29 2013\t17:35:22.34",),
+ ("Foo",),
+ )
+ def test_parse_clock_invalid(self, datestr):
+ with self.assertRaises(exceptions.InvalidResponse):
+ fsoptium._parse_clock(datestr)
diff --git a/glucometerutils/drivers/tests/test_otultra2.py b/glucometerutils/drivers/tests/test_otultra2.py
new file mode 100644
index 0000000..6b36602
--- /dev/null
+++ b/glucometerutils/drivers/tests/test_otultra2.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+#
+# SPDX-License-Identifier: MIT
+"""Tests for the LifeScan OneTouch Ultra 2 driver."""
+
+# pylint: disable=protected-access,missing-docstring
+
+from unittest import mock
+
+from absl.testing import parameterized
+from glucometerutils import exceptions
+from glucometerutils.drivers import otultra2
+from glucometerutils.support import lifescan
+
+
+class TestOTUltra2(parameterized.TestCase):
+ def test_checksum(self):
+ checksum = otultra2._calculate_checksum(b"T")
+ self.assertEqual(0x0054, checksum)
+
+ def test_checksum_full(self):
+ checksum = otultra2._calculate_checksum(b'T "SAT","08/03/13","22:12:00 "')
+ self.assertEqual(0x0608, checksum)
+
+ @parameterized.named_parameters(
+ ("_missing_checksum", b"INVALID", lifescan.MissingChecksum),
+ ("_short", b".\r", exceptions.InvalidResponse),
+ ("_generic", b"% 2500\r", exceptions.InvalidResponse),
+ (
+ "_invalid_serial_number",
+ b'@ "12345678O" 0297\r',
+ lifescan.InvalidSerialNumber,
+ ),
+ ("_invalid_checksum", b"% 1337\r", exceptions.InvalidChecksum),
+ ("_broken_checksum", b"% 13AZ\r", lifescan.MissingChecksum),
+ )
+ def test_invalid_response(self, returned_string, expected_exception):
+ with mock.patch("serial.Serial") as mock_serial:
+ mock_serial.return_value.readline.return_value = returned_string
+
+ device = otultra2.Device("mockdevice")
+ with self.assertRaises(expected_exception):
+ device.get_serial_number()
diff --git a/glucometerutils/drivers/tests/test_otultraeasy.py b/glucometerutils/drivers/tests/test_otultraeasy.py
new file mode 100644
index 0000000..c6fce83
--- /dev/null
+++ b/glucometerutils/drivers/tests/test_otultraeasy.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#
+# SPDX-License-Identifier: MIT
+"""Tests for the LifeScan OneTouch Ultra Easy driver."""
+
+# pylint: disable=protected-access,missing-docstring
+
+from absl.testing import absltest
+from glucometerutils.drivers import otultraeasy
+
+
+class ConstructTest(absltest.TestCase):
+ def test_make_packet_ack(self):
+ self.assertEqual(
+ b"\x02\x06\x08\x03\xc2\x62",
+ otultraeasy._make_packet(b"", False, False, False, True),
+ )
+
+ def test_make_packet_version_request(self):
+ self.assertEqual(
+ b"\x02\x09\x03\x05\x0d\x02\x03\x08\x9f",
+ otultraeasy._make_packet(b"\x05\x0d\x02", True, True, False, False),
+ )
diff --git a/glucometerutils/drivers/tests/test_td4277.py b/glucometerutils/drivers/tests/test_td4277.py
new file mode 100644
index 0000000..fbd4aa2
--- /dev/null
+++ b/glucometerutils/drivers/tests/test_td4277.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+#
+# SPDX-License-Identifier: MIT
+"""Tests for the TD-4277 driver."""
+
+# pylint: disable=protected-access,missing-docstring
+
+import datetime
+
+from absl.testing import parameterized
+from glucometerutils import exceptions
+from glucometerutils.drivers import td4277
+from glucometerutils.support import lifescan
+
+
+class TestTD4277Nexus(parameterized.TestCase):
+ @parameterized.parameters(
+ (b"\x21\x24\x0e\x15", datetime.datetime(2018, 1, 1, 21, 14)),
+ (b"\x21\x26\x0e\x15", datetime.datetime(2019, 1, 1, 21, 14)),
+ (b"\x04\x27\x25\x0d", datetime.datetime(2019, 8, 4, 13, 37)),
+ )
+ def test_parse_datetime(self, message, date):
+ self.assertEqual(td4277._parse_datetime(message), date)
+
+ def test_making_message(self):
+ self.assertEqual(
+ td4277._make_packet(0x22, 0), b"\x51\x22\x00\x00\x00\x00\xa3\x16"
+ )