@@ -357,6 +357,204 @@ TEST_F(TensorPtrTest, MakeTensorPtrFromExistingTensorInt32) {
357357 EXPECT_EQ (new_tensor->scalar_type (), executorch::aten::ScalarType::Int);
358358}
359359
360+ TEST_F (TensorPtrTest, MakeViewOverrideSizesRankIncrease) {
361+ std::vector<float > data = {1 , 2 , 3 , 4 , 5 , 6 };
362+ auto tensor = make_tensor_ptr ({2 , 3 }, std::move (data));
363+ auto view = make_tensor_ptr (tensor, {1 , 2 , 3 });
364+
365+ EXPECT_EQ (view->dim (), 3 );
366+ EXPECT_EQ (view->size (0 ), 1 );
367+ EXPECT_EQ (view->size (1 ), 2 );
368+ EXPECT_EQ (view->size (2 ), 3 );
369+ EXPECT_EQ (view->const_data_ptr <float >(), tensor->const_data_ptr <float >());
370+ EXPECT_EQ (view->strides ()[0 ], 6 );
371+ EXPECT_EQ (view->strides ()[1 ], 3 );
372+ EXPECT_EQ (view->strides ()[2 ], 1 );
373+ }
374+
375+ TEST_F (TensorPtrTest, MakeViewOverrideSizesSameRankRecomputesStrides) {
376+ float data[12 ] = {0 };
377+ auto tensor = make_tensor_ptr ({3 , 4 }, data);
378+ auto view = make_tensor_ptr (tensor, {4 , 3 });
379+
380+ EXPECT_EQ (view->dim (), 2 );
381+ EXPECT_EQ (view->size (0 ), 4 );
382+ EXPECT_EQ (view->size (1 ), 3 );
383+ EXPECT_EQ (view->strides ()[0 ], 3 );
384+ EXPECT_EQ (view->strides ()[1 ], 1 );
385+ }
386+
387+ TEST_F (TensorPtrTest, MakeViewOverrideDimOrderOnly) {
388+ float data[6 ] = {0 };
389+ auto tensor = make_tensor_ptr ({2 , 3 }, data);
390+ auto view = make_tensor_ptr (tensor, {}, {1 , 0 }, {});
391+
392+ EXPECT_EQ (view->dim (), 2 );
393+ EXPECT_EQ (view->size (0 ), 2 );
394+ EXPECT_EQ (view->size (1 ), 3 );
395+ EXPECT_EQ (view->strides ()[0 ], 1 );
396+ EXPECT_EQ (view->strides ()[1 ], 2 );
397+ }
398+
399+ TEST_F (TensorPtrTest, MakeViewOverrideStridesOnlyInfersDimOrder) {
400+ float data[12 ] = {0 };
401+ auto tensor = make_tensor_ptr ({3 , 4 }, data);
402+ auto view = make_tensor_ptr (tensor, {}, {}, {1 , 3 });
403+
404+ EXPECT_EQ (view->dim (), 2 );
405+ EXPECT_EQ (view->size (0 ), 3 );
406+ EXPECT_EQ (view->size (1 ), 4 );
407+ EXPECT_EQ (view->strides ()[0 ], 1 );
408+ EXPECT_EQ (view->strides ()[1 ], 3 );
409+ }
410+
411+ TEST_F (TensorPtrTest, MakeViewReuseMetadataWhenShapeSame) {
412+ float data[12 ] = {0 };
413+ auto tensor = make_tensor_ptr ({3 , 4 }, data, {1 , 0 }, {1 , 3 });
414+ auto view = make_tensor_ptr (tensor, {3 , 4 });
415+
416+ EXPECT_EQ (view->dim (), 2 );
417+ EXPECT_EQ (view->size (0 ), 3 );
418+ EXPECT_EQ (view->size (1 ), 4 );
419+ EXPECT_EQ (view->strides ()[0 ], 1 );
420+ EXPECT_EQ (view->strides ()[1 ], 3 );
421+ }
422+
423+ TEST_F (TensorPtrTest, MakeViewShapeChangeWithExplicitOldStridesExpectDeath) {
424+ float data[12 ] = {0 };
425+ auto tensor = make_tensor_ptr ({3 , 4 }, data);
426+ std::vector<executorch::aten::StridesType> old_strides (
427+ tensor->strides ().begin (), tensor->strides ().end ());
428+
429+ ET_EXPECT_DEATH (
430+ { auto _ = make_tensor_ptr (tensor, {2 , 6 }, {}, old_strides); }, " " );
431+ }
432+
433+ TEST_F (TensorPtrTest, MakeViewInvalidDimOrderExpectDeath) {
434+ float data[12 ] = {0 };
435+ auto tensor = make_tensor_ptr ({3 , 4 }, data);
436+
437+ ET_EXPECT_DEATH (
438+ { auto _ = make_tensor_ptr (tensor, {3 , 4 }, {2 , 1 }, {1 , 4 }); }, " " );
439+ }
440+
441+ TEST_F (TensorPtrTest, MakeViewFromTensorPtrConvenienceOverload) {
442+ float data[12 ] = {0 };
443+ auto tensor = make_tensor_ptr ({3 , 4 }, data);
444+ auto view = make_tensor_ptr (tensor, {}, {1 , 0 }, {});
445+
446+ EXPECT_EQ (view->dim (), 2 );
447+ EXPECT_EQ (view->size (0 ), 3 );
448+ EXPECT_EQ (view->size (1 ), 4 );
449+ EXPECT_EQ (view->strides ()[0 ], 1 );
450+ EXPECT_EQ (view->strides ()[1 ], 3 );
451+ }
452+
453+ TEST_F (TensorPtrTest, MakeViewRankDecreaseFlatten) {
454+ float data[6 ] = {1 , 2 , 3 , 4 , 5 , 6 };
455+ auto tensor = make_tensor_ptr (
456+ {2 , 3 },
457+ data,
458+ {},
459+ {},
460+ executorch::aten::ScalarType::Float,
461+ executorch::aten::TensorShapeDynamism::DYNAMIC_UNBOUND);
462+ auto view = make_tensor_ptr (tensor, {6 });
463+ EXPECT_EQ (view->dim (), 1 );
464+ EXPECT_EQ (view->size (0 ), 6 );
465+ EXPECT_EQ (view->strides ()[0 ], 1 );
466+ EXPECT_NE (tensor->unsafeGetTensorImpl (), view->unsafeGetTensorImpl ());
467+ EXPECT_EQ (resize_tensor_ptr (view, {3 , 2 }), Error::NotSupported);
468+ EXPECT_EQ (view->dim (), 1 );
469+ EXPECT_EQ (view->size (0 ), 6 );
470+ }
471+
472+ TEST_F (TensorPtrTest, MakeViewFromScalarAliasAnd1D) {
473+ float scalar_value = 7 .f ;
474+ auto tensor = make_tensor_ptr ({}, &scalar_value);
475+ auto alias = make_tensor_ptr (tensor);
476+ EXPECT_EQ (alias->dim (), 0 );
477+ EXPECT_EQ (alias->numel (), 1 );
478+ auto reshaped = make_tensor_ptr (tensor, {1 });
479+ EXPECT_EQ (reshaped->dim (), 1 );
480+ EXPECT_EQ (reshaped->size (0 ), 1 );
481+ EXPECT_EQ (reshaped->strides ()[0 ], 1 );
482+ ET_EXPECT_DEATH ({ auto unused = make_tensor_ptr (tensor, {}, {0 }, {}); }, " " );
483+ ET_EXPECT_DEATH ({ auto unused = make_tensor_ptr (tensor, {}, {}, {1 }); }, " " );
484+ }
485+
486+ TEST_F (TensorPtrTest, MakeViewExplicitDimOrderAndStridesShapeChange) {
487+ float data[6 ] = {0 };
488+ auto tensor = make_tensor_ptr ({2 , 3 }, data);
489+ auto view = make_tensor_ptr (tensor, {3 , 2 }, {1 , 0 }, {1 , 3 });
490+ EXPECT_EQ (view->dim (), 2 );
491+ EXPECT_EQ (view->size (0 ), 3 );
492+ EXPECT_EQ (view->size (1 ), 2 );
493+ EXPECT_EQ (view->strides ()[0 ], 1 );
494+ EXPECT_EQ (view->strides ()[1 ], 3 );
495+ }
496+
497+ TEST_F (TensorPtrTest, TensorUint8dataInt16Type) {
498+ std::vector<int16_t > int16_values = {-1 , 2 , -3 , 4 };
499+ auto byte_pointer = reinterpret_cast <const uint8_t *>(int16_values.data ());
500+ std::vector<uint8_t > byte_data (
501+ byte_pointer, byte_pointer + int16_values.size () * sizeof (int16_t ));
502+ auto tensor = make_tensor_ptr (
503+ {4 }, std::move (byte_data), executorch::aten::ScalarType::Short);
504+ EXPECT_EQ (tensor->dim (), 1 );
505+ EXPECT_EQ (tensor->size (0 ), 4 );
506+ auto int16_data = tensor->const_data_ptr <int16_t >();
507+ EXPECT_EQ (int16_data[0 ], -1 );
508+ EXPECT_EQ (int16_data[1 ], 2 );
509+ EXPECT_EQ (int16_data[2 ], -3 );
510+ EXPECT_EQ (int16_data[3 ], 4 );
511+ }
512+
513+ TEST_F (TensorPtrTest, MakeView3DDimOrderOnly) {
514+ float data[24 ] = {0 };
515+ auto tensor = make_tensor_ptr ({2 , 3 , 4 }, data);
516+ auto view = make_tensor_ptr (tensor, {}, {2 , 0 , 1 }, {});
517+ EXPECT_EQ (view->dim (), 3 );
518+ EXPECT_EQ (view->size (0 ), 2 );
519+ EXPECT_EQ (view->size (1 ), 3 );
520+ EXPECT_EQ (view->size (2 ), 4 );
521+ EXPECT_EQ (view->strides ()[0 ], 3 );
522+ EXPECT_EQ (view->strides ()[1 ], 1 );
523+ EXPECT_EQ (view->strides ()[2 ], 6 );
524+ }
525+
526+ #ifndef USE_ATEN_LIB
527+ TEST_F (TensorPtrTest, MakeViewDynamismPropagationResizeAlias) {
528+ float data[12 ] = {0 };
529+ auto tensor = make_tensor_ptr (
530+ {3 , 4 },
531+ data,
532+ {},
533+ {},
534+ executorch::aten::ScalarType::Float,
535+ executorch::aten::TensorShapeDynamism::DYNAMIC_UNBOUND);
536+ auto alias = make_tensor_ptr (tensor);
537+ EXPECT_EQ (resize_tensor_ptr (alias, {2 , 6 }), Error::Ok);
538+ EXPECT_EQ (alias->size (0 ), 2 );
539+ EXPECT_EQ (alias->size (1 ), 6 );
540+ EXPECT_EQ (tensor->size (0 ), 3 );
541+ EXPECT_EQ (tensor->size (1 ), 4 );
542+ }
543+
544+ TEST_F (TensorPtrTest, MakeViewSameRankShapeChangeCopiesDimOrder) {
545+ float data[24 ] = {0 };
546+ auto tensor = make_tensor_ptr ({2 , 3 , 4 }, data, {2 , 0 , 1 }, {3 , 1 , 6 });
547+ auto view = make_tensor_ptr (tensor, {4 , 2 , 3 });
548+ EXPECT_EQ (view->dim (), 3 );
549+ EXPECT_EQ (view->size (0 ), 4 );
550+ EXPECT_EQ (view->size (1 ), 2 );
551+ EXPECT_EQ (view->size (2 ), 3 );
552+ EXPECT_EQ (view->strides ()[0 ], 2 );
553+ EXPECT_EQ (view->strides ()[1 ], 1 );
554+ EXPECT_EQ (view->strides ()[2 ], 8 );
555+ }
556+ #endif
557+
360558TEST_F (TensorPtrTest, CloneTensorPtrFromExistingTensorInt32) {
361559 std::vector<int32_t > data = {1 , 2 , 3 , 4 };
362560 auto tensor = make_tensor_ptr ({2 , 2 }, std::move (data));
@@ -803,7 +1001,7 @@ TEST_F(TensorPtrTest, TensorDeducedScalarType) {
8031001 EXPECT_EQ (tensor->const_data_ptr <double >()[3 ], 4.0 );
8041002}
8051003
806- TEST_F (TensorPtrTest, TensorUint8BufferWithFloatScalarType ) {
1004+ TEST_F (TensorPtrTest, TensorUint8dataWithFloatScalarType ) {
8071005 std::vector<uint8_t > data (
8081006 4 * executorch::aten::elementSize (executorch::aten::ScalarType::Float));
8091007
@@ -827,14 +1025,14 @@ TEST_F(TensorPtrTest, TensorUint8BufferWithFloatScalarType) {
8271025 EXPECT_EQ (tensor->const_data_ptr <float >()[3 ], 4 .0f );
8281026}
8291027
830- TEST_F (TensorPtrTest, TensorUint8BufferTooSmallExpectDeath ) {
1028+ TEST_F (TensorPtrTest, TensorUint8dataTooSmallExpectDeath ) {
8311029 std::vector<uint8_t > data (
8321030 2 * executorch::aten::elementSize (executorch::aten::ScalarType::Float));
8331031 ET_EXPECT_DEATH (
8341032 { auto tensor = make_tensor_ptr ({2 , 2 }, std::move (data)); }, " " );
8351033}
8361034
837- TEST_F (TensorPtrTest, TensorUint8BufferTooLargeExpectDeath ) {
1035+ TEST_F (TensorPtrTest, TensorUint8dataTooLargeExpectDeath ) {
8381036 std::vector<uint8_t > data (
8391037 5 * executorch::aten::elementSize (executorch::aten::ScalarType::Float));
8401038 ET_EXPECT_DEATH ({ auto _ = make_tensor_ptr ({2 , 2 }, std::move (data)); }, " " );
0 commit comments