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(in_start: Ptr, in_end: 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>(args&: 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 |
78 | |