// Copyright 2016 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "core/fxcrt/string_pool_template.h" #include "core/fxcrt/fx_string.h" #include "testing/gtest/include/gtest/gtest.h" namespace fxcrt { TEST(StringPool, ByteString) { ByteStringPool pool; ByteString null1; ByteString null2; ByteString goats1("goats"); ByteString goats2("goats"); // Underlying storage, if non-null, is not shared. EXPECT_EQ(nullptr, null1.m_pData.Get()); EXPECT_EQ(nullptr, null2.m_pData.Get()); EXPECT_NE(goats1.m_pData, goats2.m_pData); ByteString interned_null1 = pool.Intern(null1); ByteString interned_null2 = pool.Intern(null2); ByteString interned_goats1 = pool.Intern(goats1); ByteString interned_goats2 = pool.Intern(goats2); // Strings are logically equal after being interned. EXPECT_EQ(null1, interned_null1); EXPECT_EQ(null2, interned_null2); EXPECT_EQ(goats1, interned_goats1); EXPECT_EQ(goats2, interned_goats2); // Interned underlying storage, if non-null, belongs to first seen. EXPECT_EQ(nullptr, interned_null1.m_pData.Get()); EXPECT_EQ(nullptr, interned_null2.m_pData.Get()); EXPECT_EQ(goats1.m_pData, interned_goats1.m_pData); EXPECT_EQ(goats1.m_pData, interned_goats2.m_pData); pool.Clear(); ByteString reinterned_null2 = pool.Intern(null2); ByteString reinterned_null1 = pool.Intern(null2); ByteString reinterned_goats2 = pool.Intern(goats2); ByteString reinterned_goats1 = pool.Intern(goats2); // After clearing pool, storage was re-interned using second strings. EXPECT_EQ(nullptr, interned_null1.m_pData.Get()); EXPECT_EQ(nullptr, interned_null2.m_pData.Get()); EXPECT_EQ(goats2.m_pData, reinterned_goats1.m_pData); EXPECT_EQ(goats2.m_pData, reinterned_goats2.m_pData); } TEST(StringPool, WideString) { WideStringPool pool; WideString null1; WideString null2; WideString goats1(L"goats"); WideString goats2(L"goats"); // Underlying storage, if non-null, is not shared. EXPECT_EQ(nullptr, null1.m_pData.Get()); EXPECT_EQ(nullptr, null2.m_pData.Get()); EXPECT_NE(goats1.m_pData, goats2.m_pData); WideString interned_null1 = pool.Intern(null1); WideString interned_null2 = pool.Intern(null2); WideString interned_goats1 = pool.Intern(goats1); WideString interned_goats2 = pool.Intern(goats2); // Strings are logically equal after being interned. EXPECT_EQ(null1, interned_null1); EXPECT_EQ(null2, interned_null2); EXPECT_EQ(goats1, interned_goats1); EXPECT_EQ(goats2, interned_goats2); // Interned underlying storage, if non-null, belongs to first seen. EXPECT_EQ(nullptr, interned_null1.m_pData.Get()); EXPECT_EQ(nullptr, interned_null2.m_pData.Get()); EXPECT_EQ(goats1.m_pData, interned_goats1.m_pData); EXPECT_EQ(goats1.m_pData, interned_goats2.m_pData); pool.Clear(); WideString reinterned_null2 = pool.Intern(null2); WideString reinterned_null1 = pool.Intern(null2); WideString reinterned_goats2 = pool.Intern(goats2); WideString reinterned_goats1 = pool.Intern(goats2); // After clearing pool, storage was re-interned using second strings. EXPECT_EQ(nullptr, interned_null1.m_pData.Get()); EXPECT_EQ(nullptr, interned_null2.m_pData.Get()); EXPECT_EQ(goats2.m_pData, reinterned_goats1.m_pData); EXPECT_EQ(goats2.m_pData, reinterned_goats2.m_pData); } } // namespace fxcrt