//===- buffer_ostream_test.cpp - buffer_ostream tests ---------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/ADT/SmallString.h" #include "llvm/Support/raw_ostream.h" #include "gtest/gtest.h" using namespace llvm; namespace { /// Naive version of raw_svector_ostream that is buffered (by default) and /// doesn't support pwrite. class NaiveSmallVectorStream : public raw_ostream { public: uint64_t current_pos() const override { return Vector.size(); } void write_impl(const char *Ptr, size_t Size) override { Vector.append(Ptr, Ptr + Size); } explicit NaiveSmallVectorStream(SmallVectorImpl &Vector) : Vector(Vector) {} ~NaiveSmallVectorStream() override { flush(); } SmallVectorImpl &Vector; }; TEST(buffer_ostreamTest, Reference) { SmallString<128> Dest; { NaiveSmallVectorStream DestOS(Dest); buffer_ostream BufferOS(DestOS); // Writing and flushing should have no effect on Dest. BufferOS << "abcd"; static_cast(BufferOS).flush(); EXPECT_EQ("", Dest); DestOS.flush(); EXPECT_EQ("", Dest); } // Write should land when constructor is called. EXPECT_EQ("abcd", Dest); } TEST(buffer_ostreamTest, Owned) { SmallString<128> Dest; { auto DestOS = std::make_unique(Dest); // Confirm that NaiveSmallVectorStream is buffered by default. EXPECT_NE(0u, DestOS->GetBufferSize()); // Confirm that passing ownership to buffer_unique_ostream sets it to // unbuffered. Also steal a reference to DestOS. NaiveSmallVectorStream &DestOSRef = *DestOS; buffer_unique_ostream BufferOS(std::move(DestOS)); EXPECT_EQ(0u, DestOSRef.GetBufferSize()); // Writing and flushing should have no effect on Dest. BufferOS << "abcd"; static_cast(BufferOS).flush(); EXPECT_EQ("", Dest); DestOSRef.flush(); EXPECT_EQ("", Dest); } // Write should land when constructor is called. EXPECT_EQ("abcd", Dest); } } // end namespace