|
18 | 18 | import unittest |
19 | 19 |
|
20 | 20 | import pytest |
| 21 | +import yaml |
21 | 22 | from rcl_interfaces.msg import Parameter as ParameterMsg |
22 | 23 | from rcl_interfaces.msg import ParameterType |
23 | 24 | from rcl_interfaces.msg import ParameterValue |
@@ -474,6 +475,121 @@ def test_parameter_dict_from_yaml_file(self) -> None: |
474 | 475 | os.unlink(f.name) |
475 | 476 | self.assertRaises(FileNotFoundError, parameter_dict_from_yaml_file, 'unknown_file') |
476 | 477 |
|
| 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 | + |
477 | 593 |
|
478 | 594 | if __name__ == '__main__': |
479 | 595 | unittest.main() |
0 commit comments