# 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"))