1*a65addddSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*a65addddSAndroid Build Coastguard Worker# Copyright 2016 Google Inc. All Rights Reserved. 3*a65addddSAndroid Build Coastguard Worker# 4*a65addddSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 5*a65addddSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 6*a65addddSAndroid Build Coastguard Worker# You may obtain a copy of the License at 7*a65addddSAndroid Build Coastguard Worker# 8*a65addddSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 9*a65addddSAndroid Build Coastguard Worker# 10*a65addddSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 11*a65addddSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS-IS" BASIS, 12*a65addddSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*a65addddSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 14*a65addddSAndroid Build Coastguard Worker# limitations under the License. 15*a65addddSAndroid Build Coastguard Worker 16*a65addddSAndroid Build Coastguard Workerfrom absl.testing import parameterized 17*a65addddSAndroid Build Coastguard Workerfrom fruit_test_common import * 18*a65addddSAndroid Build Coastguard Worker 19*a65addddSAndroid Build Coastguard WorkerCOMMON_DEFINITIONS = ''' 20*a65addddSAndroid Build Coastguard Worker #include "test_common.h" 21*a65addddSAndroid Build Coastguard Worker ''' 22*a65addddSAndroid Build Coastguard Worker 23*a65addddSAndroid Build Coastguard Workerclass TestComponentFunctions(parameterized.TestCase): 24*a65addddSAndroid Build Coastguard Worker def test_component_function_success(self): 25*a65addddSAndroid Build Coastguard Worker source = ''' 26*a65addddSAndroid Build Coastguard Worker struct X { 27*a65addddSAndroid Build Coastguard Worker int n; 28*a65addddSAndroid Build Coastguard Worker X(int n) : n(n) {} 29*a65addddSAndroid Build Coastguard Worker }; 30*a65addddSAndroid Build Coastguard Worker 31*a65addddSAndroid Build Coastguard Worker struct Arg { 32*a65addddSAndroid Build Coastguard Worker Arg(int) {} 33*a65addddSAndroid Build Coastguard Worker Arg() = default; 34*a65addddSAndroid Build Coastguard Worker Arg(const Arg&) = default; 35*a65addddSAndroid Build Coastguard Worker Arg(Arg&&) = default; 36*a65addddSAndroid Build Coastguard Worker Arg& operator=(const Arg&) = default; 37*a65addddSAndroid Build Coastguard Worker Arg& operator=(Arg&&) = default; 38*a65addddSAndroid Build Coastguard Worker }; 39*a65addddSAndroid Build Coastguard Worker 40*a65addddSAndroid Build Coastguard Worker bool operator==(const Arg&, const Arg&) { 41*a65addddSAndroid Build Coastguard Worker return true; 42*a65addddSAndroid Build Coastguard Worker } 43*a65addddSAndroid Build Coastguard Worker 44*a65addddSAndroid Build Coastguard Worker namespace std { 45*a65addddSAndroid Build Coastguard Worker template <> 46*a65addddSAndroid Build Coastguard Worker struct hash<Arg> { 47*a65addddSAndroid Build Coastguard Worker size_t operator()(const Arg&) { 48*a65addddSAndroid Build Coastguard Worker return 0; 49*a65addddSAndroid Build Coastguard Worker } 50*a65addddSAndroid Build Coastguard Worker }; 51*a65addddSAndroid Build Coastguard Worker } 52*a65addddSAndroid Build Coastguard Worker 53*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getParentComponent(int, std::string, Arg, Arg) { 54*a65addddSAndroid Build Coastguard Worker return fruit::createComponent() 55*a65addddSAndroid Build Coastguard Worker .registerProvider([]() { return X(5); }); 56*a65addddSAndroid Build Coastguard Worker } 57*a65addddSAndroid Build Coastguard Worker 58*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getComponent() { 59*a65addddSAndroid Build Coastguard Worker return fruit::createComponent() 60*a65addddSAndroid Build Coastguard Worker .installComponentFunctions(fruit::componentFunction(getParentComponent, 5, std::string("Hello"), Arg{}, 15)); 61*a65addddSAndroid Build Coastguard Worker } 62*a65addddSAndroid Build Coastguard Worker 63*a65addddSAndroid Build Coastguard Worker int main() { 64*a65addddSAndroid Build Coastguard Worker fruit::Injector<X> injector(getComponent); 65*a65addddSAndroid Build Coastguard Worker X x = injector.get<X>(); 66*a65addddSAndroid Build Coastguard Worker Assert(x.n == 5); 67*a65addddSAndroid Build Coastguard Worker } 68*a65addddSAndroid Build Coastguard Worker ''' 69*a65addddSAndroid Build Coastguard Worker expect_success(COMMON_DEFINITIONS, source) 70*a65addddSAndroid Build Coastguard Worker 71*a65addddSAndroid Build Coastguard Worker def test_component_function_no_args_success(self): 72*a65addddSAndroid Build Coastguard Worker source = ''' 73*a65addddSAndroid Build Coastguard Worker struct X { 74*a65addddSAndroid Build Coastguard Worker int n; 75*a65addddSAndroid Build Coastguard Worker X(int n) : n(n) {} 76*a65addddSAndroid Build Coastguard Worker }; 77*a65addddSAndroid Build Coastguard Worker 78*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getParentComponent() { 79*a65addddSAndroid Build Coastguard Worker return fruit::createComponent() 80*a65addddSAndroid Build Coastguard Worker .registerProvider([]() { return X(5); }); 81*a65addddSAndroid Build Coastguard Worker } 82*a65addddSAndroid Build Coastguard Worker 83*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getComponent() { 84*a65addddSAndroid Build Coastguard Worker return fruit::createComponent() 85*a65addddSAndroid Build Coastguard Worker .installComponentFunctions(fruit::componentFunction(getParentComponent)); 86*a65addddSAndroid Build Coastguard Worker } 87*a65addddSAndroid Build Coastguard Worker 88*a65addddSAndroid Build Coastguard Worker int main() { 89*a65addddSAndroid Build Coastguard Worker fruit::Injector<X> injector(getComponent); 90*a65addddSAndroid Build Coastguard Worker X x = injector.get<X>(); 91*a65addddSAndroid Build Coastguard Worker Assert(x.n == 5); 92*a65addddSAndroid Build Coastguard Worker } 93*a65addddSAndroid Build Coastguard Worker ''' 94*a65addddSAndroid Build Coastguard Worker expect_success(COMMON_DEFINITIONS, source) 95*a65addddSAndroid Build Coastguard Worker 96*a65addddSAndroid Build Coastguard Worker def test_component_function_one_arg_success(self): 97*a65addddSAndroid Build Coastguard Worker source = ''' 98*a65addddSAndroid Build Coastguard Worker struct X { 99*a65addddSAndroid Build Coastguard Worker int n; 100*a65addddSAndroid Build Coastguard Worker X(int n) : n(n) {} 101*a65addddSAndroid Build Coastguard Worker }; 102*a65addddSAndroid Build Coastguard Worker 103*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getParentComponent(std::string) { 104*a65addddSAndroid Build Coastguard Worker return fruit::createComponent() 105*a65addddSAndroid Build Coastguard Worker .registerProvider([]() { return X(5); }); 106*a65addddSAndroid Build Coastguard Worker } 107*a65addddSAndroid Build Coastguard Worker 108*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getComponent() { 109*a65addddSAndroid Build Coastguard Worker return fruit::createComponent() 110*a65addddSAndroid Build Coastguard Worker .installComponentFunctions(fruit::componentFunction(getParentComponent, std::string("Hello"))); 111*a65addddSAndroid Build Coastguard Worker } 112*a65addddSAndroid Build Coastguard Worker 113*a65addddSAndroid Build Coastguard Worker int main() { 114*a65addddSAndroid Build Coastguard Worker fruit::Injector<X> injector(getComponent); 115*a65addddSAndroid Build Coastguard Worker X x = injector.get<X>(); 116*a65addddSAndroid Build Coastguard Worker Assert(x.n == 5); 117*a65addddSAndroid Build Coastguard Worker } 118*a65addddSAndroid Build Coastguard Worker ''' 119*a65addddSAndroid Build Coastguard Worker expect_success(COMMON_DEFINITIONS, source) 120*a65addddSAndroid Build Coastguard Worker 121*a65addddSAndroid Build Coastguard Worker def test_component_function_error_not_move_constructible(self): 122*a65addddSAndroid Build Coastguard Worker source = ''' 123*a65addddSAndroid Build Coastguard Worker struct X {}; 124*a65addddSAndroid Build Coastguard Worker 125*a65addddSAndroid Build Coastguard Worker struct Arg { 126*a65addddSAndroid Build Coastguard Worker Arg() = default; 127*a65addddSAndroid Build Coastguard Worker Arg(const Arg&) = default; 128*a65addddSAndroid Build Coastguard Worker Arg(Arg&&) = delete; 129*a65addddSAndroid Build Coastguard Worker Arg& operator=(const Arg&) = default; 130*a65addddSAndroid Build Coastguard Worker Arg& operator=(Arg&&) = default; 131*a65addddSAndroid Build Coastguard Worker }; 132*a65addddSAndroid Build Coastguard Worker 133*a65addddSAndroid Build Coastguard Worker bool operator==(const Arg&, const Arg&); 134*a65addddSAndroid Build Coastguard Worker 135*a65addddSAndroid Build Coastguard Worker namespace std { 136*a65addddSAndroid Build Coastguard Worker template <> 137*a65addddSAndroid Build Coastguard Worker struct hash<Arg> { 138*a65addddSAndroid Build Coastguard Worker size_t operator()(const Arg&); 139*a65addddSAndroid Build Coastguard Worker }; 140*a65addddSAndroid Build Coastguard Worker } 141*a65addddSAndroid Build Coastguard Worker 142*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getParentComponent(int, std::string, Arg); 143*a65addddSAndroid Build Coastguard Worker 144*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getComponent() { 145*a65addddSAndroid Build Coastguard Worker return fruit::createComponent() 146*a65addddSAndroid Build Coastguard Worker .installComponentFunctions(fruit::componentFunction(getParentComponent, 5, std::string("Hello"), Arg{})); 147*a65addddSAndroid Build Coastguard Worker } 148*a65addddSAndroid Build Coastguard Worker ''' 149*a65addddSAndroid Build Coastguard Worker expect_generic_compile_error( 150*a65addddSAndroid Build Coastguard Worker r'error: use of deleted function .Arg::Arg\(Arg&&\).' 151*a65addddSAndroid Build Coastguard Worker r'|error: call to deleted constructor of .Arg.' 152*a65addddSAndroid Build Coastguard Worker r'|.Arg::Arg\(const Arg &\).: cannot convert argument 1 from .std::_Tuple_val<Arg>. to .const Arg &.' 153*a65addddSAndroid Build Coastguard Worker r'|.Arg::Arg\(Arg &&\).: cannot convert argument 1 from .std::_Tuple_val<Arg>. to .const Arg &.' 154*a65addddSAndroid Build Coastguard Worker r'|.Arg::Arg\(Arg &&\).: attempting to reference a deleted function', 155*a65addddSAndroid Build Coastguard Worker COMMON_DEFINITIONS, 156*a65addddSAndroid Build Coastguard Worker source) 157*a65addddSAndroid Build Coastguard Worker 158*a65addddSAndroid Build Coastguard Worker def test_component_function_error_not_move_constructible_with_conversion(self): 159*a65addddSAndroid Build Coastguard Worker source = ''' 160*a65addddSAndroid Build Coastguard Worker struct X {}; 161*a65addddSAndroid Build Coastguard Worker 162*a65addddSAndroid Build Coastguard Worker struct Arg { 163*a65addddSAndroid Build Coastguard Worker Arg(int) {} 164*a65addddSAndroid Build Coastguard Worker Arg() = default; 165*a65addddSAndroid Build Coastguard Worker Arg(const Arg&) = default; 166*a65addddSAndroid Build Coastguard Worker Arg(Arg&&) = delete; 167*a65addddSAndroid Build Coastguard Worker Arg& operator=(const Arg&) = default; 168*a65addddSAndroid Build Coastguard Worker Arg& operator=(Arg&&) = default; 169*a65addddSAndroid Build Coastguard Worker }; 170*a65addddSAndroid Build Coastguard Worker 171*a65addddSAndroid Build Coastguard Worker bool operator==(const Arg&, const Arg&); 172*a65addddSAndroid Build Coastguard Worker 173*a65addddSAndroid Build Coastguard Worker namespace std { 174*a65addddSAndroid Build Coastguard Worker template <> 175*a65addddSAndroid Build Coastguard Worker struct hash<Arg> { 176*a65addddSAndroid Build Coastguard Worker size_t operator()(const Arg&); 177*a65addddSAndroid Build Coastguard Worker }; 178*a65addddSAndroid Build Coastguard Worker } 179*a65addddSAndroid Build Coastguard Worker 180*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getParentComponent(int, std::string, Arg); 181*a65addddSAndroid Build Coastguard Worker 182*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getComponent() { 183*a65addddSAndroid Build Coastguard Worker return fruit::createComponent() 184*a65addddSAndroid Build Coastguard Worker .installComponentFunctions(fruit::componentFunction(getParentComponent, 5, std::string("Hello"), 15)); 185*a65addddSAndroid Build Coastguard Worker } 186*a65addddSAndroid Build Coastguard Worker ''' 187*a65addddSAndroid Build Coastguard Worker expect_generic_compile_error( 188*a65addddSAndroid Build Coastguard Worker r'error: use of deleted function .Arg::Arg\(Arg&&\).' 189*a65addddSAndroid Build Coastguard Worker r'|error: call to deleted constructor of .Arg.' 190*a65addddSAndroid Build Coastguard Worker r'|.Arg::Arg\((int|Arg &&)\).: cannot convert argument 1 from .std::_Tuple_val<Arg>. to .int.' 191*a65addddSAndroid Build Coastguard Worker r'|error: copying parameter of type .Arg. invokes deleted constructor' 192*a65addddSAndroid Build Coastguard Worker r'|error C2280: .Arg::Arg\(Arg &&\).: attempting to reference a deleted function', 193*a65addddSAndroid Build Coastguard Worker COMMON_DEFINITIONS, 194*a65addddSAndroid Build Coastguard Worker source) 195*a65addddSAndroid Build Coastguard Worker 196*a65addddSAndroid Build Coastguard Worker def test_component_function_error_not_copy_constructible(self): 197*a65addddSAndroid Build Coastguard Worker source = ''' 198*a65addddSAndroid Build Coastguard Worker struct X { 199*a65addddSAndroid Build Coastguard Worker int n; 200*a65addddSAndroid Build Coastguard Worker X(int n) : n(n) {} 201*a65addddSAndroid Build Coastguard Worker }; 202*a65addddSAndroid Build Coastguard Worker 203*a65addddSAndroid Build Coastguard Worker struct Arg { 204*a65addddSAndroid Build Coastguard Worker Arg() = default; 205*a65addddSAndroid Build Coastguard Worker Arg(const Arg&) = delete; 206*a65addddSAndroid Build Coastguard Worker Arg(Arg&&) = default; 207*a65addddSAndroid Build Coastguard Worker Arg& operator=(const Arg&) = default; 208*a65addddSAndroid Build Coastguard Worker Arg& operator=(Arg&&) = default; 209*a65addddSAndroid Build Coastguard Worker }; 210*a65addddSAndroid Build Coastguard Worker 211*a65addddSAndroid Build Coastguard Worker bool operator==(const Arg&, const Arg&); 212*a65addddSAndroid Build Coastguard Worker 213*a65addddSAndroid Build Coastguard Worker namespace std { 214*a65addddSAndroid Build Coastguard Worker template <> 215*a65addddSAndroid Build Coastguard Worker struct hash<Arg> { 216*a65addddSAndroid Build Coastguard Worker size_t operator()(const Arg&); 217*a65addddSAndroid Build Coastguard Worker }; 218*a65addddSAndroid Build Coastguard Worker } 219*a65addddSAndroid Build Coastguard Worker 220*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getParentComponent(int, std::string, Arg); 221*a65addddSAndroid Build Coastguard Worker 222*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getComponent() { 223*a65addddSAndroid Build Coastguard Worker return fruit::createComponent() 224*a65addddSAndroid Build Coastguard Worker .installComponentFunctions(fruit::componentFunction(getParentComponent, 5, std::string("Hello"), Arg{})); 225*a65addddSAndroid Build Coastguard Worker } 226*a65addddSAndroid Build Coastguard Worker ''' 227*a65addddSAndroid Build Coastguard Worker expect_generic_compile_error( 228*a65addddSAndroid Build Coastguard Worker r'error: use of deleted function .Arg::Arg\(const Arg&\).' 229*a65addddSAndroid Build Coastguard Worker r'|error: call to deleted constructor of .Arg.' 230*a65addddSAndroid Build Coastguard Worker r'|error C2280: .Arg::Arg\(const Arg &\).: attempting to reference a deleted function' 231*a65addddSAndroid Build Coastguard Worker r'|.std::tuple<int,std::string,Arg>::tuple.: no overloaded function takes 3 arguments' 232*a65addddSAndroid Build Coastguard Worker # This is the error printed by MSVC. It's not great but I couldn't find a way to have it print 233*a65addddSAndroid Build Coastguard Worker # a more useful error. 234*a65addddSAndroid Build Coastguard Worker r'|cannot convert argument 1 from .int. to .std::allocator_arg_t.', 235*a65addddSAndroid Build Coastguard Worker COMMON_DEFINITIONS, 236*a65addddSAndroid Build Coastguard Worker source) 237*a65addddSAndroid Build Coastguard Worker 238*a65addddSAndroid Build Coastguard Worker def test_component_function_error_not_copy_constructible_with_conversion(self): 239*a65addddSAndroid Build Coastguard Worker source = ''' 240*a65addddSAndroid Build Coastguard Worker struct X { 241*a65addddSAndroid Build Coastguard Worker int n; 242*a65addddSAndroid Build Coastguard Worker X(int n) : n(n) {} 243*a65addddSAndroid Build Coastguard Worker }; 244*a65addddSAndroid Build Coastguard Worker 245*a65addddSAndroid Build Coastguard Worker struct Arg { 246*a65addddSAndroid Build Coastguard Worker Arg(int) {} 247*a65addddSAndroid Build Coastguard Worker Arg() = default; 248*a65addddSAndroid Build Coastguard Worker Arg(const Arg&) = delete; 249*a65addddSAndroid Build Coastguard Worker Arg(Arg&&) = default; 250*a65addddSAndroid Build Coastguard Worker Arg& operator=(const Arg&) = default; 251*a65addddSAndroid Build Coastguard Worker Arg& operator=(Arg&&) = default; 252*a65addddSAndroid Build Coastguard Worker }; 253*a65addddSAndroid Build Coastguard Worker 254*a65addddSAndroid Build Coastguard Worker bool operator==(const Arg&, const Arg&); 255*a65addddSAndroid Build Coastguard Worker 256*a65addddSAndroid Build Coastguard Worker namespace std { 257*a65addddSAndroid Build Coastguard Worker template <> 258*a65addddSAndroid Build Coastguard Worker struct hash<Arg> { 259*a65addddSAndroid Build Coastguard Worker size_t operator()(const Arg&); 260*a65addddSAndroid Build Coastguard Worker }; 261*a65addddSAndroid Build Coastguard Worker } 262*a65addddSAndroid Build Coastguard Worker 263*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getParentComponent(int, std::string, Arg); 264*a65addddSAndroid Build Coastguard Worker 265*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getComponent() { 266*a65addddSAndroid Build Coastguard Worker return fruit::createComponent() 267*a65addddSAndroid Build Coastguard Worker .installComponentFunctions(fruit::componentFunction(getParentComponent, 5, std::string("Hello"), 15)); 268*a65addddSAndroid Build Coastguard Worker } 269*a65addddSAndroid Build Coastguard Worker ''' 270*a65addddSAndroid Build Coastguard Worker expect_generic_compile_error( 271*a65addddSAndroid Build Coastguard Worker r'error: use of deleted function .Arg::Arg\(const Arg&\).' 272*a65addddSAndroid Build Coastguard Worker r'|error: call to deleted constructor of .Arg.' 273*a65addddSAndroid Build Coastguard Worker r'|error C2280: .Arg::Arg\(const Arg &\).: attempting to reference a deleted function' 274*a65addddSAndroid Build Coastguard Worker r'|.std::tuple<int,std::string,Arg>::tuple.: no overloaded function takes 3 arguments' 275*a65addddSAndroid Build Coastguard Worker # This is the error printed by MSVC. It's not great but I couldn't find a way to have it print 276*a65addddSAndroid Build Coastguard Worker # a more useful error. 277*a65addddSAndroid Build Coastguard Worker r'|cannot convert argument 1 from .int. to .std::allocator_arg_t.', 278*a65addddSAndroid Build Coastguard Worker COMMON_DEFINITIONS, 279*a65addddSAndroid Build Coastguard Worker source) 280*a65addddSAndroid Build Coastguard Worker 281*a65addddSAndroid Build Coastguard Worker def test_component_function_error_not_move_assignable(self): 282*a65addddSAndroid Build Coastguard Worker source = ''' 283*a65addddSAndroid Build Coastguard Worker struct X {}; 284*a65addddSAndroid Build Coastguard Worker 285*a65addddSAndroid Build Coastguard Worker struct Arg { 286*a65addddSAndroid Build Coastguard Worker Arg() = default; 287*a65addddSAndroid Build Coastguard Worker Arg(const Arg&) = default; 288*a65addddSAndroid Build Coastguard Worker Arg(Arg&&) = default; 289*a65addddSAndroid Build Coastguard Worker Arg& operator=(const Arg&) = default; 290*a65addddSAndroid Build Coastguard Worker Arg& operator=(Arg&&) = delete; 291*a65addddSAndroid Build Coastguard Worker }; 292*a65addddSAndroid Build Coastguard Worker 293*a65addddSAndroid Build Coastguard Worker bool operator==(const Arg&, const Arg&); 294*a65addddSAndroid Build Coastguard Worker 295*a65addddSAndroid Build Coastguard Worker namespace std { 296*a65addddSAndroid Build Coastguard Worker template <> 297*a65addddSAndroid Build Coastguard Worker struct hash<Arg> { 298*a65addddSAndroid Build Coastguard Worker size_t operator()(const Arg&); 299*a65addddSAndroid Build Coastguard Worker }; 300*a65addddSAndroid Build Coastguard Worker } 301*a65addddSAndroid Build Coastguard Worker 302*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getParentComponent(int, std::string, Arg); 303*a65addddSAndroid Build Coastguard Worker 304*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getComponent() { 305*a65addddSAndroid Build Coastguard Worker return fruit::createComponent() 306*a65addddSAndroid Build Coastguard Worker .installComponentFunctions(fruit::componentFunction(getParentComponent, 5, std::string("Hello"), Arg{})); 307*a65addddSAndroid Build Coastguard Worker } 308*a65addddSAndroid Build Coastguard Worker ''' 309*a65addddSAndroid Build Coastguard Worker expect_generic_compile_error( 310*a65addddSAndroid Build Coastguard Worker r'error: use of deleted function .Arg& Arg::operator=\(Arg&&\).' 311*a65addddSAndroid Build Coastguard Worker r'|error: overload resolution selected deleted operator .=.' 312*a65addddSAndroid Build Coastguard Worker r'|error C2280: .Arg &Arg::operator =\(Arg &&\).: attempting to reference a deleted function', 313*a65addddSAndroid Build Coastguard Worker COMMON_DEFINITIONS, 314*a65addddSAndroid Build Coastguard Worker source) 315*a65addddSAndroid Build Coastguard Worker 316*a65addddSAndroid Build Coastguard Worker def test_component_function_error_not_move_assignable_with_conversion(self): 317*a65addddSAndroid Build Coastguard Worker source = ''' 318*a65addddSAndroid Build Coastguard Worker struct X {}; 319*a65addddSAndroid Build Coastguard Worker 320*a65addddSAndroid Build Coastguard Worker struct Arg { 321*a65addddSAndroid Build Coastguard Worker Arg(int) {} 322*a65addddSAndroid Build Coastguard Worker Arg() = default; 323*a65addddSAndroid Build Coastguard Worker Arg(const Arg&) = default; 324*a65addddSAndroid Build Coastguard Worker Arg(Arg&&) = default; 325*a65addddSAndroid Build Coastguard Worker Arg& operator=(const Arg&) = default; 326*a65addddSAndroid Build Coastguard Worker Arg& operator=(Arg&&) = delete; 327*a65addddSAndroid Build Coastguard Worker }; 328*a65addddSAndroid Build Coastguard Worker 329*a65addddSAndroid Build Coastguard Worker bool operator==(const Arg&, const Arg&); 330*a65addddSAndroid Build Coastguard Worker 331*a65addddSAndroid Build Coastguard Worker namespace std { 332*a65addddSAndroid Build Coastguard Worker template <> 333*a65addddSAndroid Build Coastguard Worker struct hash<Arg> { 334*a65addddSAndroid Build Coastguard Worker size_t operator()(const Arg&); 335*a65addddSAndroid Build Coastguard Worker }; 336*a65addddSAndroid Build Coastguard Worker } 337*a65addddSAndroid Build Coastguard Worker 338*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getParentComponent(int, std::string, Arg); 339*a65addddSAndroid Build Coastguard Worker 340*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getComponent() { 341*a65addddSAndroid Build Coastguard Worker return fruit::createComponent() 342*a65addddSAndroid Build Coastguard Worker .installComponentFunctions(fruit::componentFunction(getParentComponent, 5, std::string("Hello"), 15)); 343*a65addddSAndroid Build Coastguard Worker } 344*a65addddSAndroid Build Coastguard Worker ''' 345*a65addddSAndroid Build Coastguard Worker expect_generic_compile_error( 346*a65addddSAndroid Build Coastguard Worker r'error: use of deleted function .Arg& Arg::operator=\(Arg&&\).' 347*a65addddSAndroid Build Coastguard Worker r'|error: overload resolution selected deleted operator .=.' 348*a65addddSAndroid Build Coastguard Worker r'|error C2280: .Arg &Arg::operator =\(Arg &&\).: attempting to reference a deleted function', 349*a65addddSAndroid Build Coastguard Worker COMMON_DEFINITIONS, 350*a65addddSAndroid Build Coastguard Worker source) 351*a65addddSAndroid Build Coastguard Worker 352*a65addddSAndroid Build Coastguard Worker def test_component_function_error_not_copy_assignable(self): 353*a65addddSAndroid Build Coastguard Worker source = ''' 354*a65addddSAndroid Build Coastguard Worker struct X { 355*a65addddSAndroid Build Coastguard Worker int n; 356*a65addddSAndroid Build Coastguard Worker X(int n) : n(n) {} 357*a65addddSAndroid Build Coastguard Worker }; 358*a65addddSAndroid Build Coastguard Worker 359*a65addddSAndroid Build Coastguard Worker struct Arg { 360*a65addddSAndroid Build Coastguard Worker Arg() = default; 361*a65addddSAndroid Build Coastguard Worker Arg(const Arg&) = default; 362*a65addddSAndroid Build Coastguard Worker Arg(Arg&&) = default; 363*a65addddSAndroid Build Coastguard Worker Arg& operator=(const Arg&) = delete; 364*a65addddSAndroid Build Coastguard Worker Arg& operator=(Arg&&) = default; 365*a65addddSAndroid Build Coastguard Worker }; 366*a65addddSAndroid Build Coastguard Worker 367*a65addddSAndroid Build Coastguard Worker bool operator==(const Arg&, const Arg&); 368*a65addddSAndroid Build Coastguard Worker 369*a65addddSAndroid Build Coastguard Worker namespace std { 370*a65addddSAndroid Build Coastguard Worker template <> 371*a65addddSAndroid Build Coastguard Worker struct hash<Arg> { 372*a65addddSAndroid Build Coastguard Worker size_t operator()(const Arg&); 373*a65addddSAndroid Build Coastguard Worker }; 374*a65addddSAndroid Build Coastguard Worker } 375*a65addddSAndroid Build Coastguard Worker 376*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getParentComponent(int, std::string, Arg); 377*a65addddSAndroid Build Coastguard Worker 378*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getComponent() { 379*a65addddSAndroid Build Coastguard Worker return fruit::createComponent() 380*a65addddSAndroid Build Coastguard Worker .installComponentFunctions(fruit::componentFunction(getParentComponent, 5, std::string("Hello"), Arg{})); 381*a65addddSAndroid Build Coastguard Worker } 382*a65addddSAndroid Build Coastguard Worker ''' 383*a65addddSAndroid Build Coastguard Worker expect_generic_compile_error( 384*a65addddSAndroid Build Coastguard Worker r'error: use of deleted function .Arg& Arg::operator=\(const Arg&\).' 385*a65addddSAndroid Build Coastguard Worker r'|error: overload resolution selected deleted operator .=.' 386*a65addddSAndroid Build Coastguard Worker r'|error C2280: .Arg &Arg::operator =\(const Arg &\).: attempting to reference a deleted function', 387*a65addddSAndroid Build Coastguard Worker COMMON_DEFINITIONS, 388*a65addddSAndroid Build Coastguard Worker source) 389*a65addddSAndroid Build Coastguard Worker 390*a65addddSAndroid Build Coastguard Worker def test_component_function_error_not_copy_assignable_with_conversion(self): 391*a65addddSAndroid Build Coastguard Worker source = ''' 392*a65addddSAndroid Build Coastguard Worker struct X { 393*a65addddSAndroid Build Coastguard Worker int n; 394*a65addddSAndroid Build Coastguard Worker X(int n) : n(n) {} 395*a65addddSAndroid Build Coastguard Worker }; 396*a65addddSAndroid Build Coastguard Worker 397*a65addddSAndroid Build Coastguard Worker struct Arg { 398*a65addddSAndroid Build Coastguard Worker Arg(int) {} 399*a65addddSAndroid Build Coastguard Worker Arg() = default; 400*a65addddSAndroid Build Coastguard Worker Arg(const Arg&) = default; 401*a65addddSAndroid Build Coastguard Worker Arg(Arg&&) = default; 402*a65addddSAndroid Build Coastguard Worker Arg& operator=(const Arg&) = delete; 403*a65addddSAndroid Build Coastguard Worker Arg& operator=(Arg&&) = default; 404*a65addddSAndroid Build Coastguard Worker }; 405*a65addddSAndroid Build Coastguard Worker 406*a65addddSAndroid Build Coastguard Worker bool operator==(const Arg&, const Arg&); 407*a65addddSAndroid Build Coastguard Worker 408*a65addddSAndroid Build Coastguard Worker namespace std { 409*a65addddSAndroid Build Coastguard Worker template <> 410*a65addddSAndroid Build Coastguard Worker struct hash<Arg> { 411*a65addddSAndroid Build Coastguard Worker size_t operator()(const Arg&); 412*a65addddSAndroid Build Coastguard Worker }; 413*a65addddSAndroid Build Coastguard Worker } 414*a65addddSAndroid Build Coastguard Worker 415*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getParentComponent(int, std::string, Arg); 416*a65addddSAndroid Build Coastguard Worker 417*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getComponent() { 418*a65addddSAndroid Build Coastguard Worker return fruit::createComponent() 419*a65addddSAndroid Build Coastguard Worker .installComponentFunctions(fruit::componentFunction(getParentComponent, 5, std::string("Hello"), 15)); 420*a65addddSAndroid Build Coastguard Worker } 421*a65addddSAndroid Build Coastguard Worker ''' 422*a65addddSAndroid Build Coastguard Worker expect_generic_compile_error( 423*a65addddSAndroid Build Coastguard Worker r'error: use of deleted function .Arg& Arg::operator=\(const Arg&\).' 424*a65addddSAndroid Build Coastguard Worker r'|error: overload resolution selected deleted operator .=.' 425*a65addddSAndroid Build Coastguard Worker r'|error C2280: .Arg &Arg::operator =\(const Arg &\).: attempting to reference a deleted function', 426*a65addddSAndroid Build Coastguard Worker COMMON_DEFINITIONS, 427*a65addddSAndroid Build Coastguard Worker source) 428*a65addddSAndroid Build Coastguard Worker 429*a65addddSAndroid Build Coastguard Worker def test_component_function_error_not_equality_comparable(self): 430*a65addddSAndroid Build Coastguard Worker source = ''' 431*a65addddSAndroid Build Coastguard Worker struct X { 432*a65addddSAndroid Build Coastguard Worker int n; 433*a65addddSAndroid Build Coastguard Worker X(int n) : n(n) {} 434*a65addddSAndroid Build Coastguard Worker }; 435*a65addddSAndroid Build Coastguard Worker 436*a65addddSAndroid Build Coastguard Worker struct Arg { 437*a65addddSAndroid Build Coastguard Worker Arg() = default; 438*a65addddSAndroid Build Coastguard Worker Arg(const Arg&) = default; 439*a65addddSAndroid Build Coastguard Worker Arg(Arg&&) = default; 440*a65addddSAndroid Build Coastguard Worker Arg& operator=(const Arg&) = default; 441*a65addddSAndroid Build Coastguard Worker Arg& operator=(Arg&&) = default; 442*a65addddSAndroid Build Coastguard Worker }; 443*a65addddSAndroid Build Coastguard Worker 444*a65addddSAndroid Build Coastguard Worker namespace std { 445*a65addddSAndroid Build Coastguard Worker template <> 446*a65addddSAndroid Build Coastguard Worker struct hash<Arg> { 447*a65addddSAndroid Build Coastguard Worker size_t operator()(const Arg&); 448*a65addddSAndroid Build Coastguard Worker }; 449*a65addddSAndroid Build Coastguard Worker } 450*a65addddSAndroid Build Coastguard Worker 451*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getParentComponent(int, std::string, Arg); 452*a65addddSAndroid Build Coastguard Worker 453*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getComponent() { 454*a65addddSAndroid Build Coastguard Worker return fruit::createComponent() 455*a65addddSAndroid Build Coastguard Worker .installComponentFunctions(fruit::componentFunction(getParentComponent, 5, std::string("Hello"), Arg{})); 456*a65addddSAndroid Build Coastguard Worker } 457*a65addddSAndroid Build Coastguard Worker ''' 458*a65addddSAndroid Build Coastguard Worker expect_generic_compile_error( 459*a65addddSAndroid Build Coastguard Worker r'error: no match for .operator==. \(operand types are .const Arg. and .const Arg.\)' 460*a65addddSAndroid Build Coastguard Worker r'|error: invalid operands to binary expression \(.const Arg. and .const Arg.\)' 461*a65addddSAndroid Build Coastguard Worker r'|error C2676: binary .==.: .const Arg. does not define this operator', 462*a65addddSAndroid Build Coastguard Worker COMMON_DEFINITIONS, 463*a65addddSAndroid Build Coastguard Worker source) 464*a65addddSAndroid Build Coastguard Worker 465*a65addddSAndroid Build Coastguard Worker def test_component_function_error_not_equality_comparable_with_conversion(self): 466*a65addddSAndroid Build Coastguard Worker source = ''' 467*a65addddSAndroid Build Coastguard Worker struct X { 468*a65addddSAndroid Build Coastguard Worker int n; 469*a65addddSAndroid Build Coastguard Worker X(int n) : n(n) {} 470*a65addddSAndroid Build Coastguard Worker }; 471*a65addddSAndroid Build Coastguard Worker 472*a65addddSAndroid Build Coastguard Worker struct Arg { 473*a65addddSAndroid Build Coastguard Worker Arg(int) {} 474*a65addddSAndroid Build Coastguard Worker Arg() = default; 475*a65addddSAndroid Build Coastguard Worker Arg(const Arg&) = default; 476*a65addddSAndroid Build Coastguard Worker Arg(Arg&&) = default; 477*a65addddSAndroid Build Coastguard Worker Arg& operator=(const Arg&) = default; 478*a65addddSAndroid Build Coastguard Worker Arg& operator=(Arg&&) = default; 479*a65addddSAndroid Build Coastguard Worker }; 480*a65addddSAndroid Build Coastguard Worker 481*a65addddSAndroid Build Coastguard Worker namespace std { 482*a65addddSAndroid Build Coastguard Worker template <> 483*a65addddSAndroid Build Coastguard Worker struct hash<Arg> { 484*a65addddSAndroid Build Coastguard Worker size_t operator()(const Arg&); 485*a65addddSAndroid Build Coastguard Worker }; 486*a65addddSAndroid Build Coastguard Worker } 487*a65addddSAndroid Build Coastguard Worker 488*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getParentComponent(int, std::string, Arg); 489*a65addddSAndroid Build Coastguard Worker 490*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getComponent() { 491*a65addddSAndroid Build Coastguard Worker return fruit::createComponent() 492*a65addddSAndroid Build Coastguard Worker .installComponentFunctions(fruit::componentFunction(getParentComponent, 5, std::string("Hello"), 15)); 493*a65addddSAndroid Build Coastguard Worker } 494*a65addddSAndroid Build Coastguard Worker ''' 495*a65addddSAndroid Build Coastguard Worker expect_generic_compile_error( 496*a65addddSAndroid Build Coastguard Worker r'error: no match for .operator==. \(operand types are .const Arg. and .const Arg.\)' 497*a65addddSAndroid Build Coastguard Worker r'|error: invalid operands to binary expression \(.const Arg. and .const Arg.\)' 498*a65addddSAndroid Build Coastguard Worker r'|error C2676: binary .==.: .const Arg. does not define this operator', 499*a65addddSAndroid Build Coastguard Worker COMMON_DEFINITIONS, 500*a65addddSAndroid Build Coastguard Worker source) 501*a65addddSAndroid Build Coastguard Worker 502*a65addddSAndroid Build Coastguard Worker def test_component_function_error_not_hashable(self): 503*a65addddSAndroid Build Coastguard Worker source = ''' 504*a65addddSAndroid Build Coastguard Worker struct X {}; 505*a65addddSAndroid Build Coastguard Worker 506*a65addddSAndroid Build Coastguard Worker struct Arg { 507*a65addddSAndroid Build Coastguard Worker Arg() = default; 508*a65addddSAndroid Build Coastguard Worker Arg(const Arg&) = default; 509*a65addddSAndroid Build Coastguard Worker Arg(Arg&&) = default; 510*a65addddSAndroid Build Coastguard Worker Arg& operator=(const Arg&) = default; 511*a65addddSAndroid Build Coastguard Worker Arg& operator=(Arg&&) = default; 512*a65addddSAndroid Build Coastguard Worker }; 513*a65addddSAndroid Build Coastguard Worker 514*a65addddSAndroid Build Coastguard Worker bool operator==(const Arg&, const Arg&); 515*a65addddSAndroid Build Coastguard Worker 516*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getParentComponent(int, std::string, Arg); 517*a65addddSAndroid Build Coastguard Worker 518*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getComponent() { 519*a65addddSAndroid Build Coastguard Worker return fruit::createComponent() 520*a65addddSAndroid Build Coastguard Worker .installComponentFunctions(fruit::componentFunction(getParentComponent, 5, std::string("Hello"), Arg{})); 521*a65addddSAndroid Build Coastguard Worker } 522*a65addddSAndroid Build Coastguard Worker ''' 523*a65addddSAndroid Build Coastguard Worker expect_generic_compile_error( 524*a65addddSAndroid Build Coastguard Worker r'error: use of deleted function .std::hash<Arg>::hash\(\).' 525*a65addddSAndroid Build Coastguard Worker r'|error: call to implicitly-deleted default constructor of .std::hash<Arg>.' 526*a65addddSAndroid Build Coastguard Worker r'|error: invalid use of incomplete type .struct std::hash<Arg>.' 527*a65addddSAndroid Build Coastguard Worker r'|error: implicit instantiation of undefined template .std::(__1::)?hash<Arg>.' 528*a65addddSAndroid Build Coastguard Worker r'|error C2338: The C\+\+ Standard doesn.t provide a hash for this type.' 529*a65addddSAndroid Build Coastguard Worker r'|error C2064: term does not evaluate to a function taking 1 arguments', 530*a65addddSAndroid Build Coastguard Worker COMMON_DEFINITIONS, 531*a65addddSAndroid Build Coastguard Worker source) 532*a65addddSAndroid Build Coastguard Worker 533*a65addddSAndroid Build Coastguard Worker def test_component_function_error_not_hashable_with_conversion(self): 534*a65addddSAndroid Build Coastguard Worker source = ''' 535*a65addddSAndroid Build Coastguard Worker struct X {}; 536*a65addddSAndroid Build Coastguard Worker 537*a65addddSAndroid Build Coastguard Worker struct Arg { 538*a65addddSAndroid Build Coastguard Worker Arg(int) {} 539*a65addddSAndroid Build Coastguard Worker Arg() = default; 540*a65addddSAndroid Build Coastguard Worker Arg(const Arg&) = default; 541*a65addddSAndroid Build Coastguard Worker Arg(Arg&&) = default; 542*a65addddSAndroid Build Coastguard Worker Arg& operator=(const Arg&) = default; 543*a65addddSAndroid Build Coastguard Worker Arg& operator=(Arg&&) = default; 544*a65addddSAndroid Build Coastguard Worker }; 545*a65addddSAndroid Build Coastguard Worker 546*a65addddSAndroid Build Coastguard Worker bool operator==(const Arg&, const Arg&); 547*a65addddSAndroid Build Coastguard Worker 548*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getParentComponent(int, std::string, Arg); 549*a65addddSAndroid Build Coastguard Worker 550*a65addddSAndroid Build Coastguard Worker fruit::Component<X> getComponent() { 551*a65addddSAndroid Build Coastguard Worker return fruit::createComponent() 552*a65addddSAndroid Build Coastguard Worker .installComponentFunctions(fruit::componentFunction(getParentComponent, 5, std::string("Hello"), 15)); 553*a65addddSAndroid Build Coastguard Worker } 554*a65addddSAndroid Build Coastguard Worker ''' 555*a65addddSAndroid Build Coastguard Worker expect_generic_compile_error( 556*a65addddSAndroid Build Coastguard Worker r'error: use of deleted function .std::hash<Arg>::hash\(\).' 557*a65addddSAndroid Build Coastguard Worker r'|error: call to implicitly-deleted default constructor of .std::hash<Arg>.' 558*a65addddSAndroid Build Coastguard Worker r'|error: invalid use of incomplete type .struct std::hash<Arg>.' 559*a65addddSAndroid Build Coastguard Worker r'|error: implicit instantiation of undefined template .std::(__1::)?hash<Arg>.' 560*a65addddSAndroid Build Coastguard Worker r'|error C2338: The C\+\+ Standard doesn.t provide a hash for this type.' 561*a65addddSAndroid Build Coastguard Worker r'|error C2064: term does not evaluate to a function taking 1 arguments', 562*a65addddSAndroid Build Coastguard Worker COMMON_DEFINITIONS, 563*a65addddSAndroid Build Coastguard Worker source) 564*a65addddSAndroid Build Coastguard Worker 565*a65addddSAndroid Build Coastguard Workerif __name__ == '__main__': 566*a65addddSAndroid Build Coastguard Worker absltest.main() 567