# @file MacroTest.py | |
# | |
# Contains the data classes that are used to compose debug macro tests. | |
# | |
# All data classes inherit from a single abstract base class that expects | |
# the subclass to define the category of test it represents. | |
# | |
# Copyright (c) Microsoft Corporation. All rights reserved. | |
# SPDX-License-Identifier: BSD-2-Clause-Patent | |
## | |
from dataclasses import dataclass, field | |
from os import linesep | |
from typing import Tuple | |
import abc | |
@dataclass(frozen=True) | |
class MacroTest(abc.ABC): | |
"""Abstract base class for an individual macro test case.""" | |
macro: str | |
result: Tuple[int, int, int] | |
description: str = field(default='') | |
@property | |
@abc.abstractmethod | |
def category(self) -> str: | |
"""Returns the test class category identifier. | |
Example: 'equal_specifier_equal_argument_macro_test' | |
This string is used to bind test objects against this class. | |
Returns: | |
str: Test category identifier string. | |
""" | |
pass | |
@property | |
def category_description(self) -> str: | |
"""Returns the test class category description. | |
Example: 'Test case with equal count of print specifiers to arguments.' | |
This string is a human readable description of the test category. | |
Returns: | |
str: String describing the test category. | |
""" | |
return self.__doc__ | |
def __str__(self): | |
"""Returns a macro test case description string.""" | |
s = [ | |
f"{linesep}", | |
"=" * 80, | |
f"Macro Test Type: {self.category_description}", | |
f"{linesep}Macro: {self.macro}", | |
f"{linesep}Expected Result: {self.result}" | |
] | |
if self.description: | |
s.insert(3, f"Test Description: {self.description}") | |
return f'{linesep}'.join(s) | |
@dataclass(frozen=True) | |
class NoSpecifierNoArgumentMacroTest(MacroTest): | |
"""Test case with no print specifier and no arguments.""" | |
@property | |
def category(self) -> str: | |
return "no_specifier_no_argument_macro_test" | |
@dataclass(frozen=True) | |
class EqualSpecifierEqualArgumentMacroTest(MacroTest): | |
"""Test case with equal count of print specifiers to arguments.""" | |
@property | |
def category(self) -> str: | |
return "equal_specifier_equal_argument_macro_test" | |
@dataclass(frozen=True) | |
class MoreSpecifiersThanArgumentsMacroTest(MacroTest): | |
"""Test case with more print specifiers than arguments.""" | |
@property | |
def category(self) -> str: | |
return "more_specifiers_than_arguments_macro_test" | |
@dataclass(frozen=True) | |
class LessSpecifiersThanArgumentsMacroTest(MacroTest): | |
"""Test case with less print specifiers than arguments.""" | |
@property | |
def category(self) -> str: | |
return "less_specifiers_than_arguments_macro_test" | |
@dataclass(frozen=True) | |
class IgnoredSpecifiersMacroTest(MacroTest): | |
"""Test case to test ignored print specifiers.""" | |
@property | |
def category(self) -> str: | |
return "ignored_specifiers_macro_test" | |
@dataclass(frozen=True) | |
class SpecialParsingMacroTest(MacroTest): | |
"""Test case with special (complicated) parsing scenarios.""" | |
@property | |
def category(self) -> str: | |
return "special_parsing_macro_test" | |
@dataclass(frozen=True) | |
class CodeSnippetMacroTest(MacroTest): | |
"""Test case within a larger code snippet.""" | |
@property | |
def category(self) -> str: | |
return "code_snippet_macro_test" |