blob: c8daa3cb216fda0c387a63954d5d6a7cc17a894d [file] [log] [blame]
William A. Kennington IIIcb9ddb62022-11-18 19:50:10 -08001#include <gtest/gtest.h>
2#include <memory>
3#include <stdplus/pinned.hpp>
4#include <string>
5
6namespace stdplus
7{
8
9static_assert(noexcept(Pinned<int>(4)));
10static_assert(!noexcept(Pinned<std::string>("4")));
11
12TEST(Pinned, Basic)
13{
14 EXPECT_EQ("hi", Pinned<std::string>("hi"));
15 EXPECT_EQ("hi", Pinned<std::string>(std::string("hi")));
16 auto s = std::string("hi");
17 EXPECT_EQ("hi", Pinned<std::string>(s));
18 EXPECT_EQ("hi", Pinned<std::string>(std::move(s)));
19 Pinned<std::string> ps = "hi";
20 EXPECT_EQ("hi", Pinned<std::string>(ps));
21 // EXPECT_EQ("hi", Pinned<std::string>(std::move(ps)));
22 ps = "hi";
23 EXPECT_EQ("hi", ps);
24 s = std::string("hi");
25 ps = s;
26 EXPECT_EQ("hi", ps);
27 ps = std::move(s);
28 EXPECT_EQ("hi", ps);
29 Pinned<std::string> ps2;
30 ps2 = ps;
31 EXPECT_EQ("hi", ps2);
32 // ps2 = std::move(ps);
33 // std::string s2 = std::move(ps2);
34 EXPECT_EQ("hi", [](std::string& f) { return f; }(ps2));
35 EXPECT_EQ("hi", [](std::string f) { return f; }(ps2));
36}
37
38TEST(Pinned, Fundamental)
39{
40 Pinned<int> pi = 4;
41 EXPECT_EQ(4, [](int& f) { return f; }(pi));
42 EXPECT_EQ(4, [](int f) { return f; }(pi));
43}
44
45struct NoMove1
46{
47 NoMove1() = default;
48 NoMove1(NoMove1&&) = delete;
49 NoMove1& operator=(NoMove1&&) = default;
50};
51
52struct NoMove2
53{
54 NoMove2() = default;
55 NoMove2(NoMove2&&) = default;
56 NoMove2& operator=(NoMove2&&) = delete;
57};
58
59struct NoMove3
60{
61 NoMove3() = default;
62 NoMove3(NoMove3&&) = delete;
63 NoMove3& operator=(NoMove3&&) = delete;
64};
65
66TEST(PinnedRef, Basic)
67{
68 auto uptr = std::make_unique<std::string>("hi");
69 PinnedRef<std::string>(uptr).get()[0] = 'd';
70 EXPECT_EQ("di", *uptr);
71 PinnedRef<const std::string> cref(uptr);
72 // cref.get()[0] = 'e';
73 EXPECT_EQ("di", cref.get());
74
75 auto sptr = std::make_shared<std::string>("hi");
76 EXPECT_EQ("hi", PinnedRef<std::string>(sptr).get());
77
78 Pinned<std::string> pstr("hi");
79 EXPECT_EQ("hi", PinnedRef<std::string>(pstr).get());
80 EXPECT_EQ("hi", PinnedRef<const std::string>(pstr).get());
81 const Pinned<std::string> cpstr("hi");
82 // EXPECT_EQ("hi", PinnedRef<std::string>(cpstr).get());
83 EXPECT_EQ("hi", PinnedRef<const std::string>(cpstr).get());
84}
85
86TEST(PinnedRef, Fundamental)
87{
88 auto uptr = std::make_unique<int>(4);
89 EXPECT_EQ(4, PinnedRef<int>(uptr));
90 Pinned<int> pi = 4;
91 EXPECT_EQ(4, PinnedRef<int>(pi));
92 EXPECT_EQ(4, PinnedRef<const int>(pi));
93}
94
95TEST(PinnedREf, NoMove)
96{
97 // int i;
98 // PinnedRef<int> ri(i);
99 // NoMove1 nm1;
100 // PinnedRef<NoMove1> rnm1(nm1);
101 // NoMove2 nm2;
102 // PinnedRef<NoMove2> rnm2(nm2);
103 NoMove3 nm3;
104 PinnedRef<NoMove3> rnm3(nm3);
105}
106
107} // namespace stdplus