@@ -307,6 +307,7 @@ mod tests {
307
307
use super :: * ;
308
308
use crate :: VariantBuilder ;
309
309
use std:: iter:: repeat_n;
310
+ use std:: ops:: Range ;
310
311
311
312
#[ test]
312
313
fn test_variant_list_simple ( ) {
@@ -627,4 +628,106 @@ mod tests {
627
628
assert_eq ! ( expected_list. get( i) . unwrap( ) , item_str) ;
628
629
}
629
630
}
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
+ }
630
733
}
0 commit comments