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 <sternenseemann@systemli.org>
		
			
				
	
	
		
			101 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use super::*;
 | |
| 
 | |
| #[test]
 | |
| fn test_empty_attrs() {
 | |
|     let attrs = NixAttrs::construct(0, vec![]).expect("empty attr construction should succeed");
 | |
| 
 | |
|     assert!(
 | |
|         matches!(attrs, NixAttrs(AttrsRep::Empty)),
 | |
|         "empty attribute set should use optimised representation"
 | |
|     );
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn test_simple_attrs() {
 | |
|     let attrs = NixAttrs::construct(
 | |
|         1,
 | |
|         vec![Value::String("key".into()), Value::String("value".into())],
 | |
|     )
 | |
|     .expect("simple attr construction should succeed");
 | |
| 
 | |
|     assert!(
 | |
|         matches!(attrs, NixAttrs(AttrsRep::Map(_))),
 | |
|         "simple attribute set should use map representation",
 | |
|     )
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn test_kv_attrs() {
 | |
|     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");
 | |
| 
 | |
|     match kv_attrs {
 | |
|         NixAttrs(AttrsRep::KV { name, value }) if name == meaning_val || value == forty_two_val => {
 | |
|         }
 | |
| 
 | |
|         _ => panic!(
 | |
|             "K/V attribute set should use optimised representation, but got {:?}",
 | |
|             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<_>>(),
 | |
|         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<_>>(),
 | |
|         vec![(&NixString::from("key"), &Value::String("value".into()))],
 | |
|     );
 | |
| }
 |