@@ -357,6 +357,204 @@ TEST_F(TensorPtrTest, MakeTensorPtrFromExistingTensorInt32) {
357
357
EXPECT_EQ (new_tensor->scalar_type (), executorch::aten::ScalarType::Int);
358
358
}
359
359
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
+
360
558
TEST_F (TensorPtrTest, CloneTensorPtrFromExistingTensorInt32) {
361
559
std::vector<int32_t > data = {1 , 2 , 3 , 4 };
362
560
auto tensor = make_tensor_ptr ({2 , 2 }, std::move (data));
@@ -803,7 +1001,7 @@ TEST_F(TensorPtrTest, TensorDeducedScalarType) {
803
1001
EXPECT_EQ (tensor->const_data_ptr <double >()[3 ], 4.0 );
804
1002
}
805
1003
806
- TEST_F (TensorPtrTest, TensorUint8BufferWithFloatScalarType ) {
1004
+ TEST_F (TensorPtrTest, TensorUint8dataWithFloatScalarType ) {
807
1005
std::vector<uint8_t > data (
808
1006
4 * executorch::aten::elementSize (executorch::aten::ScalarType::Float));
809
1007
@@ -827,14 +1025,14 @@ TEST_F(TensorPtrTest, TensorUint8BufferWithFloatScalarType) {
827
1025
EXPECT_EQ (tensor->const_data_ptr <float >()[3 ], 4 .0f );
828
1026
}
829
1027
830
- TEST_F (TensorPtrTest, TensorUint8BufferTooSmallExpectDeath ) {
1028
+ TEST_F (TensorPtrTest, TensorUint8dataTooSmallExpectDeath ) {
831
1029
std::vector<uint8_t > data (
832
1030
2 * executorch::aten::elementSize (executorch::aten::ScalarType::Float));
833
1031
ET_EXPECT_DEATH (
834
1032
{ auto tensor = make_tensor_ptr ({2 , 2 }, std::move (data)); }, " " );
835
1033
}
836
1034
837
- TEST_F (TensorPtrTest, TensorUint8BufferTooLargeExpectDeath ) {
1035
+ TEST_F (TensorPtrTest, TensorUint8dataTooLargeExpectDeath ) {
838
1036
std::vector<uint8_t > data (
839
1037
5 * executorch::aten::elementSize (executorch::aten::ScalarType::Float));
840
1038
ET_EXPECT_DEATH ({ auto _ = make_tensor_ptr ({2 , 2 }, std::move (data)); }, " " );
0 commit comments