diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2024-04-14 12:58:30 +0300 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2025-02-13 15:26:44 +0200 |
commit | 518c732ea9b0f1975f6f28accff3286be4106538 (patch) | |
tree | 2be9544828545a2f9f0676efc6eb82ac197ec4bd /unittests/optiontests.py | |
parent | ea678ed82938ceac00682b2695b57193d36b71b4 (diff) | |
download | meson-optionrefactor3.zip meson-optionrefactor3.tar.gz meson-optionrefactor3.tar.bz2 |
Make all Meson level options overridable per subproject.optionrefactor3
Diffstat (limited to 'unittests/optiontests.py')
-rw-r--r-- | unittests/optiontests.py | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/unittests/optiontests.py b/unittests/optiontests.py new file mode 100644 index 0000000..bbf9c0e --- /dev/null +++ b/unittests/optiontests.py @@ -0,0 +1,184 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright 2024 Meson project contributors + +from mesonbuild.options import * + +import unittest + + +class OptionTests(unittest.TestCase): + + def test_basic(self): + optstore = OptionStore(False) + name = 'someoption' + default_value = 'somevalue' + new_value = 'new_value' + vo = UserStringOption(name, 'An option of some sort', default_value) + optstore.add_system_option(name, vo) + self.assertEqual(optstore.get_value_for(name), default_value) + optstore.set_option(OptionKey.from_string(name), new_value) + self.assertEqual(optstore.get_value_for(name), new_value) + + def test_toplevel_project(self): + optstore = OptionStore(False) + name = 'someoption' + default_value = 'somevalue' + new_value = 'new_value' + k = OptionKey(name) + vo = UserStringOption(k.name, 'An option of some sort', default_value) + optstore.add_system_option(k.name, vo) + self.assertEqual(optstore.get_value_for(k), default_value) + optstore.initialize_from_top_level_project_call([f'someoption={new_value}'], {}, {}) + self.assertEqual(optstore.get_value_for(k), new_value) + + def test_parsing(self): + s1 = OptionKey.from_string('sub:optname') + s1_expected = OptionKey('optname', 'sub', MachineChoice.HOST) + self.assertEqual(s1, s1_expected) + self.assertEqual(str(s1), 'sub:optname') + + s2 = OptionKey.from_string('optname') + s2_expected = OptionKey('optname', None, MachineChoice.HOST) + self.assertEqual(s2, s2_expected) + + self.assertEqual(str(s2), 'optname') + + s3 = OptionKey.from_string(':optname') + s3_expected = OptionKey('optname', '', MachineChoice.HOST) + self.assertEqual(s3, s3_expected) + self.assertEqual(str(s3), ':optname') + + def test_subproject_for_system(self): + optstore = OptionStore(False) + name = 'someoption' + default_value = 'somevalue' + vo = UserStringOption(name, 'An option of some sort', default_value) + optstore.add_system_option(name, vo) + self.assertEqual(optstore.get_value_for(name, 'somesubproject'), default_value) + + def test_reset(self): + optstore = OptionStore(False) + name = 'someoption' + original_value = 'original' + reset_value = 'reset' + vo = UserStringOption(name, 'An option set twice', original_value) + optstore.add_system_option(name, vo) + self.assertEqual(optstore.get_value_for(name), original_value) + self.assertEqual(optstore.num_options(), 1) + vo2 = UserStringOption(name, 'An option set twice', reset_value) + optstore.add_system_option(name, vo2) + self.assertEqual(optstore.get_value_for(name), original_value) + self.assertEqual(optstore.num_options(), 1) + + def test_project_nonyielding(self): + optstore = OptionStore(False) + name = 'someoption' + top_value = 'top' + sub_value = 'sub' + vo = UserStringOption(name, 'A top level option', top_value, False) + optstore.add_project_option(OptionKey(name, ''), vo) + self.assertEqual(optstore.get_value_for(name, ''), top_value, False) + self.assertEqual(optstore.num_options(), 1) + vo2 = UserStringOption(name, 'A subproject option', sub_value) + optstore.add_project_option(OptionKey(name, 'sub'), vo2) + self.assertEqual(optstore.get_value_for(name, ''), top_value) + self.assertEqual(optstore.get_value_for(name, 'sub'), sub_value) + self.assertEqual(optstore.num_options(), 2) + + def test_project_yielding(self): + optstore = OptionStore(False) + name = 'someoption' + top_value = 'top' + sub_value = 'sub' + vo = UserStringOption(name, 'A top level option', top_value) + optstore.add_project_option(OptionKey(name, ''), vo) + self.assertEqual(optstore.get_value_for(name, ''), top_value) + self.assertEqual(optstore.num_options(), 1) + vo2 = UserStringOption(name, 'A subproject option', sub_value, True) + optstore.add_project_option(OptionKey(name, 'sub'), vo2) + self.assertEqual(optstore.get_value_for(name, ''), top_value) + self.assertEqual(optstore.get_value_for(name, 'sub'), top_value) + self.assertEqual(optstore.num_options(), 2) + + def test_augments(self): + optstore = OptionStore(False) + name = 'cpp_std' + sub_name = 'sub' + sub2_name = 'sub2' + top_value = 'c++11' + aug_value = 'c++23' + + co = UserComboOption(name, + 'C++ language standard to use', + top_value, + choices=['c++98', 'c++11', 'c++14', 'c++17', 'c++20', 'c++23']) + optstore.add_system_option(name, co) + self.assertEqual(optstore.get_value_for(name), top_value) + self.assertEqual(optstore.get_value_for(name, sub_name), top_value) + self.assertEqual(optstore.get_value_for(name, sub2_name), top_value) + + # First augment a subproject + optstore.set_from_configure_command([f'{sub_name}:{name}={aug_value}'], []) + self.assertEqual(optstore.get_value_for(name), top_value) + self.assertEqual(optstore.get_value_for(name, sub_name), aug_value) + self.assertEqual(optstore.get_value_for(name, sub2_name), top_value) + + optstore.set_from_configure_command([], [f'{sub_name}:{name}']) + self.assertEqual(optstore.get_value_for(name), top_value) + self.assertEqual(optstore.get_value_for(name, sub_name), top_value) + self.assertEqual(optstore.get_value_for(name, sub2_name), top_value) + + # And now augment the top level option + optstore.set_from_configure_command([f':{name}={aug_value}'], []) + self.assertEqual(optstore.get_value_for(name, None), top_value) + self.assertEqual(optstore.get_value_for(name, ''), aug_value) + self.assertEqual(optstore.get_value_for(name, sub_name), top_value) + self.assertEqual(optstore.get_value_for(name, sub2_name), top_value) + + optstore.set_from_configure_command([], [f':{name}']) + self.assertEqual(optstore.get_value_for(name), top_value) + self.assertEqual(optstore.get_value_for(name, sub_name), top_value) + self.assertEqual(optstore.get_value_for(name, sub2_name), top_value) + + def test_augment_set_sub(self): + optstore = OptionStore(False) + name = 'cpp_std' + sub_name = 'sub' + sub2_name = 'sub2' + top_value = 'c++11' + aug_value = 'c++23' + set_value = 'c++20' + + co = UserComboOption(name, + 'C++ language standard to use', + top_value, + choices=['c++98', 'c++11', 'c++14', 'c++17', 'c++20', 'c++23'], + ) + optstore.add_system_option(name, co) + optstore.set_from_configure_command([f'{sub_name}:{name}={aug_value}'], []) + optstore.set_from_configure_command([f'{sub_name}:{name}={set_value}'], []) + self.assertEqual(optstore.get_value_for(name), top_value) + self.assertEqual(optstore.get_value_for(name, sub_name), set_value) + + def test_subproject_call_options(self): + optstore = OptionStore(False) + name = 'cpp_std' + default_value = 'c++11' + override_value = 'c++14' + unused_value = 'c++20' + subproject = 'sub' + + co = UserComboOption(name, + 'C++ language standard to use', + default_value, + choices=['c++98', 'c++11', 'c++14', 'c++17', 'c++20', 'c++23'], + ) + optstore.add_system_option(name, co) + optstore.set_subproject_options(subproject, [f'cpp_std={override_value}'], [f'cpp_std={unused_value}']) + self.assertEqual(optstore.get_value_for(name), default_value) + self.assertEqual(optstore.get_value_for(name, subproject), override_value) + + # Trying again should change nothing + optstore.set_subproject_options(subproject, [f'cpp_std={unused_value}'], [f'cpp_std={unused_value}']) + self.assertEqual(optstore.get_value_for(name), default_value) + self.assertEqual(optstore.get_value_for(name, subproject), override_value) |