2 * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #include "gtest/gtest.h"
19 #include "ndarray/Array.h"
21 using namespace ndarray;
23 TEST(NDArray_tests, basic_data_test)
26 float raw_data[] = {1, 2, 3, 4};
28 Array<float> data22{raw_data, {2, 2}};
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);
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);
47 ContiguousSpan<float> cs = data22.flat();
48 ASSERT_EQ(cs.size(), 4);
49 ASSERT_FLOAT_EQ(cs.at(3), 4);
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);
58 TEST(NDArray_tests, slice_write_test)
60 float raw_data[4] = {0};
62 Array<float> data22{raw_data, {2, 2}};
64 data22.slice(1) = {1, 2};
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);
72 TEST(NDArray_tests, slice_read_test)
74 float raw_data[4] = {1, 2, 3, 4};
76 Array<float> data22{raw_data, {2, 2}};
78 auto slice = data22.slice(1);
80 ASSERT_FLOAT_EQ(slice[0], 3);
81 ASSERT_FLOAT_EQ(slice[1], 4);
84 TEST(NDArray_tests, multidim_test)
86 float raw_data[5] = {0, 1, 2, 3, 4};
88 Array<float> data22{raw_data, {1, 1, 1, 1, 5}};
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);
97 TEST(NDArray_tests, slice_assign_test)
99 std::vector<float> v1{1, 2, 3, 4, 5};
100 std::vector<float> v2(5);
102 ContiguousSpan<float> span1(v1.begin(), v1.end());
103 ContiguousSpan<float> span2(v2.begin(), v2.end());
108 ASSERT_EQ(span1.size(), 5);
109 ASSERT_EQ(span2.size(), 5);
111 ASSERT_EQ(span2.at(2), 3);
112 ASSERT_EQ(span2.at(4), 5);
114 ASSERT_EQ(*(span1.data() + 2), *(span1.data() + 2));
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);