xref: /aosp_15_r20/external/google-fruit/tests/test_class_destruction.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    // The shared_ptr objects below ensure (since these tests are run under Valgrind) that deletion occurs, and only once.
23*a65addddSAndroid Build Coastguard Worker
24*a65addddSAndroid Build Coastguard Worker    struct I1 {
25*a65addddSAndroid Build Coastguard Worker      std::shared_ptr<int> x = std::make_shared<int>(3);
26*a65addddSAndroid Build Coastguard Worker      virtual ~I1() {}
27*a65addddSAndroid Build Coastguard Worker    };
28*a65addddSAndroid Build Coastguard Worker
29*a65addddSAndroid Build Coastguard Worker    struct I2 {
30*a65addddSAndroid Build Coastguard Worker      std::shared_ptr<int> x = std::make_shared<int>(3);
31*a65addddSAndroid Build Coastguard Worker    };
32*a65addddSAndroid Build Coastguard Worker
33*a65addddSAndroid Build Coastguard Worker    struct I3 {
34*a65addddSAndroid Build Coastguard Worker      std::shared_ptr<int> x = std::make_shared<int>(3);
35*a65addddSAndroid Build Coastguard Worker    };
36*a65addddSAndroid Build Coastguard Worker
37*a65addddSAndroid Build Coastguard Worker    struct I4 {
38*a65addddSAndroid Build Coastguard Worker      std::shared_ptr<int> x = std::make_shared<int>(3);
39*a65addddSAndroid Build Coastguard Worker    };
40*a65addddSAndroid Build Coastguard Worker
41*a65addddSAndroid Build Coastguard Worker    struct X1 : I1 {
42*a65addddSAndroid Build Coastguard Worker      INJECT(X1()) = default;
43*a65addddSAndroid Build Coastguard Worker      std::shared_ptr<int> x = std::make_shared<int>(3);
44*a65addddSAndroid Build Coastguard Worker    };
45*a65addddSAndroid Build Coastguard Worker
46*a65addddSAndroid Build Coastguard Worker    struct X2 : I2 {
47*a65addddSAndroid Build Coastguard Worker      // Taking an X1 here prevents binding compression.
48*a65addddSAndroid Build Coastguard Worker      INJECT(X2(X1)) {}
49*a65addddSAndroid Build Coastguard Worker      std::shared_ptr<int> x = std::make_shared<int>(3);
50*a65addddSAndroid Build Coastguard Worker    };
51*a65addddSAndroid Build Coastguard Worker
52*a65addddSAndroid Build Coastguard Worker    struct X3 : public I3 {
53*a65addddSAndroid Build Coastguard Worker      std::shared_ptr<int> x = std::make_shared<int>(3);
54*a65addddSAndroid Build Coastguard Worker    };
55*a65addddSAndroid Build Coastguard Worker
56*a65addddSAndroid Build Coastguard Worker    struct X4 : public I4 {
57*a65addddSAndroid Build Coastguard Worker      // Taking an X3 here prevents binding compression.
58*a65addddSAndroid Build Coastguard Worker      X4(X3) {};
59*a65addddSAndroid Build Coastguard Worker      std::shared_ptr<int> x = std::make_shared<int>(3);
60*a65addddSAndroid Build Coastguard Worker    };
61*a65addddSAndroid Build Coastguard Worker
62*a65addddSAndroid Build Coastguard Worker    struct X5 {
63*a65addddSAndroid Build Coastguard Worker      std::shared_ptr<int> x = std::make_shared<int>(3);
64*a65addddSAndroid Build Coastguard Worker    };
65*a65addddSAndroid Build Coastguard Worker
66*a65addddSAndroid Build Coastguard Worker    struct X6 : public I1 {
67*a65addddSAndroid Build Coastguard Worker      INJECT(X6()) = default;
68*a65addddSAndroid Build Coastguard Worker      std::shared_ptr<int> x = std::make_shared<int>(3);
69*a65addddSAndroid Build Coastguard Worker    };
70*a65addddSAndroid Build Coastguard Worker
71*a65addddSAndroid Build Coastguard Worker    struct X7 : public I1 {
72*a65addddSAndroid Build Coastguard Worker      std::shared_ptr<int> x = std::make_shared<int>(3);
73*a65addddSAndroid Build Coastguard Worker    };
74*a65addddSAndroid Build Coastguard Worker
75*a65addddSAndroid Build Coastguard Worker    struct X8 : public I1 {
76*a65addddSAndroid Build Coastguard Worker      std::shared_ptr<int> x = std::make_shared<int>(3);
77*a65addddSAndroid Build Coastguard Worker      virtual ~X8() {}
78*a65addddSAndroid Build Coastguard Worker    };
79*a65addddSAndroid Build Coastguard Worker
80*a65addddSAndroid Build Coastguard Worker    struct Annotation {};
81*a65addddSAndroid Build Coastguard Worker
82*a65addddSAndroid Build Coastguard Worker    using I1Annot = fruit::Annotated<Annotation, I1>;
83*a65addddSAndroid Build Coastguard Worker    using I2Annot = fruit::Annotated<Annotation, I2>;
84*a65addddSAndroid Build Coastguard Worker    using I3Annot = fruit::Annotated<Annotation, I3>;
85*a65addddSAndroid Build Coastguard Worker    using I4Annot = fruit::Annotated<Annotation, I4>;
86*a65addddSAndroid Build Coastguard Worker
87*a65addddSAndroid Build Coastguard Worker    using X1Annot = fruit::Annotated<Annotation, X1>;
88*a65addddSAndroid Build Coastguard Worker    using X2Annot = fruit::Annotated<Annotation, X2>;
89*a65addddSAndroid Build Coastguard Worker    using X3Annot = fruit::Annotated<Annotation, X3>;
90*a65addddSAndroid Build Coastguard Worker    using X4Annot = fruit::Annotated<Annotation, X4>;
91*a65addddSAndroid Build Coastguard Worker    using X5Annot = fruit::Annotated<Annotation, X5>;
92*a65addddSAndroid Build Coastguard Worker    using X6Annot = fruit::Annotated<Annotation, X6>;
93*a65addddSAndroid Build Coastguard Worker    using X7Annot = fruit::Annotated<Annotation, X7>;
94*a65addddSAndroid Build Coastguard Worker    using X8Annot = fruit::Annotated<Annotation, X8>;
95*a65addddSAndroid Build Coastguard Worker
96*a65addddSAndroid Build Coastguard Worker    using X1PtrAnnot = fruit::Annotated<Annotation, X1*>;
97*a65addddSAndroid Build Coastguard Worker    '''
98*a65addddSAndroid Build Coastguard Worker
99*a65addddSAndroid Build Coastguard Workerclass TestClassDestruction(parameterized.TestCase):
100*a65addddSAndroid Build Coastguard Worker    @parameterized.parameters([
101*a65addddSAndroid Build Coastguard Worker        ('I1', 'I2', 'I3', 'I4', 'X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'X8', 'X1*', 'bindInstance(x5)', 'addInstanceMultibinding(*x7)'),
102*a65addddSAndroid Build Coastguard Worker        ('I1Annot', 'I2Annot', 'I3Annot', 'I4Annot', 'X1Annot', 'X2Annot', 'X3Annot', 'X4Annot', 'X5Annot', 'X6Annot', 'X7Annot', 'X8Annot', 'X1PtrAnnot', 'bindInstance<X5Annot>(x5)', 'addInstanceMultibinding<X7Annot>(*x7)'),
103*a65addddSAndroid Build Coastguard Worker    ])
104*a65addddSAndroid Build Coastguard Worker    def test_injector_creation_no_injection(self,
105*a65addddSAndroid Build Coastguard Worker            I1Annot, I2Annot, I3Annot, I4Annot, X1Annot, X2Annot, X3Annot, X4Annot, X5Annot, X6Annot, X7Annot, X8Annot, X1PtrAnnot, bindX5Instance, addX7InstanceMultibinding):
106*a65addddSAndroid Build Coastguard Worker        source = '''
107*a65addddSAndroid Build Coastguard Worker            fruit::Component<I1Annot, I2Annot, I3Annot, I4Annot, X5Annot> getComponent() {
108*a65addddSAndroid Build Coastguard Worker              static X5 x5;
109*a65addddSAndroid Build Coastguard Worker              static std::unique_ptr<X7> x7(new X7());
110*a65addddSAndroid Build Coastguard Worker              return fruit::createComponent()
111*a65addddSAndroid Build Coastguard Worker                  .bind<I1Annot, X1Annot>()
112*a65addddSAndroid Build Coastguard Worker                  .bind<I2Annot, X2Annot>()
113*a65addddSAndroid Build Coastguard Worker                  .bind<I3Annot, X3Annot>()
114*a65addddSAndroid Build Coastguard Worker                  .bind<I4Annot, X4Annot>()
115*a65addddSAndroid Build Coastguard Worker                  .registerProvider<X3Annot()>([]() { return X3(); })
116*a65addddSAndroid Build Coastguard Worker                  .registerProvider<X4Annot(X3Annot)>([](X3 x3) { return X4(x3); })
117*a65addddSAndroid Build Coastguard Worker                  .bindX5Instance
118*a65addddSAndroid Build Coastguard Worker                  .addMultibinding<I1Annot, X6Annot>()
119*a65addddSAndroid Build Coastguard Worker                  .addX7InstanceMultibinding
120*a65addddSAndroid Build Coastguard Worker                  .addMultibindingProvider<X1PtrAnnot()>([]() { return (X1*) new X8(); });
121*a65addddSAndroid Build Coastguard Worker            }
122*a65addddSAndroid Build Coastguard Worker
123*a65addddSAndroid Build Coastguard Worker            int main() {
124*a65addddSAndroid Build Coastguard Worker              fruit::Injector<I1Annot, I2Annot, I3Annot, I4Annot, X5Annot> injector(getComponent);
125*a65addddSAndroid Build Coastguard Worker              (void)injector;
126*a65addddSAndroid Build Coastguard Worker            }
127*a65addddSAndroid Build Coastguard Worker            '''
128*a65addddSAndroid Build Coastguard Worker        expect_success(
129*a65addddSAndroid Build Coastguard Worker            COMMON_DEFINITIONS,
130*a65addddSAndroid Build Coastguard Worker            source,
131*a65addddSAndroid Build Coastguard Worker            locals())
132*a65addddSAndroid Build Coastguard Worker
133*a65addddSAndroid Build Coastguard Worker    @parameterized.parameters([
134*a65addddSAndroid Build Coastguard Worker        ('I1', 'I2', 'I3', 'I4', 'X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'X8', 'X1*', 'bindInstance(x5)', 'addInstanceMultibinding(*x7)'),
135*a65addddSAndroid Build Coastguard Worker        ('I1Annot', 'I2Annot', 'I3Annot', 'I4Annot', 'X1Annot', 'X2Annot', 'X3Annot', 'X4Annot', 'X5Annot', 'X6Annot', 'X7Annot', 'X8Annot', 'X1PtrAnnot', 'bindInstance<X5Annot>(x5)', 'addInstanceMultibinding<X7Annot>(*x7)'),
136*a65addddSAndroid Build Coastguard Worker    ])
137*a65addddSAndroid Build Coastguard Worker    def test_injector_creation_and_injection(self,
138*a65addddSAndroid Build Coastguard Worker            I1Annot, I2Annot, I3Annot, I4Annot, X1Annot, X2Annot, X3Annot, X4Annot, X5Annot, X6Annot, X7Annot, X8Annot, X1PtrAnnot, bindX5Instance, addX7InstanceMultibinding):
139*a65addddSAndroid Build Coastguard Worker        source = '''
140*a65addddSAndroid Build Coastguard Worker            fruit::Component<I1Annot, I2Annot, I3Annot, I4Annot, X5Annot> getComponent() {
141*a65addddSAndroid Build Coastguard Worker              static X5 x5;
142*a65addddSAndroid Build Coastguard Worker              static std::unique_ptr<X7> x7(new X7());
143*a65addddSAndroid Build Coastguard Worker              return fruit::createComponent()
144*a65addddSAndroid Build Coastguard Worker                  .bind<I1Annot, X1Annot>()
145*a65addddSAndroid Build Coastguard Worker                  .bind<I2Annot, X2Annot>()
146*a65addddSAndroid Build Coastguard Worker                  .bind<I3Annot, X3Annot>()
147*a65addddSAndroid Build Coastguard Worker                  .bind<I4Annot, X4Annot>()
148*a65addddSAndroid Build Coastguard Worker                  .registerProvider<X3Annot()>([]() { return X3(); })
149*a65addddSAndroid Build Coastguard Worker                  .registerProvider<X4Annot(X3Annot)>([](X3 x3) { return X4(x3); })
150*a65addddSAndroid Build Coastguard Worker                  .bindX5Instance
151*a65addddSAndroid Build Coastguard Worker                  .addMultibinding<I1Annot, X6Annot>()
152*a65addddSAndroid Build Coastguard Worker                  .addX7InstanceMultibinding
153*a65addddSAndroid Build Coastguard Worker                  .addMultibindingProvider<X1PtrAnnot()>([]() { return (X1*) new X8(); });
154*a65addddSAndroid Build Coastguard Worker            }
155*a65addddSAndroid Build Coastguard Worker
156*a65addddSAndroid Build Coastguard Worker            int main() {
157*a65addddSAndroid Build Coastguard Worker              fruit::Injector<I1Annot, I2Annot, I3Annot, I4Annot, X5Annot> injector(getComponent);
158*a65addddSAndroid Build Coastguard Worker
159*a65addddSAndroid Build Coastguard Worker              injector.get<I1Annot>();
160*a65addddSAndroid Build Coastguard Worker              injector.get<I2Annot>();
161*a65addddSAndroid Build Coastguard Worker              injector.get<I3Annot>();
162*a65addddSAndroid Build Coastguard Worker              injector.get<I4Annot>();
163*a65addddSAndroid Build Coastguard Worker              injector.get<X5Annot>();
164*a65addddSAndroid Build Coastguard Worker
165*a65addddSAndroid Build Coastguard Worker              injector.getMultibindings<I1Annot>();
166*a65addddSAndroid Build Coastguard Worker            }
167*a65addddSAndroid Build Coastguard Worker            '''
168*a65addddSAndroid Build Coastguard Worker        expect_success(
169*a65addddSAndroid Build Coastguard Worker            COMMON_DEFINITIONS,
170*a65addddSAndroid Build Coastguard Worker            source,
171*a65addddSAndroid Build Coastguard Worker            locals())
172*a65addddSAndroid Build Coastguard Worker
173*a65addddSAndroid Build Coastguard Workerif __name__ == '__main__':
174*a65addddSAndroid Build Coastguard Worker    absltest.main()
175