blob: 5e58dc471b2f0a7370110f64cb53605d0f667448 [file] [log] [blame]
William A. Kennington IIIcb9ddb62022-11-18 19:50:10 -08001#include <stdplus/pinned.hpp>
Patrick Williamsd1984dd2023-05-10 16:12:44 -05002
William A. Kennington IIIcb9ddb62022-11-18 19:50:10 -08003#include <string>
4
Patrick Williamsd1984dd2023-05-10 16:12:44 -05005#include <gtest/gtest.h>
6
William A. Kennington IIIcb9ddb62022-11-18 19:50:10 -08007namespace stdplus
8{
9
10static_assert(noexcept(Pinned<int>(4)));
11static_assert(!noexcept(Pinned<std::string>("4")));
12
13TEST(Pinned, Basic)
14{
15 EXPECT_EQ("hi", Pinned<std::string>("hi"));
William A. Kennington IIIc6ca7c22022-12-03 03:50:35 -080016 EXPECT_EQ("hi", Pinned(std::string("hi")));
William A. Kennington IIIcb9ddb62022-11-18 19:50:10 -080017 auto s = std::string("hi");
William A. Kennington IIIc6ca7c22022-12-03 03:50:35 -080018 EXPECT_EQ("hi", Pinned(s));
19 EXPECT_EQ("hi", Pinned(std::move(s)));
William A. Kennington IIIcb9ddb62022-11-18 19:50:10 -080020 Pinned<std::string> ps = "hi";
21 EXPECT_EQ("hi", Pinned<std::string>(ps));
22 // EXPECT_EQ("hi", Pinned<std::string>(std::move(ps)));
23 ps = "hi";
24 EXPECT_EQ("hi", ps);
25 s = std::string("hi");
26 ps = s;
27 EXPECT_EQ("hi", ps);
28 ps = std::move(s);
29 EXPECT_EQ("hi", ps);
30 Pinned<std::string> ps2;
31 ps2 = ps;
32 EXPECT_EQ("hi", ps2);
33 // ps2 = std::move(ps);
34 // std::string s2 = std::move(ps2);
35 EXPECT_EQ("hi", [](std::string& f) { return f; }(ps2));
36 EXPECT_EQ("hi", [](std::string f) { return f; }(ps2));
37}
38
39TEST(Pinned, Fundamental)
40{
William A. Kennington IIIc6ca7c22022-12-03 03:50:35 -080041 Pinned pi = 4;
William A. Kennington IIIcb9ddb62022-11-18 19:50:10 -080042 EXPECT_EQ(4, [](int& f) { return f; }(pi));
43 EXPECT_EQ(4, [](int f) { return f; }(pi));
44}
45
46struct NoMove1
47{
48 NoMove1() = default;
49 NoMove1(NoMove1&&) = delete;
50 NoMove1& operator=(NoMove1&&) = default;
51};
52
53struct NoMove2
54{
55 NoMove2() = default;
56 NoMove2(NoMove2&&) = default;
57 NoMove2& operator=(NoMove2&&) = delete;
58};
59
60struct NoMove3
61{
62 NoMove3() = default;
63 NoMove3(NoMove3&&) = delete;
64 NoMove3& operator=(NoMove3&&) = delete;
65};
66
67TEST(PinnedRef, Basic)
68{
William A. Kennington IIIcb9ddb62022-11-18 19:50:10 -080069 Pinned<std::string> pstr("hi");
70 EXPECT_EQ("hi", PinnedRef<std::string>(pstr).get());
71 EXPECT_EQ("hi", PinnedRef<const std::string>(pstr).get());
William A. Kennington IIIb6be0432022-12-05 18:48:05 -080072 EXPECT_EQ("hi", PinnedRef(pstr).get());
73
William A. Kennington IIIcb9ddb62022-11-18 19:50:10 -080074 const Pinned<std::string> cpstr("hi");
75 // EXPECT_EQ("hi", PinnedRef<std::string>(cpstr).get());
76 EXPECT_EQ("hi", PinnedRef<const std::string>(cpstr).get());
William A. Kennington IIIc6ca7c22022-12-03 03:50:35 -080077 EXPECT_EQ("hi", PinnedRef(cpstr).get());
William A. Kennington IIIcb9ddb62022-11-18 19:50:10 -080078}
79
80TEST(PinnedRef, Fundamental)
81{
William A. Kennington IIIcb9ddb62022-11-18 19:50:10 -080082 Pinned<int> pi = 4;
83 EXPECT_EQ(4, PinnedRef<int>(pi));
84 EXPECT_EQ(4, PinnedRef<const int>(pi));
William A. Kennington IIIb6be0432022-12-05 18:48:05 -080085 EXPECT_EQ(4, PinnedRef(pi));
86
87 const Pinned<int> cpi = 4;
88 // EXPECT_EQ(4, PinnedRef<int>(cpi));
89 EXPECT_EQ(4, PinnedRef<const int>(cpi));
90 EXPECT_EQ(4, PinnedRef(cpi));
William A. Kennington IIIcb9ddb62022-11-18 19:50:10 -080091}
92
William A. Kennington IIIb6be0432022-12-05 18:48:05 -080093TEST(PinnedRef, NoMove)
William A. Kennington IIIcb9ddb62022-11-18 19:50:10 -080094{
95 // int i;
96 // PinnedRef<int> ri(i);
97 // NoMove1 nm1;
98 // PinnedRef<NoMove1> rnm1(nm1);
99 // NoMove2 nm2;
100 // PinnedRef<NoMove2> rnm2(nm2);
William A. Kennington IIIb6be0432022-12-05 18:48:05 -0800101
William A. Kennington IIIcb9ddb62022-11-18 19:50:10 -0800102 NoMove3 nm3;
103 PinnedRef<NoMove3> rnm3(nm3);
William A. Kennington IIIb6be0432022-12-05 18:48:05 -0800104 PinnedRef<const NoMove3> rnm3c(nm3);
105 PinnedRef<const NoMove3> rnm3cr(rnm3);
William A. Kennington IIIc6ca7c22022-12-03 03:50:35 -0800106 PinnedRef rnm3i(nm3);
William A. Kennington IIIb6be0432022-12-05 18:48:05 -0800107 PinnedRef rnm3ir(rnm3);
108 PinnedRef rnm3ic(rnm3c);
109
110 const NoMove3 cnm3;
111 // PinnedRef<NoMove3> crnm3(cnm3);
112 PinnedRef<const NoMove3> crnm3c(cnm3);
113 PinnedRef crnm3i(cnm3);
William A. Kennington IIIcb9ddb62022-11-18 19:50:10 -0800114}
115
116} // namespace stdplus