Source code for camcops_server.cc_modules.tests.cc_proquint_tests

"""
camcops_server/cc_modules/tests/cc_proquint_tests.py

===============================================================================

    Copyright (C) 2012, University of Cambridge, Department of Psychiatry.
    Created by Rudolf Cardinal (rnc1001@cam.ac.uk).

    This file is part of CamCOPS.

    CamCOPS is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    CamCOPS is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with CamCOPS. If not, see <https://www.gnu.org/licenses/>.

===============================================================================

"""

import random
import uuid
from unittest import TestCase

from camcops_server.cc_modules.cc_proquint import (
    int_from_proquint,
    InvalidProquintException,
    proquint_from_int,
    proquint_from_uuid,
    uuid_from_proquint,
)


# =============================================================================
# Unit tests
# =============================================================================


[docs]class ProquintTest(TestCase): def test_int_encoded_as_proquint(self) -> None: self.assertEqual(proquint_from_int(0x493B05EE, 32), "hohur-bilov-j") def test_uuid_encoded_as_proquint(self) -> None: self.assertEqual( proquint_from_uuid( uuid.UUID("6457cb90-1ca0-47a7-9f40-767567819bee") ), "kidil-sovib-dufob-hivol-nutab-linuj-kivad-nozov-t", ) def test_proquint_decoded_as_int(self) -> None: self.assertEqual(int_from_proquint("hohur-bilov-j"), 0x493B05EE) def test_proquint_decoded_as_uuid(self) -> None: self.assertEqual( uuid_from_proquint( "kidil-sovib-dufob-hivol-nutab-linuj-kivad-nozov-t" ), uuid.UUID("6457cb90-1ca0-47a7-9f40-767567819bee"), ) def test_ints_converted_to_proquints_and_back(self) -> None: for bits in (16, 32, 48, 64, 80, 96, 128, 256): for i in range(1000): random_int = random.getrandbits(bits) encoded = proquint_from_int(random_int, bits) num_expected_words = bits // 16 num_expected_dashes = num_expected_words check_character_length = 1 expected_proquint_length = ( 5 * num_expected_words + num_expected_dashes + check_character_length ) self.assertEqual(len(encoded), expected_proquint_length) decoded = int_from_proquint(encoded) self.assertEqual( decoded, random_int, msg=( f"Conversion failed for {random_int}, " f"encoded={encoded}, decoded={decoded} " ), ) def test_raises_when_bits_not_multiple_of_16(self) -> None: with self.assertRaises(ValueError) as cm: proquint_from_int(0, 5) self.assertEqual( str(cm.exception), "size_in_bits (5) must be a multiple of 16" ) def test_raises_when_proquint_has_invalid_chars(self) -> None: with self.assertRaises(InvalidProquintException) as cm: int_from_proquint("lusab-rrrrr-s") self.assertEqual( str(cm.exception), "'lusab-rrrrr-s' contains invalid or transposed characters", ) def test_raises_when_proquint_has_chars_in_wrong_order(self) -> None: with self.assertRaises(InvalidProquintException) as cm: int_from_proquint("lusab-abadu-b") self.assertEqual( str(cm.exception), "'lusab-abadu-b' contains invalid or transposed characters", ) def test_raises_when_check_character_doesnt_match(self) -> None: with self.assertRaises(InvalidProquintException) as cm: int_from_proquint("hohur-dilov-j") self.assertEqual( str(cm.exception), "'hohur-dilov-j' is not valid (check character mismatch)", )