xref: /aosp_15_r20/external/pytorch/c10/test/util/ssize_test.cpp (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1 #include <c10/util/ssize.h>
2 
3 #include <gmock/gmock.h>
4 #include <gtest/gtest.h>
5 
6 #include <cstdint>
7 #include <limits>
8 
9 namespace c10 {
10 namespace {
11 
12 template <typename size_type_>
13 class Container {
14  public:
15   using size_type = size_type_;
16 
Container(size_type size)17   constexpr explicit Container(size_type size) : size_(size) {}
18 
size() const19   constexpr auto size() const noexcept -> size_type {
20     return size_;
21   }
22 
23  private:
24   size_type size_;
25 };
26 
TEST(ssizeTest,size_t)27 TEST(ssizeTest, size_t) {
28   ASSERT_THAT(ssize(Container(std::size_t{3})), testing::Eq(std::ptrdiff_t{3}));
29 }
30 
TEST(ssizeTest,size_t_overflow)31 TEST(ssizeTest, size_t_overflow) {
32 #if defined(NDEBUG)
33   GTEST_SKIP() << "Only valid if assert is enabled." << std::endl;
34 #endif
35 
36   constexpr auto ptrdiff_t_max =
37       std::size_t{std::numeric_limits<std::ptrdiff_t>::max()};
38   static_assert(ptrdiff_t_max < std::numeric_limits<std::size_t>::max());
39   EXPECT_THROW(ssize(Container(ptrdiff_t_max + 1)), c10::Error);
40 }
41 
TEST(ssizeTest,small_container_promotes_to_ptrdiff_t)42 TEST(ssizeTest, small_container_promotes_to_ptrdiff_t) {
43   auto signed_size = ssize(Container(std::uint16_t{3}));
44   static_assert(std::is_same_v<decltype(signed_size), std::ptrdiff_t>);
45   ASSERT_THAT(signed_size, testing::Eq(3));
46 }
47 
TEST(ssizeTest,promotes_to_64_bit_on_32_bit_platform)48 TEST(ssizeTest, promotes_to_64_bit_on_32_bit_platform) {
49   if (sizeof(std::intptr_t) != 4) {
50     GTEST_SKIP() << "Only valid in 64-bits." << std::endl;
51   }
52 
53   auto signed_size = ssize(Container(std::uint64_t{3}));
54   static_assert(std::is_same_v<decltype(signed_size), std::int64_t>);
55   ASSERT_THAT(signed_size, testing::Eq(3));
56 }
57 
58 } // namespace
59 } // namespace c10
60