1212#include < numeric>
1313
1414#include < executorch/runtime/core/exec_aten/exec_aten.h>
15+ #include < executorch/runtime/platform/runtime.h>
1516
1617#include < gtest/gtest.h>
1718
@@ -21,6 +22,15 @@ using executorch::runtime::is_channels_last_dim_order;
2122using executorch::runtime::is_contiguous_dim_order;
2223using executorch::runtime::stride_to_dim_order;
2324
25+ class DimOrderUtilTest : public ::testing::Test {
26+ protected:
27+ void SetUp () override {
28+ // As some of these tests cause ET_LOG to be called, the PAL must be
29+ // initialized first by calling runtime_init();
30+ executorch::runtime::runtime_init ();
31+ }
32+ };
33+
2434namespace {
2535void check_strides_eq (
2636 executorch::aten::ArrayRef<executorch::aten::StridesType> strides_a,
@@ -39,7 +49,7 @@ void check_dim_order_eq(
3949}
4050} // namespace
4151
42- TEST (DimOrderUtilTest, DimOrderToStride) {
52+ TEST_F (DimOrderUtilTest, DimOrderToStride) {
4353 executorch::aten::SizesType sizes_1[1 ] = {5 };
4454 executorch::aten::SizesType dim_order_1[1 ] = {0 };
4555 executorch::aten::SizesType strides_1[1 ] = {0 };
@@ -204,7 +214,7 @@ TEST(DimOrderUtilTest, DimOrderToStride) {
204214 check_strides_eq ({strides_3_zero, 3 }, {expected_strides_3_zero, 3 });
205215}
206216
207- TEST (DimOrderUtilTest, StrideToDimOrder) {
217+ TEST_F (DimOrderUtilTest, StrideToDimOrder) {
208218 executorch::aten::SizesType strides[3 ] = {5 , 1 , 15 };
209219 executorch::aten::DimOrderType dim_order[3 ] = {0 , 0 , 0 };
210220
@@ -216,7 +226,7 @@ TEST(DimOrderUtilTest, StrideToDimOrder) {
216226 check_dim_order_eq (dim_order, expected_dim_order);
217227}
218228
219- TEST (DimOrderUtilTest, StrideToDimOrderSameStrides) {
229+ TEST_F (DimOrderUtilTest, StrideToDimOrderSameStrides) {
220230 executorch::aten::SizesType strides[4 ] = {4 , 3 , 1 , 1 };
221231 executorch::aten::DimOrderType dim_order[4 ] = {0 , 0 , 0 , 0 };
222232
@@ -227,7 +237,7 @@ TEST(DimOrderUtilTest, StrideToDimOrderSameStrides) {
227237 check_dim_order_eq (dim_order, expected_dim_order);
228238}
229239
230- TEST (DimOrderUtilTest, IsDefaultDimOrderTest) {
240+ TEST_F (DimOrderUtilTest, IsDefaultDimOrderTest) {
231241 for (const auto i : c10::irange (1 , 7 )) {
232242 std::vector<executorch::aten::DimOrderType> dim_order (i);
233243 std::iota (dim_order.begin (), dim_order.end (), 0 );
@@ -240,7 +250,7 @@ TEST(DimOrderUtilTest, IsDefaultDimOrderTest) {
240250 }
241251}
242252
243- TEST (DimOrderUtilTest, IsDefaultDimOrderFailCasesTest) {
253+ TEST_F (DimOrderUtilTest, IsDefaultDimOrderFailCasesTest) {
244254 // Dims is default order but have two elements swapped
245255 for (const auto i : c10::irange (3 , 8 )) {
246256 std::vector<executorch::aten::DimOrderType> dim_order (i);
@@ -261,7 +271,7 @@ TEST(DimOrderUtilTest, IsDefaultDimOrderFailCasesTest) {
261271 }
262272}
263273
264- TEST (DimOrderUtilTest, IsChannelsLastDimOrderTest) {
274+ TEST_F (DimOrderUtilTest, IsChannelsLastDimOrderTest) {
265275 executorch::aten::DimOrderType dim_order_4d[4 ] = {0 , 2 , 3 , 1 };
266276 executorch::aten::DimOrderType dim_order_5d[5 ] = {0 , 2 , 3 , 4 , 1 };
267277
@@ -273,7 +283,7 @@ TEST(DimOrderUtilTest, IsChannelsLastDimOrderTest) {
273283 EXPECT_FALSE (is_contiguous_dim_order (dim_order_5d, 5 ));
274284}
275285
276- TEST (DimOrderUtilTest, IsChannelsLastDimOrderFailCasesTest) {
286+ TEST_F (DimOrderUtilTest, IsChannelsLastDimOrderFailCasesTest) {
277287 // Non 4D and 5D dim order returns false
278288 executorch::aten::DimOrderType dim_order_3d[4 ] = {1 , 2 , 0 };
279289 executorch::aten::DimOrderType dim_order_6d[6 ] = {0 , 2 , 3 , 4 , 5 , 1 };
@@ -287,3 +297,52 @@ TEST(DimOrderUtilTest, IsChannelsLastDimOrderFailCasesTest) {
287297 EXPECT_FALSE (is_channels_last_dim_order (dim_order_4d, 4 ));
288298 EXPECT_FALSE (is_channels_last_dim_order (dim_order_5d, 5 ));
289299}
300+
301+ TEST_F (DimOrderUtilTest, DimOrderWithAllDuplicatesReturnsError) {
302+ executorch::aten::SizesType sizes[3 ] = {2 , 3 , 4 };
303+ executorch::aten::SizesType dim_order[3 ] = {0 , 0 , 0 };
304+ executorch::aten::SizesType strides[3 ] = {0 , 0 , 0 };
305+
306+ auto error = dim_order_to_stride (sizes, dim_order, 3 , strides);
307+ EXPECT_EQ (error, Error::InvalidArgument);
308+ }
309+
310+ TEST_F (DimOrderUtilTest, DimOrderWithPartialDuplicateReturnsError) {
311+ executorch::aten::SizesType sizes[3 ] = {2 , 3 , 4 };
312+ executorch::aten::SizesType dim_order[3 ] = {0 , 1 , 1 };
313+ executorch::aten::SizesType strides[3 ] = {0 , 0 , 0 };
314+
315+ auto error = dim_order_to_stride (sizes, dim_order, 3 , strides);
316+ EXPECT_EQ (error, Error::InvalidArgument);
317+ }
318+
319+ TEST_F (DimOrderUtilTest, DimOrderWithMissingValueReturnsError) {
320+ executorch::aten::SizesType sizes[3 ] = {2 , 3 , 4 };
321+ executorch::aten::SizesType dim_order[3 ] = {1 , 2 , 2 };
322+ executorch::aten::SizesType strides[3 ] = {0 , 0 , 0 };
323+
324+ auto error = dim_order_to_stride (sizes, dim_order, 3 , strides);
325+ EXPECT_EQ (error, Error::InvalidArgument);
326+ }
327+
328+ TEST_F (DimOrderUtilTest, DimOrderWithOutOfBoundsValueReturnsError) {
329+ executorch::aten::SizesType sizes[3 ] = {2 , 3 , 4 };
330+ executorch::aten::SizesType dim_order[3 ] = {0 , 1 , 5 };
331+ executorch::aten::SizesType strides[3 ] = {0 , 0 , 0 };
332+
333+ auto error = dim_order_to_stride (sizes, dim_order, 3 , strides);
334+ EXPECT_EQ (error, Error::InvalidArgument);
335+ }
336+
337+ TEST_F (DimOrderUtilTest, TooManyDimsReturnsError) {
338+ constexpr size_t kTooManyDims =
339+ executorch::runtime::kTensorDimensionLimit + 1 ;
340+ std::vector<executorch::aten::SizesType> sizes (kTooManyDims , 1 );
341+ std::vector<executorch::aten::SizesType> dim_order (kTooManyDims );
342+ std::iota (dim_order.begin (), dim_order.end (), 0 );
343+ std::vector<executorch::aten::SizesType> strides (kTooManyDims , 0 );
344+
345+ auto error = dim_order_to_stride (
346+ sizes.data (), dim_order.data (), kTooManyDims , strides.data ());
347+ EXPECT_EQ (error, Error::InvalidArgument);
348+ }
0 commit comments