115fd4404SLang Hames //===----- SymbolStringPoolTest.cpp - Unit tests for SymbolStringPool -----===//
215fd4404SLang Hames //
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
615fd4404SLang Hames //
715fd4404SLang Hames //===----------------------------------------------------------------------===//
815fd4404SLang Hames 
915fd4404SLang Hames #include "llvm/ExecutionEngine/Orc/SymbolStringPool.h"
10*3fcd3669SLang Hames #include "llvm/ExecutionEngine/Orc/DebugUtils.h"
1115fd4404SLang Hames #include "gtest/gtest.h"
1215fd4404SLang Hames 
1315fd4404SLang Hames using namespace llvm;
1415fd4404SLang Hames using namespace llvm::orc;
1515fd4404SLang Hames 
1615fd4404SLang Hames namespace {
1715fd4404SLang Hames 
TEST(SymbolStringPool,UniquingAndComparisons)182f0c5bbcSLang Hames TEST(SymbolStringPool, UniquingAndComparisons) {
1915fd4404SLang Hames   SymbolStringPool SP;
2015fd4404SLang Hames   auto P1 = SP.intern("hello");
2115fd4404SLang Hames 
2215fd4404SLang Hames   std::string S("hel");
2315fd4404SLang Hames   S += "lo";
2415fd4404SLang Hames   auto P2 = SP.intern(S);
2515fd4404SLang Hames 
2615fd4404SLang Hames   auto P3 = SP.intern("goodbye");
2715fd4404SLang Hames 
2815fd4404SLang Hames   EXPECT_EQ(P1, P2) << "Failed to unique entries";
2915fd4404SLang Hames   EXPECT_NE(P1, P3) << "Inequal pooled symbol strings comparing equal";
302f0c5bbcSLang Hames 
312f0c5bbcSLang Hames   // We want to test that less-than comparison of SymbolStringPtrs compiles,
322f0c5bbcSLang Hames   // however we can't test the actual result as this is a pointer comparison and
332f0c5bbcSLang Hames   // SymbolStringPtr doesn't expose the underlying address of the string.
342f0c5bbcSLang Hames   (void)(P1 < P3);
3515fd4404SLang Hames }
3615fd4404SLang Hames 
TEST(SymbolStringPool,Dereference)37183a059fSLang Hames TEST(SymbolStringPool, Dereference) {
38183a059fSLang Hames   SymbolStringPool SP;
39183a059fSLang Hames   auto Foo = SP.intern("foo");
40183a059fSLang Hames   EXPECT_EQ(*Foo, "foo") << "Equality on dereferenced string failed";
41183a059fSLang Hames }
42183a059fSLang Hames 
TEST(SymbolStringPool,ClearDeadEntries)4315fd4404SLang Hames TEST(SymbolStringPool, ClearDeadEntries) {
4415fd4404SLang Hames   SymbolStringPool SP;
4515fd4404SLang Hames   {
4615fd4404SLang Hames     auto P1 = SP.intern("s1");
4715fd4404SLang Hames     SP.clearDeadEntries();
4815fd4404SLang Hames     EXPECT_FALSE(SP.empty()) << "\"s1\" entry in pool should still be retained";
4915fd4404SLang Hames   }
5015fd4404SLang Hames   SP.clearDeadEntries();
5115fd4404SLang Hames   EXPECT_TRUE(SP.empty()) << "pool should be empty";
5215fd4404SLang Hames }
5315fd4404SLang Hames 
TEST(SymbolStringPool,DebugDump)54*3fcd3669SLang Hames TEST(SymbolStringPool, DebugDump) {
55*3fcd3669SLang Hames   SymbolStringPool SP;
56*3fcd3669SLang Hames   auto A1 = SP.intern("a");
57*3fcd3669SLang Hames   auto A2 = A1;
58*3fcd3669SLang Hames   auto B = SP.intern("b");
59*3fcd3669SLang Hames 
60*3fcd3669SLang Hames   std::string DumpString;
61*3fcd3669SLang Hames   raw_string_ostream(DumpString) << SP;
62*3fcd3669SLang Hames 
63*3fcd3669SLang Hames   EXPECT_EQ(DumpString, "a: 2\nb: 1\n");
64*3fcd3669SLang Hames }
6515fd4404SLang Hames }
66