xref: /aosp_15_r20/external/google-fruit/tests/test_component_functions.py (revision a65addddcf69f38db5b288d787b6b7571a57bb8f)
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