Skip to content
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 116 additions & 0 deletions rclpy/test/test_parameter.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import unittest

import pytest
import yaml
from rcl_interfaces.msg import Parameter as ParameterMsg
from rcl_interfaces.msg import ParameterType
from rcl_interfaces.msg import ParameterValue
Expand Down Expand Up @@ -474,6 +475,121 @@ def test_parameter_dict_from_yaml_file(self) -> None:
os.unlink(f.name)
self.assertRaises(FileNotFoundError, parameter_dict_from_yaml_file, 'unknown_file')

def test_parameter_dict_from_yaml_file_scalar_types(self) -> None:
yaml_string = """
/node:
ros__parameters:
count: 42
ratio: 3.5
label: foo
flag: true
"""
with NamedTemporaryFile(mode='w', delete=False, suffix='.yaml') as f:
f.write(yaml_string)
f.flush()
try:
result = parameter_dict_from_yaml_file(f.name)
assert result['count'].value.type == ParameterType.PARAMETER_INTEGER
assert result['count'].value.integer_value == 42
assert result['ratio'].value.type == ParameterType.PARAMETER_DOUBLE
assert result['ratio'].value.double_value == 3.5
assert result['label'].value.type == ParameterType.PARAMETER_STRING
assert result['label'].value.string_value == 'foo'
assert result['flag'].value.type == ParameterType.PARAMETER_BOOL
assert result['flag'].value.bool_value is True
finally:
os.unlink(f.name)

def test_parameter_dict_from_yaml_file_array_types(self) -> None:
yaml_string = """
/node:
ros__parameters:
bools: [true, false, true]
ints: [1, 2, 3]
doubles: [1.0, 2.5, 3.25]
strings: ['a', 'b', 'c']
"""
with NamedTemporaryFile(mode='w', delete=False, suffix='.yaml') as f:
f.write(yaml_string)
f.flush()
try:
result = parameter_dict_from_yaml_file(f.name)
assert result['bools'].value.type == ParameterType.PARAMETER_BOOL_ARRAY
assert list(result['bools'].value.bool_array_value) == [True, False, True]
assert result['ints'].value.type == ParameterType.PARAMETER_INTEGER_ARRAY
assert list(result['ints'].value.integer_array_value) == [1, 2, 3]
assert result['doubles'].value.type == ParameterType.PARAMETER_DOUBLE_ARRAY
assert list(result['doubles'].value.double_array_value) == [1.0, 2.5, 3.25]
assert result['strings'].value.type == ParameterType.PARAMETER_STRING_ARRAY
assert list(result['strings'].value.string_array_value) == ['a', 'b', 'c']
finally:
os.unlink(f.name)

def test_parameter_dict_from_yaml_file_namespace_prepends(self) -> None:
yaml_string = """
/node:
ros__parameters:
foo: 1
bar: 2
"""
with NamedTemporaryFile(mode='w', delete=False, suffix='.yaml') as f:
f.write(yaml_string)
f.flush()
try:
result = parameter_dict_from_yaml_file(f.name, namespace='my_ns.')
assert 'my_ns.foo' in result
assert 'my_ns.bar' in result
assert result['my_ns.foo'].name == 'my_ns.foo'
assert result['my_ns.foo'].value.integer_value == 1
finally:
os.unlink(f.name)

def test_parameter_dict_from_yaml_file_nested_keys_flattened(self) -> None:
yaml_string = """
/node:
ros__parameters:
outer:
inner: 7
leaf: hello
"""
with NamedTemporaryFile(mode='w', delete=False, suffix='.yaml') as f:
f.write(yaml_string)
f.flush()
try:
result = parameter_dict_from_yaml_file(f.name)
assert 'outer.inner' in result
assert 'outer.leaf' in result
assert result['outer.inner'].value.integer_value == 7
assert result['outer.leaf'].value.string_value == 'hello'
finally:
os.unlink(f.name)

def test_parameter_dict_from_yaml_file_malformed_raises(self) -> None:
yaml_string = '/node:\n ros__parameters: [unclosed'
with NamedTemporaryFile(mode='w', delete=False, suffix='.yaml') as f:
f.write(yaml_string)
f.flush()
try:
with pytest.raises(yaml.YAMLError):
parameter_dict_from_yaml_file(f.name)
finally:
os.unlink(f.name)

def test_parameter_dict_from_yaml_file_empty_params_raises(self) -> None:
yaml_string = """
/node:
ros__parameters: {}
"""
with NamedTemporaryFile(mode='w', delete=False, suffix='.yaml') as f:
f.write(yaml_string)
f.flush()
try:
with pytest.raises(RuntimeError,
match='Param file does not contain any valid parameters'):
parameter_dict_from_yaml_file(f.name)
finally:
os.unlink(f.name)


if __name__ == '__main__':
unittest.main()