/* * Copyright (C) 2024 The Dagger Authors. * * 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. */ package dagger.functional.jakarta; import static com.google.common.truth.Truth.assertThat; import com.google.common.base.Optional; import dagger.Binds; import dagger.BindsOptionalOf; import dagger.Component; import dagger.Lazy; import dagger.Module; import dagger.Provides; import dagger.multibindings.IntoMap; import dagger.multibindings.StringKey; import jakarta.inject.Inject; import jakarta.inject.Provider; import jakarta.inject.Qualifier; import jakarta.inject.Scope; import java.util.HashMap; import java.util.Map; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public final class JakartaProviderTest { @Scope public @interface TestScope {} @Qualifier public @interface TestQualifier {} @TestScope @Component(modules = TestModule.class) interface TestComponent { Provider getJakartaFoo(); javax.inject.Provider getJavaxFoo(); Provider getJakartaBar(); javax.inject.Provider getJavaxBar(); @TestQualifier Provider getJakartaQualifiedFoo(); @TestQualifier javax.inject.Provider getJavaxQualifiedFoo(); @TestQualifier Provider getJakartaQualifiedBar(); @TestQualifier javax.inject.Provider getJavaxQualifiedBar(); InjectUsages injectUsages(); Map> getJakartaProviderMap(); Map> getJavaxProviderMap(); Map>> getJakartaProviderLazyMap(); Map>> getJavaxProviderLazyMap(); Map> getManuallyProvidedJakartaMap(); Map> getManuallyProvidedJavaxMap(); Optional> getPresentOptionalJakartaProvider(); Optional> getPresentOptionalJavaxProvider(); Optional> getEmptyOptionalJakartaProvider(); Optional> getEmptyOptionalJavaxProvider(); } public static final class Foo { @Inject Foo() {} } @TestScope public static final class Bar { @Inject Bar() {} } public static final class InjectUsages { Provider jakartaBar; Provider jakartaQualifiedBar; javax.inject.Provider javaxQualifiedBar; @Inject InjectUsages(Provider jakartaBar) { this.jakartaBar = jakartaBar; } @Inject javax.inject.Provider javaxBar; @Inject void injectBar( Provider jakartaQualifiedBar, javax.inject.Provider javaxQualifiedBar) { this.jakartaQualifiedBar = jakartaQualifiedBar; this.javaxQualifiedBar = javaxQualifiedBar; } } @Module abstract static class TestModule { @Provides @TestQualifier static Foo provideFoo( Provider fooProvider, javax.inject.Provider unusedOtherFooProvider) { return fooProvider.get(); } @Provides @TestQualifier @TestScope static Bar provideBar( Provider unusedBarProvider, javax.inject.Provider otherBarProvider) { // Use the other one in this case just to vary it from Foo return otherBarProvider.get(); } @Binds @IntoMap @StringKey("bar") abstract Bar bindBarIntoMap(Bar bar); // TODO(b/65118638): Use @Binds @IntoMap Lazy once that works properly. @Provides @IntoMap @StringKey("bar") static Lazy provideLazyIntoMap(Lazy bar) { return bar; } // Manually provide two Provider maps to make sure they don't conflict. @Provides static Map> manuallyProvidedJakartaMap() { Map> map = new HashMap<>(); map.put(9L, null); return map; } @Provides static Map> manuallyProvidedJavaxMap() { Map> map = new HashMap<>(); map.put(0L, null); return map; } @BindsOptionalOf abstract String bindOptionalString(); @Provides static String provideString() { return "present"; } @BindsOptionalOf abstract Long bindOptionalLong(); } @Test public void testJakartaProviders() { TestComponent testComponent = DaggerJakartaProviderTest_TestComponent.create(); assertThat(testComponent.getJakartaFoo().get()).isNotNull(); assertThat(testComponent.getJavaxFoo().get()).isNotNull(); assertThat(testComponent.getJakartaBar().get()) .isSameInstanceAs(testComponent.getJavaxBar().get()); assertThat(testComponent.getJakartaQualifiedFoo().get()).isNotNull(); assertThat(testComponent.getJavaxQualifiedFoo().get()).isNotNull(); assertThat(testComponent.getJakartaQualifiedBar().get()) .isSameInstanceAs(testComponent.getJavaxQualifiedBar().get()); assertThat(testComponent.getJakartaBar().get()) .isSameInstanceAs(testComponent.getJakartaQualifiedBar().get()); InjectUsages injectUsages = testComponent.injectUsages(); assertThat(injectUsages.jakartaBar.get()).isSameInstanceAs(injectUsages.javaxBar.get()); assertThat(injectUsages.jakartaQualifiedBar.get()) .isSameInstanceAs(injectUsages.javaxQualifiedBar.get()); assertThat(injectUsages.jakartaBar.get()) .isSameInstanceAs(injectUsages.jakartaQualifiedBar.get()); assertThat(testComponent.getJakartaProviderMap().get("bar").get()).isSameInstanceAs( testComponent.getJavaxProviderMap().get("bar").get()); assertThat(testComponent.getJakartaProviderLazyMap().get("bar").get().get()).isSameInstanceAs( testComponent.getJavaxProviderLazyMap().get("bar").get().get()); Map> manualJakartaMap = testComponent.getManuallyProvidedJakartaMap(); assertThat(manualJakartaMap.keySet()).containsExactly(9L); Map> manualJavaxMap = testComponent.getManuallyProvidedJavaxMap(); assertThat(manualJavaxMap.keySet()).containsExactly(0L); assertThat(testComponent.getPresentOptionalJakartaProvider().get().get()).isEqualTo("present"); assertThat(testComponent.getPresentOptionalJavaxProvider().get().get()).isEqualTo("present"); assertThat(testComponent.getEmptyOptionalJakartaProvider().isPresent()).isFalse(); assertThat(testComponent.getEmptyOptionalJavaxProvider().isPresent()).isFalse(); } }