180814287SRaphael Isemann //===-- ConstStringTest.cpp -----------------------------------------------===//
23b7e1981SPavel Labath //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63b7e1981SPavel Labath //
73b7e1981SPavel Labath //===----------------------------------------------------------------------===//
83b7e1981SPavel Labath 
93b7e1981SPavel Labath #include "lldb/Utility/ConstString.h"
103b7e1981SPavel Labath #include "llvm/Support/FormatVariadic.h"
11*bc9b6b33SJonas Devlieghere #include "llvm/Support/YAMLParser.h"
123b7e1981SPavel Labath #include "gtest/gtest.h"
133b7e1981SPavel Labath 
143b7e1981SPavel Labath using namespace lldb_private;
153b7e1981SPavel Labath 
TEST(ConstStringTest,format_provider)163b7e1981SPavel Labath TEST(ConstStringTest, format_provider) {
173b7e1981SPavel Labath   EXPECT_EQ("foo", llvm::formatv("{0}", ConstString("foo")).str());
183b7e1981SPavel Labath }
1919a357adSPavel Labath 
TEST(ConstStringTest,MangledCounterpart)2019a357adSPavel Labath TEST(ConstStringTest, MangledCounterpart) {
212397a2b6SStefan Granitz   ConstString uvw("uvw");
2219a357adSPavel Labath   ConstString counterpart;
232397a2b6SStefan Granitz   EXPECT_FALSE(uvw.GetMangledCounterpart(counterpart));
2419a357adSPavel Labath   EXPECT_EQ("", counterpart.GetStringRef());
2519a357adSPavel Labath 
262397a2b6SStefan Granitz   ConstString xyz;
272397a2b6SStefan Granitz   xyz.SetStringWithMangledCounterpart("xyz", uvw);
282397a2b6SStefan Granitz   EXPECT_EQ("xyz", xyz.GetStringRef());
2919a357adSPavel Labath 
302397a2b6SStefan Granitz   EXPECT_TRUE(xyz.GetMangledCounterpart(counterpart));
312397a2b6SStefan Granitz   EXPECT_EQ("uvw", counterpart.GetStringRef());
3219a357adSPavel Labath 
332397a2b6SStefan Granitz   EXPECT_TRUE(uvw.GetMangledCounterpart(counterpart));
342397a2b6SStefan Granitz   EXPECT_EQ("xyz", counterpart.GetStringRef());
352397a2b6SStefan Granitz }
362397a2b6SStefan Granitz 
TEST(ConstStringTest,UpdateMangledCounterpart)372397a2b6SStefan Granitz TEST(ConstStringTest, UpdateMangledCounterpart) {
382397a2b6SStefan Granitz   { // Add counterpart
392397a2b6SStefan Granitz     ConstString some1;
402397a2b6SStefan Granitz     some1.SetStringWithMangledCounterpart("some", ConstString(""));
412397a2b6SStefan Granitz   }
422397a2b6SStefan Granitz   { // Overwrite empty string
432397a2b6SStefan Granitz     ConstString some2;
442397a2b6SStefan Granitz     some2.SetStringWithMangledCounterpart("some", ConstString("one"));
452397a2b6SStefan Granitz   }
462397a2b6SStefan Granitz   { // Overwrite with identical value
472397a2b6SStefan Granitz     ConstString some2;
482397a2b6SStefan Granitz     some2.SetStringWithMangledCounterpart("some", ConstString("one"));
492397a2b6SStefan Granitz   }
502397a2b6SStefan Granitz   { // Check counterpart is set
512397a2b6SStefan Granitz     ConstString counterpart;
522397a2b6SStefan Granitz     EXPECT_TRUE(ConstString("some").GetMangledCounterpart(counterpart));
532397a2b6SStefan Granitz     EXPECT_EQ("one", counterpart.GetStringRef());
542397a2b6SStefan Granitz   }
5519a357adSPavel Labath }
564af5a83aSStefan Granitz 
TEST(ConstStringTest,FromMidOfBufferStringRef)574c01eccbSStefan Granitz TEST(ConstStringTest, FromMidOfBufferStringRef) {
584c01eccbSStefan Granitz   // StringRef's into bigger buffer: no null termination
592397a2b6SStefan Granitz   const char *buffer = "abcdefghi";
604c01eccbSStefan Granitz   llvm::StringRef foo_ref(buffer, 3);
614c01eccbSStefan Granitz   llvm::StringRef bar_ref(buffer + 3, 3);
624c01eccbSStefan Granitz 
634c01eccbSStefan Granitz   ConstString foo(foo_ref);
644c01eccbSStefan Granitz 
654c01eccbSStefan Granitz   ConstString bar;
664c01eccbSStefan Granitz   bar.SetStringWithMangledCounterpart(bar_ref, foo);
672397a2b6SStefan Granitz   EXPECT_EQ("def", bar.GetStringRef());
684c01eccbSStefan Granitz 
694c01eccbSStefan Granitz   ConstString counterpart;
704c01eccbSStefan Granitz   EXPECT_TRUE(bar.GetMangledCounterpart(counterpart));
712397a2b6SStefan Granitz   EXPECT_EQ("abc", counterpart.GetStringRef());
724c01eccbSStefan Granitz 
734c01eccbSStefan Granitz   EXPECT_TRUE(foo.GetMangledCounterpart(counterpart));
742397a2b6SStefan Granitz   EXPECT_EQ("def", counterpart.GetStringRef());
754c01eccbSStefan Granitz }
764c01eccbSStefan Granitz 
TEST(ConstStringTest,NullAndEmptyStates)774af5a83aSStefan Granitz TEST(ConstStringTest, NullAndEmptyStates) {
784af5a83aSStefan Granitz   ConstString foo("foo");
794af5a83aSStefan Granitz   EXPECT_FALSE(!foo);
804af5a83aSStefan Granitz   EXPECT_FALSE(foo.IsEmpty());
814af5a83aSStefan Granitz   EXPECT_FALSE(foo.IsNull());
824af5a83aSStefan Granitz 
834af5a83aSStefan Granitz   ConstString empty("");
844af5a83aSStefan Granitz   EXPECT_TRUE(!empty);
854af5a83aSStefan Granitz   EXPECT_TRUE(empty.IsEmpty());
864af5a83aSStefan Granitz   EXPECT_FALSE(empty.IsNull());
874af5a83aSStefan Granitz 
884af5a83aSStefan Granitz   ConstString null;
894af5a83aSStefan Granitz   EXPECT_TRUE(!null);
904af5a83aSStefan Granitz   EXPECT_TRUE(null.IsEmpty());
914af5a83aSStefan Granitz   EXPECT_TRUE(null.IsNull());
924af5a83aSStefan Granitz }
9305cfdb0eSRaphael Isemann 
TEST(ConstStringTest,CompareConstString)9405cfdb0eSRaphael Isemann TEST(ConstStringTest, CompareConstString) {
9505cfdb0eSRaphael Isemann   ConstString foo("foo");
9605cfdb0eSRaphael Isemann   ConstString foo2("foo");
9705cfdb0eSRaphael Isemann   ConstString bar("bar");
9805cfdb0eSRaphael Isemann 
9905cfdb0eSRaphael Isemann   EXPECT_TRUE(foo == foo2);
10005cfdb0eSRaphael Isemann   EXPECT_TRUE(foo2 == foo);
10105cfdb0eSRaphael Isemann   EXPECT_TRUE(foo == ConstString("foo"));
10205cfdb0eSRaphael Isemann 
10305cfdb0eSRaphael Isemann   EXPECT_FALSE(foo == bar);
10405cfdb0eSRaphael Isemann   EXPECT_FALSE(foo2 == bar);
10505cfdb0eSRaphael Isemann   EXPECT_FALSE(foo == ConstString("bar"));
10605cfdb0eSRaphael Isemann   EXPECT_FALSE(foo == ConstString("different"));
10705cfdb0eSRaphael Isemann   EXPECT_FALSE(foo == ConstString(""));
10805cfdb0eSRaphael Isemann   EXPECT_FALSE(foo == ConstString());
10905cfdb0eSRaphael Isemann 
11005cfdb0eSRaphael Isemann   ConstString empty("");
11105cfdb0eSRaphael Isemann   EXPECT_FALSE(empty == ConstString("bar"));
11205cfdb0eSRaphael Isemann   EXPECT_FALSE(empty == ConstString());
11305cfdb0eSRaphael Isemann   EXPECT_TRUE(empty == ConstString(""));
11405cfdb0eSRaphael Isemann 
11505cfdb0eSRaphael Isemann   ConstString null;
11605cfdb0eSRaphael Isemann   EXPECT_FALSE(null == ConstString("bar"));
11705cfdb0eSRaphael Isemann   EXPECT_TRUE(null == ConstString());
11805cfdb0eSRaphael Isemann   EXPECT_FALSE(null == ConstString(""));
11905cfdb0eSRaphael Isemann }
12005cfdb0eSRaphael Isemann 
TEST(ConstStringTest,CompareStringRef)12105cfdb0eSRaphael Isemann TEST(ConstStringTest, CompareStringRef) {
12205cfdb0eSRaphael Isemann   ConstString foo("foo");
12305cfdb0eSRaphael Isemann 
12405cfdb0eSRaphael Isemann   EXPECT_TRUE(foo == "foo");
12505cfdb0eSRaphael Isemann   EXPECT_TRUE(foo != "");
12605cfdb0eSRaphael Isemann   EXPECT_FALSE(foo == static_cast<const char *>(nullptr));
12705cfdb0eSRaphael Isemann   EXPECT_TRUE(foo != "bar");
12805cfdb0eSRaphael Isemann 
12905cfdb0eSRaphael Isemann   ConstString empty("");
13005cfdb0eSRaphael Isemann   EXPECT_FALSE(empty == "foo");
13105cfdb0eSRaphael Isemann   EXPECT_FALSE(empty != "");
13205cfdb0eSRaphael Isemann   EXPECT_FALSE(empty == static_cast<const char *>(nullptr));
13305cfdb0eSRaphael Isemann   EXPECT_TRUE(empty != "bar");
13405cfdb0eSRaphael Isemann 
13505cfdb0eSRaphael Isemann   ConstString null;
13605cfdb0eSRaphael Isemann   EXPECT_FALSE(null == "foo");
13705cfdb0eSRaphael Isemann   EXPECT_TRUE(null != "");
13805cfdb0eSRaphael Isemann   EXPECT_TRUE(null == static_cast<const char *>(nullptr));
13905cfdb0eSRaphael Isemann   EXPECT_TRUE(null != "bar");
14005cfdb0eSRaphael Isemann }
141*bc9b6b33SJonas Devlieghere 
TEST(ConstStringTest,YAML)142*bc9b6b33SJonas Devlieghere TEST(ConstStringTest, YAML) {
143*bc9b6b33SJonas Devlieghere   std::string buffer;
144*bc9b6b33SJonas Devlieghere   llvm::raw_string_ostream os(buffer);
145*bc9b6b33SJonas Devlieghere 
146*bc9b6b33SJonas Devlieghere   // Serialize.
147*bc9b6b33SJonas Devlieghere   std::vector<ConstString> strings = {ConstString("foo"), ConstString("bar"),
148*bc9b6b33SJonas Devlieghere                                       ConstString("")};
149*bc9b6b33SJonas Devlieghere   llvm::yaml::Output yout(os);
150*bc9b6b33SJonas Devlieghere   yout << strings;
151*bc9b6b33SJonas Devlieghere   os.flush();
152*bc9b6b33SJonas Devlieghere 
153*bc9b6b33SJonas Devlieghere   // Deserialize.
154*bc9b6b33SJonas Devlieghere   std::vector<ConstString> deserialized;
155*bc9b6b33SJonas Devlieghere   llvm::yaml::Input yin(buffer);
156*bc9b6b33SJonas Devlieghere   yin >> deserialized;
157*bc9b6b33SJonas Devlieghere 
158*bc9b6b33SJonas Devlieghere   EXPECT_EQ(strings, deserialized);
159*bc9b6b33SJonas Devlieghere }
160