| //===- 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<char> &Vector) | |
| : Vector(Vector) {} | |
| ~NaiveSmallVectorStream() override { flush(); } | |
| SmallVectorImpl<char> &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<raw_ostream &>(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<NaiveSmallVectorStream>(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<raw_ostream &>(BufferOS).flush(); | |
| EXPECT_EQ("", Dest); | |
| DestOSRef.flush(); | |
| EXPECT_EQ("", Dest); | |
| } | |
| // Write should land when constructor is called. | |
| EXPECT_EQ("abcd", Dest); | |
| } | |
| } // end namespace |