#!/usr/bin/env python3 # Copyright 2016 Google Inc. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS-IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from absl.testing import parameterized from fruit_test_common import * COMMON_DEFINITIONS = ''' #include "test_common.h" // The shared_ptr objects below ensure (since these tests are run under Valgrind) that deletion occurs, and only once. struct I1 { std::shared_ptr x = std::make_shared(3); virtual ~I1() {} }; struct I2 { std::shared_ptr x = std::make_shared(3); }; struct I3 { std::shared_ptr x = std::make_shared(3); }; struct I4 { std::shared_ptr x = std::make_shared(3); }; struct X1 : I1 { INJECT(X1()) = default; std::shared_ptr x = std::make_shared(3); }; struct X2 : I2 { // Taking an X1 here prevents binding compression. INJECT(X2(X1)) {} std::shared_ptr x = std::make_shared(3); }; struct X3 : public I3 { std::shared_ptr x = std::make_shared(3); }; struct X4 : public I4 { // Taking an X3 here prevents binding compression. X4(X3) {}; std::shared_ptr x = std::make_shared(3); }; struct X5 { std::shared_ptr x = std::make_shared(3); }; struct X6 : public I1 { INJECT(X6()) = default; std::shared_ptr x = std::make_shared(3); }; struct X7 : public I1 { std::shared_ptr x = std::make_shared(3); }; struct X8 : public I1 { std::shared_ptr x = std::make_shared(3); virtual ~X8() {} }; struct Annotation {}; using I1Annot = fruit::Annotated; using I2Annot = fruit::Annotated; using I3Annot = fruit::Annotated; using I4Annot = fruit::Annotated; using X1Annot = fruit::Annotated; using X2Annot = fruit::Annotated; using X3Annot = fruit::Annotated; using X4Annot = fruit::Annotated; using X5Annot = fruit::Annotated; using X6Annot = fruit::Annotated; using X7Annot = fruit::Annotated; using X8Annot = fruit::Annotated; using X1PtrAnnot = fruit::Annotated; ''' class TestClassDestruction(parameterized.TestCase): @parameterized.parameters([ ('I1', 'I2', 'I3', 'I4', 'X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'X8', 'X1*', 'bindInstance(x5)', 'addInstanceMultibinding(*x7)'), ('I1Annot', 'I2Annot', 'I3Annot', 'I4Annot', 'X1Annot', 'X2Annot', 'X3Annot', 'X4Annot', 'X5Annot', 'X6Annot', 'X7Annot', 'X8Annot', 'X1PtrAnnot', 'bindInstance(x5)', 'addInstanceMultibinding(*x7)'), ]) def test_injector_creation_no_injection(self, I1Annot, I2Annot, I3Annot, I4Annot, X1Annot, X2Annot, X3Annot, X4Annot, X5Annot, X6Annot, X7Annot, X8Annot, X1PtrAnnot, bindX5Instance, addX7InstanceMultibinding): source = ''' fruit::Component getComponent() { static X5 x5; static std::unique_ptr x7(new X7()); return fruit::createComponent() .bind() .bind() .bind() .bind() .registerProvider([]() { return X3(); }) .registerProvider([](X3 x3) { return X4(x3); }) .bindX5Instance .addMultibinding() .addX7InstanceMultibinding .addMultibindingProvider([]() { return (X1*) new X8(); }); } int main() { fruit::Injector injector(getComponent); (void)injector; } ''' expect_success( COMMON_DEFINITIONS, source, locals()) @parameterized.parameters([ ('I1', 'I2', 'I3', 'I4', 'X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'X8', 'X1*', 'bindInstance(x5)', 'addInstanceMultibinding(*x7)'), ('I1Annot', 'I2Annot', 'I3Annot', 'I4Annot', 'X1Annot', 'X2Annot', 'X3Annot', 'X4Annot', 'X5Annot', 'X6Annot', 'X7Annot', 'X8Annot', 'X1PtrAnnot', 'bindInstance(x5)', 'addInstanceMultibinding(*x7)'), ]) def test_injector_creation_and_injection(self, I1Annot, I2Annot, I3Annot, I4Annot, X1Annot, X2Annot, X3Annot, X4Annot, X5Annot, X6Annot, X7Annot, X8Annot, X1PtrAnnot, bindX5Instance, addX7InstanceMultibinding): source = ''' fruit::Component getComponent() { static X5 x5; static std::unique_ptr x7(new X7()); return fruit::createComponent() .bind() .bind() .bind() .bind() .registerProvider([]() { return X3(); }) .registerProvider([](X3 x3) { return X4(x3); }) .bindX5Instance .addMultibinding() .addX7InstanceMultibinding .addMultibindingProvider([]() { return (X1*) new X8(); }); } int main() { fruit::Injector injector(getComponent); injector.get(); injector.get(); injector.get(); injector.get(); injector.get(); injector.getMultibindings(); } ''' expect_success( COMMON_DEFINITIONS, source, locals()) if __name__ == '__main__': absltest.main()