From 38d3db5fb88e85eae23680f1c892175e5dfaad0f Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Wed, 31 Aug 2022 04:24:30 +0300 Subject: feat(tvix/eval): implement NixAttrs::iter() Implementing iteration over NixAttrs requires a custom iterator type in order to encapsulate the different representations. The BTreeMap for example has its own iterator type which needs to be encapsulated. This is mostly boilerplate code, but for a change some simple unit tests have been added in. Change-Id: Ie13b063241d461b810876f95f53878388e918ef2 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6367 Tested-by: BuildkiteCI Reviewed-by: sterni --- tvix/eval/src/value/attrs/tests.rs | 47 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'tvix/eval/src/value/attrs/tests.rs') diff --git a/tvix/eval/src/value/attrs/tests.rs b/tvix/eval/src/value/attrs/tests.rs index 647a358655..c9e4022472 100644 --- a/tvix/eval/src/value/attrs/tests.rs +++ b/tvix/eval/src/value/attrs/tests.rs @@ -52,3 +52,50 @@ fn test_kv_attrs() { ), } } + +#[test] +fn test_empty_attrs_iter() { + let attrs = NixAttrs::construct(0, vec![]).unwrap(); + assert_eq!(attrs.iter().next(), None); +} + +#[test] +fn test_kv_attrs_iter() { + let name_val = Value::String("name".into()); + let value_val = Value::String("value".into()); + let meaning_val = Value::String("meaning".into()); + let forty_two_val = Value::Integer(42); + + let kv_attrs = NixAttrs::construct( + 2, + vec![ + value_val.clone(), + forty_two_val.clone(), + name_val.clone(), + meaning_val.clone(), + ], + ) + .expect("constructing K/V pair attrs should succeed"); + + assert_eq!( + kv_attrs.iter().collect::>(), + vec![ + (NixString::NAME_REF, &meaning_val), + (NixString::VALUE_REF, &forty_two_val) + ] + ); +} + +#[test] +fn test_map_attrs_iter() { + let attrs = NixAttrs::construct( + 1, + vec![Value::String("key".into()), Value::String("value".into())], + ) + .expect("simple attr construction should succeed"); + + assert_eq!( + attrs.iter().collect::>(), + vec![(&NixString::from("key"), &Value::String("value".into()))], + ); +} -- cgit 1.4.1