@@ -816,6 +816,83 @@ TEST_F(DiffTest, CompareRandomStruct) {
816816 }
817817}
818818
819+ TEST_F (DiffTest, StructFieldComparison) {
820+ // test struct field-by-field comparison
821+ auto type = struct_ (
822+ {field (" first" , int32 ()), field (" second" , utf8 ()), field (" third" , int64 ())});
823+
824+ // first field differs
825+ base_ = ArrayFromJSON (type, R"( [{"first": 1, "second": "a", "third": 100}])" );
826+ target_ = ArrayFromJSON (type, R"( [{"first": 2, "second": "a", "third": 100}])" );
827+ DoDiff ();
828+ AssertInsertIs (" [false, false, true]" );
829+ AssertRunLengthIs (" [0, 0, 0]" );
830+
831+ // second field differs
832+ base_ = ArrayFromJSON (type, R"( [{"first": 1, "second": "a", "third": 100}])" );
833+ target_ = ArrayFromJSON (type, R"( [{"first": 1, "second": "b", "third": 100}])" );
834+ DoDiff ();
835+ AssertInsertIs (" [false, false, true]" );
836+ AssertRunLengthIs (" [0, 0, 0]" );
837+
838+ // third field differs
839+ base_ = ArrayFromJSON (type, R"( [{"first": 1, "second": "a", "third": 100}])" );
840+ target_ = ArrayFromJSON (type, R"( [{"first": 1, "second": "a", "third": 200}])" );
841+ DoDiff ();
842+ AssertInsertIs (" [false, false, true]" );
843+ AssertRunLengthIs (" [0, 0, 0]" );
844+
845+ // all fields equal
846+ base_ = ArrayFromJSON (type, R"( [{"first": 1, "second": "a", "third": 100}])" );
847+ target_ = ArrayFromJSON (type, R"( [{"first": 1, "second": "a", "third": 100}])" );
848+ DoDiff ();
849+ AssertInsertIs (" [false]" );
850+ AssertRunLengthIs (" [1]" );
851+ }
852+
853+ TEST_F (DiffTest, NestedStructComparison) {
854+ // test nested struct comparison
855+ auto inner_type = struct_ ({field (" x" , int32 ()), field (" y" , int32 ())});
856+ auto outer_type =
857+ struct_ ({field (" id" , int32 ()), field (" inner" , inner_type), field (" name" , utf8 ())});
858+
859+ // outer first field differs
860+ base_ = ArrayFromJSON (outer_type,
861+ R"( [{"id": 1, "inner": {"x": 10, "y": 20}, "name": "test"}])" );
862+ target_ = ArrayFromJSON (outer_type,
863+ R"( [{"id": 2, "inner": {"x": 10, "y": 20}, "name": "test"}])" );
864+ DoDiff ();
865+ AssertInsertIs (" [false, false, true]" );
866+ AssertRunLengthIs (" [0, 0, 0]" );
867+
868+ // nested struct first field differs
869+ base_ = ArrayFromJSON (outer_type,
870+ R"( [{"id": 1, "inner": {"x": 10, "y": 20}, "name": "test"}])" );
871+ target_ = ArrayFromJSON (outer_type,
872+ R"( [{"id": 1, "inner": {"x": 99, "y": 20}, "name": "test"}])" );
873+ DoDiff ();
874+ AssertInsertIs (" [false, false, true]" );
875+ AssertRunLengthIs (" [0, 0, 0]" );
876+
877+ // nested struct second field differs
878+ base_ = ArrayFromJSON (outer_type,
879+ R"( [{"id": 1, "inner": {"x": 10, "y": 20}, "name": "test"}])" );
880+ target_ = ArrayFromJSON (outer_type,
881+ R"( [{"id": 1, "inner": {"x": 10, "y": 99}, "name": "test"}])" );
882+ DoDiff ();
883+ AssertInsertIs (" [false, false, true]" );
884+ AssertRunLengthIs (" [0, 0, 0]" );
885+
886+ // all equal including nested struct
887+ base_ = ArrayFromJSON (outer_type,
888+ R"( [{"id": 1, "inner": {"x": 10, "y": 20}, "name": "test"}])" );
889+ target_ = ArrayFromJSON (outer_type,
890+ R"( [{"id": 1, "inner": {"x": 10, "y": 20}, "name": "test"}])" );
891+ DoDiff ();
892+ AssertInsertIs (" [false]" );
893+ AssertRunLengthIs (" [1]" );
894+ }
895+
819896TEST_F (DiffTest, CompareHalfFloat) {
820897 auto first = ArrayFromJSON (float16 (), " [1.1, 2.0, 2.5, 3.3]" );
821898 auto second = ArrayFromJSON (float16 (), " [1.1, 4.0, 3.5, 3.3]" );
0 commit comments