1/* 2 * Copyright (C) 2015 Google, Inc. 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 */ 16package dagger.producers.internal; 17 18import com.google.common.collect.ImmutableSet; 19import com.google.common.collect.Iterables; 20import com.google.common.collect.Sets; 21import dagger.producers.Produced; 22import dagger.producers.Producer; 23import java.util.Arrays; 24import java.util.Collections; 25import java.util.Set; 26import java.util.concurrent.ExecutionException; 27import org.junit.Test; 28import org.junit.runner.RunWith; 29import org.junit.runners.JUnit4; 30 31import static com.google.common.truth.Truth.assertThat; 32 33/** 34 * Tests {@link SetOfProducedProducer}. 35 */ 36@RunWith(JUnit4.class) 37public class SetOfProducedProducerTest { 38 @Test 39 public void success() throws Exception { 40 Producer<Set<Produced<Integer>>> producer = 41 SetOfProducedProducer.create( 42 Producers.<Set<Integer>>immediateProducer(ImmutableSet.of(1, 2)), 43 Producers.<Set<Integer>>immediateProducer(ImmutableSet.of(5, 7))); 44 assertThat(producer.get().get()) 45 .containsExactly( 46 Produced.successful(1), 47 Produced.successful(2), 48 Produced.successful(5), 49 Produced.successful(7)); 50 } 51 52 @Test 53 public void failure() throws Exception { 54 RuntimeException e = new RuntimeException("monkey"); 55 Producer<Set<Produced<Integer>>> producer = 56 SetOfProducedProducer.create( 57 Producers.<Set<Integer>>immediateProducer(ImmutableSet.of(1, 2)), 58 Producers.<Set<Integer>>immediateFailedProducer(e)); 59 assertThat(producer.get().get()) 60 .containsExactly( 61 Produced.successful(1), Produced.successful(2), Produced.<Integer>failed(e)); 62 } 63 64 @Test 65 public void delegateSetNpe() throws Exception { 66 Producer<Set<Produced<Integer>>> producer = 67 SetOfProducedProducer.create(Producers.<Set<Integer>>immediateProducer(null)); 68 Results<Integer> results = Results.create(producer.get().get()); 69 assertThat(results.successes).isEmpty(); 70 assertThat(results.failures).hasSize(1); 71 assertThat(Iterables.getOnlyElement(results.failures).getCause()) 72 .isInstanceOf(NullPointerException.class); 73 } 74 75 @Test 76 public void oneOfDelegateSetNpe() throws Exception { 77 Producer<Set<Produced<Integer>>> producer = 78 SetOfProducedProducer.create( 79 Producers.<Set<Integer>>immediateProducer(null), 80 Producers.<Set<Integer>>immediateProducer(ImmutableSet.of(7, 3))); 81 Results<Integer> results = Results.create(producer.get().get()); 82 assertThat(results.successes).containsExactly(3, 7); 83 assertThat(results.failures).hasSize(1); 84 assertThat(Iterables.getOnlyElement(results.failures).getCause()) 85 .isInstanceOf(NullPointerException.class); 86 } 87 88 @Test 89 public void delegateElementNpe() throws Exception { 90 Producer<Set<Produced<Integer>>> producer = 91 SetOfProducedProducer.create( 92 Producers.<Set<Integer>>immediateProducer(Collections.<Integer>singleton(null))); 93 Results<Integer> results = Results.create(producer.get().get()); 94 assertThat(results.successes).isEmpty(); 95 assertThat(results.failures).hasSize(1); 96 assertThat(Iterables.getOnlyElement(results.failures).getCause()) 97 .isInstanceOf(NullPointerException.class); 98 } 99 100 @Test 101 public void oneOfDelegateElementNpe() throws Exception { 102 Producer<Set<Produced<Integer>>> producer = 103 SetOfProducedProducer.create( 104 Producers.<Set<Integer>>immediateProducer(Sets.newHashSet(Arrays.asList(5, 2, null)))); 105 Results<Integer> results = Results.create(producer.get().get()); 106 assertThat(results.successes).containsExactly(2, 5); 107 assertThat(results.failures).hasSize(1); 108 assertThat(Iterables.getOnlyElement(results.failures).getCause()) 109 .isInstanceOf(NullPointerException.class); 110 } 111 112 static final class Results<T> { 113 final ImmutableSet<T> successes; 114 final ImmutableSet<ExecutionException> failures; 115 116 private Results(ImmutableSet<T> successes, ImmutableSet<ExecutionException> failures) { 117 this.successes = successes; 118 this.failures = failures; 119 } 120 121 static <T> Results<T> create(Set<Produced<T>> setOfProduced) { 122 ImmutableSet.Builder<T> successes = ImmutableSet.builder(); 123 ImmutableSet.Builder<ExecutionException> failures = ImmutableSet.builder(); 124 for (Produced<T> produced : setOfProduced) { 125 try { 126 successes.add(produced.get()); 127 } catch (ExecutionException e) { 128 failures.add(e); 129 } 130 } 131 return new Results<T>(successes.build(), failures.build()); 132 } 133 } 134} 135