Skip to content

Commit

Permalink
Merge pull request #303 from oss-slu/slideswitch
Browse files Browse the repository at this point in the history
test(slide-switch): add comprehensive unit tests for SlideSwitchHelper
  • Loading branch information
yrlmanoharreddy authored Feb 10, 2025
2 parents 6e6a624 + 8bb94cd commit 19c0c5d
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public class SlideSwitchHelper {
* @param slideSwitchInput A Pi4J DigitalInput Object.
*/
//tag::const[]
public SlideSwitchHelper(DigitalInput slideSwitchInput)
public SlideSwitchHelper(DigitalInput slideSwitchInput)
//end::const[]
{
this.slideSwitchInput = slideSwitchInput;
Expand All @@ -42,7 +42,7 @@ public void initialize()
log.info("Initializing Slide Switch");

slideSwitchInput.addListener(e->
isOn = slideSwitchInput.isHigh()
isOn = slideSwitchInput.isHigh()
);
}

Expand All @@ -51,7 +51,7 @@ public void initialize()
* @param function A Pi4J DigitalStateChangeListener object.
*/
//tag::method[]
public void addEventListener(DigitalStateChangeListener function)
public void addEventListener(DigitalStateChangeListener function)
//end::method[]
{
slideSwitchInput.addListener(function);
Expand All @@ -62,7 +62,7 @@ public void addEventListener(DigitalStateChangeListener function)
* @param function A Pi4J DigitalStateChangeListener object.
*/
//tag::method[]
public void removeEventListener(DigitalStateChangeListener function)
public void removeEventListener(DigitalStateChangeListener function)
//end::method[]
{
slideSwitchInput.removeListener(function);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;

import com.pi4j.io.gpio.digital.DigitalInput;
import com.pi4j.io.gpio.digital.DigitalStateChangeListener;
import com.opensourcewithslu.inputdevices.SlideSwitchHelper;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.concurrent.atomic.AtomicBoolean;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;

class SlideSwitchHelperTest {
private DigitalInput slideSwitchInput;
private SlideSwitchHelper slideSwitchHelper;

@BeforeEach
void setUp() {
slideSwitchInput = mock(DigitalInput.class);
when(slideSwitchInput.isHigh()).thenReturn(true);
slideSwitchHelper = new SlideSwitchHelper(slideSwitchInput);
}

@Test
void testIsOnFieldSetCorrectlyWhenInputIsHigh() {
when(slideSwitchInput.isHigh()).thenReturn(true);
slideSwitchHelper = new SlideSwitchHelper(slideSwitchInput);
assertTrue(slideSwitchHelper.isOn, "Expected isOn to be true when DigitalInput is high");
}

@Test
void testIsOnFieldSetCorrectlyWhenInputIsLow() {
when(slideSwitchInput.isHigh()).thenReturn(false);
slideSwitchHelper = new SlideSwitchHelper(slideSwitchInput);
assertFalse(slideSwitchHelper.isOn, "Expected isOn to be false when DigitalInput is low");
}

@Test
void testAddEventListener() {
DigitalStateChangeListener dummyListener = mock(DigitalStateChangeListener.class);
slideSwitchHelper.addEventListener(dummyListener);
verify(slideSwitchInput).addListener(dummyListener);
}

@Test
void testRemoveEventListener() {
DigitalStateChangeListener dummyListener = mock(DigitalStateChangeListener.class);
slideSwitchHelper.addEventListener(dummyListener);
slideSwitchHelper.removeEventListener(dummyListener);
verify(slideSwitchInput).removeListener(dummyListener);
}

@Test
void testCustomListenerInvocation() {
AtomicBoolean listenerInvoked = new AtomicBoolean(false);
DigitalStateChangeListener listener = event -> listenerInvoked.set(true);
slideSwitchHelper.addEventListener(listener);
listener.onDigitalStateChange(null);
assertTrue(listenerInvoked.get(), "The custom listener should have been invoked.");
}

@Test
void testInternalListenerUpdatesIsOn() {
ArgumentCaptor<DigitalStateChangeListener> captor = ArgumentCaptor.forClass(DigitalStateChangeListener.class);
verify(slideSwitchInput, atLeastOnce()).addListener(captor.capture());
DigitalStateChangeListener internalListener = captor.getAllValues().get(0);

when(slideSwitchInput.isHigh()).thenReturn(false);
internalListener.onDigitalStateChange(null);
assertFalse(slideSwitchHelper.isOn, "Expected isOn to update to false after state change.");

when(slideSwitchInput.isHigh()).thenReturn(true);
internalListener.onDigitalStateChange(null);
assertTrue(slideSwitchHelper.isOn, "Expected isOn to update to true after state change.");
}

@Test
void testInitializationLogsCaptureSystemOut() {
PrintStream originalOut = System.out;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
System.setOut(ps);
try {
when(slideSwitchInput.isHigh()).thenReturn(true);
new SlideSwitchHelper(slideSwitchInput);
ps.flush();
String output = baos.toString();
assertTrue(output.contains("Initializing Slide Switch"),
"Expected log message 'Initializing Slide Switch' was not found in System.out output.");
} finally {
System.setOut(originalOut);
}
}
}

0 comments on commit 19c0c5d

Please sign in to comment.