# Copyright (C) 2023 The Qt Company Ltd. # SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only import decimal import unittest import xml.etree.ElementTree as ET from typing import Optional import common class Operation(common.Operation): """ Dummy operation. Used to test the retry feature. """ def __init__(self, timeouts: int) -> None: self.timeouts = timeouts async def run(self) -> Optional[common.Error]: if self.timeouts > 0: self.timeouts -= 1 return common.OperationTimedOut("Operation timed out") return None class TestOperation(unittest.IsolatedAsyncioTestCase): async def test_run_and_retry(self) -> None: """If an operation times out, we try again.""" async def run_and_retry(timeouts: int, retries: int) -> Optional[common.Error]: operation = Operation(timeouts) return await operation.run_and_retry(retries=retries, delay=0, logger=None) self.assertIsNone(await run_and_retry(timeouts=0, retries=0)) self.assertIsInstance(await run_and_retry(timeouts=1, retries=0), common.OperationTimedOut) self.assertIsNone(await run_and_retry(timeouts=1, retries=1)) self.assertIsInstance(await run_and_retry(timeouts=2, retries=1), common.OperationTimedOut) self.assertIsNone(await run_and_retry(timeouts=2, retries=2)) class TestXmlParser(unittest.TestCase): def test_decimal_attribute(self) -> None: """We can parse decimal attributes""" element = common.XmlParser(ET.fromstring("""""")) value = element.decimal_attribute("radius") self.assertEqual(value, decimal.Decimal("1.5")) def test_decimal_attrubute_with_comma(self) -> None: """We can parse decimal attributes with commas""" element = common.XmlParser(ET.fromstring("""""")) value = element.decimal_attribute("length") self.assertEqual(value, decimal.Decimal("3.4"))