Skip to content

Commit 67206a4

Browse files
committed
Add tests for parameter_dict_from_yaml_file type and namespace handling
Regression fixtures ahead of #1606 (replace with rcl_parse_yaml_file). Covers scalar/array types, namespace prepend, nested-key flattening, malformed YAML, and empty ros__parameters — cases not exercised by the existing wildcard-focused test. Signed-off-by: Akihiko Komada <aki1770@gmail.com>
1 parent 33bd498 commit 67206a4

1 file changed

Lines changed: 116 additions & 0 deletions

File tree

rclpy/test/test_parameter.py

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import unittest
1919

2020
import pytest
21+
import yaml
2122
from rcl_interfaces.msg import Parameter as ParameterMsg
2223
from rcl_interfaces.msg import ParameterType
2324
from rcl_interfaces.msg import ParameterValue
@@ -474,6 +475,121 @@ def test_parameter_dict_from_yaml_file(self) -> None:
474475
os.unlink(f.name)
475476
self.assertRaises(FileNotFoundError, parameter_dict_from_yaml_file, 'unknown_file')
476477

478+
def test_parameter_dict_from_yaml_file_scalar_types(self) -> None:
479+
yaml_string = """
480+
/node:
481+
ros__parameters:
482+
count: 42
483+
ratio: 3.5
484+
label: foo
485+
flag: true
486+
"""
487+
with NamedTemporaryFile(mode='w', delete=False, suffix='.yaml') as f:
488+
f.write(yaml_string)
489+
f.flush()
490+
try:
491+
result = parameter_dict_from_yaml_file(f.name)
492+
assert result['count'].value.type == ParameterType.PARAMETER_INTEGER
493+
assert result['count'].value.integer_value == 42
494+
assert result['ratio'].value.type == ParameterType.PARAMETER_DOUBLE
495+
assert result['ratio'].value.double_value == 3.5
496+
assert result['label'].value.type == ParameterType.PARAMETER_STRING
497+
assert result['label'].value.string_value == 'foo'
498+
assert result['flag'].value.type == ParameterType.PARAMETER_BOOL
499+
assert result['flag'].value.bool_value is True
500+
finally:
501+
os.unlink(f.name)
502+
503+
def test_parameter_dict_from_yaml_file_array_types(self) -> None:
504+
yaml_string = """
505+
/node:
506+
ros__parameters:
507+
bools: [true, false, true]
508+
ints: [1, 2, 3]
509+
doubles: [1.0, 2.5, 3.25]
510+
strings: ['a', 'b', 'c']
511+
"""
512+
with NamedTemporaryFile(mode='w', delete=False, suffix='.yaml') as f:
513+
f.write(yaml_string)
514+
f.flush()
515+
try:
516+
result = parameter_dict_from_yaml_file(f.name)
517+
assert result['bools'].value.type == ParameterType.PARAMETER_BOOL_ARRAY
518+
assert list(result['bools'].value.bool_array_value) == [True, False, True]
519+
assert result['ints'].value.type == ParameterType.PARAMETER_INTEGER_ARRAY
520+
assert list(result['ints'].value.integer_array_value) == [1, 2, 3]
521+
assert result['doubles'].value.type == ParameterType.PARAMETER_DOUBLE_ARRAY
522+
assert list(result['doubles'].value.double_array_value) == [1.0, 2.5, 3.25]
523+
assert result['strings'].value.type == ParameterType.PARAMETER_STRING_ARRAY
524+
assert list(result['strings'].value.string_array_value) == ['a', 'b', 'c']
525+
finally:
526+
os.unlink(f.name)
527+
528+
def test_parameter_dict_from_yaml_file_namespace_prepends(self) -> None:
529+
yaml_string = """
530+
/node:
531+
ros__parameters:
532+
foo: 1
533+
bar: 2
534+
"""
535+
with NamedTemporaryFile(mode='w', delete=False, suffix='.yaml') as f:
536+
f.write(yaml_string)
537+
f.flush()
538+
try:
539+
result = parameter_dict_from_yaml_file(f.name, namespace='my_ns.')
540+
assert 'my_ns.foo' in result
541+
assert 'my_ns.bar' in result
542+
assert result['my_ns.foo'].name == 'my_ns.foo'
543+
assert result['my_ns.foo'].value.integer_value == 1
544+
finally:
545+
os.unlink(f.name)
546+
547+
def test_parameter_dict_from_yaml_file_nested_keys_flattened(self) -> None:
548+
yaml_string = """
549+
/node:
550+
ros__parameters:
551+
outer:
552+
inner: 7
553+
leaf: hello
554+
"""
555+
with NamedTemporaryFile(mode='w', delete=False, suffix='.yaml') as f:
556+
f.write(yaml_string)
557+
f.flush()
558+
try:
559+
result = parameter_dict_from_yaml_file(f.name)
560+
assert 'outer.inner' in result
561+
assert 'outer.leaf' in result
562+
assert result['outer.inner'].value.integer_value == 7
563+
assert result['outer.leaf'].value.string_value == 'hello'
564+
finally:
565+
os.unlink(f.name)
566+
567+
def test_parameter_dict_from_yaml_file_malformed_raises(self) -> None:
568+
yaml_string = '/node:\n ros__parameters: [unclosed'
569+
with NamedTemporaryFile(mode='w', delete=False, suffix='.yaml') as f:
570+
f.write(yaml_string)
571+
f.flush()
572+
try:
573+
with pytest.raises(yaml.YAMLError):
574+
parameter_dict_from_yaml_file(f.name)
575+
finally:
576+
os.unlink(f.name)
577+
578+
def test_parameter_dict_from_yaml_file_empty_params_raises(self) -> None:
579+
yaml_string = """
580+
/node:
581+
ros__parameters: {}
582+
"""
583+
with NamedTemporaryFile(mode='w', delete=False, suffix='.yaml') as f:
584+
f.write(yaml_string)
585+
f.flush()
586+
try:
587+
with pytest.raises(RuntimeError,
588+
match='Param file does not contain any valid parameters'):
589+
parameter_dict_from_yaml_file(f.name)
590+
finally:
591+
os.unlink(f.name)
592+
477593

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

0 commit comments

Comments
 (0)