| # Copyright lowRISC contributors. |
| # Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| # SPDX-License-Identifier: Apache-2.0 |
| |
| '''pytest-based testing for functions in utils.py''' |
| |
| import os |
| import pytest |
| from .utils import _subst_wildcards, subst_wildcards |
| |
| |
| def test_subst_wildcards(): |
| '''Pytest-compatible test for the subst_wildcards function.''' |
| # Basic checks |
| assert subst_wildcards('foo {x} baz', {'x': 'bar'}) == 'foo bar baz' |
| |
| # Stringify |
| assert (subst_wildcards('{a}, {b}, {c}, {d}', |
| {'a': 'a', 'b': True, 'c': 42, 'd': ['{b}', 10]}) == |
| 'a, 1, 42, 1 10') |
| |
| # Ignored wildcards (with or without a match in mdict) |
| assert (subst_wildcards('{a} {b}', {'a': 'aye', 'b': 'bee'}, |
| ignored_wildcards=['a']) == |
| '{a} bee') |
| assert (subst_wildcards('{a} {b}', {'b': 'bee'}, |
| ignored_wildcards=['a']) == |
| '{a} bee') |
| |
| # Environment variables. We will always have PWD and can probably assume |
| # that this won't itself have any braced substrings. |
| assert (subst_wildcards('{PWD}', {}) == os.environ['PWD']) |
| |
| # Missing variable with ignore_error=False, running _subst_wildcards |
| # instead so that we can catch the error. (We assume that 'biggles' isn't |
| # in the environment) |
| with pytest.raises(ValueError) as excinfo: |
| _subst_wildcards('{biggles} {b}', {'b': 'bee'}, [], False, []) |
| assert "unknown wildcard, '{biggles}'" in str(excinfo.value) |
| |
| # ignore_error=True. |
| assert (subst_wildcards('{biggles} {b}', {'b': 'bee'}, |
| ignore_error=True) == |
| '{biggles} bee') |
| |
| # Check we support (non-circular) recursion |
| assert (subst_wildcards('{a}', {'a': '{b}', 'b': 'c'}) == 'c') |
| |
| # Check we spot circular recursion |
| with pytest.raises(ValueError) as excinfo: |
| _subst_wildcards('{a}', {'a': '{b}', 'b': '{a}'}, [], False, []) |
| assert "circular expansion of wildcard '{a}'" in str(excinfo.value) |
| |
| # Check we also complain about circular recursion with ignore_error |
| with pytest.raises(ValueError) as excinfo: |
| _subst_wildcards('{a}', {'a': '{b}', 'b': '{a}'}, [], True, []) |
| assert "circular expansion of wildcard '{a}'" in str(excinfo.value) |
| |
| # Computed variable names (probably not a great idea, but it's probably |
| # good to check this works the way we think) |
| assert subst_wildcards('{a}b}', {'a': 'a {', 'b': 'bee'}) == 'a bee' |
| |
| # Some eval_cmd calls (using echo, which should always work) |
| assert (subst_wildcards('{eval_cmd}echo foo {b}', {'b': 'bar'}) == |
| 'foo bar') |
| |
| assert (subst_wildcards('foo {eval_cmd}echo {b}', {'b': 'bar'}) == |
| 'foo bar') |
| |
| # Make sure that nested commands work |
| assert (subst_wildcards('{eval_cmd} {eval_cmd} echo echo a', {}) == 'a') |
| |
| # Recursive expansion |
| assert (subst_wildcards('{var}', |
| { |
| 'var': '{{foo}_xyz_{bar}}', |
| 'foo': 'p', |
| 'bar': 'q', |
| 'p_xyz_q': 'baz' |
| }) == 'baz') |