1#include "catch.hpp"
2#include "test_helpers.hpp"
3
4using namespace duckdb;
5using namespace std;
6
7/* Test Case disclaimer
8 *
9 * Assertions built using the Domain Testing technique
10 * at: https://bbst.courses/wp-content/uploads/2018/01/Kaner-Intro-to-Domain-Testing-2018.pdf
11 *
12 */
13TEST_CASE("Suffix test", "[function]") {
14 unique_ptr<QueryResult> result;
15 DuckDB db(nullptr);
16 Connection con(db);
17 con.EnableQueryVerification();
18
19 SECTION("Short string (4bytes)") {
20 result = con.Query("SELECT suffix('abcd', 'd')");
21 REQUIRE(CHECK_COLUMN(result, 0, {true}));
22 result = con.Query("SELECT suffix('abcd', 'cd')");
23 REQUIRE(CHECK_COLUMN(result, 0, {true}));
24 result = con.Query("SELECT suffix('abcd', 'bcd')");
25 REQUIRE(CHECK_COLUMN(result, 0, {true}));
26 result = con.Query("SELECT suffix('abcd', 'abcd')");
27 REQUIRE(CHECK_COLUMN(result, 0, {true}));
28 result = con.Query("SELECT suffix('abcd', 'X')");
29 REQUIRE(CHECK_COLUMN(result, 0, {false}));
30 }
31
32 SECTION("Medium string (8bytes)") {
33 result = con.Query("SELECT suffix('abcdefgh', 'h')");
34 REQUIRE(CHECK_COLUMN(result, 0, {true}));
35 result = con.Query("SELECT suffix('abcdefgh', 'gh')");
36 REQUIRE(CHECK_COLUMN(result, 0, {true}));
37 result = con.Query("SELECT suffix('abcdefgh', 'fgh')");
38 REQUIRE(CHECK_COLUMN(result, 0, {true}));
39 result = con.Query("SELECT suffix('abcdefgh', 'efgh')");
40 REQUIRE(CHECK_COLUMN(result, 0, {true}));
41 result = con.Query("SELECT suffix('abcdefgh', 'defgh')");
42 REQUIRE(CHECK_COLUMN(result, 0, {true}));
43 result = con.Query("SELECT suffix('abcdefgh', 'X')");
44 REQUIRE(CHECK_COLUMN(result, 0, {false}));
45 result = con.Query("SELECT suffix('abcdefgh', 'abcdefgh')");
46 REQUIRE(CHECK_COLUMN(result, 0, {true}));
47 }
48
49 SECTION("Long string (> 15bytes)") {
50 result = con.Query("SELECT suffix('abcdefghijklmnopqrstuvwxyz', 'z')");
51 REQUIRE(CHECK_COLUMN(result, 0, {true}));
52 result = con.Query("SELECT suffix('abcdefghijklmnopqrstuvwxyz', 'yz')");
53 REQUIRE(CHECK_COLUMN(result, 0, {true}));
54 result = con.Query("SELECT suffix('abcdefghijklmnopqrstuvwxyz', 'xyz')");
55 REQUIRE(CHECK_COLUMN(result, 0, {true}));
56 result = con.Query("SELECT suffix('abcdefghijklmnopqrstuvwxyz', 'wxyz')");
57 REQUIRE(CHECK_COLUMN(result, 0, {true}));
58 result = con.Query("SELECT suffix('abcdefghijklmnopqrstuvwxyz', 'vwxyz')");
59 REQUIRE(CHECK_COLUMN(result, 0, {true}));
60 result = con.Query("SELECT suffix('abcdefghijklmnopqrstuvwxyz', 'X')");
61 REQUIRE(CHECK_COLUMN(result, 0, {false}));
62
63 result = con.Query("SELECT suffix('abcdefghijklmnopqrstuvwxyz', 'defghijklmnopqrstuvwxyz')");
64 REQUIRE(CHECK_COLUMN(result, 0, {true}));
65 }
66
67 SECTION("Empty string and suffix") {
68 result = con.Query("SELECT suffix('', 'aaa')");
69 REQUIRE(CHECK_COLUMN(result, 0, {false}));
70
71 result = con.Query("SELECT suffix('aaa', '')");
72 REQUIRE(CHECK_COLUMN(result, 0, {true}));
73 }
74
75 SECTION("NULL string and suffix") {
76 result = con.Query("SELECT suffix(NULL, 'aaa')");
77 REQUIRE(CHECK_COLUMN(result, 0, {Value(nullptr)}));
78
79 result = con.Query("SELECT suffix('aaa', NULL)");
80 REQUIRE(CHECK_COLUMN(result, 0, {Value(nullptr)}));
81
82 result = con.Query("SELECT suffix(NULL, NULL)");
83 REQUIRE(CHECK_COLUMN(result, 0, {Value(nullptr)}));
84 }
85
86 SECTION("Suffix test with UTF8") {
87 // inverse "átomo" (atom)
88 result = con.Query("SELECT suffix('omot\xc3\xa1', '\xc3\xa1')");
89 REQUIRE(CHECK_COLUMN(result, 0, {true}));
90 result = con.Query("SELECT suffix('omot\xc3\xa1', 'á')");
91 REQUIRE(CHECK_COLUMN(result, 0, {true}));
92 result = con.Query("SELECT suffix('omot\xc3\xa1', 'a')");
93 REQUIRE(CHECK_COLUMN(result, 0, {false}));
94
95 // inverse "olá mundo" (hello world)
96 result = con.Query("SELECT suffix('mundo ol\xc3\xa1', 'ol\xc3\xa1')");
97 REQUIRE(CHECK_COLUMN(result, 0, {true}));
98 result = con.Query("SELECT suffix('mundo ol\xc3\xa1', 'olá')");
99 REQUIRE(CHECK_COLUMN(result, 0, {true}));
100 result = con.Query("SELECT suffix('mundo olá', 'mundo olá')");
101 REQUIRE(CHECK_COLUMN(result, 0, {true}));
102 result = con.Query("SELECT suffix('mundo ol\xc3\xa1', 'ola')");
103 REQUIRE(CHECK_COLUMN(result, 0, {false}));
104
105 // eftñ
106 result = con.Query("SELECT suffix('\x65\x66\x74\xc3\xb1', '\xc3\xb1')");
107 REQUIRE(CHECK_COLUMN(result, 0, {true}));
108 //ñeft
109 result = con.Query("SELECT suffix('\xc3\xb1\x65\x66\x74', 'ñeft')");
110 REQUIRE(CHECK_COLUMN(result, 0, {true}));
111 result = con.Query("SELECT suffix('\xc3\xb1\x65\x66\x74', 'neft')");
112 REQUIRE(CHECK_COLUMN(result, 0, {false}));
113
114 // two ñ three ₡ four 🦆 end
115 string str_utf8 = "'two \xc3\xb1 three \xE2\x82\xA1 four \xF0\x9F\xA6\x86 end'";
116
117 result = con.Query("SELECT suffix(" + str_utf8 + ", '\xF0\x9F\xA6\x86 end')");
118 REQUIRE(CHECK_COLUMN(result, 0, {true}));
119 result = con.Query("SELECT suffix(" + str_utf8 + ", '🦆 end')");
120 REQUIRE(CHECK_COLUMN(result, 0, {true}));
121
122 result = con.Query("SELECT suffix(" + str_utf8 + ", 'three \xE2\x82\xA1 four 🦆 end')");
123 REQUIRE(CHECK_COLUMN(result, 0, {true}));
124 result = con.Query("SELECT suffix(" + str_utf8 + ", 'three ₡ four 🦆 end')");
125 REQUIRE(CHECK_COLUMN(result, 0, {true}));
126
127 result = con.Query("SELECT suffix(" + str_utf8 + ", 'two \xc3\xb1 three ₡ four 🦆 end')");
128 REQUIRE(CHECK_COLUMN(result, 0, {true}));
129 result = con.Query("SELECT suffix(" + str_utf8 + ", 'two ñ three ₡ four 🦆 end')");
130 REQUIRE(CHECK_COLUMN(result, 0, {true}));
131 result = con.Query("SELECT suffix(" + str_utf8 + ", 'two ñ three \xE2\x82\xA1 four \xF0\x9F\xA6\x86 end')");
132 REQUIRE(CHECK_COLUMN(result, 0, {true}));
133
134 result = con.Query("SELECT suffix(" + str_utf8 + ", 'two n three ₡ four 🦆 end')");
135 REQUIRE(CHECK_COLUMN(result, 0, {false}));
136 result = con.Query("SELECT suffix(" + str_utf8 + ", 'XXXtwo ñ three ₡ four 🦆 end')");
137 REQUIRE(CHECK_COLUMN(result, 0, {false}));
138 }
139}
140