// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #include #include "ck/utility/array.hpp" using namespace ck; // Test basic Array construction and properties TEST(Array, BasicConstruction) { using Arr = Array; EXPECT_EQ(Arr::Size(), 5); } TEST(Array, InitListConstruction) { using Arr = Array; Arr value{1, 2, 3, 4, 5}; EXPECT_EQ(value[0], 1); EXPECT_EQ(value[4], 5); } // Test At() method TEST(Array, AtMethod) { Array arr{10, 20, 30}; EXPECT_EQ(arr.At(0), 10); EXPECT_EQ(arr.At(1), 20); EXPECT_EQ(arr.At(2), 30); // Test non-const At() for modification arr.At(1) = 25; EXPECT_EQ(arr.At(1), 25); } // Test const At() method TEST(Array, ConstAtMethod) { const Array arr{10, 20, 30}; EXPECT_EQ(arr.At(0), 10); EXPECT_EQ(arr.At(1), 20); EXPECT_EQ(arr.At(2), 30); } // Test operator[] TEST(Array, OperatorBracket) { const Array arr{5, 10, 15, 20}; EXPECT_EQ(arr[0], 5); EXPECT_EQ(arr[1], 10); EXPECT_EQ(arr[2], 15); EXPECT_EQ(arr[3], 20); } // Test operator() TEST(Array, OperatorParenthesis) { Array arr{1, 2, 3}; EXPECT_EQ(arr(0), 1); EXPECT_EQ(arr(1), 2); EXPECT_EQ(arr(2), 3); // Test modification through operator() arr(1) = 99; EXPECT_EQ(arr(1), 99); } // Test operator= assignment TEST(Array, Assignment) { Array arr1{1, 2, 3}; Array arr2{0, 0, 0}; arr2 = arr1; EXPECT_EQ(arr2[0], 1); EXPECT_EQ(arr2[1], 2); EXPECT_EQ(arr2[2], 3); } // Test iterators TEST(Array, Iterators) { Array arr{1, 2, 3, 4, 5}; // Test begin() and end() int sum = 0; for(auto it = arr.begin(); it != arr.end(); ++it) { sum += *it; } EXPECT_EQ(sum, 15); // Test range-based for loop sum = 0; for(auto val : arr) { sum += val; } EXPECT_EQ(sum, 15); } // Test const iterators TEST(Array, ConstIterators) { const Array arr{10, 20, 30, 40}; int sum = 0; for(auto it = arr.begin(); it != arr.end(); ++it) { sum += *it; } EXPECT_EQ(sum, 100); // Test const range-based for loop sum = 0; for(auto val : arr) { sum += val; } EXPECT_EQ(sum, 100); } // Test make_array() helper function TEST(Array, MakeArray) { auto arr = make_array(1, 2, 3, 4, 5); EXPECT_EQ(arr.Size(), 5); EXPECT_EQ(arr[0], 1); EXPECT_EQ(arr[1], 2); EXPECT_EQ(arr[2], 3); EXPECT_EQ(arr[3], 4); EXPECT_EQ(arr[4], 5); } // Test make_array() with different types TEST(Array, MakeArrayFloats) { auto arr = make_array(1.5f, 2.5f, 3.5f); EXPECT_EQ(arr.Size(), 3); EXPECT_FLOAT_EQ(arr[0], 1.5f); EXPECT_FLOAT_EQ(arr[1], 2.5f); EXPECT_FLOAT_EQ(arr[2], 3.5f); } // Test empty Array TEST(Array, EmptyArray) { using EmptyArr = Array; EXPECT_EQ(EmptyArr::Size(), 0); // Test make_array() for empty array auto empty = make_array(); EXPECT_EQ(empty.Size(), 0); } // Test Array with different data types TEST(Array, DifferentTypes) { Array float_arr{1.1f, 2.2f, 3.3f}; EXPECT_FLOAT_EQ(float_arr[0], 1.1f); EXPECT_FLOAT_EQ(float_arr[1], 2.2f); EXPECT_FLOAT_EQ(float_arr[2], 3.3f); Array double_arr{1.23, 4.56}; EXPECT_DOUBLE_EQ(double_arr[0], 1.23); EXPECT_DOUBLE_EQ(double_arr[1], 4.56); } // Test Array modification through iterators TEST(Array, ModifyThroughIterators) { Array arr{1, 2, 3}; for(auto it = arr.begin(); it != arr.end(); ++it) { *it *= 2; } EXPECT_EQ(arr[0], 2); EXPECT_EQ(arr[1], 4); EXPECT_EQ(arr[2], 6); } // Test single element Array TEST(Array, SingleElement) { Array arr{42}; EXPECT_EQ(arr.Size(), 1); EXPECT_EQ(arr[0], 42); auto single = make_array(100); EXPECT_EQ(single.Size(), 1); EXPECT_EQ(single[0], 100); }