unique_small_name_test.cc (2288B)
1 // Copyright 2020 The Abseil Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // https://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #include "gtest/gtest.h" 16 #include "absl/base/optimization.h" 17 #include "absl/strings/string_view.h" 18 19 // This test by itself does not do anything fancy, but it serves as binary I can 20 // query in shell test. 21 22 namespace { 23 24 template <class T> 25 void DoNotOptimize(const T& var) { 26 #ifdef __GNUC__ 27 asm volatile("" : "+m"(const_cast<T&>(var))); 28 #else 29 std::cout << (void*)&var; 30 #endif 31 } 32 33 int very_long_int_variable_name ABSL_INTERNAL_UNIQUE_SMALL_NAME() = 0; 34 char very_long_str_variable_name[] ABSL_INTERNAL_UNIQUE_SMALL_NAME() = "abc"; 35 36 TEST(UniqueSmallName, NonAutomaticVar) { 37 EXPECT_EQ(very_long_int_variable_name, 0); 38 EXPECT_EQ(absl::string_view(very_long_str_variable_name), "abc"); 39 } 40 41 int VeryLongFreeFunctionName() ABSL_INTERNAL_UNIQUE_SMALL_NAME(); 42 43 TEST(UniqueSmallName, FreeFunction) { 44 DoNotOptimize(&VeryLongFreeFunctionName); 45 46 EXPECT_EQ(VeryLongFreeFunctionName(), 456); 47 } 48 49 int VeryLongFreeFunctionName() { return 456; } 50 51 struct VeryLongStructName { 52 explicit VeryLongStructName(int i); 53 54 int VeryLongMethodName() ABSL_INTERNAL_UNIQUE_SMALL_NAME(); 55 56 static int VeryLongStaticMethodName() ABSL_INTERNAL_UNIQUE_SMALL_NAME(); 57 58 private: 59 int fld; 60 }; 61 62 TEST(UniqueSmallName, Struct) { 63 VeryLongStructName var(10); 64 65 DoNotOptimize(var); 66 DoNotOptimize(&VeryLongStructName::VeryLongMethodName); 67 DoNotOptimize(&VeryLongStructName::VeryLongStaticMethodName); 68 69 EXPECT_EQ(var.VeryLongMethodName(), 10); 70 EXPECT_EQ(VeryLongStructName::VeryLongStaticMethodName(), 123); 71 } 72 73 VeryLongStructName::VeryLongStructName(int i) : fld(i) {} 74 int VeryLongStructName::VeryLongMethodName() { return fld; } 75 int VeryLongStructName::VeryLongStaticMethodName() { return 123; } 76 77 } // namespace