From b12d7fcb2d86f7c03d6868c7d254b400d8d3ce47 Mon Sep 17 00:00:00 2001 From: lyken Date: Mon, 15 Jul 2024 11:54:21 +0800 Subject: [PATCH] core: irrt improve test_ndarray_subscript - rewrote some comments - add test_ndsubscript_index_subscript_out_of_bounds --- nac3core/irrt/test/test_ndarray_subscript.hpp | 63 +++++++++++++++++-- 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/nac3core/irrt/test/test_ndarray_subscript.hpp b/nac3core/irrt/test/test_ndarray_subscript.hpp index 7bd68755..b3f39028 100644 --- a/nac3core/irrt/test/test_ndarray_subscript.hpp +++ b/nac3core/irrt/test/test_ndarray_subscript.hpp @@ -27,6 +27,7 @@ namespace test { namespace ndarray_subscript { */ BEGIN_TEST(); + // Prepare src_ndarray double src_data[12] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0 }; int32_t src_itemsize = sizeof(double); const int32_t src_ndims = 2; @@ -41,8 +42,7 @@ namespace test { namespace ndarray_subscript { }; ndarray::basic::set_strides_by_shape(&src_ndarray); - // Destination ndarray - // As documented, ndims and shape & strides must be allocated and determined by the caller. + // Prepare dst_ndarray const int32_t dst_ndims = 2; int32_t dst_shape[dst_ndims] = {999, 999}; // Empty values int32_t dst_strides[dst_ndims] = {999, 999}; // Empty values @@ -53,7 +53,7 @@ namespace test { namespace ndarray_subscript { .strides = dst_strides }; - // Create the slice in `ndarray[-2::, 1::2]` + // Create the subscripts in `ndarray[-2::, 1::2]` UserSlice subscript_1; subscript_1.set_start(-2); @@ -118,6 +118,7 @@ namespace test { namespace ndarray_subscript { */ BEGIN_TEST(); + // Prepare src_ndarray double src_data[12] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0 }; int32_t src_itemsize = sizeof(double); const int32_t src_ndims = 2; @@ -132,8 +133,7 @@ namespace test { namespace ndarray_subscript { }; ndarray::basic::set_strides_by_shape(&src_ndarray); - // Destination ndarray - // As documented, ndims and shape & strides must be allocated and determined by the caller. + // Prepare dst_ndarray const int32_t dst_ndims = 1; int32_t dst_shape[dst_ndims] = {999}; // Empty values int32_t dst_strides[dst_ndims] = {999}; // Empty values @@ -144,7 +144,7 @@ namespace test { namespace ndarray_subscript { .strides = dst_strides }; - // Create the slice in `ndarray[2, ::-2]` + // Create the subscripts in `ndarray[2, ::-2]` int32_t subscript_1 = 2; UserSlice subscript_2; @@ -175,8 +175,59 @@ namespace test { namespace ndarray_subscript { ); } + void test_ndsubscript_index_subscript_out_of_bounds() { + /* + # Consider `my_array` + + print(my_array.shape) + # (4, 5, 6) + + my_array[2, 100] # error, index subscript at axis 1 is out of bounds + */ + BEGIN_TEST(); + + // Prepare src_ndarray + const int32_t src_ndims = 2; + int32_t src_shape[src_ndims] = { 3, 4 }; + int32_t src_strides[src_ndims] = {}; + NDArray src_ndarray = { + .data = (uint8_t*) nullptr, // placeholder, we wouldn't access it + .itemsize = sizeof(double), // placeholder + .ndims = src_ndims, + .shape = src_shape, + .strides = src_strides + }; + ndarray::basic::set_strides_by_shape(&src_ndarray); + + // Create the subscripts in `my_array[2, 100]` + int32_t subscript_1 = 2; + int32_t subscript_2 = 100; + + const int32_t num_ndsubscripts = 2; + NDSubscript ndsubscripts[num_ndsubscripts] = { + { .type = INPUT_SUBSCRIPT_TYPE_INDEX, .data = (uint8_t*) &subscript_1 }, + { .type = INPUT_SUBSCRIPT_TYPE_INDEX, .data = (uint8_t*) &subscript_2 } + }; + + // Prepare dst_ndarray + const int32_t dst_ndims = 0; + int32_t dst_shape[dst_ndims] = {}; + int32_t dst_strides[dst_ndims] = {}; + NDArray dst_ndarray = { + .data = nullptr, // placehloder + .ndims = dst_ndims, + .shape = dst_shape, + .strides = dst_strides + }; + + ErrorContext errctx = create_testing_errctx(); + ndarray::subscript::subscript(&errctx, num_ndsubscripts, ndsubscripts, &src_ndarray, &dst_ndarray); + assert_errctx_has_error(&errctx, errctx.error_ids->index_error); + } + void run() { test_ndsubscript_normal_1(); test_ndsubscript_normal_2(); + test_ndsubscript_index_subscript_out_of_bounds(); } } } \ No newline at end of file