|
| 1 | +//===- buffer_ostream_test.cpp - buffer_ostream tests ---------------------===// |
| 2 | +// |
| 3 | +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | +// See https://llvm.org/LICENSE.txt for license information. |
| 5 | +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | +// |
| 7 | +//===----------------------------------------------------------------------===// |
| 8 | + |
| 9 | +#include "llvm/ADT/SmallString.h" |
| 10 | +#include "llvm/Support/raw_ostream.h" |
| 11 | +#include "gtest/gtest.h" |
| 12 | + |
| 13 | +using namespace llvm; |
| 14 | + |
| 15 | +namespace { |
| 16 | + |
| 17 | +/// Naive version of raw_svector_ostream that is buffered (by default) and |
| 18 | +/// doesn't support pwrite. |
| 19 | +class NaiveSmallVectorStream : public raw_ostream { |
| 20 | +public: |
| 21 | + uint64_t current_pos() const override { return Vector.size(); } |
| 22 | + void write_impl(const char *Ptr, size_t Size) override { |
| 23 | + Vector.append(Ptr, Ptr + Size); |
| 24 | + } |
| 25 | + |
| 26 | + explicit NaiveSmallVectorStream(SmallVectorImpl<char> &Vector) |
| 27 | + : Vector(Vector) {} |
| 28 | + ~NaiveSmallVectorStream() override { flush(); } |
| 29 | + |
| 30 | + SmallVectorImpl<char> &Vector; |
| 31 | +}; |
| 32 | + |
| 33 | +TEST(buffer_ostreamTest, Reference) { |
| 34 | + SmallString<128> Dest; |
| 35 | + { |
| 36 | + NaiveSmallVectorStream DestOS(Dest); |
| 37 | + buffer_ostream BufferOS(DestOS); |
| 38 | + |
| 39 | + // Writing and flushing should have no effect on Dest. |
| 40 | + BufferOS << "abcd"; |
| 41 | + static_cast<raw_ostream &>(BufferOS).flush(); |
| 42 | + EXPECT_EQ("", Dest); |
| 43 | + DestOS.flush(); |
| 44 | + EXPECT_EQ("", Dest); |
| 45 | + } |
| 46 | + |
| 47 | + // Write should land when constructor is called. |
| 48 | + EXPECT_EQ("abcd", Dest); |
| 49 | +} |
| 50 | + |
| 51 | +TEST(buffer_ostreamTest, Owned) { |
| 52 | + SmallString<128> Dest; |
| 53 | + { |
| 54 | + auto DestOS = std::make_unique<NaiveSmallVectorStream>(Dest); |
| 55 | + |
| 56 | + // Confirm that NaiveSmallVectorStream is buffered by default. |
| 57 | + EXPECT_NE(0u, DestOS->GetBufferSize()); |
| 58 | + |
| 59 | + // Confirm that passing ownership to buffer_unique_ostream sets it to |
| 60 | + // unbuffered. Also steal a reference to DestOS. |
| 61 | + NaiveSmallVectorStream &DestOSRef = *DestOS; |
| 62 | + buffer_unique_ostream BufferOS(std::move(DestOS)); |
| 63 | + EXPECT_EQ(0u, DestOSRef.GetBufferSize()); |
| 64 | + |
| 65 | + // Writing and flushing should have no effect on Dest. |
| 66 | + BufferOS << "abcd"; |
| 67 | + static_cast<raw_ostream &>(BufferOS).flush(); |
| 68 | + EXPECT_EQ("", Dest); |
| 69 | + DestOSRef.flush(); |
| 70 | + EXPECT_EQ("", Dest); |
| 71 | + } |
| 72 | + |
| 73 | + // Write should land when constructor is called. |
| 74 | + EXPECT_EQ("abcd", Dest); |
| 75 | +} |
| 76 | + |
| 77 | +} // end namespace |
0 commit comments