1#!/usr/bin/env python3 2# Copyright 2016 Google Inc. All Rights Reserved. 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS-IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15 16from absl.testing import parameterized 17from fruit_test_common import * 18 19COMMON_DEFINITIONS = ''' 20 #include "test_common.h" 21 22 struct X { 23 INJECT(X()) { 24 Assert(!constructed); 25 constructed = true; 26 } 27 28 static bool constructed; 29 }; 30 31 bool X::constructed = false; 32 33 struct Y { 34 Y() { 35 Assert(!constructed); 36 constructed = true; 37 } 38 39 static bool constructed; 40 }; 41 42 bool Y::constructed = false; 43 44 struct Z { 45 Z() { 46 Assert(!constructed); 47 constructed = true; 48 } 49 50 static bool constructed; 51 }; 52 53 bool Z::constructed = false; 54 ''' 55 56class TestEagerInjection(parameterized.TestCase): 57 def test_eager_injection_deprecated(self): 58 source = ''' 59 fruit::Component<X> getComponent() { 60 return fruit::createComponent() 61 .addMultibindingProvider([](){return new Y();}) 62 .registerConstructor<Z()>(); 63 } 64 65 int main() { 66 67 fruit::Injector<X> injector(getComponent); 68 69 Assert(!X::constructed); 70 Assert(!Y::constructed); 71 Assert(!Z::constructed); 72 73 injector.eagerlyInjectAll(); 74 75 Assert(X::constructed); 76 Assert(Y::constructed); 77 // Z still not constructed, it's not reachable from Injector<X>. 78 Assert(!Z::constructed); 79 80 return 0; 81 } 82 ''' 83 expect_generic_compile_error( 84 'deprecation|deprecated', 85 COMMON_DEFINITIONS, 86 source) 87 88 def test_eager_injection(self): 89 source = ''' 90 fruit::Component<X> getComponent() { 91 return fruit::createComponent() 92 .addMultibindingProvider([](){return new Y();}) 93 .registerConstructor<Z()>(); 94 } 95 96 int main() { 97 98 fruit::Injector<X> injector(getComponent); 99 100 Assert(!X::constructed); 101 Assert(!Y::constructed); 102 Assert(!Z::constructed); 103 104 injector.eagerlyInjectAll(); 105 106 Assert(X::constructed); 107 Assert(Y::constructed); 108 // Z still not constructed, it's not reachable from Injector<X>. 109 Assert(!Z::constructed); 110 111 return 0; 112 } 113 ''' 114 expect_success( 115 COMMON_DEFINITIONS, 116 source, 117 locals(), 118 ignore_deprecation_warnings=True) 119 120if __name__ == '__main__': 121 absltest.main() 122