Serenity Operating System
at master 120 lines 3.4 kB view raw
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}