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