blob: 84b7cb8855190d19e9234e656ba85bd9eac2faae [file] [log] [blame]
William A. Kennington III61a81bc2022-09-19 17:46:49 -07001#include <gtest/gtest.h>
2#include <iostream>
3#include <set>
4#include <stdplus/zstring_view.hpp>
5#include <string>
6#include <unordered_set>
7
8namespace stdplus
9{
10
11using std::literals::string_literals::operator""s;
William A. Kennington IIIa2d2df72022-09-20 18:49:36 -070012using std::literals::string_view_literals::operator""sv;
William A. Kennington III61a81bc2022-09-19 17:46:49 -070013using zstring_view_literals::operator""_zsv;
14
William A. Kennington IIIb6032a12022-09-23 18:27:05 -070015TEST(ZstringView, IsString)
16{
17 EXPECT_TRUE((
18 detail::same_string<std::string, char, std::char_traits<char>>::value));
19 EXPECT_FALSE((detail::same_string<std::string_view, char,
20 std::char_traits<char>>::value));
21}
22
William A. Kennington III61a81bc2022-09-19 17:46:49 -070023TEST(ZstringView, Basic)
24{
25 auto s1 = zstring_view("ac");
26 auto s = "b"s;
27 auto s2 = zstring_view(s);
28 std::string_view sv = s1;
William A. Kennington IIIe6e44e72022-09-22 17:54:07 -070029 char mut[] = "aa";
30 auto s3 = zstring_view(mut);
William A. Kennington III61a81bc2022-09-19 17:46:49 -070031
32 EXPECT_NE(sv, s2);
33 EXPECT_NE(s1, s2);
William A. Kennington IIIe6e44e72022-09-22 17:54:07 -070034 EXPECT_EQ(s3, "aa");
William A. Kennington III61a81bc2022-09-19 17:46:49 -070035
36 EXPECT_EQ("ac"_zsv, s1);
37 EXPECT_EQ("ac", s1);
38 EXPECT_EQ(s1, "ac");
39 EXPECT_EQ(s, s2);
40 EXPECT_EQ(s2, s);
41 EXPECT_EQ(s1, sv);
42 EXPECT_EQ(sv, s1);
43 EXPECT_LT("ab", s1);
44 EXPECT_GT("ad", s1);
45 EXPECT_LE(s1, "ac");
46 EXPECT_LE(s, s2);
47 EXPECT_LE(s2, s);
48 EXPECT_LE(s1, sv);
49 EXPECT_LE(sv, s1);
50
51 std::cerr << s1;
52
53 std::unordered_set<zstring_view> uset{s1, s2};
54 EXPECT_EQ(1, uset.count("ac"));
55 EXPECT_EQ(1, uset.count("b"));
56 std::set<zstring_view> set{s2, s2};
57 EXPECT_EQ(0, set.count("ac"));
58 EXPECT_EQ(1, set.count("b"));
William A. Kennington IIIb6032a12022-09-23 18:27:05 -070059
60 auto from_str = [&](zstring_view cs) { EXPECT_EQ(cs, "ac"); };
61 from_str("ac"s);
William A. Kennington III61a81bc2022-09-19 17:46:49 -070062}
63
64TEST(ZstringView, ConstructError)
65{
66 auto s = "hi\0"s;
William A. Kennington IIIe6e44e72022-09-22 17:54:07 -070067#ifdef NDEBUG
68 EXPECT_EQ("hi", zstring_view(s));
69#else
William A. Kennington III61a81bc2022-09-19 17:46:49 -070070 EXPECT_THROW((zstring_view(s)), std::invalid_argument);
William A. Kennington IIIe6e44e72022-09-22 17:54:07 -070071#endif
72
73 char mut1[] = "aa\0";
74 char mut2[] = {'a', 'a'};
75#ifdef NDEBUG
76 EXPECT_EQ("aa\0", zstring_view(mut1));
77 EXPECT_EQ("a", zstring_view(mut2));
78#else
79 EXPECT_THROW((zstring_view(mut1)), std::invalid_argument);
80 EXPECT_THROW((zstring_view(mut2)), std::invalid_argument);
81#endif
William A. Kennington III61a81bc2022-09-19 17:46:49 -070082}
83
84TEST(ZstringView, Suffix)
85{
86 auto s1 = zstring_view("ac");
87
88 EXPECT_EQ("ac", s1.suffix(0));
89 EXPECT_EQ("c", s1.suffix(1));
90 EXPECT_EQ("", s1.suffix(2));
91 EXPECT_THROW(s1.suffix(3), std::out_of_range);
92}
93
William A. Kennington IIIa2d2df72022-09-20 18:49:36 -070094TEST(ZstringView, NoTypeCoercion)
95{
William A. Kennington IIIe6e44e72022-09-22 17:54:07 -070096 EXPECT_NE(""_zsv, "\0");
97 EXPECT_NE("\0", ""_zsv);
William A. Kennington IIIa2d2df72022-09-20 18:49:36 -070098 EXPECT_NE(""_zsv, "\0"sv);
99 EXPECT_NE("\0"sv, ""_zsv);
100 EXPECT_LT(""_zsv, "\0"sv);
101 EXPECT_GT("\0"sv, ""_zsv);
102 auto str = "\0"s;
103 EXPECT_NE(""_zsv, str);
104 EXPECT_NE(str, ""_zsv);
105 EXPECT_LT(""_zsv, str);
106 EXPECT_GT(str, ""_zsv);
107}
108
William A. Kennington III61a81bc2022-09-19 17:46:49 -0700109} // namespace stdplus