فهرست منبع

Add tests for most of the GUI features involved.

Sam Jaffe 5 سال پیش
والد
کامیت
272ab337bb

+ 133 - 0
src/test/java/org/leumasjaffe/recipe/view/AutoGrowPanelTest.java

@@ -0,0 +1,133 @@
+package org.leumasjaffe.recipe.view;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsArrayWithSize.arrayWithSize;
+import static org.mockito.Mockito.*;
+
+import javax.swing.JTextField;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.BadLocationException;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.platform.runner.JUnitPlatform;
+import org.junit.runner.RunWith;
+import org.leumasjaffe.recipe.view.AutoGrowPanel.DocumentListenable;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+@ExtendWith(MockitoExtension.class)
+@RunWith(JUnitPlatform.class)
+class AutoGrowPanelTest extends SwingTestCase {
+	@SuppressWarnings("serial")
+	private static class MockComponent extends JTextField implements DocumentListenable {
+		public MockComponent() {
+		}
+
+		public MockComponent(String s) {
+			super(s);
+		}
+
+		@Override
+		public void addDocumentListener(DocumentListener dl) {
+			super.getDocument().addDocumentListener(dl);
+		}
+
+		@Override
+		public void removeDocumentListener(DocumentListener dl) {
+			super.getDocument().removeDocumentListener(dl);
+		}
+	}
+	
+	@Test
+	void testAlwaysHasAtLeastOneComponent() {
+		final MockComponent wrapper = spy(new MockComponent());
+		
+		AutoGrowPanel panel = new AutoGrowPanel(() -> wrapper);
+		
+		assertThat(panel.getComponents(), arrayWithSize(1));
+	}
+
+	@Test
+	void testInputParamIsZeroIndex() {
+		final MockComponent[] wrapper = {
+				spy(new MockComponent()),
+				spy(new MockComponent())
+		};
+		
+		AutoGrowPanel panel = new AutoGrowPanel((i) -> wrapper[i], 1);
+
+		verify(wrapper[0]).addDocumentListener(any());
+		verify(wrapper[1], never()).addDocumentListener(any());
+		assertThat(panel.getComponents(), arrayWithSize(1));
+	}
+
+	@Test
+	void testCreatesGivenNumberOfChildren() {
+		final MockComponent[] wrapper = {
+				spy(new MockComponent()),
+				spy(new MockComponent())
+		};
+		
+		AutoGrowPanel panel = new AutoGrowPanel((i) -> wrapper[i], 2);
+
+		assertThat(panel.getComponents(), arrayWithSize(2));
+	}
+
+	@Test
+	void testEnteringContentTriggersNewRow() {
+		final MockComponent[] wrapper = {
+				spy(new MockComponent()),
+				spy(new MockComponent())
+		};
+		
+		AutoGrowPanel panel = new AutoGrowPanel((i) -> wrapper[i], 1);
+		getTestFrame().add(panel);
+		wrapper[0].setText("A");
+		
+		assertThat(panel.getComponents(), arrayWithSize(2));
+	}
+
+	@Test
+	void testEnteringEmptyContentDoesNotTrigger() {
+		final MockComponent[] wrapper = {
+				spy(new MockComponent()),
+				spy(new MockComponent())
+		};
+		
+		AutoGrowPanel panel = new AutoGrowPanel((i) -> wrapper[i], 1);
+		getTestFrame().add(panel);
+		wrapper[0].setText("");
+		
+		assertThat(panel.getComponents(), arrayWithSize(1));
+		verify(wrapper[0], never()).removeDocumentListener(any());
+	}
+
+	@Test
+	void testEmptyingContentClearsPanel() {
+		final MockComponent[] wrapper = {
+				spy(new MockComponent("A")),
+				spy(new MockComponent())
+		};
+		
+		AutoGrowPanel panel = new AutoGrowPanel((i) -> wrapper[i], 2);
+		getTestFrame().add(panel);
+		wrapper[0].setText("");
+		
+		assertThat(panel.getComponents(), arrayWithSize(1));
+	}
+
+
+	@Test
+	void testChangingTextDoesNotDeleteRow() throws BadLocationException {
+		final MockComponent[] wrapper = {
+				spy(new MockComponent("A")),
+				spy(new MockComponent())
+		};
+		
+		AutoGrowPanel panel = new AutoGrowPanel((i) -> wrapper[i], 2);
+		getTestFrame().add(panel);
+		wrapper[0].getDocument().insertString(0, "B", null);
+		
+		assertThat(panel.getComponents(), arrayWithSize(2));
+	}
+}

+ 45 - 0
src/test/java/org/leumasjaffe/recipe/view/CardPanelTest.java

