package limitedwip.watchdog;
import limitedwip.watchdog.Watchdog.Settings;
import limitedwip.watchdog.components.IdeAdapter;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InOrder;
import org.mockito.Matchers;
import static org.mockito.Mockito.*;
public class WatchdogTest {
private static final int maxLinesInChange = 100;
private static final int notificationIntervalInSeconds = 2;
private final IdeAdapter ideAdapter = mock(IdeAdapter.class);
private final Settings settings = new Settings(true, maxLinesInChange, notificationIntervalInSeconds, true);
private final Watchdog watchdog = new Watchdog(ideAdapter).init(settings);
private int secondsSinceStart;
@Test public void doesNotSendNotification_WhenChangeSizeIsBelowThreshold() {
when(ideAdapter.currentChangeListSizeInLines()).thenReturn(new ChangeSize(10));
watchdog.onTimer(next());
verify(ideAdapter, times(0)).onChangeSizeTooBig(Matchers.<ChangeSize>any(), anyInt());
}
@Test public void sendsNotification_WhenChangeSizeIsAboveThreshold() {
when(ideAdapter.currentChangeListSizeInLines()).thenReturn(new ChangeSize(200));
watchdog.onTimer(next());
verify(ideAdapter).onChangeSizeTooBig(new ChangeSize(200), maxLinesInChange);
}
@Test public void sendsChangeSizeNotification_OnlyOnOneOfSeveralUpdates() {
when(ideAdapter.currentChangeListSizeInLines()).thenReturn(new ChangeSize(200));
watchdog.onTimer(next()); // send notification
watchdog.onTimer(next());
watchdog.onTimer(next()); // send notification
watchdog.onTimer(next());
verify(ideAdapter, times(2)).onChangeSizeTooBig(new ChangeSize(200), maxLinesInChange);
}
@Test public void sendsChangeSizeNotification_AfterSettingsChange() {
when(ideAdapter.currentChangeListSizeInLines()).thenReturn(new ChangeSize(200));
InOrder inOrder = inOrder(ideAdapter);
watchdog.onTimer(next());
inOrder.verify(ideAdapter).onChangeSizeTooBig(new ChangeSize(200), maxLinesInChange);
watchdog.onSettings(settingsWithChangeSizeThreshold(150));
watchdog.onTimer(next());
inOrder.verify(ideAdapter).onChangeSizeTooBig(new ChangeSize(200), 150);
}
@Test public void doesNotSendNotification_WhenDisabled() {
when(ideAdapter.currentChangeListSizeInLines()).thenReturn(new ChangeSize(200));
watchdog.onSettings(watchdogDisabledSettings());
watchdog.onTimer(next());
watchdog.onTimer(next());
verify(ideAdapter, times(2)).onSettingsUpdate(Matchers.<Settings>anyObject());
verifyNoMoreInteractions(ideAdapter);
}
@Test public void canSkipNotificationsUtilNextCommit() {
when(ideAdapter.currentChangeListSizeInLines()).thenReturn(new ChangeSize(200));
watchdog.skipNotificationsUntilCommit(true);
watchdog.onTimer(next());
watchdog.onTimer(next());
watchdog.onCommit();
watchdog.onTimer(next());
verify(ideAdapter).onChangeSizeTooBig(new ChangeSize(200), maxLinesInChange);
}
@Test public void sendsChangeSizeUpdate() {
when(ideAdapter.currentChangeListSizeInLines()).thenReturn(new ChangeSize(200));
watchdog.onTimer(next());
verify(ideAdapter).showCurrentChangeListSize(new ChangeSize(200), maxLinesInChange);
}
@Test public void stillSendsChangeSizeUpdate_WhenNotificationsAreSkippedTillNextCommit() {
when(ideAdapter.currentChangeListSizeInLines()).thenReturn(new ChangeSize(200));
watchdog.skipNotificationsUntilCommit(true);
watchdog.onTimer(next());
verify(ideAdapter).showCurrentChangeListSize(new ChangeSize(200), maxLinesInChange);
}
@Test public void doesNotSendChangeSizeUpdate_WhenDisabled() {
when(ideAdapter.currentChangeListSizeInLines()).thenReturn(new ChangeSize(200));
watchdog.onSettings(watchdogDisabledSettings());
watchdog.onTimer(next());
verify(ideAdapter, times(2)).onSettingsUpdate(Matchers.<Settings>anyObject());
verifyNoMoreInteractions(ideAdapter);
}
@Test public void closeNotification_WhenChangeSizeIsBackWithinLimit() {
when(ideAdapter.currentChangeListSizeInLines()).thenReturn(new ChangeSize(200));
watchdog.onTimer(next());
when(ideAdapter.currentChangeListSizeInLines()).thenReturn(new ChangeSize(0));
watchdog.onTimer(next());
watchdog.onTimer(next());
verify(ideAdapter, times(1)).onChangeSizeTooBig(new ChangeSize(200), maxLinesInChange);
verify(ideAdapter, times(2)).onChangeSizeWithinLimit();
}
@Before public void setUp() throws Exception {
secondsSinceStart = 0;
}
private int next() {
return ++secondsSinceStart;
}
private static Settings watchdogDisabledSettings() {
return new Settings(false, 150, 2, true);
}
private static Settings settingsWithChangeSizeThreshold(int maxLinesInChange) {
return new Settings(true, maxLinesInChange, 2, true);
}
}