paleolimbot commented on code in PR #930:
URL: https://github.com/apache/arrow-nanoarrow/pull/930#discussion_r3981587819


##########
src/nanoarrow/common/array_test.cc:
##########
@@ -5087,3 +5088,906 @@ TEST(ArrayMoveSharedTest, ArrayWithNullBuffers) {
 
   ArrowArrayRelease(&shared);
 }
+
+static ArrowErrorCode AppendStorageFromArrayViewForTest(const struct 
ArrowArrayView* src,
+                                                        struct ArrowArray* dst,
+                                                        struct ArrowError* 
error) {
+  NANOARROW_RETURN_NOT_OK(ArrowArrayInitFromArrayView(dst, src, error));
+  NANOARROW_RETURN_NOT_OK(ArrowArrayStartAppending(dst));
+  NANOARROW_RETURN_NOT_OK(ArrowArrayAppendStorageFromArrayView(dst, src, 
error));
+  return ArrowArrayFinishBuildingDefault(dst, error);
+}
+
+static void ExpectPrimitiveStorageAppendIdentical(struct ArrowArray* src,
+                                                  enum ArrowType type) {
+  struct ArrowError error;
+  struct ArrowArrayView src_view;
+  ArrowArrayViewInitFromType(&src_view, type);
+  ASSERT_EQ(ArrowArrayViewSetArray(&src_view, src, &error), NANOARROW_OK)
+      << error.message;
+
+  struct ArrowArray dst;
+  ASSERT_EQ(AppendStorageFromArrayViewForTest(&src_view, &dst, &error), 
NANOARROW_OK)
+      << error.message;
+  struct ArrowArrayView dst_view;
+  ArrowArrayViewInitFromType(&dst_view, type);
+  ASSERT_EQ(ArrowArrayViewSetArray(&dst_view, &dst, &error), NANOARROW_OK)
+      << error.message;
+
+  int identical = 0;
+  ASSERT_EQ(ArrowArrayViewCompare(&src_view, &dst_view, 
NANOARROW_COMPARE_IDENTICAL,
+                                  &identical, &error),
+            NANOARROW_OK);
+  EXPECT_EQ(identical, 1) << error.message;
+
+  ArrowArrayViewReset(&dst_view);
+  ArrowArrayRelease(&dst);
+  ArrowArrayViewReset(&src_view);
+}
+
+TEST(ArrayTest, ArrayAppendStorageFromArrayViewPrimitiveTypes) {
+  struct ArrowArray array;
+
+  ASSERT_EQ(ArrowArrayInitFromType(&array, NANOARROW_TYPE_INT64), 
NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayStartAppending(&array), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayAppendInt(&array, -42), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayAppendNull(&array, 1), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayFinishBuildingDefault(&array, nullptr), NANOARROW_OK);
+  ExpectPrimitiveStorageAppendIdentical(&array, NANOARROW_TYPE_INT64);
+  ArrowArrayRelease(&array);
+
+  ASSERT_EQ(ArrowArrayInitFromType(&array, NANOARROW_TYPE_UINT64), 
NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayStartAppending(&array), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayAppendUInt(&array, UINT64_MAX), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayFinishBuildingDefault(&array, nullptr), NANOARROW_OK);
+  ExpectPrimitiveStorageAppendIdentical(&array, NANOARROW_TYPE_UINT64);
+  ArrowArrayRelease(&array);
+
+  ASSERT_EQ(ArrowArrayInitFromType(&array, NANOARROW_TYPE_DOUBLE), 
NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayStartAppending(&array), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayAppendDouble(&array, 1.25), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayFinishBuildingDefault(&array, nullptr), NANOARROW_OK);
+  ExpectPrimitiveStorageAppendIdentical(&array, NANOARROW_TYPE_DOUBLE);
+  ArrowArrayRelease(&array);
+
+  ASSERT_EQ(ArrowArrayInitFromType(&array, NANOARROW_TYPE_STRING), 
NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayStartAppending(&array), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayAppendString(&array, "some value"_asv), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayFinishBuildingDefault(&array, nullptr), NANOARROW_OK);
+  ExpectPrimitiveStorageAppendIdentical(&array, NANOARROW_TYPE_STRING);
+  ArrowArrayRelease(&array);
+
+  ASSERT_EQ(ArrowArrayInitFromType(&array, NANOARROW_TYPE_INTERVAL_MONTHS), 
NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayStartAppending(&array), NANOARROW_OK);
+  struct ArrowInterval interval;
+  ArrowIntervalInit(&interval, NANOARROW_TYPE_INTERVAL_MONTHS);
+  interval.months = 42;
+  ASSERT_EQ(ArrowArrayAppendInterval(&array, &interval), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayFinishBuildingDefault(&array, nullptr), NANOARROW_OK);
+  ExpectPrimitiveStorageAppendIdentical(&array, 
NANOARROW_TYPE_INTERVAL_MONTHS);
+  ArrowArrayRelease(&array);
+
+  ASSERT_EQ(ArrowArrayInitFromType(&array, NANOARROW_TYPE_DECIMAL128), 
NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayStartAppending(&array), NANOARROW_OK);
+  struct ArrowDecimal decimal;
+  ArrowDecimalInit(&decimal, 128, 10, 2);
+  ArrowDecimalSetInt(&decimal, 1234);
+  ASSERT_EQ(ArrowArrayAppendDecimal(&array, &decimal), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayFinishBuildingDefault(&array, nullptr), NANOARROW_OK);
+  ExpectPrimitiveStorageAppendIdentical(&array, NANOARROW_TYPE_DECIMAL128);
+  ArrowArrayRelease(&array);
+}
+
+TEST(ArrayTest, ArrayAppendStorageFromArrayViewNestedAndSliced) {
+  struct ArrowError error;
+  struct ArrowSchema schema;
+  ArrowSchemaInit(&schema);
+  ASSERT_EQ(ArrowSchemaSetTypeStruct(&schema, 2), NANOARROW_OK);
+  ASSERT_EQ(ArrowSchemaSetType(schema.children[0], NANOARROW_TYPE_LIST), 
NANOARROW_OK);
+  ASSERT_EQ(ArrowSchemaSetType(schema.children[0]->children[0], 
NANOARROW_TYPE_INT32),
+            NANOARROW_OK);
+  ASSERT_EQ(ArrowSchemaSetType(schema.children[1], NANOARROW_TYPE_STRING), 
NANOARROW_OK);
+
+  struct ArrowArray src;
+  ASSERT_EQ(ArrowArrayInitFromSchema(&src, &schema, &error), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayStartAppending(&src), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayAppendInt(src.children[0]->children[0], 1), 
NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayAppendInt(src.children[0]->children[0], 2), 
NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayFinishElement(src.children[0]), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayAppendString(src.children[1], "first"_asv), 
NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayFinishElement(&src), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayAppendNull(&src, 1), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayFinishElement(src.children[0]), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayAppendString(src.children[1], "third"_asv), 
NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayFinishElement(&src), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayFinishBuildingDefault(&src, &error), NANOARROW_OK) << 
error.message;
+
+  struct ArrowArrayView src_view;
+  ASSERT_EQ(ArrowArrayViewInitFromSchema(&src_view, &schema, &error), 
NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayViewSetArray(&src_view, &src, &error), NANOARROW_OK);
+  src_view.offset = 1;
+  src_view.length = 2;
+  src_view.null_count = 1;
+
+  struct ArrowArray dst;
+  ASSERT_EQ(AppendStorageFromArrayViewForTest(&src_view, &dst, &error), 
NANOARROW_OK)
+      << error.message;
+  EXPECT_EQ(dst.length, 2);
+  EXPECT_EQ(dst.children[0]->length, 2);
+  EXPECT_EQ(dst.children[0]->children[0]->length, 0);
+  EXPECT_EQ(dst.children[1]->length, 2);
+
+  struct ArrowArrayView dst_view;
+  ASSERT_EQ(ArrowArrayViewInitFromSchema(&dst_view, &schema, &error), 
NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayViewSetArray(&dst_view, &dst, &error), NANOARROW_OK);
+  EXPECT_TRUE(ArrowArrayViewIsNull(&dst_view, 0));
+  EXPECT_EQ(ArrowArrayViewGetStringUnsafe(dst_view.children[1], 1), 
"third"_asv);
+
+  ArrowArrayViewReset(&dst_view);
+  ArrowArrayRelease(&dst);
+  ArrowArrayViewReset(&src_view);
+  ArrowArrayRelease(&src);
+  ArrowSchemaRelease(&schema);
+}
+
+TEST(ArrayTest, ArrayAppendStorageFromArrayViewNestedDecimal) {
+  struct ArrowError error;
+  struct ArrowSchema schema;
+  ArrowSchemaInit(&schema);
+  ASSERT_EQ(ArrowSchemaSetTypeStruct(&schema, 2), NANOARROW_OK);
+  ASSERT_EQ(ArrowSchemaSetName(schema.children[0], "scalar"), NANOARROW_OK);
+  ASSERT_EQ(
+      ArrowSchemaSetTypeDecimal(schema.children[0], NANOARROW_TYPE_DECIMAL128, 
10, 2),
+      NANOARROW_OK);
+  ASSERT_EQ(ArrowSchemaSetName(schema.children[1], "values"), NANOARROW_OK);
+  ASSERT_EQ(ArrowSchemaSetType(schema.children[1], NANOARROW_TYPE_LIST), 
NANOARROW_OK);
+  ASSERT_EQ(ArrowSchemaSetTypeDecimal(schema.children[1]->children[0],
+                                      NANOARROW_TYPE_DECIMAL128, 10, 2),
+            NANOARROW_OK);
+
+  struct ArrowArray src;
+  ASSERT_EQ(ArrowArrayInitFromSchema(&src, &schema, &error), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayStartAppending(&src), NANOARROW_OK);
+  struct ArrowDecimal decimal;
+  ArrowDecimalInit(&decimal, 128, 10, 2);
+  ArrowDecimalSetInt(&decimal, 1234);
+  ASSERT_EQ(ArrowArrayAppendDecimal(src.children[0], &decimal), NANOARROW_OK);
+  ArrowDecimalSetInt(&decimal, 5678);
+  ASSERT_EQ(ArrowArrayAppendDecimal(src.children[1]->children[0], &decimal),
+            NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayFinishElement(src.children[1]), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayFinishElement(&src), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayFinishBuildingDefault(&src, &error), NANOARROW_OK) << 
error.message;
+
+  struct ArrowArrayView src_view;
+  ASSERT_EQ(ArrowArrayViewInitFromSchema(&src_view, &schema, &error), 
NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayViewSetArray(&src_view, &src, &error), NANOARROW_OK);
+  struct ArrowArray dst;
+  ASSERT_EQ(AppendStorageFromArrayViewForTest(&src_view, &dst, &error), 
NANOARROW_OK)
+      << error.message;
+
+  struct ArrowArrayView dst_view;
+  ASSERT_EQ(ArrowArrayViewInitFromSchema(&dst_view, &schema, &error), 
NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayViewSetArray(&dst_view, &dst, &error), NANOARROW_OK);
+  int identical = 0;
+  ASSERT_EQ(ArrowArrayViewCompare(&src_view, &dst_view, 
NANOARROW_COMPARE_IDENTICAL,
+                                  &identical, &error),
+            NANOARROW_OK);
+  EXPECT_EQ(identical, 1) << error.message;
+
+  ArrowArrayViewReset(&dst_view);
+  ArrowArrayRelease(&dst);
+  ArrowArrayViewReset(&src_view);
+  ArrowArrayRelease(&src);
+  ArrowSchemaRelease(&schema);
+}
+
+TEST(ArrayTest, ArrayAppendStorageFromArrayViewRejectsUnions) {
+  for (enum ArrowType union_type :
+       {NANOARROW_TYPE_DENSE_UNION, NANOARROW_TYPE_SPARSE_UNION}) {
+    struct ArrowError error;
+    struct ArrowSchema schema;
+    ArrowSchemaInit(&schema);
+    ASSERT_EQ(ArrowSchemaSetTypeUnion(&schema, union_type, 2), NANOARROW_OK);
+    ASSERT_EQ(ArrowSchemaSetType(schema.children[0], NANOARROW_TYPE_INT32), 
NANOARROW_OK);
+    ASSERT_EQ(ArrowSchemaSetType(schema.children[1], NANOARROW_TYPE_STRING),
+              NANOARROW_OK);
+
+    struct ArrowArray src;
+    ASSERT_EQ(ArrowArrayInitFromSchema(&src, &schema, &error), NANOARROW_OK);
+    ASSERT_EQ(ArrowArrayStartAppending(&src), NANOARROW_OK);
+    ASSERT_EQ(ArrowArrayAppendInt(src.children[0], 42), NANOARROW_OK);
+    ASSERT_EQ(ArrowArrayFinishUnionElement(&src, 0), NANOARROW_OK);
+    ASSERT_EQ(ArrowArrayAppendString(src.children[1], "value"_asv), 
NANOARROW_OK);
+    ASSERT_EQ(ArrowArrayFinishUnionElement(&src, 1), NANOARROW_OK);
+    ASSERT_EQ(ArrowArrayFinishBuildingDefault(&src, &error), NANOARROW_OK);
+
+    struct ArrowArrayView src_view;
+    ASSERT_EQ(ArrowArrayViewInitFromSchema(&src_view, &schema, &error), 
NANOARROW_OK);
+    ASSERT_EQ(ArrowArrayViewSetArray(&src_view, &src, &error), NANOARROW_OK);
+    struct ArrowArray dst;
+    ASSERT_EQ(AppendStorageFromArrayViewForTest(&src_view, &dst, &error), 
ENOTSUP);
+    EXPECT_EQ(dst.length, 0);
+    EXPECT_EQ(std::string(error.message), "Appending array views is not 
supported for " +
+                                              
std::string(ArrowTypeString(union_type)));
+
+    ArrowArrayRelease(&dst);
+    ArrowArrayViewReset(&src_view);
+    ArrowArrayRelease(&src);
+    ArrowSchemaRelease(&schema);
+  }
+}
+
+TEST(ArrayTest, ArrayAppendStorageFromArrayViewRunEndEncoded) {
+  struct ArrowError error;
+  struct ArrowSchema schema;
+  ArrowSchemaInit(&schema);
+  ASSERT_EQ(ArrowSchemaSetTypeRunEndEncoded(&schema, NANOARROW_TYPE_INT16), 
NANOARROW_OK);
+  ASSERT_EQ(ArrowSchemaSetType(schema.children[1], NANOARROW_TYPE_STRING), 
NANOARROW_OK);

Review Comment:
   Here the int32 REE and int64 REE branches aren't covered. I think a `for()` 
over `NANOARROW_TYPE_INT16`, `NANOARROW_TYPE_INT32` and `NANOARROW_TYPE_INT64` 
should cover those.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to