1cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzpackage com.xtremelabs.robolectric; 2cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz 3db121a3768da9bd5f9ac210a0b1fc368acb85824Ryan Richardimport android.app.Activity; 4cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzimport android.content.Context; 544edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwinimport android.os.Handler; 69931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Planteimport android.view.Display; 7cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzimport android.view.View; 822c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation; 922c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements; 109931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Planteimport com.xtremelabs.robolectric.shadows.ShadowDisplay; 11867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultzimport com.xtremelabs.robolectric.util.TestOnClickListener; 122399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Tothimport org.apache.http.HttpException; 132399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Tothimport org.apache.http.HttpResponse; 142399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Tothimport org.apache.http.client.methods.HttpGet; 152399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Tothimport org.apache.http.conn.ConnectionKeepAliveStrategy; 162399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Tothimport org.apache.http.impl.client.DefaultRequestDirector; 172399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Tothimport org.apache.http.protocol.HttpContext; 18cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzimport org.junit.After; 19cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzimport org.junit.Before; 20cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzimport org.junit.Test; 21cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzimport org.junit.runner.RunWith; 22cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz 23cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzimport java.io.ByteArrayOutputStream; 242399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Tothimport java.io.IOException; 25cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzimport java.io.PrintStream; 26867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz 279931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Planteimport static com.xtremelabs.robolectric.Robolectric.shadowOf; 28a3030055b95774b06a963ccc9224fac58c887cb2Christian Williams & Phil Goodwinimport static org.hamcrest.CoreMatchers.equalTo; 292399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Tothimport static org.junit.Assert.*; 30cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz 31cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz@RunWith(WithTestDefaultsRunner.class) 32cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzpublic class RobolectricTest { 33cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz 34cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz private PrintStream originalSystemOut; 35cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz private ByteArrayOutputStream buff; 3640c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams private String defaultLineSeparator; 37cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz 38cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz @Before 39cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz public void setUp() { 40cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz originalSystemOut = System.out; 41f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown defaultLineSeparator = System.getProperty("line.separator"); 42f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown 43f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown System.setProperty("line.separator", "\n"); 44cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz buff = new ByteArrayOutputStream(); 45cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz PrintStream testOut = new PrintStream(buff); 46cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz System.setOut(testOut); 47cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz } 4840c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams 49cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz @After 50f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown public void tearDown() throws Exception { 5140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams System.setProperty("line.separator", defaultLineSeparator); 52cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz System.setOut(originalSystemOut); 53cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz } 54cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz 55cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz @Test 56cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz public void shouldLogMissingInvokedShadowMethodsWhenRequested() throws Exception { 57237888bb1e926aea523388de5d511a35f38506efPhil Goodwin & Tyler Schultz Robolectric.bindShadowClass(TestShadowView.class); 58cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz Robolectric.logMissingInvokedShadowMethods(); 59cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz 60cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz 61cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz View aView = new View(null); 62cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz // There's a shadow method for this 63cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz aView.getContext(); 64cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz String output = buff.toString(); 651cdfbcfd97e89e1d9451a8c06a307fb07c380924Christian Williams assertEquals("No Shadow method found for View.<init>(android.content.Context)\n", output); 661cdfbcfd97e89e1d9451a8c06a307fb07c380924Christian Williams buff.reset(); 67cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz 68cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz aView.findViewById(27); 69cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz // No shadow here... should be logged 70cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz output = buff.toString(); 71f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown assertEquals("No Shadow method found for View.findViewById(int)\n", output); 72cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz } 73cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz 74cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz @Test // This is nasty because it depends on the test above having run first in order to fail 75cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz public void shouldNotLogMissingInvokedShadowMethodsByDefault() throws Exception { 76cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz View aView = new View(null); 77cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz aView.findViewById(27); 78cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz String output = buff.toString(); 79cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz 80cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz assertEquals("", output); 81cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz } 82cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz 8340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams @Test(expected = RuntimeException.class) 84867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz public void clickOn_shouldThrowIfViewIsDisabled() throws Exception { 85867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz View view = new View(null); 86867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz view.setEnabled(false); 87867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz Robolectric.clickOn(view); 88867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz } 89867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz 90a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz @Test 91a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz public void shouldResetBackgroundSchedulerBeforeTests() throws Exception { 920fe1965a36c508fb5b9fa4c8d0caa2d30540f2ccChristian Williams & Phil Goodwin assertThat(Robolectric.getBackgroundScheduler().isPaused(), equalTo(false)); 930fe1965a36c508fb5b9fa4c8d0caa2d30540f2ccChristian Williams & Phil Goodwin Robolectric.getBackgroundScheduler().pause(); 94a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz } 95a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz 96a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz @Test 97a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz public void shouldResetBackgroundSchedulerAfterTests() throws Exception { 980fe1965a36c508fb5b9fa4c8d0caa2d30540f2ccChristian Williams & Phil Goodwin assertThat(Robolectric.getBackgroundScheduler().isPaused(), equalTo(false)); 990fe1965a36c508fb5b9fa4c8d0caa2d30540f2ccChristian Williams & Phil Goodwin Robolectric.getBackgroundScheduler().pause(); 100a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz } 101a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz 102db121a3768da9bd5f9ac210a0b1fc368acb85824Ryan Richard @Test 1032399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth public void httpRequestWasSent_ReturnsTrueIfRequestWasSent() throws IOException, HttpException { 1045ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin makeRequest("http://example.com"); 1052399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth 1062399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth assertTrue(Robolectric.httpRequestWasMade()); 1072399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth } 1082399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth 1092399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth @Test 1102399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth public void httpRequestWasMade_ReturnsFalseIfNoRequestWasMade() { 1112399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth assertFalse(Robolectric.httpRequestWasMade()); 1122399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth } 1132399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth 1145ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin @Test 1155ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin public void httpRequestWasMade_returnsTrueIfRequestMatchingGivenRuleWasMade() throws IOException, HttpException { 1165ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin makeRequest("http://example.com"); 1175ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin assertTrue(Robolectric.httpRequestWasMade("http://example.com")); 1185ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin } 1195ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin 1205ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin @Test 1215ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin public void httpRequestWasMade_returnsFalseIfNoRequestMatchingGivenRuleWasMAde() throws IOException, HttpException { 1225ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin makeRequest("http://example.com"); 1235ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin assertFalse(Robolectric.httpRequestWasMade("http://example.org")); 1245ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin } 1255ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin 12644edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin @Test 12744edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin public void idleMainLooper_executesScheduledTasks() { 1289931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante final boolean[] wasRun = new boolean[]{false}; 12944edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin new Handler().postDelayed(new Runnable() { 13044edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin @Override 13144edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin public void run() { 13244edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin wasRun[0] = true; 13344edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin } 13444edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin }, 2000); 13544edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin 13644edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin assertFalse(wasRun[0]); 13744edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin Robolectric.idleMainLooper(1999); 13844edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin assertFalse(wasRun[0]); 13944edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin Robolectric.idleMainLooper(1); 14044edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin assertTrue(wasRun[0]); 14144edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin } 14244edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin 1435f52066979dd3a3eb6a0df2cd360611c50fb31ecRyan Richard @Test 144db121a3768da9bd5f9ac210a0b1fc368acb85824Ryan Richard public void shouldUseSetDensityForContexts() throws Exception { 145db121a3768da9bd5f9ac210a0b1fc368acb85824Ryan Richard assertThat(new Activity().getResources().getDisplayMetrics().density, equalTo(1.0f)); 146db121a3768da9bd5f9ac210a0b1fc368acb85824Ryan Richard Robolectric.setDisplayMetricsDensity(1.5f); 147db121a3768da9bd5f9ac210a0b1fc368acb85824Ryan Richard assertThat(new Activity().getResources().getDisplayMetrics().density, equalTo(1.5f)); 148db121a3768da9bd5f9ac210a0b1fc368acb85824Ryan Richard } 149db121a3768da9bd5f9ac210a0b1fc368acb85824Ryan Richard 1509931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante @Test 1519931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante public void shouldUseSetDisplayForContexts() throws Exception { 1529931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante assertThat(new Activity().getResources().getDisplayMetrics().widthPixels, equalTo(480)); 1539931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante assertThat(new Activity().getResources().getDisplayMetrics().heightPixels, equalTo(800)); 1549931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante 1559931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante Display display = Robolectric.newInstanceOf(Display.class); 1569931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante ShadowDisplay shadowDisplay = shadowOf(display); 1579931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante shadowDisplay.setWidth(100); 1589931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante shadowDisplay.setHeight(200); 1599931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante Robolectric.setDefaultDisplay(display); 1609931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante 1619931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante assertThat(new Activity().getResources().getDisplayMetrics().widthPixels, equalTo(100)); 1629931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante assertThat(new Activity().getResources().getDisplayMetrics().heightPixels, equalTo(200)); 1639931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante } 1649931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante 165867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz public void clickOn_shouldCallClickListener() throws Exception { 166867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz View view = new View(null); 167867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz TestOnClickListener testOnClickListener = new TestOnClickListener(); 168867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz view.setOnClickListener(testOnClickListener); 169867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz Robolectric.clickOn(view); 170867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz assertTrue(testOnClickListener.clicked); 171867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz } 172867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz 173cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz @Implements(View.class) 1741cdfbcfd97e89e1d9451a8c06a307fb07c380924Christian Williams public static class TestShadowView { 175cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz @SuppressWarnings({"UnusedDeclaration"}) 176cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz @Implementation 177cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz public Context getContext() { 178cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz return null; 179cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz } 180cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz } 1815ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin 1825ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin private void makeRequest(String uri) throws HttpException, IOException { 1835ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin Robolectric.addPendingHttpResponse(200, "a happy response body"); 1845ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin 1855ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin ConnectionKeepAliveStrategy connectionKeepAliveStrategy = new ConnectionKeepAliveStrategy() { 1865ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin @Override 1875ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin public long getKeepAliveDuration(HttpResponse httpResponse, HttpContext httpContext) { 1885ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin return 0; 1895ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin } 1905ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin 1915ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin }; 1925ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin DefaultRequestDirector requestDirector = new DefaultRequestDirector(null, null, null, connectionKeepAliveStrategy, null, null, null, null, null, null, null, null); 1935ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin 1945ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin requestDirector.execute(null, new HttpGet(uri), null); 1955ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin } 196cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz} 197