@@ -0,0 +1,45 @@
+package org.leumasjaffe.recipe.view;
+
+import static org.mockito.Mockito.*;
+
+import java.util.Arrays;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.platform.runner.JUnitPlatform;
+import org.junit.runner.RunWith;
+import org.leumasjaffe.mock.MockObserverListener;
+import org.leumasjaffe.observer.ObserverDispatch;
+import org.leumasjaffe.recipe.model.Card;
+import org.leumasjaffe.recipe.model.Step;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+@ExtendWith(MockitoExtension.class)
+@RunWith(JUnitPlatform.class)
+class CardPanelTest extends SwingTestCase {
+	
+	@Spy MockObserverListener listener;
+	final Step stub = new Step();
+	@Mock Card stuff;
+	CardPanel panel;
+
+	@BeforeEach
+	void setUp() {
+		doReturn(Arrays.asList(stub)).when(stuff).getCooking();
+		panel = new CardPanel(stuff);
+		
+		listener.setObserved(stuff);
+		// setObserved() calls update
+		clearInvocations(listener);
+	}
+
+	@Test
+	void testPropogatesSignalFromChildren() {
+		ObserverDispatch.notifySubscribers(stub);
+		verify(listener).updateWasSignalled();
+	}
+
+}

+ 10 - 0
src/test/java/org/leumasjaffe/recipe/view/IngredientPanelTest.java

@@ -38,6 +38,14 @@ class IngredientPanelTest extends SwingTestCase {
 		assertEquals("100", panel.getTxtAmount().getText());
 		assertEquals("g", panel.getTxtUnit().getText());
 	}
