Serenity Operating System
1/*
2 * Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <LibTest/TestCase.h>
8
9#include <AK/FlyString.h>
10#include <AK/String.h>
11#include <AK/Try.h>
12
13TEST_CASE(empty_string)
14{
15 FlyString fly {};
16 EXPECT(fly.is_empty());
17 EXPECT_EQ(fly, ""sv);
18
19 // Short strings do not get stored in the fly string table.
20 EXPECT_EQ(FlyString::number_of_fly_strings(), 0u);
21}
22
23TEST_CASE(short_string)
24{
25 FlyString fly1 { MUST("foo"_string) };
26 EXPECT_EQ(fly1, "foo"sv);
27
28 FlyString fly2 { MUST("foo"_string) };
29 EXPECT_EQ(fly2, "foo"sv);
30
31 FlyString fly3 { MUST("bar"_string) };
32 EXPECT_EQ(fly3, "bar"sv);
33
34 EXPECT_EQ(fly1, fly2);
35 EXPECT_NE(fly1, fly3);
36 EXPECT_NE(fly2, fly3);
37
38 EXPECT(fly1.to_string().is_short_string());
39 EXPECT(fly2.to_string().is_short_string());
40 EXPECT(fly3.to_string().is_short_string());
41
42 // Short strings do not get stored in the fly string table.
43 EXPECT_EQ(FlyString::number_of_fly_strings(), 0u);
44}
45
46TEST_CASE(long_string)
47{
48 FlyString fly1 { MUST("thisisdefinitelymorethan7bytes"_string) };
49 EXPECT_EQ(fly1, "thisisdefinitelymorethan7bytes"sv);
50 EXPECT_EQ(FlyString::number_of_fly_strings(), 1u);
51
52 FlyString fly2 { MUST("thisisdefinitelymorethan7bytes"_string) };
53 EXPECT_EQ(fly2, "thisisdefinitelymorethan7bytes"sv);
54 EXPECT_EQ(FlyString::number_of_fly_strings(), 1u);
55
56 FlyString fly3 { MUST("thisisalsoforsuremorethan7bytes"_string) };
57 EXPECT_EQ(fly3, "thisisalsoforsuremorethan7bytes"sv);
58 EXPECT_EQ(FlyString::number_of_fly_strings(), 2u);
59
60 EXPECT_EQ(fly1, fly2);
61 EXPECT_NE(fly1, fly3);
62 EXPECT_NE(fly2, fly3);
63
64 EXPECT(!fly1.to_string().is_short_string());
65 EXPECT(!fly2.to_string().is_short_string());
66 EXPECT(!fly3.to_string().is_short_string());
67}
68
69TEST_CASE(from_string_view)
70{
71 auto fly1 = MUST("thisisdefinitelymorethan7bytes"_fly_string);
72 EXPECT_EQ(fly1, "thisisdefinitelymorethan7bytes"sv);
73 EXPECT_EQ(FlyString::number_of_fly_strings(), 1u);
74
75 auto fly2 = MUST("thisisdefinitelymorethan7bytes"_fly_string);
76 EXPECT_EQ(fly2, "thisisdefinitelymorethan7bytes"sv);
77 EXPECT_EQ(FlyString::number_of_fly_strings(), 1u);
78
79 auto fly3 = MUST("foo"_fly_string);
80 EXPECT_EQ(fly3, "foo"sv);
81 EXPECT_EQ(FlyString::number_of_fly_strings(), 1u);
82
83 EXPECT_EQ(fly1, fly2);
84 EXPECT_NE(fly1, fly3);
85 EXPECT_NE(fly2, fly3);
86}
87
88TEST_CASE(fly_string_keep_string_data_alive)
89{
90 EXPECT_EQ(FlyString::number_of_fly_strings(), 0u);
91 {
92 FlyString fly {};
93 {
94 auto string = MUST("thisisdefinitelymorethan7bytes"_string);
95 fly = FlyString { string };
96 EXPECT_EQ(FlyString::number_of_fly_strings(), 1u);
97 }
98
99 EXPECT_EQ(fly, "thisisdefinitelymorethan7bytes"sv);
100 EXPECT_EQ(FlyString::number_of_fly_strings(), 1u);
101 }
102
103 EXPECT_EQ(FlyString::number_of_fly_strings(), 0u);
104}
105
106TEST_CASE(moved_fly_string_becomes_empty)
107{
108 FlyString fly1 {};
109 EXPECT(fly1.is_empty());
110
111 FlyString fly2 { MUST("thisisdefinitelymorethan7bytes"_string) };
112 EXPECT_EQ(fly2, "thisisdefinitelymorethan7bytes"sv);
113 EXPECT_EQ(FlyString::number_of_fly_strings(), 1u);
114
115 fly1 = move(fly2);
116
117 EXPECT(fly2.is_empty());
118 EXPECT_EQ(fly1, "thisisdefinitelymorethan7bytes"sv);
119 EXPECT_EQ(FlyString::number_of_fly_strings(), 1u);
120}