summaryrefslogtreecommitdiff
path: root/compiler/loco/src/IR/Nodes.test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/loco/src/IR/Nodes.test.cpp')
-rw-r--r--compiler/loco/src/IR/Nodes.test.cpp588
1 files changed, 588 insertions, 0 deletions
diff --git a/compiler/loco/src/IR/Nodes.test.cpp b/compiler/loco/src/IR/Nodes.test.cpp
new file mode 100644
index 000000000..cd51f46c0
--- /dev/null
+++ b/compiler/loco/src/IR/Nodes.test.cpp
@@ -0,0 +1,588 @@
+/*
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "loco/IR/Nodes.h"
+#include "loco/IR/CanonicalDialect.h"
+
+#include <gtest/gtest.h>
+
+TEST(PushTest, constructor)
+{
+ loco::Push push_node;
+
+ ASSERT_EQ(push_node.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(push_node.opcode(), loco::CanonicalOpcode::Push);
+
+ ASSERT_FALSE(push_node.indexed());
+}
+
+TEST(PushTest, shape)
+{
+ const std::vector<uint32_t> dims{1, 8, 16, 3};
+
+ loco::Pull push_node;
+
+ push_node.shape({dims[0], dims[1], dims[2], dims[3]});
+
+ ASSERT_EQ(push_node.rank(), dims.size());
+ ASSERT_EQ(push_node.dim(0), dims[0]);
+ ASSERT_EQ(push_node.dim(1), dims[1]);
+ ASSERT_EQ(push_node.dim(2), dims[2]);
+ ASSERT_EQ(push_node.dim(3), dims[3]);
+}
+
+TEST(PullTest, constructor)
+{
+ loco::Pull pull_node;
+
+ ASSERT_EQ(pull_node.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(pull_node.opcode(), loco::CanonicalOpcode::Pull);
+
+ ASSERT_FALSE(pull_node.indexed());
+
+ ASSERT_EQ(pull_node.dtype(), loco::DataType::Unknown);
+ ASSERT_EQ(pull_node.rank(), 0);
+}
+
+TEST(PullTest, shape)
+{
+ const std::vector<uint32_t> dims{1, 8, 16, 3};
+
+ loco::Pull pull_node;
+
+ pull_node.shape({dims[0], dims[1], dims[2], dims[3]});
+
+ ASSERT_EQ(pull_node.rank(), dims.size());
+ ASSERT_EQ(pull_node.dim(0), dims[0]);
+ ASSERT_EQ(pull_node.dim(1), dims[1]);
+ ASSERT_EQ(pull_node.dim(2), dims[2]);
+ ASSERT_EQ(pull_node.dim(3), dims[3]);
+}
+
+TEST(ForwardTest, constructor)
+{
+ loco::Forward forward_node;
+
+ ASSERT_EQ(forward_node.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(forward_node.opcode(), loco::CanonicalOpcode::Forward);
+
+ ASSERT_EQ(forward_node.input(), nullptr);
+}
+
+TEST(ReLUTest, constructor)
+{
+ loco::ReLU relu_node;
+
+ ASSERT_EQ(relu_node.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(relu_node.opcode(), loco::CanonicalOpcode::ReLU);
+
+ ASSERT_EQ(relu_node.input(), nullptr);
+}
+
+TEST(ReLU6Test, constructor)
+{
+ loco::ReLU6 relu6_node;
+
+ ASSERT_EQ(relu6_node.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(relu6_node.opcode(), loco::CanonicalOpcode::ReLU6);
+
+ ASSERT_EQ(relu6_node.input(), nullptr);
+}
+
+TEST(ConstGenTest, constructor)
+{
+ loco::ConstGen constgen_node;
+
+ ASSERT_EQ(constgen_node.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(constgen_node.opcode(), loco::CanonicalOpcode::ConstGen);
+
+ ASSERT_EQ(constgen_node.dtype(), loco::DataType::Unknown);
+ ASSERT_EQ(constgen_node.rank(), 0);
+
+ constgen_node.dtype(loco::DataType::FLOAT32);
+ ASSERT_EQ(constgen_node.dtype(), loco::DataType::FLOAT32);
+
+ constgen_node.rank(2);
+ ASSERT_EQ(constgen_node.rank(), 2);
+
+ constgen_node.dim(0) = 2;
+ constgen_node.dim(1) = 3;
+
+ ASSERT_TRUE(constgen_node.dim(0).known());
+ ASSERT_TRUE(constgen_node.dim(1).known());
+
+ ASSERT_EQ(constgen_node.dim(0), 2);
+ ASSERT_EQ(constgen_node.dim(1), 3);
+
+ constgen_node.size<loco::DataType::FLOAT32>(6);
+
+ ASSERT_EQ(constgen_node.size<loco::DataType::FLOAT32>(), 6);
+
+ constgen_node.at<loco::DataType::FLOAT32>(0) = 0.0f; // Set 0,0
+ constgen_node.at<loco::DataType::FLOAT32>(1) = 1.0f; // Set 0,1
+ constgen_node.at<loco::DataType::FLOAT32>(2) = 2.0f; // Set 0,2
+ constgen_node.at<loco::DataType::FLOAT32>(3) = 3.0f; // Set 1,0
+ constgen_node.at<loco::DataType::FLOAT32>(4) = 4.0f; // Set 1,1
+ constgen_node.at<loco::DataType::FLOAT32>(5) = 5.0f; // Set 1,2
+
+ ASSERT_EQ(constgen_node.at<loco::DataType::FLOAT32>(0), 0.0f);
+ ASSERT_EQ(constgen_node.at<loco::DataType::FLOAT32>(1), 1.0f);
+ ASSERT_EQ(constgen_node.at<loco::DataType::FLOAT32>(2), 2.0f);
+ ASSERT_EQ(constgen_node.at<loco::DataType::FLOAT32>(3), 3.0f);
+ ASSERT_EQ(constgen_node.at<loco::DataType::FLOAT32>(4), 4.0f);
+ ASSERT_EQ(constgen_node.at<loco::DataType::FLOAT32>(5), 5.0f);
+}
+
+TEST(ConstGenTest, constructor_s32)
+{
+ loco::ConstGen constgen_node;
+
+ ASSERT_EQ(constgen_node.dtype(), loco::DataType::Unknown);
+ ASSERT_EQ(constgen_node.rank(), 0);
+
+ constgen_node.dtype(loco::DataType::S32);
+ ASSERT_EQ(constgen_node.dtype(), loco::DataType::S32);
+
+ constgen_node.rank(2);
+ ASSERT_EQ(constgen_node.rank(), 2);
+
+ constgen_node.dim(0) = 2;
+ constgen_node.dim(1) = 3;
+
+ ASSERT_TRUE(constgen_node.dim(0).known());
+ ASSERT_TRUE(constgen_node.dim(1).known());
+
+ ASSERT_EQ(constgen_node.dim(0), 2);
+ ASSERT_EQ(constgen_node.dim(1), 3);
+
+ constgen_node.size<loco::DataType::S32>(6);
+
+ ASSERT_EQ(constgen_node.size<loco::DataType::S32>(), 6);
+
+ constgen_node.at<loco::DataType::S32>(0) = 0; // Set 0,0
+ constgen_node.at<loco::DataType::S32>(1) = 1; // Set 0,1
+ constgen_node.at<loco::DataType::S32>(2) = 2; // Set 0,2
+ constgen_node.at<loco::DataType::S32>(3) = -3; // Set 1,0
+ constgen_node.at<loco::DataType::S32>(4) = -4; // Set 1,1
+ constgen_node.at<loco::DataType::S32>(5) = -5; // Set 1,2
+
+ ASSERT_EQ(constgen_node.at<loco::DataType::S32>(0), 0);
+ ASSERT_EQ(constgen_node.at<loco::DataType::S32>(1), 1);
+ ASSERT_EQ(constgen_node.at<loco::DataType::S32>(2), 2);
+ ASSERT_EQ(constgen_node.at<loco::DataType::S32>(3), -3);
+ ASSERT_EQ(constgen_node.at<loco::DataType::S32>(4), -4);
+ ASSERT_EQ(constgen_node.at<loco::DataType::S32>(5), -5);
+}
+
+TEST(MaxPool2DTest, constructor)
+{
+ loco::MaxPool2D maxpool_node;
+
+ ASSERT_EQ(maxpool_node.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(maxpool_node.opcode(), loco::CanonicalOpcode::MaxPool2D);
+
+ ASSERT_EQ(maxpool_node.ifm(), nullptr);
+
+ ASSERT_EQ(maxpool_node.pad()->top(), 0);
+ ASSERT_EQ(maxpool_node.pad()->bottom(), 0);
+ ASSERT_EQ(maxpool_node.pad()->left(), 0);
+ ASSERT_EQ(maxpool_node.pad()->right(), 0);
+
+ ASSERT_EQ(maxpool_node.window()->vertical(), 1);
+ ASSERT_EQ(maxpool_node.window()->horizontal(), 1);
+
+ ASSERT_EQ(maxpool_node.stride()->vertical(), 1);
+ ASSERT_EQ(maxpool_node.stride()->horizontal(), 1);
+}
+
+TEST(MaxPool2DTest, pad)
+{
+ const uint32_t t = 1;
+ const uint32_t b = 2;
+ const uint32_t l = 3;
+ const uint32_t r = 4;
+
+ loco::MaxPool2D maxpool_node;
+
+ maxpool_node.pad()->top(t);
+ ASSERT_EQ(maxpool_node.pad()->top(), t);
+
+ maxpool_node.pad()->bottom(b);
+ ASSERT_EQ(maxpool_node.pad()->bottom(), b);
+
+ maxpool_node.pad()->left(l);
+ ASSERT_EQ(maxpool_node.pad()->left(), l);
+
+ maxpool_node.pad()->right(r);
+ ASSERT_EQ(maxpool_node.pad()->right(), r);
+}
+
+TEST(AvgPool2DTest, constructor)
+{
+ loco::AvgPool2D avgpool_node;
+
+ ASSERT_EQ(avgpool_node.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(avgpool_node.opcode(), loco::CanonicalOpcode::AvgPool2D);
+
+ ASSERT_EQ(avgpool_node.ifm(), nullptr);
+
+ ASSERT_EQ(avgpool_node.convention(), loco::AvgPool2D::Convention::Unknown);
+
+ ASSERT_EQ(avgpool_node.pad()->top(), 0);
+ ASSERT_EQ(avgpool_node.pad()->bottom(), 0);
+ ASSERT_EQ(avgpool_node.pad()->left(), 0);
+ ASSERT_EQ(avgpool_node.pad()->right(), 0);
+
+ ASSERT_EQ(avgpool_node.window()->vertical(), 1);
+ ASSERT_EQ(avgpool_node.window()->horizontal(), 1);
+
+ ASSERT_EQ(avgpool_node.stride()->vertical(), 1);
+ ASSERT_EQ(avgpool_node.stride()->horizontal(), 1);
+}
+
+TEST(FeatureEncodeTest, constructor)
+{
+ loco::FeatureEncode feature_encode;
+
+ ASSERT_EQ(feature_encode.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(feature_encode.opcode(), loco::CanonicalOpcode::FeatureEncode);
+
+ ASSERT_EQ(feature_encode.input(), nullptr);
+ ASSERT_EQ(feature_encode.encoder(), nullptr);
+}
+
+TEST(FeatureDecodeTest, constructor)
+{
+ loco::FeatureDecode feature_decode;
+
+ ASSERT_EQ(feature_decode.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(feature_decode.opcode(), loco::CanonicalOpcode::FeatureDecode);
+
+ ASSERT_EQ(feature_decode.input(), nullptr);
+ ASSERT_EQ(feature_decode.decoder(), nullptr);
+}
+
+TEST(Reshape_Fixed_Test, constructor)
+{
+ loco::Reshape<loco::ReshapeType::Fixed> reshape;
+
+ ASSERT_EQ(reshape.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(reshape.opcode(), loco::CanonicalOpcode::FixedReshape);
+
+ ASSERT_EQ(reshape.rank(), 0);
+}
+
+TEST(Reshape_Fixed_Test, shape)
+{
+ loco::Reshape<loco::ReshapeType::Fixed> reshape;
+ reshape.shape({2, 3});
+
+ ASSERT_EQ(reshape.rank(), 2);
+ ASSERT_EQ(reshape.dim(0), 2);
+ ASSERT_EQ(reshape.dim(1), 3);
+}
+
+TEST(FilterEncodeTest, constructor)
+{
+ loco::FilterEncode filter_encode;
+
+ ASSERT_EQ(filter_encode.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(filter_encode.opcode(), loco::CanonicalOpcode::FilterEncode);
+
+ ASSERT_EQ(filter_encode.input(), nullptr);
+ ASSERT_EQ(filter_encode.encoder(), nullptr);
+}
+
+TEST(FilterDecodeTest, constructor)
+{
+ loco::FilterDecode filter_decode;
+
+ ASSERT_EQ(filter_decode.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(filter_decode.opcode(), loco::CanonicalOpcode::FilterDecode);
+
+ ASSERT_EQ(filter_decode.input(), nullptr);
+ ASSERT_EQ(filter_decode.decoder(), nullptr);
+}
+
+TEST(DepthwiseFilterEncodeTest, constructor)
+{
+ loco::DepthwiseFilterEncode dw_filter_encode;
+
+ ASSERT_EQ(dw_filter_encode.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(dw_filter_encode.opcode(), loco::CanonicalOpcode::DepthwiseFilterEncode);
+
+ ASSERT_EQ(dw_filter_encode.input(), nullptr);
+ ASSERT_EQ(dw_filter_encode.encoder(), nullptr);
+}
+
+TEST(DepthwiseFilterDecodeTest, constructor)
+{
+ loco::DepthwiseFilterDecode dw_filter_decode;
+
+ ASSERT_EQ(dw_filter_decode.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(dw_filter_decode.opcode(), loco::CanonicalOpcode::DepthwiseFilterDecode);
+
+ ASSERT_EQ(dw_filter_decode.input(), nullptr);
+ ASSERT_EQ(dw_filter_decode.decoder(), nullptr);
+}
+
+TEST(TensorConcatTest, constructor)
+{
+ loco::TensorConcat tensor_concat;
+
+ ASSERT_EQ(tensor_concat.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(tensor_concat.opcode(), loco::CanonicalOpcode::TensorConcat);
+
+ ASSERT_EQ(tensor_concat.lhs(), nullptr);
+ ASSERT_EQ(tensor_concat.rhs(), nullptr);
+ ASSERT_EQ(tensor_concat.axis(), 0);
+
+ tensor_concat.axis(3);
+ ASSERT_EQ(tensor_concat.axis(), 3);
+}
+
+TEST(Conv2DTest, constructor)
+{
+ loco::Conv2D conv2d;
+
+ ASSERT_EQ(conv2d.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(conv2d.opcode(), loco::CanonicalOpcode::Conv2D);
+
+ ASSERT_EQ(conv2d.ifm(), nullptr);
+ ASSERT_EQ(conv2d.ker(), nullptr);
+
+ ASSERT_NE(conv2d.pad(), nullptr);
+ ASSERT_EQ(conv2d.pad()->top(), 0);
+ ASSERT_EQ(conv2d.pad()->bottom(), 0);
+ ASSERT_EQ(conv2d.pad()->left(), 0);
+ ASSERT_EQ(conv2d.pad()->right(), 0);
+
+ ASSERT_NE(conv2d.stride(), nullptr);
+ ASSERT_EQ(conv2d.stride()->vertical(), 1);
+ ASSERT_EQ(conv2d.stride()->horizontal(), 1);
+}
+
+TEST(DepthwiseConv2DTest, constructor)
+{
+ loco::DepthwiseConv2D dw_conv2d;
+
+ ASSERT_EQ(dw_conv2d.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(dw_conv2d.opcode(), loco::CanonicalOpcode::DepthwiseConv2D);
+
+ ASSERT_EQ(dw_conv2d.ifm(), nullptr);
+ ASSERT_EQ(dw_conv2d.ker(), nullptr);
+
+ ASSERT_NE(dw_conv2d.pad(), nullptr);
+ ASSERT_EQ(dw_conv2d.pad()->top(), 0);
+ ASSERT_EQ(dw_conv2d.pad()->bottom(), 0);
+ ASSERT_EQ(dw_conv2d.pad()->left(), 0);
+ ASSERT_EQ(dw_conv2d.pad()->right(), 0);
+
+ ASSERT_NE(dw_conv2d.stride(), nullptr);
+ ASSERT_EQ(dw_conv2d.stride()->vertical(), 1);
+ ASSERT_EQ(dw_conv2d.stride()->horizontal(), 1);
+}
+
+TEST(TransposedConv2DTest, constructor)
+{
+ loco::TransposedConv2D tr_conv2d;
+
+ ASSERT_EQ(tr_conv2d.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(tr_conv2d.opcode(), loco::CanonicalOpcode::TransposedConv2D);
+
+ ASSERT_EQ(tr_conv2d.ifm(), nullptr);
+ ASSERT_EQ(tr_conv2d.ker(), nullptr);
+
+ ASSERT_NE(tr_conv2d.pad(), nullptr);
+ ASSERT_EQ(tr_conv2d.pad()->top(), 0);
+ ASSERT_EQ(tr_conv2d.pad()->bottom(), 0);
+ ASSERT_EQ(tr_conv2d.pad()->left(), 0);
+ ASSERT_EQ(tr_conv2d.pad()->right(), 0);
+
+ ASSERT_NE(tr_conv2d.stride(), nullptr);
+ ASSERT_EQ(tr_conv2d.stride()->vertical(), 1);
+ ASSERT_EQ(tr_conv2d.stride()->horizontal(), 1);
+}
+
+TEST(BiasEncodeTest, constructor)
+{
+ loco::BiasEncode bias_encode;
+
+ ASSERT_EQ(bias_encode.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(bias_encode.opcode(), loco::CanonicalOpcode::BiasEncode);
+
+ ASSERT_EQ(bias_encode.input(), nullptr);
+}
+
+TEST(TensorBiasAddTest, constructor)
+{
+ loco::BiasAdd<loco::Domain::Tensor> bias_add;
+
+ ASSERT_EQ(bias_add.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(bias_add.opcode(), loco::CanonicalOpcode::TensorBiasAdd);
+
+ ASSERT_EQ(bias_add.value(), nullptr);
+ ASSERT_EQ(bias_add.bias(), nullptr);
+ ASSERT_EQ(bias_add.axis(), 0);
+}
+
+TEST(TensorBiasAddTest, alias)
+{
+ loco::TensorBiasAdd bias_add;
+
+ SUCCEED();
+}
+
+TEST(FeatureBiasAddTest, constructor)
+{
+ loco::BiasAdd<loco::Domain::Feature> bias_add;
+
+ ASSERT_EQ(bias_add.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(bias_add.opcode(), loco::CanonicalOpcode::FeatureBiasAdd);
+
+ ASSERT_EQ(bias_add.value(), nullptr);
+ ASSERT_EQ(bias_add.bias(), nullptr);
+}
+
+TEST(FeatureBiasAddTest, alias)
+{
+ loco::FeatureBiasAdd bias_add;
+
+ SUCCEED();
+}
+
+TEST(EltwiseAddTest, constructor)
+{
+ loco::EltwiseAdd eltwise_add;
+
+ SUCCEED();
+}
+
+TEST(EltwiseMaxTest, constructor)
+{
+ loco::EltwiseMax eltwise_max;
+
+ SUCCEED();
+}
+
+TEST(EltwiseMulTest, constructor)
+{
+ loco::EltwiseMul eltwise_mul;
+
+ SUCCEED();
+}
+
+TEST(EltwiseSubTest, constructor)
+{
+ loco::EltwiseSub eltwise_sub;
+
+ SUCCEED();
+}
+
+TEST(EltwiseDivTest, constructor)
+{
+ loco::EltwiseDiv eltwise_div;
+
+ SUCCEED();
+}
+
+TEST(EltwiseSqrtTest, constructor)
+{
+ loco::EltwiseSqrt sqrt_node;
+
+ ASSERT_EQ(sqrt_node.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(sqrt_node.opcode(), loco::CanonicalOpcode::EltwiseSqrt);
+
+ ASSERT_EQ(sqrt_node.input(), nullptr);
+}
+
+TEST(TensorBroadcastTest, constructor)
+{
+ loco::TensorBroadcast tensor_broadcast_node;
+
+ ASSERT_EQ(tensor_broadcast_node.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(tensor_broadcast_node.opcode(), loco::CanonicalOpcode::TensorBroadcast);
+
+ ASSERT_EQ(tensor_broadcast_node.input(), nullptr);
+}
+
+TEST(TensorBroadcastTest, mapping)
+{
+ loco::TensorBroadcast tensor_broadcast_node;
+
+ ASSERT_EQ(tensor_broadcast_node.mapping()->defined(0), false);
+
+ tensor_broadcast_node.mapping()->dim(0) = 3;
+
+ ASSERT_EQ(tensor_broadcast_node.mapping()->defined(0), true);
+ ASSERT_EQ(tensor_broadcast_node.mapping()->dim(0), 3);
+}
+
+TEST(MatrixEncodeTest, constructor)
+{
+ loco::MatrixEncode matrix_encode;
+
+ ASSERT_EQ(matrix_encode.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(matrix_encode.opcode(), loco::CanonicalOpcode::MatrixEncode);
+
+ ASSERT_EQ(matrix_encode.input(), nullptr);
+}
+
+TEST(MatrixDecodeTest, constructor)
+{
+ loco::MatrixDecode matrix_decode;
+
+ ASSERT_EQ(matrix_decode.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(matrix_decode.opcode(), loco::CanonicalOpcode::MatrixDecode);
+
+ ASSERT_EQ(matrix_decode.input(), nullptr);
+}
+
+TEST(MatMulTest, constructor)
+{
+ loco::MatMul mat_mul;
+
+ ASSERT_EQ(mat_mul.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(mat_mul.opcode(), loco::CanonicalOpcode::MatMul);
+
+ ASSERT_EQ(mat_mul.lhs(), nullptr);
+ ASSERT_EQ(mat_mul.rhs(), nullptr);
+}
+
+TEST(TransposeTest, constructor)
+{
+ loco::TensorTranspose transpose;
+
+ ASSERT_EQ(transpose.dialect(), loco::CanonicalDialect::get());
+ ASSERT_EQ(transpose.opcode(), loco::CanonicalOpcode::TensorTranspose);
+
+ ASSERT_EQ(transpose.input(), nullptr);
+ ASSERT_EQ(transpose.perm()->size(), 0);
+}
+
+TEST(TransposeTest, perm)
+{
+ loco::TensorTranspose transpose;
+
+ transpose.perm()->size(3);
+ transpose.perm()->axis(0) = 1;
+ transpose.perm()->axis(1) = 2;
+ transpose.perm()->axis(2) = 0;
+
+ ASSERT_EQ(transpose.perm()->axis(0), 1);
+ ASSERT_EQ(transpose.perm()->axis(1), 2);
+ ASSERT_EQ(transpose.perm()->axis(2), 0);
+}