// // Copyright 2025 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. // // Unit tests for ANGLE's MemoryBuffer class. // #include "common/MemoryBuffer.h" #include using namespace angle; namespace { // Test usage of MemoryBuffer with multiple resizes TEST(MemoryBufferTest, MultipleResizes) { MemoryBuffer buffer; ASSERT_TRUE(buffer.resize(100)); ASSERT_EQ(buffer.size(), 100u); buffer.assertTotalAllocatedBytes(100u); buffer.assertTotalCopiedBytes(0u); ASSERT_TRUE(buffer.resize(300)); ASSERT_EQ(buffer.size(), 300u); buffer.assertTotalAllocatedBytes(400u); buffer.assertTotalCopiedBytes(100u); ASSERT_TRUE(buffer.resize(100)); ASSERT_EQ(buffer.size(), 100u); buffer.assertTotalAllocatedBytes(400u); buffer.assertTotalCopiedBytes(100u); ASSERT_TRUE(buffer.resize(400)); ASSERT_EQ(buffer.size(), 400u); buffer.assertTotalAllocatedBytes(800u); buffer.assertTotalCopiedBytes(200u); } // Test usage of MemoryBuffer with reserve and then multiple resizes TEST(MemoryBufferTest, ReserveThenResize) { MemoryBuffer buffer; ASSERT_TRUE(buffer.reserve(300)); ASSERT_EQ(buffer.size(), 0u); ASSERT_TRUE(buffer.resize(100)); ASSERT_EQ(buffer.size(), 100u); buffer.assertTotalAllocatedBytes(300u); buffer.assertTotalCopiedBytes(0u); ASSERT_TRUE(buffer.resize(300)); ASSERT_EQ(buffer.size(), 300u); buffer.assertTotalAllocatedBytes(300u); buffer.assertTotalCopiedBytes(0u); ASSERT_TRUE(buffer.resize(100)); ASSERT_EQ(buffer.size(), 100u); buffer.assertTotalAllocatedBytes(300u); buffer.assertTotalCopiedBytes(0u); ASSERT_TRUE(buffer.resize(400)); ASSERT_EQ(buffer.size(), 400u); buffer.assertTotalAllocatedBytes(700u); buffer.assertTotalCopiedBytes(100u); } // Test usage of MemoryBuffer with clearAndReserve and then multiple resizes TEST(MemoryBufferTest, ClearAndReserveThenResize) { MemoryBuffer buffer; ASSERT_TRUE(buffer.clearAndReserve(300)); ASSERT_EQ(buffer.size(), 0u); ASSERT_TRUE(buffer.resize(100)); ASSERT_EQ(buffer.size(), 100u); buffer.assertTotalAllocatedBytes(300u); buffer.assertTotalCopiedBytes(0u); ASSERT_TRUE(buffer.resize(300)); ASSERT_EQ(buffer.size(), 300u); buffer.assertTotalAllocatedBytes(300u); buffer.assertTotalCopiedBytes(0u); ASSERT_TRUE(buffer.resize(100)); ASSERT_EQ(buffer.size(), 100u); buffer.assertTotalAllocatedBytes(300u); buffer.assertTotalCopiedBytes(0u); ASSERT_TRUE(buffer.clearAndReserve(400)); ASSERT_EQ(buffer.size(), 0u); ASSERT_TRUE(buffer.resize(400)); ASSERT_EQ(buffer.size(), 400u); buffer.assertTotalAllocatedBytes(700u); buffer.assertTotalCopiedBytes(0u); } // Test appending and destroying MemoryBuffer TEST(MemoryBufferTest, AppendAndDestroy) { MemoryBuffer bufferSrc; MemoryBuffer bufferDst; ASSERT_TRUE(bufferSrc.clearAndReserve(100)); ASSERT_EQ(bufferSrc.size(), 0u); ASSERT_TRUE(bufferSrc.resize(100)); ASSERT_EQ(bufferSrc.size(), 100u); bufferSrc.assertTotalAllocatedBytes(100u); bufferSrc.assertTotalCopiedBytes(0u); ASSERT_TRUE(bufferDst.clearAndReserve(200)); ASSERT_EQ(bufferDst.size(), 0u); ASSERT_TRUE(bufferDst.resize(100)); ASSERT_EQ(bufferDst.size(), 100u); ASSERT_TRUE(bufferDst.append(bufferSrc)); ASSERT_EQ(bufferDst.size(), 200u); bufferDst.assertTotalAllocatedBytes(200u); bufferDst.assertTotalCopiedBytes(0u); ASSERT_TRUE(bufferDst.append(bufferSrc)); ASSERT_EQ(bufferDst.size(), 300u); bufferDst.assertTotalAllocatedBytes(500u); bufferDst.assertTotalCopiedBytes(200u); ASSERT_TRUE(bufferDst.append(bufferDst)); ASSERT_EQ(bufferDst.size(), 600u); bufferDst.assertTotalAllocatedBytes(1100u); bufferDst.assertTotalCopiedBytes(500u); bufferDst.destroy(); ASSERT_EQ(bufferDst.size(), 0u); bufferDst.assertTotalAllocatedBytes(0u); bufferDst.assertTotalCopiedBytes(0u); } } // namespace