// Copyright 2017 The Abseil Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "absl/strings/internal/ostringstream.h" #include <memory> #include <ostream> #include <string> #include <type_traits> #include "gtest/gtest.h" namespace { TEST(OStringStream, IsOStream) { static_assert( std::is_base_of<std::ostream, absl::strings_internal::OStringStream>(), ""); } TEST(OStringStream, ConstructDestroy) { { absl::strings_internal::OStringStream strm(nullptr); EXPECT_EQ(nullptr, strm.str()); } { std::string s = "abc"; { absl::strings_internal::OStringStream strm(&s); EXPECT_EQ(&s, strm.str()); } EXPECT_EQ("abc", s); } { std::unique_ptr<std::string> s(new std::string); absl::strings_internal::OStringStream strm(s.get()); s.reset(); } } TEST(OStringStream, Str) { std::string s1; absl::strings_internal::OStringStream strm(&s1); const absl::strings_internal::OStringStream& c_strm(strm); static_assert(std::is_same<decltype(strm.str()), std::string*>(), ""); static_assert(std::is_same<decltype(c_strm.str()), const std::string*>(), ""); EXPECT_EQ(&s1, strm.str()); EXPECT_EQ(&s1, c_strm.str()); strm.str(&s1); EXPECT_EQ(&s1, strm.str()); EXPECT_EQ(&s1, c_strm.str()); std::string s2; strm.str(&s2); EXPECT_EQ(&s2, strm.str()); EXPECT_EQ(&s2, c_strm.str()); strm.str(nullptr); EXPECT_EQ(nullptr, strm.str()); EXPECT_EQ(nullptr, c_strm.str()); } TEST(OStreamStream, WriteToLValue) { std::string s = "abc"; { absl::strings_internal::OStringStream strm(&s); EXPECT_EQ("abc", s); strm << ""; EXPECT_EQ("abc", s); strm << 42; EXPECT_EQ("abc42", s); strm << 'x' << 'y'; EXPECT_EQ("abc42xy", s); } EXPECT_EQ("abc42xy", s); } TEST(OStreamStream, WriteToRValue) { std::string s = "abc"; absl::strings_internal::OStringStream(&s) << ""; EXPECT_EQ("abc", s); absl::strings_internal::OStringStream(&s) << 42; EXPECT_EQ("abc42", s); absl::strings_internal::OStringStream(&s) << 'x' << 'y'; EXPECT_EQ("abc42xy", s); } } // namespace