• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
TEST(fxcrt,ByteStringPool)10 TEST(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 
TEST(fxcrt,WideStringPool)53 TEST(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