1*f585d8a3SJacky Wang /* 2*f585d8a3SJacky Wang * Copyright (C) 2015 The Dagger Authors. 3*f585d8a3SJacky Wang * 4*f585d8a3SJacky Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5*f585d8a3SJacky Wang * you may not use this file except in compliance with the License. 6*f585d8a3SJacky Wang * You may obtain a copy of the License at 7*f585d8a3SJacky Wang * 8*f585d8a3SJacky Wang * http://www.apache.org/licenses/LICENSE-2.0 9*f585d8a3SJacky Wang * 10*f585d8a3SJacky Wang * Unless required by applicable law or agreed to in writing, software 11*f585d8a3SJacky Wang * distributed under the License is distributed on an "AS IS" BASIS, 12*f585d8a3SJacky Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*f585d8a3SJacky Wang * See the License for the specific language governing permissions and 14*f585d8a3SJacky Wang * limitations under the License. 15*f585d8a3SJacky Wang */ 16*f585d8a3SJacky Wang 17*f585d8a3SJacky Wang package dagger.producers.internal; 18*f585d8a3SJacky Wang 19*f585d8a3SJacky Wang import static com.google.common.truth.Truth.assertThat; 20*f585d8a3SJacky Wang 21*f585d8a3SJacky Wang import com.google.common.collect.ImmutableSet; 22*f585d8a3SJacky Wang import com.google.common.collect.Iterables; 23*f585d8a3SJacky Wang import com.google.common.collect.Sets; 24*f585d8a3SJacky Wang import dagger.producers.Produced; 25*f585d8a3SJacky Wang import dagger.producers.Producer; 26*f585d8a3SJacky Wang import dagger.producers.Producers; 27*f585d8a3SJacky Wang import java.util.Arrays; 28*f585d8a3SJacky Wang import java.util.Collections; 29*f585d8a3SJacky Wang import java.util.Set; 30*f585d8a3SJacky Wang import java.util.concurrent.ExecutionException; 31*f585d8a3SJacky Wang import org.junit.Test; 32*f585d8a3SJacky Wang import org.junit.runner.RunWith; 33*f585d8a3SJacky Wang import org.junit.runners.JUnit4; 34*f585d8a3SJacky Wang 35*f585d8a3SJacky Wang /** 36*f585d8a3SJacky Wang * Tests {@link SetOfProducedProducer}. 37*f585d8a3SJacky Wang */ 38*f585d8a3SJacky Wang @RunWith(JUnit4.class) 39*f585d8a3SJacky Wang public class SetOfProducedProducerTest { 40*f585d8a3SJacky Wang @Test success()41*f585d8a3SJacky Wang public void success() throws Exception { 42*f585d8a3SJacky Wang Producer<Set<Produced<Integer>>> producer = 43*f585d8a3SJacky Wang SetOfProducedProducer.<Integer>builder(1, 1) 44*f585d8a3SJacky Wang .addProducer(Producers.immediateProducer(1)) 45*f585d8a3SJacky Wang .addCollectionProducer(Producers.<Set<Integer>>immediateProducer(ImmutableSet.of(5, 7))) 46*f585d8a3SJacky Wang .build(); 47*f585d8a3SJacky Wang assertThat(producer.get().get()) 48*f585d8a3SJacky Wang .containsExactly( 49*f585d8a3SJacky Wang Produced.successful(1), 50*f585d8a3SJacky Wang Produced.successful(5), 51*f585d8a3SJacky Wang Produced.successful(7)); 52*f585d8a3SJacky Wang } 53*f585d8a3SJacky Wang 54*f585d8a3SJacky Wang @Test failure()55*f585d8a3SJacky Wang public void failure() throws Exception { 56*f585d8a3SJacky Wang RuntimeException e = new RuntimeException("monkey"); 57*f585d8a3SJacky Wang Producer<Set<Produced<Integer>>> producer = 58*f585d8a3SJacky Wang SetOfProducedProducer.<Integer>builder(1, 1) 59*f585d8a3SJacky Wang .addCollectionProducer(Producers.<Set<Integer>>immediateProducer(ImmutableSet.of(1, 2))) 60*f585d8a3SJacky Wang .addProducer(Producers.<Integer>immediateFailedProducer(e)) 61*f585d8a3SJacky Wang .build(); 62*f585d8a3SJacky Wang assertThat(producer.get().get()) 63*f585d8a3SJacky Wang .containsExactly( 64*f585d8a3SJacky Wang Produced.successful(1), Produced.successful(2), Produced.<Integer>failed(e)); 65*f585d8a3SJacky Wang } 66*f585d8a3SJacky Wang 67*f585d8a3SJacky Wang @Test delegateNpe()68*f585d8a3SJacky Wang public void delegateNpe() throws Exception { 69*f585d8a3SJacky Wang Producer<Set<Produced<Integer>>> producer = 70*f585d8a3SJacky Wang SetOfProducedProducer.<Integer>builder(1, 0) 71*f585d8a3SJacky Wang .addProducer(Producers.<Integer>immediateProducer(null)) 72*f585d8a3SJacky Wang .build(); 73*f585d8a3SJacky Wang Results<Integer> results = Results.create(producer.get().get()); 74*f585d8a3SJacky Wang assertThat(results.successes).isEmpty(); 75*f585d8a3SJacky Wang assertThat(results.failures).hasSize(1); 76*f585d8a3SJacky Wang assertThat(Iterables.getOnlyElement(results.failures)) 77*f585d8a3SJacky Wang .hasCauseThat() 78*f585d8a3SJacky Wang .isInstanceOf(NullPointerException.class); 79*f585d8a3SJacky Wang } 80*f585d8a3SJacky Wang 81*f585d8a3SJacky Wang @Test delegateSetNpe()82*f585d8a3SJacky Wang public void delegateSetNpe() throws Exception { 83*f585d8a3SJacky Wang Producer<Set<Produced<Integer>>> producer = 84*f585d8a3SJacky Wang SetOfProducedProducer.<Integer>builder(0, 1) 85*f585d8a3SJacky Wang .addCollectionProducer(Producers.<Set<Integer>>immediateProducer(null)) 86*f585d8a3SJacky Wang .build(); 87*f585d8a3SJacky Wang Results<Integer> results = Results.create(producer.get().get()); 88*f585d8a3SJacky Wang assertThat(results.successes).isEmpty(); 89*f585d8a3SJacky Wang assertThat(results.failures).hasSize(1); 90*f585d8a3SJacky Wang assertThat(Iterables.getOnlyElement(results.failures)) 91*f585d8a3SJacky Wang .hasCauseThat() 92*f585d8a3SJacky Wang .isInstanceOf(NullPointerException.class); 93*f585d8a3SJacky Wang } 94*f585d8a3SJacky Wang 95*f585d8a3SJacky Wang @Test delegateElementNpe()96*f585d8a3SJacky Wang public void delegateElementNpe() throws Exception { 97*f585d8a3SJacky Wang Producer<Set<Produced<Integer>>> producer = 98*f585d8a3SJacky Wang SetOfProducedProducer.<Integer>builder(0, 1) 99*f585d8a3SJacky Wang .addCollectionProducer( 100*f585d8a3SJacky Wang Producers.<Set<Integer>>immediateProducer(Collections.<Integer>singleton(null))) 101*f585d8a3SJacky Wang .build(); 102*f585d8a3SJacky Wang Results<Integer> results = Results.create(producer.get().get()); 103*f585d8a3SJacky Wang assertThat(results.successes).isEmpty(); 104*f585d8a3SJacky Wang assertThat(results.failures).hasSize(1); 105*f585d8a3SJacky Wang assertThat(Iterables.getOnlyElement(results.failures)) 106*f585d8a3SJacky Wang .hasCauseThat() 107*f585d8a3SJacky Wang .isInstanceOf(NullPointerException.class); 108*f585d8a3SJacky Wang } 109*f585d8a3SJacky Wang 110*f585d8a3SJacky Wang @Test oneOfDelegateElementNpe()111*f585d8a3SJacky Wang public void oneOfDelegateElementNpe() throws Exception { 112*f585d8a3SJacky Wang Producer<Set<Produced<Integer>>> producer = 113*f585d8a3SJacky Wang SetOfProducedProducer.<Integer>builder(0, 1) 114*f585d8a3SJacky Wang .addCollectionProducer( 115*f585d8a3SJacky Wang Producers.<Set<Integer>>immediateProducer( 116*f585d8a3SJacky Wang Sets.newHashSet(Arrays.asList(5, 2, null)))) 117*f585d8a3SJacky Wang .build(); 118*f585d8a3SJacky Wang Results<Integer> results = Results.create(producer.get().get()); 119*f585d8a3SJacky Wang assertThat(results.successes).containsExactly(2, 5); 120*f585d8a3SJacky Wang assertThat(results.failures).hasSize(1); 121*f585d8a3SJacky Wang assertThat(Iterables.getOnlyElement(results.failures)) 122*f585d8a3SJacky Wang .hasCauseThat() 123*f585d8a3SJacky Wang .isInstanceOf(NullPointerException.class); 124*f585d8a3SJacky Wang } 125*f585d8a3SJacky Wang 126*f585d8a3SJacky Wang static final class Results<T> { 127*f585d8a3SJacky Wang final ImmutableSet<T> successes; 128*f585d8a3SJacky Wang final ImmutableSet<ExecutionException> failures; 129*f585d8a3SJacky Wang Results(ImmutableSet<T> successes, ImmutableSet<ExecutionException> failures)130*f585d8a3SJacky Wang private Results(ImmutableSet<T> successes, ImmutableSet<ExecutionException> failures) { 131*f585d8a3SJacky Wang this.successes = successes; 132*f585d8a3SJacky Wang this.failures = failures; 133*f585d8a3SJacky Wang } 134*f585d8a3SJacky Wang create(Set<Produced<T>> setOfProduced)135*f585d8a3SJacky Wang static <T> Results<T> create(Set<Produced<T>> setOfProduced) { 136*f585d8a3SJacky Wang ImmutableSet.Builder<T> successes = ImmutableSet.builder(); 137*f585d8a3SJacky Wang ImmutableSet.Builder<ExecutionException> failures = ImmutableSet.builder(); 138*f585d8a3SJacky Wang for (Produced<T> produced : setOfProduced) { 139*f585d8a3SJacky Wang try { 140*f585d8a3SJacky Wang successes.add(produced.get()); 141*f585d8a3SJacky Wang } catch (ExecutionException e) { 142*f585d8a3SJacky Wang failures.add(e); 143*f585d8a3SJacky Wang } 144*f585d8a3SJacky Wang } 145*f585d8a3SJacky Wang return new Results<T>(successes.build(), failures.build()); 146*f585d8a3SJacky Wang } 147*f585d8a3SJacky Wang } 148*f585d8a3SJacky Wang } 149