/* * Copyright (C) 2015 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.producers.internal; import static com.google.common.truth.Truth.assertThat; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import dagger.producers.Produced; import dagger.producers.Producer; import dagger.producers.Producers; import java.util.Arrays; import java.util.Collections; import java.util.Set; import java.util.concurrent.ExecutionException; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; /** * Tests {@link SetOfProducedProducer}. */ @RunWith(JUnit4.class) public class SetOfProducedProducerTest { @Test public void success() throws Exception { Producer>> producer = SetOfProducedProducer.builder(1, 1) .addProducer(Producers.immediateProducer(1)) .addCollectionProducer(Producers.>immediateProducer(ImmutableSet.of(5, 7))) .build(); assertThat(producer.get().get()) .containsExactly( Produced.successful(1), Produced.successful(5), Produced.successful(7)); } @Test public void failure() throws Exception { RuntimeException e = new RuntimeException("monkey"); Producer>> producer = SetOfProducedProducer.builder(1, 1) .addCollectionProducer(Producers.>immediateProducer(ImmutableSet.of(1, 2))) .addProducer(Producers.immediateFailedProducer(e)) .build(); assertThat(producer.get().get()) .containsExactly( Produced.successful(1), Produced.successful(2), Produced.failed(e)); } @Test public void delegateNpe() throws Exception { Producer>> producer = SetOfProducedProducer.builder(1, 0) .addProducer(Producers.immediateProducer(null)) .build(); Results results = Results.create(producer.get().get()); assertThat(results.successes).isEmpty(); assertThat(results.failures).hasSize(1); assertThat(Iterables.getOnlyElement(results.failures)) .hasCauseThat() .isInstanceOf(NullPointerException.class); } @Test public void delegateSetNpe() throws Exception { Producer>> producer = SetOfProducedProducer.builder(0, 1) .addCollectionProducer(Producers.>immediateProducer(null)) .build(); Results results = Results.create(producer.get().get()); assertThat(results.successes).isEmpty(); assertThat(results.failures).hasSize(1); assertThat(Iterables.getOnlyElement(results.failures)) .hasCauseThat() .isInstanceOf(NullPointerException.class); } @Test public void delegateElementNpe() throws Exception { Producer>> producer = SetOfProducedProducer.builder(0, 1) .addCollectionProducer( Producers.>immediateProducer(Collections.singleton(null))) .build(); Results results = Results.create(producer.get().get()); assertThat(results.successes).isEmpty(); assertThat(results.failures).hasSize(1); assertThat(Iterables.getOnlyElement(results.failures)) .hasCauseThat() .isInstanceOf(NullPointerException.class); } @Test public void oneOfDelegateElementNpe() throws Exception { Producer>> producer = SetOfProducedProducer.builder(0, 1) .addCollectionProducer( Producers.>immediateProducer( Sets.newHashSet(Arrays.asList(5, 2, null)))) .build(); Results results = Results.create(producer.get().get()); assertThat(results.successes).containsExactly(2, 5); assertThat(results.failures).hasSize(1); assertThat(Iterables.getOnlyElement(results.failures)) .hasCauseThat() .isInstanceOf(NullPointerException.class); } static final class Results { final ImmutableSet successes; final ImmutableSet failures; private Results(ImmutableSet successes, ImmutableSet failures) { this.successes = successes; this.failures = failures; } static Results create(Set> setOfProduced) { ImmutableSet.Builder successes = ImmutableSet.builder(); ImmutableSet.Builder failures = ImmutableSet.builder(); for (Produced produced : setOfProduced) { try { successes.add(produced.get()); } catch (ExecutionException e) { failures.add(e); } } return new Results(successes.build(), failures.build()); } } }