Hash :
b8d546b2
Author :
Date :
2024-10-30T15:40:58
Fix immutable string concats with ints
`BuildConcatenatedImmutableString("a", 10, "b")`
would construct "a\nb" because the implementation lacked int overloads
and ints would be promoted to chars implicitly.
Fix by implementing simpler way to calculate digits for numbers
and then add useful overloads. Remove
ImmutableStringBuilder::appendDecimal() since the code is already
expecting << for all other types, and the bug was due to this
expectation.
Bug: angleproject:376417347
Change-Id: Iea5e14a6e2fede068b704754b9203db794dd5bf0
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5972641
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Kimmo Kinnunen <kkinnunen@apple.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
// Copyright 2018 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// ImmutableString_test.cpp:
// Tests for ImmutableString and ImmutableStringBuilder.
#include "compiler/translator/ImmutableString.h"
#include "compiler/translator/ImmutableStringBuilder.h"
#include "compiler/translator/PoolAlloc.h"
#include "gtest/gtest.h"
using namespace sh;
class ImmutableStringBuilderTest : public testing::Test
{
public:
ImmutableStringBuilderTest() {}
protected:
void SetUp() override
{
allocator.push();
SetGlobalPoolAllocator(&allocator);
}
void TearDown() override
{
SetGlobalPoolAllocator(nullptr);
allocator.pop();
}
angle::PoolAllocator allocator;
};
// Test writing a 32-bit signed int as hexadecimal using ImmutableStringBuilder.
TEST_F(ImmutableStringBuilderTest, AppendHexInt32)
{
int32_t i = -1;
ImmutableStringBuilder strBuilder(2 * sizeof(int32_t));
strBuilder.appendHex(i);
ImmutableString str = strBuilder;
EXPECT_EQ(std::string("ffffffff"), str.data());
}
// Test writing a 32-bit unsigned int as hexadecimal using ImmutableStringBuilder.
TEST_F(ImmutableStringBuilderTest, AppendHexUint32)
{
uint32_t i = 0x1234beefu;
ImmutableStringBuilder strBuilder(2 * sizeof(uint32_t));
strBuilder.appendHex(i);
ImmutableString str = strBuilder;
EXPECT_EQ(std::string("1234beef"), str.data());
}
// Test writing a 64-bit signed int as hexadecimal using ImmutableStringBuilder.
TEST_F(ImmutableStringBuilderTest, AppendHexInt64)
{
int64_t i = -1;
ImmutableStringBuilder strBuilder(2 * sizeof(int64_t));
strBuilder.appendHex(i);
ImmutableString str = strBuilder;
EXPECT_EQ(std::string("ffffffffffffffff"), str.data());
}
// Test writing a 64-bit unsigned int as hexadecimal using ImmutableStringBuilder.
TEST_F(ImmutableStringBuilderTest, AppendHexUint64)
{
uint64_t i = 0xfeedcafe9876beefull;
ImmutableStringBuilder strBuilder(2 * sizeof(uint64_t));
strBuilder.appendHex(i);
ImmutableString str = strBuilder;
EXPECT_EQ(std::string("feedcafe9876beef"), str.data());
}
// Test writing a decimal using ImmutableStringBuilder of exact size.
TEST_F(ImmutableStringBuilderTest, AppendDecimal)
{
ImmutableStringBuilder b1(1);
b1 << 1;
ImmutableString s1 = b1;
EXPECT_EQ(std::string("1"), s1.data());
ImmutableStringBuilder b20(2);
b20 << 20;
ImmutableString s20 = b20;
EXPECT_EQ(std::string("20"), s20.data());
ImmutableStringBuilder b30000(5);
b30000 << 30000;
ImmutableString s30000 = b30000;
EXPECT_EQ(std::string("30000"), s30000.data());
}
// Test BuildConcatenatedImmutableString.
TEST_F(ImmutableStringBuilderTest, BuildConcatenatedImmutableString)
{
EXPECT_EQ(BuildConcatenatedImmutableString('a', 0, 'b'), "a0b");
EXPECT_EQ(BuildConcatenatedImmutableString('a', 10, 'b'), "a10b");
EXPECT_EQ(BuildConcatenatedImmutableString('a', -153, 'b'), "a-153b");
EXPECT_EQ(BuildConcatenatedImmutableString('a', 78788u, 'b'), "a78788b");
EXPECT_EQ(BuildConcatenatedImmutableString('a', INT64_MAX, 'b'), "a9223372036854775807b");
EXPECT_EQ(BuildConcatenatedImmutableString('a', INT64_MIN, 'b'), "a-9223372036854775808b");
EXPECT_EQ(BuildConcatenatedImmutableString('a', 'c', 'b'), "acb");
EXPECT_EQ(BuildConcatenatedImmutableString("ab", 'c', "de"), "abcde");
}