1 package com.google.inject.testing.throwingproviders; 2 3 import static com.google.common.truth.Truth.assertThat; 4 import static com.google.inject.testing.throwingproviders.CheckedProviderSubject.assertThat; 5 6 import com.google.common.truth.ExpectFailure; 7 import com.google.common.truth.SimpleSubjectBuilder; 8 import com.google.inject.throwingproviders.CheckedProvider; 9 import com.google.inject.throwingproviders.CheckedProviders; 10 import org.junit.Rule; 11 import org.junit.Test; 12 import org.junit.runner.RunWith; 13 import org.junit.runners.JUnit4; 14 15 /** 16 * Unit tests for {@link CheckedProviderSubject}. 17 * 18 * @author eatnumber1@google.com (Russ Harmon) 19 */ 20 @RunWith(JUnit4.class) 21 public class CheckedProviderSubjectTest { 22 public @Rule ExpectFailure expect = new ExpectFailure(); 23 24 private interface StringCheckedProvider extends CheckedProvider<String> {} 25 26 @Test providedValue_gotExpected_expectSuccess()27 public void providedValue_gotExpected_expectSuccess() { 28 String expected = "keep Summer safe"; 29 CheckedProvider<String> provider = CheckedProviders.of(StringCheckedProvider.class, expected); 30 31 assertThat(provider).providedValue().isEqualTo(expected); 32 } 33 34 @Test providedValue_gotUnexpected_expectFailure()35 public void providedValue_gotUnexpected_expectFailure() { 36 String expected = "keep Summer safe"; 37 String unexpected = "Summer is unsafe"; 38 CheckedProvider<String> provider = CheckedProviders.of(StringCheckedProvider.class, unexpected); 39 String message = 40 String.format( 41 "value provided by <%s>: Not true that <%s> is equal to <%s>", 42 getReturningProviderName(unexpected), unexpected, expected); 43 44 expectWhenTesting().that(provider).providedValue().isEqualTo(expected); 45 assertThat(expect.getFailure()).hasMessageThat().isEqualTo(message); 46 } 47 48 private static final class SummerException extends RuntimeException {} 49 50 @Test providedValue_throws_expectFailure()51 public void providedValue_throws_expectFailure() { 52 CheckedProvider<String> provider = 53 CheckedProviders.throwing(StringCheckedProvider.class, SummerException.class); 54 String message = 55 String.format( 56 "checked provider <%s> threw an exception", 57 getThrowingProviderName(SummerException.class.getName())); 58 59 expectWhenTesting().that(provider).providedValue(); 60 AssertionError expected = expect.getFailure(); 61 assertThat(expected).hasCauseThat().isInstanceOf(SummerException.class); 62 assertThat(expected).hasMessageThat().isEqualTo(message); 63 } 64 65 @Test thrownException_threwExpected_expectSuccess()66 public void thrownException_threwExpected_expectSuccess() { 67 CheckedProvider<?> provider = 68 CheckedProviders.throwing(StringCheckedProvider.class, SummerException.class); 69 70 assertThat(provider).thrownException().isInstanceOf(SummerException.class); 71 } 72 73 @Test thrownException_threwUnexpected_expectFailure()74 public void thrownException_threwUnexpected_expectFailure() { 75 Class<? extends Throwable> expected = SummerException.class; 76 Class<? extends Throwable> unexpected = UnsupportedOperationException.class; 77 CheckedProvider<String> provider = 78 CheckedProviders.throwing(StringCheckedProvider.class, unexpected); 79 String message = 80 String.format( 81 "exception thrown by <%s>: Not true that <%s> is an instance of <%s>. " 82 + "It is an instance of <%s>", 83 getThrowingProviderName(UnsupportedOperationException.class.getName()), 84 UnsupportedOperationException.class.getName(), 85 SummerException.class.getName(), 86 UnsupportedOperationException.class.getName()); 87 88 expectWhenTesting().that(provider).thrownException().isInstanceOf(expected); 89 assertThat(expect.getFailure()).hasMessageThat().isEqualTo(message); 90 } 91 92 @Test thrownException_gets_expectFailure()93 public void thrownException_gets_expectFailure() { 94 String getValue = "keep WINTER IS COMING safe"; 95 CheckedProvider<String> provider = CheckedProviders.of(StringCheckedProvider.class, getValue); 96 String message = 97 String.format( 98 "Not true that <%s> threw <an exception>. It provided <%s>", 99 getReturningProviderName(getValue), getValue); 100 101 expectWhenTesting().that(provider).thrownException(); 102 assertThat(expect.getFailure()).hasMessageThat().isEqualTo(message); 103 } 104 105 private SimpleSubjectBuilder< 106 CheckedProviderSubject<String, CheckedProvider<String>>, CheckedProvider<String>> expectWhenTesting()107 expectWhenTesting() { 108 return expect 109 .whenTesting() 110 .about(CheckedProviderSubject.<String, CheckedProvider<String>>checkedProviders()); 111 } 112 getReturningProviderName(String providing)113 private String getReturningProviderName(String providing) { 114 return String.format("generated CheckedProvider returning <%s>", providing); 115 } 116 getThrowingProviderName(String throwing)117 private String getThrowingProviderName(String throwing) { 118 return String.format("generated CheckedProvider throwing <%s>", throwing); 119 } 120 } 121