1// Copyright 2016 PDFium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "core/fxcrt/cfx_string_pool_template.h" 6#include "core/fxcrt/fx_string.h" 7#include "testing/fx_string_testhelpers.h" 8#include "testing/gtest/include/gtest/gtest.h" 9 10TEST(fxcrt, ByteStringPool) { 11 CFX_ByteStringPool pool; 12 13 CFX_ByteString null1; 14 CFX_ByteString null2; 15 CFX_ByteString goats1("goats"); 16 CFX_ByteString goats2("goats"); 17 18 // Underlying storage, if non-null, is not shared. 19 EXPECT_EQ(nullptr, null1.m_pData.Get()); 20 EXPECT_EQ(nullptr, null2.m_pData.Get()); 21 EXPECT_NE(goats1.m_pData, goats2.m_pData); 22 23 CFX_ByteString interned_null1 = pool.Intern(null1); 24 CFX_ByteString interned_null2 = pool.Intern(null2); 25 CFX_ByteString interned_goats1 = pool.Intern(goats1); 26 CFX_ByteString interned_goats2 = pool.Intern(goats2); 27 28 // Strings are logically equal after being interned. 29 EXPECT_EQ(null1, interned_null1); 30 EXPECT_EQ(null2, interned_null2); 31 EXPECT_EQ(goats1, interned_goats1); 32 EXPECT_EQ(goats2, interned_goats2); 33 34 // Interned underlying storage, if non-null, belongs to first seen. 35 EXPECT_EQ(nullptr, interned_null1.m_pData.Get()); 36 EXPECT_EQ(nullptr, interned_null2.m_pData.Get()); 37 EXPECT_EQ(goats1.m_pData, interned_goats1.m_pData); 38 EXPECT_EQ(goats1.m_pData, interned_goats2.m_pData); 39 40 pool.Clear(); 41 CFX_ByteString reinterned_null2 = pool.Intern(null2); 42 CFX_ByteString reinterned_null1 = pool.Intern(null2); 43 CFX_ByteString reinterned_goats2 = pool.Intern(goats2); 44 CFX_ByteString reinterned_goats1 = pool.Intern(goats2); 45 46 // After clearing pool, storage was re-interned using second strings. 47 EXPECT_EQ(nullptr, interned_null1.m_pData.Get()); 48 EXPECT_EQ(nullptr, interned_null2.m_pData.Get()); 49 EXPECT_EQ(goats2.m_pData, reinterned_goats1.m_pData); 50 EXPECT_EQ(goats2.m_pData, reinterned_goats2.m_pData); 51} 52 53TEST(fxcrt, WideStringPool) { 54 CFX_WideStringPool pool; 55 56 CFX_WideString null1; 57 CFX_WideString null2; 58 CFX_WideString goats1(L"goats"); 59 CFX_WideString goats2(L"goats"); 60 61 // Underlying storage, if non-null, is not shared. 62 EXPECT_EQ(nullptr, null1.m_pData.Get()); 63 EXPECT_EQ(nullptr, null2.m_pData.Get()); 64 EXPECT_NE(goats1.m_pData, goats2.m_pData); 65 66 CFX_WideString interned_null1 = pool.Intern(null1); 67 CFX_WideString interned_null2 = pool.Intern(null2); 68 CFX_WideString interned_goats1 = pool.Intern(goats1); 69 CFX_WideString interned_goats2 = pool.Intern(goats2); 70 71 // Strings are logically equal after being interned. 72 EXPECT_EQ(null1, interned_null1); 73 EXPECT_EQ(null2, interned_null2); 74 EXPECT_EQ(goats1, interned_goats1); 75 EXPECT_EQ(goats2, interned_goats2); 76 77 // Interned underlying storage, if non-null, belongs to first seen. 78 EXPECT_EQ(nullptr, interned_null1.m_pData.Get()); 79 EXPECT_EQ(nullptr, interned_null2.m_pData.Get()); 80 EXPECT_EQ(goats1.m_pData, interned_goats1.m_pData); 81 EXPECT_EQ(goats1.m_pData, interned_goats2.m_pData); 82 83 pool.Clear(); 84 CFX_WideString reinterned_null2 = pool.Intern(null2); 85 CFX_WideString reinterned_null1 = pool.Intern(null2); 86 CFX_WideString reinterned_goats2 = pool.Intern(goats2); 87 CFX_WideString reinterned_goats1 = pool.Intern(goats2); 88 89 // After clearing pool, storage was re-interned using second strings. 90 EXPECT_EQ(nullptr, interned_null1.m_pData.Get()); 91 EXPECT_EQ(nullptr, interned_null2.m_pData.Get()); 92 EXPECT_EQ(goats2.m_pData, reinterned_goats1.m_pData); 93 EXPECT_EQ(goats2.m_pData, reinterned_goats2.m_pData); 94} 95