Files
computer-playbook/tests/unit/python/utils/templating/test_expr.py

95 lines
3.1 KiB
Python

# Ensure repo root is importable so `utils.*` resolves in all runners
import sys
import unittest
from . import PROJECT_ROOT
sys.path.insert(0, str(PROJECT_ROOT))
from utils.templating.expr import (
find_top_level_op,
is_paren_wrapped,
split_list_items,
split_top_level,
)
class TestSplitListItems(unittest.TestCase):
def test_bare_and_quoted_tokens(self):
self.assertEqual(
split_list_items("DIR_BIN, 'ca-inject'"), ["DIR_BIN", "'ca-inject'"]
)
def test_comma_inside_quotes_is_not_a_separator(self):
self.assertEqual(split_list_items("'a,b', c"), ["'a,b'", "c"])
def test_mixed_quote_styles(self):
self.assertEqual(split_list_items("\"x\", 'y'"), ['"x"', "'y'"])
def test_empty_and_whitespace_tokens_dropped(self):
self.assertEqual(split_list_items(" a ,, b , "), ["a", "b"])
def test_empty_string(self):
self.assertEqual(split_list_items(""), [])
class TestFindTopLevelOp(unittest.TestCase):
def test_finds_operator_at_depth_zero(self):
self.assertEqual(find_top_level_op("A == B", "=="), 2)
def test_skips_operator_inside_parens(self):
expr = "(A == B) != C"
self.assertEqual(find_top_level_op(expr, "!="), expr.index("!="))
self.assertEqual(find_top_level_op("(A == B)", "=="), -1)
def test_skips_operator_inside_quotes(self):
expr = "'x == y' == Z"
self.assertEqual(find_top_level_op(expr, "=="), 9)
def test_word_operator_padded_with_spaces(self):
"""A padded ` if ` must not match inside identifiers like `notify`."""
self.assertEqual(find_top_level_op("gift if COND else b", " if "), 4)
self.assertEqual(find_top_level_op("gifted", " if "), -1)
def test_not_found(self):
self.assertEqual(find_top_level_op("A ~ B", "=="), -1)
def test_bracket_kinds_all_count_as_depth(self):
self.assertEqual(find_top_level_op("[a == b] == c", "=="), 9)
self.assertEqual(find_top_level_op("{a == b} == c", "=="), 9)
class TestSplitTopLevel(unittest.TestCase):
def test_simple_split(self):
self.assertEqual(split_top_level("a ~ b ~ c", "~"), ["a ", " b ", " c"])
def test_separator_inside_quotes_kept(self):
self.assertEqual(split_top_level("'a ~ b' ~ c", "~"), ["'a ~ b' ", " c"])
def test_separator_inside_parens_kept(self):
self.assertEqual(split_top_level("(a ~ b) ~ c", "~"), ["(a ~ b) ", " c"])
def test_no_separator_returns_whole(self):
self.assertEqual(split_top_level("abc", "~"), ["abc"])
class TestIsParenWrapped(unittest.TestCase):
def test_fully_wrapped(self):
self.assertTrue(is_paren_wrapped("(a ~ b)"))
def test_adjacent_groups_are_not_wrapped(self):
self.assertFalse(is_paren_wrapped("(a) ~ (b)"))
def test_no_parens(self):
self.assertFalse(is_paren_wrapped("a ~ b"))
def test_nested_wrap(self):
self.assertTrue(is_paren_wrapped("((a) ~ (b))"))
def test_close_paren_inside_quotes_ignored(self):
self.assertTrue(is_paren_wrapped("(a ~ ')' ~ b)"))
if __name__ == "__main__": # pragma: no cover
unittest.main()