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