xref: /aosp_15_r20/external/bazelbuild-rules_rust/test/unit/common.bzl (revision d4726bddaa87cc4778e7472feed243fa4b6c267f)
1"""Common test helpers for unit tests."""
2
3load("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest")
4
5def assert_argv_contains_not(env, action, flag):
6    asserts.true(
7        env,
8        flag not in action.argv,
9        "Expected {args} to not contain {flag}".format(args = action.argv, flag = flag),
10    )
11
12def assert_argv_contains(env, action, flag):
13    asserts.true(
14        env,
15        flag in action.argv,
16        "Expected {args} to contain {flag}".format(args = action.argv, flag = flag),
17    )
18
19def assert_argv_contains_prefix_suffix(env, action, prefix, suffix):
20    for found_flag in action.argv:
21        if found_flag.startswith(prefix) and found_flag.endswith(suffix):
22            return
23    unittest.fail(
24        env,
25        "Expected an arg with prefix '{prefix}' and suffix '{suffix}' in {args}".format(
26            prefix = prefix,
27            suffix = suffix,
28            args = action.argv,
29        ),
30    )
31
32def assert_argv_contains_prefix(env, action, prefix):
33    for found_flag in action.argv:
34        if found_flag.startswith(prefix):
35            return
36    unittest.fail(
37        env,
38        "Expected an arg with prefix '{prefix}' in {args}".format(
39            prefix = prefix,
40            args = action.argv,
41        ),
42    )
43
44def assert_argv_contains_prefix_not(env, action, prefix):
45    for found_flag in action.argv:
46        if found_flag.startswith(prefix):
47            unittest.fail(
48                env,
49                "Expected an arg with prefix '{prefix}' to not appear in {args}".format(
50                    prefix = prefix,
51                    args = action.argv,
52                ),
53            )
54
55def assert_action_mnemonic(env, action, mnemonic):
56    if not action.mnemonic == mnemonic:
57        unittest.fail(
58            env,
59            "Expected the action to have the mnemonic '{expected}', but got '{actual}'".format(
60                expected = mnemonic,
61                actual = action.mnemonic,
62            ),
63        )
64
65def _startswith(list, prefix):
66    if len(list) < len(prefix):
67        return False
68    for pair in zip(list[:len(prefix) + 1], prefix):
69        if pair[0] != pair[1]:
70            return False
71    return True
72
73def assert_list_contains_adjacent_elements(env, list_under_test, adjacent_elements):
74    """Assert that list_under_test contains given adjacent flags.
75
76    Args:
77          env: env from analysistest.begin(ctx).
78          list_under_test: list supposed to contain adjacent elements.
79          adjacent_elements: list of elements to be found inside list_under_test.
80    """
81    for idx in range(len(list_under_test)):
82        if list_under_test[idx] == adjacent_elements[0]:
83            if _startswith(list_under_test[idx:], adjacent_elements):
84                return
85
86    unittest.fail(
87        env,
88        "Expected the to find '{expected}' within '{actual}'".format(
89            expected = adjacent_elements,
90            actual = list_under_test,
91        ),
92    )
93
94def assert_list_contains_adjacent_elements_not(env, list_under_test, adjacent_elements):
95    """Assert that list_under_test does not contains given adjacent flags.
96
97    Args:
98          env: env from analysistest.begin(ctx).
99          list_under_test: list supposed not to contain adjacent elements.
100          adjacent_elements: list of elements not to be found inside list_under_test."""
101    for idx in range(len(list_under_test)):
102        if list_under_test[idx] == adjacent_elements[0]:
103            if _startswith(list_under_test[idx:], adjacent_elements):
104                unittest.fail(
105                    env,
106                    "Expected not the to find '{expected}' within '{actual}'".format(
107                        expected = adjacent_elements,
108                        actual = list_under_test,
109                    ),
110                )
111
112def assert_env_value(env, action, key, value):
113    asserts.true(
114        env,
115        action.env[key] == value,
116        "Expected env[{key}] to be equal to '{value}', got '{real_value}'".format(
117            key = key,
118            value = value,
119            real_value = action.env[key],
120        ),
121    )
122