1 // Copyright 2018 The ANGLE Project 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 // ImmutableString_test.cpp:
6 // Tests for ImmutableString and ImmutableStringBuilder.
7
8 #include "compiler/translator/ImmutableString.h"
9 #include "compiler/translator/ImmutableStringBuilder.h"
10 #include "compiler/translator/PoolAlloc.h"
11 #include "gtest/gtest.h"
12
13 using namespace sh;
14
15 class ImmutableStringBuilderTest : public testing::Test
16 {
17 public:
ImmutableStringBuilderTest()18 ImmutableStringBuilderTest() {}
19
20 protected:
SetUp()21 void SetUp() override
22 {
23 allocator.push();
24 SetGlobalPoolAllocator(&allocator);
25 }
26
TearDown()27 void TearDown() override
28 {
29 SetGlobalPoolAllocator(nullptr);
30 allocator.pop();
31 }
32
33 angle::PoolAllocator allocator;
34 };
35
36 // Test writing a 32-bit signed int as hexadecimal using ImmutableStringBuilder.
TEST_F(ImmutableStringBuilderTest,AppendHexInt32)37 TEST_F(ImmutableStringBuilderTest, AppendHexInt32)
38 {
39 int32_t i = -1;
40 ImmutableStringBuilder strBuilder(2 * sizeof(int32_t));
41 strBuilder.appendHex(i);
42 ImmutableString str = strBuilder;
43 EXPECT_EQ(std::string("ffffffff"), str.data());
44 }
45
46 // Test writing a 32-bit unsigned int as hexadecimal using ImmutableStringBuilder.
TEST_F(ImmutableStringBuilderTest,AppendHexUint32)47 TEST_F(ImmutableStringBuilderTest, AppendHexUint32)
48 {
49 uint32_t i = 0x1234beefu;
50 ImmutableStringBuilder strBuilder(2 * sizeof(uint32_t));
51 strBuilder.appendHex(i);
52 ImmutableString str = strBuilder;
53 EXPECT_EQ(std::string("1234beef"), str.data());
54 }
55
56 // Test writing a 64-bit signed int as hexadecimal using ImmutableStringBuilder.
TEST_F(ImmutableStringBuilderTest,AppendHexInt64)57 TEST_F(ImmutableStringBuilderTest, AppendHexInt64)
58 {
59 int64_t i = -1;
60 ImmutableStringBuilder strBuilder(2 * sizeof(int64_t));
61 strBuilder.appendHex(i);
62 ImmutableString str = strBuilder;
63 EXPECT_EQ(std::string("ffffffffffffffff"), str.data());
64 }
65
66 // Test writing a 64-bit unsigned int as hexadecimal using ImmutableStringBuilder.
TEST_F(ImmutableStringBuilderTest,AppendHexUint64)67 TEST_F(ImmutableStringBuilderTest, AppendHexUint64)
68 {
69 uint64_t i = 0xfeedcafe9876beefull;
70 ImmutableStringBuilder strBuilder(2 * sizeof(uint64_t));
71 strBuilder.appendHex(i);
72 ImmutableString str = strBuilder;
73 EXPECT_EQ(std::string("feedcafe9876beef"), str.data());
74 }
75
76 // Test writing a decimal using ImmutableStringBuilder of exact size.
TEST_F(ImmutableStringBuilderTest,AppendDecimal)77 TEST_F(ImmutableStringBuilderTest, AppendDecimal)
78 {
79 ImmutableStringBuilder b1(1);
80 b1 << 1;
81 ImmutableString s1 = b1;
82 EXPECT_EQ(std::string("1"), s1.data());
83
84 ImmutableStringBuilder b20(2);
85 b20 << 20;
86 ImmutableString s20 = b20;
87 EXPECT_EQ(std::string("20"), s20.data());
88
89 ImmutableStringBuilder b30000(5);
90 b30000 << 30000;
91 ImmutableString s30000 = b30000;
92 EXPECT_EQ(std::string("30000"), s30000.data());
93 }
94
95 // Test BuildConcatenatedImmutableString.
TEST_F(ImmutableStringBuilderTest,BuildConcatenatedImmutableString)96 TEST_F(ImmutableStringBuilderTest, BuildConcatenatedImmutableString)
97 {
98 EXPECT_EQ(BuildConcatenatedImmutableString('a', 0, 'b'), "a0b");
99 EXPECT_EQ(BuildConcatenatedImmutableString('a', 10, 'b'), "a10b");
100 EXPECT_EQ(BuildConcatenatedImmutableString('a', -153, 'b'), "a-153b");
101 EXPECT_EQ(BuildConcatenatedImmutableString('a', 78788u, 'b'), "a78788b");
102 EXPECT_EQ(BuildConcatenatedImmutableString('a', INT64_MAX, 'b'), "a9223372036854775807b");
103 EXPECT_EQ(BuildConcatenatedImmutableString('a', INT64_MIN, 'b'), "a-9223372036854775808b");
104 EXPECT_EQ(BuildConcatenatedImmutableString('a', 'c', 'b'), "acb");
105 EXPECT_EQ(BuildConcatenatedImmutableString("ab", 'c', "de"), "abcde");
106 }
107