+	
+	@Test
+	void testContentIsEditable() {
+		assertTrue(panel.getTxtName().isEditable());
+		assertTrue(panel.getTxtPreparation().isEditable());
+		assertTrue(panel.getTxtAmount().isEditable());
+		assertTrue(panel.getTxtUnit().isEditable());
+	}
 
 	@Test
 	void testIsSubscribedToUpdates() {
@@ -45,8 +53,10 @@ class IngredientPanelTest extends SwingTestCase {
 		assertEquals("Onions", panel.getTxtName().getText());
 		ObserverDispatch.notifySubscribers(stuff);
 		assertEquals("Bacon", panel.getTxtName().getText());
+		// TODO: I need to add hook-ups for the rest of the fields, too
 	}
 
+	// TODO: I need to add hook-ups for the rest of the fields, too
 	@Test
 	void testViewUpdateAltersModel() {
 		panel.getTxtName().setText("Bacon");

+ 47 - 0
src/test/java/org/leumasjaffe/recipe/view/IngredientPreparationPanelTest.java

@@ -0,0 +1,47 @@
+package org.leumasjaffe.recipe.view;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.leumasjaffe.observer.ObserverDispatch;
+import org.leumasjaffe.recipe.model.Amount;
+import org.leumasjaffe.recipe.model.Ingredient;
+
+class IngredientPreparationPanelTest extends SwingTestCase {
+
+	Ingredient stuff;
+	IngredientPreparationPanel panel;
+	
+	@BeforeEach
+	void setUp() {
+		stuff = new Ingredient("Onions", "Sliced", new Amount("100 g"));
+		panel = new IngredientPreparationPanel(stuff);
+	}
+
+	@Test
+	void testFilledOutWithContent() {
+		assertEquals("Onions", panel.getTxtName().getText());
+		assertEquals("Sliced", panel.getTxtPreparation().getText());
+		assertEquals("100", panel.getTxtAmount().getText());
+		assertEquals("g", panel.getTxtUnit().getText());
+	}
+	
+	@Test
+	void testCannotEditContent() {
+		assertFalse(panel.getTxtName().isEditable());
+		assertFalse(panel.getTxtPreparation().isEditable());
+		assertFalse(panel.getTxtAmount().isEditable());
+		assertFalse(panel.getTxtUnit().isEditable());
+	}
+
+	@Test
+	void testIsSubscribedToUpdates() {
+		stuff.setName("Bacon");
+		assertEquals("Onions", panel.getTxtName().getText());
+		ObserverDispatch.notifySubscribers(stuff);
+		assertEquals("Bacon", panel.getTxtName().getText());
+		// TODO: I need to add hook-ups for the rest of the fields, too
+	}
+
+}

+ 52 - 0
src/test/java/org/leumasjaffe/recipe/view/PreparationPanelTest.java

@@ -0,0 +1,52 @@
+package org.leumasjaffe.recipe.view;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsArrayWithSize.arrayWithSize;
+import static org.hamcrest.core.StringContains.containsString;
+import static org.mockito.Mockito.*;
+
+import java.util.stream.Stream;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.platform.runner.JUnitPlatform;
+import org.junit.runner.RunWith;
+import org.leumasjaffe.recipe.model.Amount;
+import org.leumasjaffe.recipe.model.Duration;
+import org.leumasjaffe.recipe.model.Ingredient;
+import org.leumasjaffe.recipe.model.Preparation;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+@ExtendWith(MockitoExtension.class)
+@RunWith(JUnitPlatform.class)
+class PreparationPanelTest extends SwingTestCase {
+	
+	Duration dur;
+	@Mock Preparation stuff;
+	PreparationPanel panel;
+	
+	@BeforeEach
+	void setUp() {
+		dur = new Duration(Duration.Display.SECONDS, false, 0, 30);
+		doReturn(dur).when(stuff).getDuration();
+		doReturn(Stream.of(
+				new Ingredient("Butter", "", new Amount("10 g")),
+				new Ingredient("Salt", "", new Amount("0.25 tsp"))
+				)).when(stuff).getIngredientsAsStream();
+		
+		panel = new PreparationPanel(stuff);
+	}
+
+	@Test
+	void testHasContent() {
+		assertThat(panel.getLblDuration().getText(),
+				containsString(dur.toString()));
+		assertThat(panel.getPanelIngredients().getComponents(),
+				arrayWithSize(2));
+	}
+
+	// TODO: Hook-ups for editing the preparation time
+	// TODO: Hook-ups for changes to the preparation model
+}

+ 45 - 0
src/test/java/org/leumasjaffe/recipe/view/ProductPanelTest.java

@@ -0,0 +1,45 @@
+package org.leumasjaffe.recipe.view;
+
+import static org.mockito.Mockito.*;
+
+import java.util.Arrays;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.platform.runner.JUnitPlatform;
+import org.junit.runner.RunWith;
+import org.leumasjaffe.mock.MockObserverListener;
+import org.leumasjaffe.observer.ObserverDispatch;
+import org.leumasjaffe.recipe.model.Card;
+import org.leumasjaffe.recipe.model.Product;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+@ExtendWith(MockitoExtension.class)
+@RunWith(JUnitPlatform.class)
+class ProductPanelTest extends SwingTestCase {
+	
+	@Spy MockObserverListener listener;
+	final Card stub = new Card();
+	@Mock Product stuff;
+	ProductPanel panel;
+
+	@BeforeEach
+	void setUp() {
+		doReturn(Arrays.asList(stub)).when(stuff).getCards();
+		panel = new ProductPanel(stuff);
+		
+		listener.setObserved(stuff);
+		// setObserved() calls update
+		clearInvocations(listener);
+	}
+
+	@Test
+	void testPropogatesSignalFromChildren() {
+		ObserverDispatch.notifySubscribers(stub);
+		verify(listener).updateWasSignalled();
+	}
+
+}

+ 59 - 0
src/test/java/org/leumasjaffe/recipe/view/ProductSummaryPanelTest.java

@@ -0,0 +1,59 @@
+package org.leumasjaffe.recipe.view;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsArrayWithSize.arrayWithSize;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import java.util.Arrays;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.platform.runner.JUnitPlatform;
+import org.junit.runner.RunWith;
+import org.leumasjaffe.observer.ObserverDispatch;
+import org.leumasjaffe.recipe.model.Amount;
+import org.leumasjaffe.recipe.model.Ingredient;
+import org.leumasjaffe.recipe.model.Product;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+@ExtendWith(MockitoExtension.class)
+@RunWith(JUnitPlatform.class)
+class ProductSummaryPanelTest extends SwingTestCase {
+	
+	@Mock Product stuff;
+	ProductSummaryPanel panel;
+	
+	@BeforeEach
+	void setUp() {
+		doReturn("Curry").when(stuff).getName();
+		doReturn(Arrays.asList(
+				new Ingredient("Onions", "", new Amount("100 g")),
+				new Ingredient("Garlic", "", new Amount("2 tsp"))))
+		.when(stuff).getIngredients();
+		
+		panel = new ProductSummaryPanel(stuff);
+	}
+
+	@Test
+	void testHasContent() {
+		assertEquals("Curry", panel.getLblProductName().getText());
+		assertThat(panel.getPanelIngredients().getComponents(),
+				arrayWithSize(2));
+	}
+	
+	@Test
+	void testRegeneratesListWhenProductNotify() {
+		doReturn(Arrays.asList(new Ingredient("Onions", "", new Amount("100 g"))))
+			.when(stuff).getIngredients();
+		
+		ObserverDispatch.notifySubscribers(stuff);
+		waitForSwing();
+		
+		assertThat(panel.getPanelIngredients().getComponents(),
+				arrayWithSize(1));
+	}
+
+}

+ 40 - 0
src/test/java/org/leumasjaffe/recipe/view/RestPanelTest.java

@@ -0,0 +1,40 @@
+package org.leumasjaffe.recipe.view;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.StringContains.containsString;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.platform.runner.JUnitPlatform;
+import org.junit.runner.RunWith;
+import org.leumasjaffe.recipe.model.Duration;
+import org.leumasjaffe.recipe.model.Rest;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+@ExtendWith(MockitoExtension.class)
+@RunWith(JUnitPlatform.class)
+class RestPanelTest extends SwingTestCase {
+	
+	Duration dur;
+	Rest stuff;
+	RestPanel panel;
+	
+	@BeforeEach
+	void setUp() {
+		dur = new Duration(Duration.Display.SECONDS, false, 0, 30);
+		stuff = new Rest(Rest.Where.REFRIGERATOR, dur);
+		panel = new RestPanel(stuff);
+	}
+
+	@Test
+	void testHasContent() {
+		assertThat(panel.getLblDuration().getText(),
+				containsString(dur.toString()));
+		assertEquals(stuff.getWhere().getHumanReadable(),
+				panel.getLblLocation().getText());
+	}
+
+	// TODO: Hook-ups for editing the preparation time
+}

+ 57 - 0
src/test/java/org/leumasjaffe/recipe/view/StepPanelTest.java

@@ -0,0 +1,57 @@
+package org.leumasjaffe.recipe.view;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsArrayWithSize.arrayWithSize;
+import static org.hamcrest.core.StringContains.containsString;
+import static org.mockito.Mockito.*;
+
+import java.util.Arrays;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.platform.runner.JUnitPlatform;
+import org.junit.runner.RunWith;
+import org.leumasjaffe.mock.MockObserverListener;
+import org.leumasjaffe.recipe.model.Amount;
+import org.leumasjaffe.recipe.model.Duration;
+import org.leumasjaffe.recipe.model.Ingredient;
+import org.leumasjaffe.recipe.model.Step;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+@ExtendWith(MockitoExtension.class)
+@RunWith(JUnitPlatform.class)
+class StepPanelTest extends SwingTestCase {
+	@Spy MockObserverListener listener;
+	Duration dur;
+	@Mock Step stuff;
+	StepPanel panel;
+
+	@BeforeEach
+	void setUp() {
+		dur = new Duration(Duration.Display.SECONDS, false, 0, 30);
+		doReturn(dur).when(stuff).getDuration();
+		doReturn("These are test instructions").when(stuff).getInstruction();
+		doReturn(Arrays.asList(new Ingredient("Onion", "Sliced", new Amount("100 g"))))
+			.when(stuff).getIngredients();
+		
+		panel = new StepPanel(0, stuff);
+		listener.setObserved(stuff);
+		// setObserved invokes our callback.
+		clearInvocations(listener);
+	}
+
+	@Test
+	void testFilledOutWithContent() {
+		assertEquals("Step 1", panel.getLblIndex().getText());
+		assertThat(panel.getLblDuration().getText(),
+				containsString(dur.toString()));
+		assertEquals("These are test instructions", panel.getTxtpnInstructions().getText());
+		assertThat(panel.getPanelIngredients().getComponents(),
+				arrayWithSize(1));
+	}
+
+}

+ 45 - 0
src/test/java/org/leumasjaffe/recipe/view/SummaryIngredientPanelTest.java

@@ -0,0 +1,45 @@
+package org.leumasjaffe.recipe.view;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.leumasjaffe.observer.ObserverDispatch;
+import org.leumasjaffe.recipe.model.Amount;
+import org.leumasjaffe.recipe.model.Ingredient;
+
+class SummaryIngredientPanelTest extends SwingTestCase {
+
+	Ingredient stuff;
+	SummaryIngredientPanel panel;
+	
+	@BeforeEach
+	void setUp() {
+		stuff = new Ingredient("Onions", "Sliced", new Amount("100 g"));
+		panel = new SummaryIngredientPanel(stuff);
+	}
+
+	@Test
+	void testFilledOutWithContent() {
+		assertEquals("Onions", panel.getTxtName().getText());
+		assertEquals("100", panel.getTxtAmount().getText());
+		assertEquals("g", panel.getTxtUnit().getText());
+	}
+	
+	@Test
+	void testCannotEditContent() {
+		assertFalse(panel.getTxtName().isEditable());
+		assertFalse(panel.getTxtAmount().isEditable());
+		assertFalse(panel.getTxtUnit().isEditable());
+	}
+
+	@Test
+	void testIsSubscribedToUpdates() {
+		stuff.setName("Bacon");
+		assertEquals("Onions", panel.getTxtName().getText());
+		ObserverDispatch.notifySubscribers(stuff);
+		assertEquals("Bacon", panel.getTxtName().getText());
+		// TODO: I need to add hook-ups for the rest of the fields, too
+	}
+
+}