From 8025122906c22b107aa6c5419d953a696a5cf4c8 Mon Sep 17 00:00:00 2001 From: Emmanuel Bigeon Date: Wed, 10 Nov 2021 11:14:08 +0100 Subject: [PATCH] [test] Complete tests. Signed-off-by: Emmanuel Bigeon --- .../gclc/swt/io/ConsoleOutputManager.java | 8 ++ .../gclc/swt/ConsolePromptManagerTest.java | 111 +++++++++++++++--- .../gclc/swt/HistoryTextKeyListenerTest.java | 7 +- .../bigeon/gclc/swt/SWTConsoleShellTest.java | 4 + .../bigeon/gclc/swt/SWTConsoleViewTest.java | 4 + 5 files changed, 118 insertions(+), 16 deletions(-) diff --git a/gclc-swt/src/main/java/net/bigeon/gclc/swt/io/ConsoleOutputManager.java b/gclc-swt/src/main/java/net/bigeon/gclc/swt/io/ConsoleOutputManager.java index b43eebd..d0d5f65 100644 --- a/gclc-swt/src/main/java/net/bigeon/gclc/swt/io/ConsoleOutputManager.java +++ b/gclc-swt/src/main/java/net/bigeon/gclc/swt/io/ConsoleOutputManager.java @@ -96,4 +96,12 @@ public final class ConsoleOutputManager implements ConsoleOutputDisplay { public Thread getForwardThread() { return forwardThread; } + + /** @return the output consumer */ + public PipedConsoleOutput getManager() { + if (forward == null) { + return null; + } + return forward.getOuput(); + } } diff --git a/gclc-swt/src/test/java/net/bigeon/gclc/swt/ConsolePromptManagerTest.java b/gclc-swt/src/test/java/net/bigeon/gclc/swt/ConsolePromptManagerTest.java index b9a0340..f8e1ed1 100644 --- a/gclc-swt/src/test/java/net/bigeon/gclc/swt/ConsolePromptManagerTest.java +++ b/gclc-swt/src/test/java/net/bigeon/gclc/swt/ConsolePromptManagerTest.java @@ -3,6 +3,7 @@ */ package net.bigeon.gclc.swt; +import static org.mockito.ArgumentMatchers.any; /*- * #%L * GCLC swt @@ -36,48 +37,128 @@ package net.bigeon.gclc.swt; * knowledge of the CeCILL license and that you accept its terms. * #L% */ - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.*; import java.io.BufferedReader; +import java.io.IOException; +import java.util.concurrent.atomic.AtomicInteger; +import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.junit.Test; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; import net.bigeon.gclc.swt.io.ConsolePromptManager; -/** - * @author Emmanuel Bigeon - * - */ +/** @author Emmanuel Bigeon */ public class ConsolePromptManagerTest { private final Label label = mock(Label.class); private final ConsolePromptManager manager = new ConsolePromptManager(label); - /** - * Test method for {@link net.bigeon.gclc.swt.io.ConsolePromptManager#setPrompt(java.lang.String)}. - */ + /** Test method for + * {@link net.bigeon.gclc.swt.io.ConsolePromptManager#setPrompt(java.lang.String)}. */ @Test public void testSetPrompt() { manager.setPrompt("abc"); verify(label).setText("abc"); } - /** - * Test method for {@link net.bigeon.gclc.swt.io.ConsolePromptManager#setStream(java.io.BufferedReader)}. - */ + /** Test method for + * {@link net.bigeon.gclc.swt.io.ConsolePromptManager#setStream(java.io.BufferedReader)}. + * + * @throws IOException if error */ @Test - public void testSetStream() { + public void testSetStream() throws IOException { + // Create the dispaly, in case... + final Display d = mock(Display.class); + when(label.getDisplay()).thenReturn(d); + Mockito.doAnswer(invocation -> { + ((Runnable) invocation.getArgument(0)).run(); + return null; + }).when(d).asyncExec(any(Runnable.class)); + Mockito.doAnswer(invocation -> { + ((Runnable) invocation.getArgument(0)).run(); + return null; + }).when(d).syncExec(any(Runnable.class)); + // Test. BufferedReader output = mock(BufferedReader.class); + final Object lock = new Object(); + final AtomicInteger calls = new AtomicInteger(0); + Mockito.when(output.readLine()).then(new Answer() { + String[] ans = { "A line" }; + + @Override + public String answer(final InvocationOnMock invocation) throws Throwable { + synchronized (lock) { + if (calls.get() >= ans.length) { + calls.incrementAndGet(); + lock.notify(); + return null; + } + lock.notify(); + return ans[calls.getAndIncrement()]; + } + } + }); manager.setStream(output); manager.setStream(output); + synchronized (lock) { + while (calls.get() < 2) { + try { + lock.wait(10); + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + verify(output, times(2)).readLine(); output = mock(BufferedReader.class); + calls.set(0); + Mockito.when(output.readLine()).then(new Answer() { + String[] ans = { "A line" }; + + @Override + public String answer(final InvocationOnMock invocation) throws Throwable { + synchronized (lock) { + if (calls.get() >= ans.length) { + calls.incrementAndGet(); + lock.notify(); + return null; + } + lock.notify(); + return ans[calls.getAndIncrement()]; + } + } + }); manager.setStream(output); + while (calls.get() < 2) { + synchronized (lock) { + try { + lock.wait(10); + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } manager.setStream(null); manager.setStream(output); + while (calls.get() < 3) { + synchronized (lock) { + try { + lock.wait(10); + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + verify(output, times(3)).readLine(); + verify(label, times(2)).setText("A line"); } - } diff --git a/gclc-swt/src/test/java/net/bigeon/gclc/swt/HistoryTextKeyListenerTest.java b/gclc-swt/src/test/java/net/bigeon/gclc/swt/HistoryTextKeyListenerTest.java index 49138c6..e1695ca 100644 --- a/gclc-swt/src/test/java/net/bigeon/gclc/swt/HistoryTextKeyListenerTest.java +++ b/gclc-swt/src/test/java/net/bigeon/gclc/swt/HistoryTextKeyListenerTest.java @@ -70,6 +70,10 @@ package net.bigeon.gclc.swt; */ import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import java.io.IOException; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; @@ -145,11 +149,12 @@ public class HistoryTextKeyListenerTest { } @Test - public void testKeyPressed() { + public void testKeyPressed() throws IOException { final ConsoleDelayIO io = mock(ConsoleDelayIO.class); final KeyEvent event = mock(KeyEvent.class); event.keyCode = 'a'; final HistoryTextKeyListener listener = new HistoryTextKeyListener(io); listener.keyPressed(event); + verify(io, times(1)).validateInput(); } } diff --git a/gclc-swt/src/test/java/net/bigeon/gclc/swt/SWTConsoleShellTest.java b/gclc-swt/src/test/java/net/bigeon/gclc/swt/SWTConsoleShellTest.java index 747abb3..75483df 100644 --- a/gclc-swt/src/test/java/net/bigeon/gclc/swt/SWTConsoleShellTest.java +++ b/gclc-swt/src/test/java/net/bigeon/gclc/swt/SWTConsoleShellTest.java @@ -38,6 +38,7 @@ package net.bigeon.gclc.swt; */ import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; @@ -46,6 +47,7 @@ import org.junit.Test; import net.bigeon.gclc.manager.PipedConsoleInput; import net.bigeon.gclc.manager.PipedConsoleOutput; +import net.bigeon.gclc.swt.io.ConsoleOutputManager; /** @author Emmanuel Bigeon */ public class SWTConsoleShellTest { @@ -70,6 +72,8 @@ public class SWTConsoleShellTest { final SWTConsole console = new SWTConsole(new Shell(), SWT.NONE); // Disconnection should work. console.connect(null, null, null); + assertNull("Console should disconnect", + ((ConsoleOutputManager) console.getOutputManager()).getManager()); } } diff --git a/gclc-swt/src/test/java/net/bigeon/gclc/swt/SWTConsoleViewTest.java b/gclc-swt/src/test/java/net/bigeon/gclc/swt/SWTConsoleViewTest.java index 00a35b7..c3a0717 100644 --- a/gclc-swt/src/test/java/net/bigeon/gclc/swt/SWTConsoleViewTest.java +++ b/gclc-swt/src/test/java/net/bigeon/gclc/swt/SWTConsoleViewTest.java @@ -39,6 +39,7 @@ package net.bigeon.gclc.swt; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Shell; @@ -46,6 +47,7 @@ import org.junit.Test; import net.bigeon.gclc.manager.PipedConsoleInput; import net.bigeon.gclc.manager.PipedConsoleOutput; +import net.bigeon.gclc.swt.io.ConsoleOutputManager; /** @author Emmanuel Bigeon */ public class SWTConsoleViewTest { @@ -74,5 +76,7 @@ public class SWTConsoleViewTest { final SWTConsoleView view = new SWTConsoleView(new Shell(), SWT.NONE); // Disconnection should work. view.setManager(null, null); + assertNull("Disconnection should replace the input.", + ((ConsoleOutputManager) view.getOutputManager()).getManager()); } }