package org.robobinding.viewattribute.property;
import static org.fest.assertions.api.Assertions.fail;
import java.lang.Thread.UncaughtExceptionHandler;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robobinding.property.PropertyChangeListener;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
/**
* @since 1.0
* @version
* @author Cheng Wei
*
*/
@Config(manifest=Config.NONE)
@RunWith(RobolectricTestRunner.class)
public class PropertyChangeListenerInUiThreadTest {
@Test
public void whenRunPropertyChangeListenerInUiThread_thenNoException() {
/**
* Robolectric is running tests in UI thread by default.
*/
newPropertyChangeListenerInUiThread().propertyChanged();
}
private PropertyChangeListenerInUiThread newPropertyChangeListenerInUiThread() {
return new PropertyChangeListenerInUiThread(new PropertyChangeListener() {
@Override
public void propertyChanged() {
}
});
}
@Test(expected = RuntimeException.class)
public void whenRunPropertyChangeListenerInNonUiThread_thenThrowsException() throws Throwable {
ThrowableUncaughtExceptionHandler throwableHandler = new ThrowableUncaughtExceptionHandler();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
newPropertyChangeListenerInUiThread().propertyChanged();
}
});
t.setUncaughtExceptionHandler(throwableHandler);
t.start();
t.join();
throwableHandler.throwExceptionIfExists();
fail("Expect errors when running PropertyChangeListener in non-UI thread");
}
private static class ThrowableUncaughtExceptionHandler implements UncaughtExceptionHandler {
private Throwable caughtException;
@Override
public void uncaughtException(Thread t, Throwable e) {
caughtException = e;
}
public void throwExceptionIfExists() throws Throwable {
if(caughtException != null) {
throw caughtException;
}
}
}
}