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