// 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 #include #include #include #include #include #include "gtest/gtest.h" namespace { TEST(OStringStream, IsOStream) { static_assert( std::is_base_of(), ""); } TEST(OStringStream, ConstructNullptr) { absl::strings_internal::OStringStream strm(nullptr); EXPECT_EQ(nullptr, strm.str()); } TEST(OStringStream, ConstructStr) { std::string s = "abc"; { absl::strings_internal::OStringStream strm(&s); EXPECT_EQ(&s, strm.str()); } EXPECT_EQ("abc", s); } TEST(OStringStream, Destroy) { std::unique_ptr s(new std::string); absl::strings_internal::OStringStream strm(s.get()); s.reset(); } TEST(OStringStream, MoveConstruct) { std::string s = "abc"; { absl::strings_internal::OStringStream strm1(&s); strm1 << std::hex << 16; EXPECT_EQ(&s, strm1.str()); absl::strings_internal::OStringStream strm2(std::move(strm1)); strm2 << 16; // We should still be in base 16. EXPECT_EQ(&s, strm2.str()); } EXPECT_EQ("abc1010", s); } TEST(OStringStream, MoveAssign) { std::string s = "abc"; { absl::strings_internal::OStringStream strm1(&s); strm1 << std::hex << 16; EXPECT_EQ(&s, strm1.str()); absl::strings_internal::OStringStream strm2(nullptr); strm2 = std::move(strm1); strm2 << 16; // We should still be in base 16. EXPECT_EQ(&s, strm2.str()); } EXPECT_EQ("abc1010", s); } 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(), ""); static_assert(std::is_same(), ""); 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