Imported Upstream version 1.18.0
[platform/core/ml/nnfw.git] / runtime / libs / ndarray / test / ndarray_test.cpp
1 /*
2  * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include "gtest/gtest.h"
18
19 #include "ndarray/Array.h"
20
21 using namespace ndarray;
22
23 TEST(NDArray_tests, basic_data_test)
24 {
25
26   float raw_data[] = {1, 2, 3, 4};
27
28   Array<float> data22{raw_data, {2, 2}};
29
30   ASSERT_FLOAT_EQ(data22.at(0, 0), 1);
31   ASSERT_FLOAT_EQ(data22.at(0, 1), 2);
32   ASSERT_FLOAT_EQ(data22.at(1, 0), 3);
33   ASSERT_FLOAT_EQ(data22.at(1, 1), 4);
34   ASSERT_EQ(data22.shape().rank(), 2);
35   ASSERT_EQ(data22.shape().dim(0), 2);
36   ASSERT_EQ(data22.shape().dim(1), 2);
37
38   Array<float> data14{raw_data, {1, 4}};
39   ASSERT_FLOAT_EQ(data14.at(0, 0), 1);
40   ASSERT_FLOAT_EQ(data14.at(0, 1), 2);
41   ASSERT_FLOAT_EQ(data14.at(0, 2), 3);
42   ASSERT_FLOAT_EQ(data14.at(0, 3), 4);
43   ASSERT_EQ(data14.shape().rank(), 2);
44   ASSERT_EQ(data14.shape().dim(0), 1);
45   ASSERT_EQ(data14.shape().dim(1), 4);
46
47   ContiguousSpan<float> cs = data22.flat();
48   ASSERT_EQ(cs.size(), 4);
49   ASSERT_FLOAT_EQ(cs.at(3), 4);
50
51   Array<float> lv = std::move(data14);
52   ASSERT_FLOAT_EQ(lv.at(0, 0), 1);
53   ASSERT_FLOAT_EQ(lv.at(0, 1), 2);
54   ASSERT_FLOAT_EQ(lv.at(0, 2), 3);
55   ASSERT_FLOAT_EQ(lv.at(0, 3), 4);
56 }
57
58 TEST(NDArray_tests, slice_write_test)
59 {
60   float raw_data[4] = {0};
61
62   Array<float> data22{raw_data, {2, 2}};
63
64   data22.slice(1) = {1, 2};
65
66   ASSERT_FLOAT_EQ(data22.at(0, 0), 0);
67   ASSERT_FLOAT_EQ(data22.at(0, 1), 0);
68   ASSERT_FLOAT_EQ(data22.at(1, 0), 1);
69   ASSERT_FLOAT_EQ(data22.at(1, 1), 2);
70 }
71
72 TEST(NDArray_tests, slice_read_test)
73 {
74   float raw_data[4] = {1, 2, 3, 4};
75
76   Array<float> data22{raw_data, {2, 2}};
77
78   auto slice = data22.slice(1);
79
80   ASSERT_FLOAT_EQ(slice[0], 3);
81   ASSERT_FLOAT_EQ(slice[1], 4);
82 }
83
84 TEST(NDArray_tests, multidim_test)
85 {
86   float raw_data[5] = {0, 1, 2, 3, 4};
87
88   Array<float> data22{raw_data, {1, 1, 1, 1, 5}};
89
90   ASSERT_FLOAT_EQ(data22.at(0, 0, 0, 0, 0), 0);
91   ASSERT_FLOAT_EQ(data22.at(0, 0, 0, 0, 1), 1);
92   ASSERT_FLOAT_EQ(data22.at(0, 0, 0, 0, 2), 2);
93   ASSERT_FLOAT_EQ(data22.at(0, 0, 0, 0, 3), 3);
94   ASSERT_FLOAT_EQ(data22.at(0, 0, 0, 0, 4), 4);
95 }
96
97 TEST(NDArray_tests, slice_assign_test)
98 {
99   std::vector<float> v1{1, 2, 3, 4, 5};
100   std::vector<float> v2(5);
101
102   ContiguousSpan<float> span1(v1.begin(), v1.end());
103   ContiguousSpan<float> span2(v2.begin(), v2.end());
104
105   span2.assign(span1);
106
107   ASSERT_EQ(v1, v2);
108   ASSERT_EQ(span1.size(), 5);
109   ASSERT_EQ(span2.size(), 5);
110
111   ASSERT_EQ(span2.at(2), 3);
112   ASSERT_EQ(span2.at(4), 5);
113
114   ASSERT_EQ(*(span1.data() + 2), *(span1.data() + 2));
115
116   ContiguousSpan<float> span3(span2.offset(1));
117   ASSERT_EQ(span3.size(), 4);
118   ASSERT_EQ(span3.at(0), 2);
119   ASSERT_EQ(span3.at(1), 3);
120   ASSERT_EQ(span3.at(2), 4);
121   ASSERT_EQ(span3.at(3), 5);
122 }