//===- RepeatedTest.cpp - Repeated unit tests -----------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/ADT/Repeated.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include #include #include using ::testing::Each; using ::testing::ElementsAre; using ::testing::IsEmpty; using ::testing::SizeIs; namespace llvm { namespace { TEST(RepeatedTest, Construction) { { Repeated Rep(5, 42); EXPECT_EQ(Rep.value(), 42); EXPECT_THAT(Rep, SizeIs(5)); EXPECT_EQ(Rep[0], 42); EXPECT_EQ(Rep[4], 42); EXPECT_THAT(Rep, ElementsAre(42, 42, 42, 42, 42)); } { Repeated Rep(3, "hello"); EXPECT_EQ(Rep.value(), "hello"); EXPECT_THAT(Rep, SizeIs(3)); } { // Move-only type. Repeated> Rep(1, std::make_unique(42)); EXPECT_EQ(*Rep.value(), 42); EXPECT_THAT(Rep, SizeIs(1)); } { // Empty Rep. Repeated EmptyRep(0, 42); EXPECT_THAT(EmptyRep, IsEmpty()); } } TEST(RepeatedTest, CTAD) { static_assert(std::is_same_v>); std::string S = "world"; Repeated RepStr(2, S); static_assert(std::is_same_v>); static_assert( std::is_same_v>); SUCCEED(); } TEST(RepeatedTest, IteratorRandomAccess) { Repeated Rep(10, 7); RepeatedIterator It = Rep.begin(); EXPECT_EQ(*It, 7); EXPECT_EQ(*(It + 5), 7); It += 10; EXPECT_EQ(It, Rep.end()); --It; EXPECT_LT(It, Rep.end()); EXPECT_EQ(Rep.end() - Rep.begin(), 10); ++It; EXPECT_EQ(It, Rep.end()); } TEST(RepeatedTest, ReverseIterator) { Repeated Rep(5, 42); std::vector Reversed(Rep.rbegin(), Rep.rend()); EXPECT_THAT(Reversed, SizeIs(5)); EXPECT_THAT(Reversed, Each(42)); } TEST(RepeatedTest, IteratorTraits) { using It = RepeatedIterator; static_assert(std::is_default_constructible_v); static_assert(std::is_same_v::iterator_category, std::random_access_iterator_tag>); static_assert(std::is_same_v::value_type, int>); static_assert( std::is_same_v::difference_type, ptrdiff_t>); SUCCEED(); } } // anonymous namespace } // namespace llvm