[PATCH v3 1/3] libcamera: yaml-parser: Add additional tests

Paul Elder paul.elder at ideasonboard.com
Mon Sep 23 11:50:11 CEST 2024


On Fri, Sep 20, 2024 at 03:28:08PM +0200, Stefan Klug wrote:
> Add additional tests in preparation for upcoming modifications on the
> yaml parser. These tests handle the case where the yaml file contains
> empty items in dictionaries or lists. E.g.:
> 
> dict:
>   key_with_value: value
>   key_without_value:
> 
> Signed-off-by: Stefan Klug <stefan.klug at ideasonboard.com>
> 
> ---
> 
> In the end it turned out that the changes on the YamlParser were never
> wrong, so these tests are somewhat superfluous. We could still merge
> them to test specifically for that case or drop the patch.

I think it's worth keeping the test to confirm correctness and ensure
that these aren't broken.

Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>

> 
> Changes in v3:
> - Added seperate patch for the working tests
> ---
>  test/yaml-parser.cpp | 28 +++++++++++++++++++++++++---
>  1 file changed, 25 insertions(+), 3 deletions(-)
> 
> diff --git a/test/yaml-parser.cpp b/test/yaml-parser.cpp
> index 81c829834667..347999831d61 100644
> --- a/test/yaml-parser.cpp
> +++ b/test/yaml-parser.cpp
> @@ -34,10 +34,12 @@ static const string testYaml =
>  	"list:\n"
>  	"  - James\n"
>  	"  - Mary\n"
> +	"  - \n"
>  	"dictionary:\n"
>  	"  a: 1\n"
>  	"  c: 3\n"
>  	"  b: 2\n"
> +	"  empty:\n"
>  	"level1:\n"
>  	"  level2:\n"
>  	"    - [1, 2]\n"
> @@ -430,9 +432,10 @@ protected:
>  		if (testObjectType(listObj, "list", Type::List) != TestPass)
>  			return TestFail;
>  
> -		static constexpr std::array<const char *, 2> listValues{
> +		static constexpr std::array<const char *, 3> listValues{
>  			"James",
>  			"Mary",
> +			"",
>  		};
>  
>  		if (listObj.size() != listValues.size()) {
> @@ -465,16 +468,23 @@ protected:
>  			i++;
>  		}
>  
> +		/* Ensure that empty objects get parsed as empty strings. */
> +		if (!listObj[2].isValue()) {
> +			cerr << "Empty object is not a value" << std::endl;
> +			return TestFail;
> +		}
> +
>  		/* Test dictionary object */
>  		auto &dictObj = (*root)["dictionary"];
>  
>  		if (testObjectType(dictObj, "dictionary", Type::Dictionary) != TestPass)
>  			return TestFail;
>  
> -		static constexpr std::array<std::pair<const char *, int>, 3> dictValues{ {
> +		static constexpr std::array<std::pair<const char *, int>, 4> dictValues{ {
>  			{ "a", 1 },
>  			{ "c", 3 },
>  			{ "b", 2 },
> +			{ "empty", -100 },
>  		} };
>  
>  		size_t dictSize = dictValues.size();
> @@ -505,7 +515,7 @@ protected:
>  				return TestFail;
>  			}
>  
> -			if (elem.get<int32_t>(0) != item.second) {
> +			if (elem.get<int32_t>(-100) != item.second) {
>  				std::cerr << "Dictionary element " << i << " has wrong value"
>  					  << std::endl;
>  				return TestFail;
> @@ -514,6 +524,18 @@ protected:
>  			i++;
>  		}
>  
> +		/* Ensure that empty objects get parsed as empty strings. */
> +		if (!dictObj["empty"].isValue()) {
> +			cerr << "Empty object is not of type value" << std::endl;
> +			return TestFail;
> +		}
> +
> +		/* Ensure that keys without values are added to a dict. */
> +		if (!dictObj.contains("empty")) {
> +			cerr << "Empty element is missing in dict" << std::endl;
> +			return TestFail;
> +		}
> +
>  		/* Make sure utils::map_keys() works on the adapter. */
>  		(void)utils::map_keys(dictObj.asDict());
>  
> -- 
> 2.43.0
> 


More information about the libcamera-devel mailing list