Skip to content

Commit 4f5ab12

Browse files
authored
[Test] Add tests for VariantList equality (#7953)
# Which issue does this PR close? - Follow on to #7943 - Part of #7948 # Rationale for this change I found a few more tests I would like to have seen while reviewing #7943 # What changes are included in this PR? Add some list equality tests # Are these changes tested? It is only tests, no functionality changes # Are there any user-facing changes? No
1 parent a15f345 commit 4f5ab12

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed

parquet-variant/src/variant/list.rs

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,7 @@ mod tests {
307307
use super::*;
308308
use crate::VariantBuilder;
309309
use std::iter::repeat_n;
310+
use std::ops::Range;
310311

311312
#[test]
312313
fn test_variant_list_simple() {
@@ -627,4 +628,106 @@ mod tests {
627628
assert_eq!(expected_list.get(i).unwrap(), item_str);
628629
}
629630
}
631+
632+
#[test]
633+
fn test_variant_list_equality() {
634+
// Create two lists with the same values (0..10)
635+
let (metadata1, value1) = make_listi32(0..10);
636+
let list1 = Variant::new(&metadata1, &value1);
637+
let (metadata2, value2) = make_listi32(0..10);
638+
let list2 = Variant::new(&metadata2, &value2);
639+
// They should be equal
640+
assert_eq!(list1, list2);
641+
}
642+
643+
#[test]
644+
fn test_variant_list_equality_different_length() {
645+
// Create two lists with different lengths
646+
let (metadata1, value1) = make_listi32(0..10);
647+
let list1 = Variant::new(&metadata1, &value1);
648+
let (metadata2, value2) = make_listi32(0..5);
649+
let list2 = Variant::new(&metadata2, &value2);
650+
// They should not be equal
651+
assert_ne!(list1, list2);
652+
}
653+
654+
#[test]
655+
fn test_variant_list_equality_different_values() {
656+
// Create two lists with different values
657+
let (metadata1, value1) = make_listi32(0..10);
658+
let list1 = Variant::new(&metadata1, &value1);
659+
let (metadata2, value2) = make_listi32(5..15);
660+
let list2 = Variant::new(&metadata2, &value2);
661+
// They should not be equal
662+
assert_ne!(list1, list2);
663+
}
664+
665+
#[test]
666+
fn test_variant_list_equality_different_types() {
667+
// Create two lists with different types
668+
let (metadata1, value1) = make_listi32(0i32..10i32);
669+
let list1 = Variant::new(&metadata1, &value1);
670+
let (metadata2, value2) = make_listi64(0..10);
671+
let list2 = Variant::new(&metadata2, &value2);
672+
// They should not be equal due to type mismatch
673+
assert_ne!(list1, list2);
674+
}
675+
676+
#[test]
677+
fn test_variant_list_equality_slices() {
678+
// Make an object like this and make sure equality works
679+
// when the lists are sub fields
680+
//
681+
// {
682+
// "list1": [0, 1, 2, ..., 9],
683+
// "list2": [0, 1, 2, ..., 9],
684+
// "list3": [10, 11, 12, ..., 19],
685+
// }
686+
let (metadata, value) = {
687+
let mut builder = VariantBuilder::new();
688+
let mut object_builder = builder.new_object();
689+
// list1 (0..10)
690+
let (metadata1, value1) = make_listi32(0i32..10i32);
691+
object_builder.insert("list1", Variant::new(&metadata1, &value1));
692+
693+
// list2 (0..10)
694+
let (metadata2, value2) = make_listi32(0i32..10i32);
695+
object_builder.insert("list2", Variant::new(&metadata2, &value2));
696+
697+
// list3 (10..20)
698+
let (metadata3, value3) = make_listi32(10i32..20i32);
699+
object_builder.insert("list3", Variant::new(&metadata3, &value3));
700+
object_builder.finish().unwrap();
701+
builder.finish()
702+
};
703+
704+
let variant = Variant::try_new(&metadata, &value).unwrap();
705+
let object = variant.as_object().unwrap();
706+
// Check that list1 and list2 are equal
707+
assert_eq!(object.get("list1").unwrap(), object.get("list2").unwrap());
708+
// Check that list1 and list3 are not equal
709+
assert_ne!(object.get("list1").unwrap(), object.get("list3").unwrap());
710+
}
711+
712+
/// return metadata/value for a simple variant list with values in a range
713+
fn make_listi32(range: Range<i32>) -> (Vec<u8>, Vec<u8>) {
714+
let mut variant_builder = VariantBuilder::new();
715+
let mut list_builder = variant_builder.new_list();
716+
for i in range {
717+
list_builder.append_value(i);
718+
}
719+
list_builder.finish();
720+
variant_builder.finish()
721+
}
722+
723+
/// return metadata/value for a simple variant list with values in a range
724+
fn make_listi64(range: Range<i64>) -> (Vec<u8>, Vec<u8>) {
725+
let mut variant_builder = VariantBuilder::new();
726+
let mut list_builder = variant_builder.new_list();
727+
for i in range {
728+
list_builder.append_value(i);
729+
}
730+
list_builder.finish();
731+
variant_builder.finish()
732+
}
630733
}

0 commit comments

Comments
 (0)