| // Copyright 2018 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "base/no_destructor.h" | 
 |  | 
 | #include <string> | 
 | #include <utility> | 
 |  | 
 | #include "base/logging.h" | 
 | #include "build/build_config.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 |  | 
 | namespace base { | 
 |  | 
 | namespace { | 
 |  | 
 | struct CheckOnDestroy { | 
 |   ~CheckOnDestroy() { CHECK(false); } | 
 | }; | 
 |  | 
 | TEST(NoDestructorTest, SkipsDestructors) { | 
 |   NoDestructor<CheckOnDestroy> destructor_should_not_run; | 
 | } | 
 |  | 
 | struct CopyOnly { | 
 |   CopyOnly() = default; | 
 |  | 
 |   CopyOnly(const CopyOnly&) = default; | 
 |   CopyOnly& operator=(const CopyOnly&) = default; | 
 |  | 
 |   CopyOnly(CopyOnly&&) = delete; | 
 |   CopyOnly& operator=(CopyOnly&&) = delete; | 
 | }; | 
 |  | 
 | struct MoveOnly { | 
 |   MoveOnly() = default; | 
 |  | 
 |   MoveOnly(const MoveOnly&) = delete; | 
 |   MoveOnly& operator=(const MoveOnly&) = delete; | 
 |  | 
 |   MoveOnly(MoveOnly&&) = default; | 
 |   MoveOnly& operator=(MoveOnly&&) = default; | 
 | }; | 
 |  | 
 | struct ForwardingTestStruct { | 
 |   ForwardingTestStruct(const CopyOnly&, MoveOnly&&) {} | 
 | }; | 
 |  | 
 | TEST(NoDestructorTest, ForwardsArguments) { | 
 |   CopyOnly copy_only; | 
 |   MoveOnly move_only; | 
 |  | 
 |   static NoDestructor<ForwardingTestStruct> test_forwarding( | 
 |       copy_only, std::move(move_only)); | 
 | } | 
 |  | 
 | TEST(NoDestructorTest, Accessors) { | 
 |   static NoDestructor<std::string> awesome("awesome"); | 
 |  | 
 |   EXPECT_EQ("awesome", *awesome); | 
 |   EXPECT_EQ(0, awesome->compare("awesome")); | 
 |   EXPECT_EQ(0, awesome.get()->compare("awesome")); | 
 | } | 
 |  | 
 | // Passing initializer list to a NoDestructor like in this test | 
 | // is ambiguous in GCC. | 
 | // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84849 | 
 | #if !defined(COMPILER_GCC) && !defined(__clang__) | 
 | TEST(NoDestructorTest, InitializerList) { | 
 |   static NoDestructor<std::vector<std::string>> vector({"a", "b", "c"}); | 
 | } | 
 | #endif | 
 | }  // namespace | 
 |  | 
 | }  // namespace base |