| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- package org.leumasjaffe.recipe.view;
- import static org.hamcrest.MatcherAssert.assertThat;
- import static org.hamcrest.collection.IsArrayWithSize.arrayWithSize;
- import static org.mockito.Mockito.*;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
- import java.util.function.Consumer;
- 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.leumasjaffe.recipe.view.AutoGrowPanel.ChildComponent;
- import org.mockito.Mock;
- import org.mockito.Spy;
- import org.mockito.junit.jupiter.MockitoExtension;
- @ExtendWith(MockitoExtension.class)
- class AutoGrowPanelTest extends SwingTestCase {
- @SuppressWarnings("serial")
- private static class MockComponent extends JTextField implements ChildComponent {
- public MockComponent() {
- }
- public MockComponent(String s) {
- super(s);
- }
- @Override
- public void addGrowShrinkListener(DocumentListener dl) {
- super.getDocument().addDocumentListener(dl);
- }
- @Override
- public void removeGrowShrinkListener(DocumentListener dl) {
- super.getDocument().removeDocumentListener(dl);
- }
- }
-
- @Mock Consumer<Boolean> callback;
- List<MockComponent> internal = new ArrayList<>();
- @Spy List<MockComponent> shared = new ArrayList<>();
-
- private MockComponent mocked() {
- final MockComponent mock = spy(new MockComponent());
- internal.add(mock);
- return mock;
- }
-
- private AutoGrowPanel<MockComponent, MockComponent> create(MockComponent... mocks) {
- shared.addAll(Arrays.asList(mocks));
- final AutoGrowPanel<MockComponent, MockComponent> rval =
- new AutoGrowPanel<>(this::mocked, m -> m);
-
- rval.setModel(shared);
- return rval;
- }
-
- @Test
- void testAlwaysHasAtLeastOneComponent() {
- AutoGrowPanel<MockComponent, MockComponent> panel =
- new AutoGrowPanel<>(this::mocked, m -> m);
-
- assertThat(panel.getComponents(), arrayWithSize(1));
- }
-
- @Test
- void testInitialComponentAssignedFirstPosition() {
- @SuppressWarnings("unused")
- AutoGrowPanel<MockComponent, MockComponent> panel =
- new AutoGrowPanel<>(this::mocked, m -> m);
-
- verify(internal.get(0)).setListPosition(0);
- }
-
- @Test
- void testSetModelCallsListPositionEvenIfNoChange() {
- AutoGrowPanel<MockComponent, MockComponent> panel = create();
-
- assertThat(panel.getComponents(), arrayWithSize(1));
- verify(internal.get(0), times(2)).setListPosition(0);
- }
- @Test
- void testCreatesGivenNumberOfChildrenPlusOne() {
- AutoGrowPanel<MockComponent, MockComponent> panel = create(mocked(), mocked());
- assertThat(panel.getComponents(), arrayWithSize(3));
- verify(shared, never()).add(any());
- }
- @Test
- void testResetsListPositionAfterSettingModel() {
- @SuppressWarnings("unused")
- AutoGrowPanel<MockComponent, MockComponent> panel = create(mocked(), mocked());
-
- // Last element because my helper function pre-installs into the internal list
- verify(internal.get(2)).setListPosition(0);
- verify(internal.get(2)).setListPosition(2);
- }
- @Test
- void testEnteringContentTriggersNewRow() {
- AutoGrowPanel<MockComponent, MockComponent> panel = create();
- internal.get(0).setText("A");
- assertThat(panel.getComponents(), arrayWithSize(2));
-
- internal.get(1).setText("B");
- assertThat(panel.getComponents(), arrayWithSize(3));
-
- verify(shared, times(2)).add(any());
- }
- @Test
- void testEnteringContentAssignsCorrectListPosition() {
- @SuppressWarnings("unused")
- AutoGrowPanel<MockComponent, MockComponent> panel = create();
- internal.get(0).setText("A");
-
- verify(internal.get(1)).setListPosition(1);
- }
- @Test
- void testEnteringEmptyContentDoesNotTrigger() {
- AutoGrowPanel<MockComponent, MockComponent> panel = create();
- getTestFrame().add(panel);
- internal.get(0).setText("");
-
- assertThat(panel.getComponents(), arrayWithSize(1));
- verify(shared, never()).add(any());
- verify(shared, never()).remove(anyInt());
- }
- @Test
- void testEmptyingContentClearsPanel() {
- final MockComponent mock = spy(new MockComponent("A"));
-
- AutoGrowPanel<MockComponent, MockComponent> panel = create(mock);
- getTestFrame().add(panel);
- mock.setText("");
-
- assertThat(panel.getComponents(), arrayWithSize(1));
- verify(shared, times(1)).remove(0);
- }
- @Test
- void testEmptyingContentAdjustsAllPositions() {
- final MockComponent mock = spy(new MockComponent("A"));
-
- @SuppressWarnings("unused")
- AutoGrowPanel<MockComponent, MockComponent> panel = create(mock);
-
- mock.setText("");
-
- verify(internal.get(0), times(2)).setListPosition(0);
- }
- @Test
- void testRemovingSomeContentDoesntClear() throws BadLocationException {
- final MockComponent mock = spy(new MockComponent("AB"));
-
- AutoGrowPanel<MockComponent, MockComponent> panel = create(mock);
- getTestFrame().add(panel);
- mock.getDocument().remove(0, 1);
-
- assertThat(panel.getComponents(), arrayWithSize(2));
- verify(shared, never()).remove(anyInt());
- }
- @Test
- void testChangingTextDoesNotDeleteRow() throws BadLocationException {
- final MockComponent mock = spy(new MockComponent("A"));
-
- AutoGrowPanel<MockComponent, MockComponent> panel = create(mock);
- getTestFrame().add(panel);
- mock.getDocument().insertString(0, "B", null);
-
- assertThat(panel.getComponents(), arrayWithSize(2));
- verify(shared, never()).remove(anyInt());
- }
- @Test
- void testCanInstallNotificationCallbackForAddsAndDeletes() {
- AutoGrowPanel<MockComponent, MockComponent> panel = create();
- panel.setModel(shared, callback);
- getTestFrame().add(panel);
- verify(callback, never()).accept(anyBoolean());
- internal.get(0).setText("A");
- verify(callback).accept(true);
- internal.get(0).setText("");
- verify(callback).accept(false);
- }
-
- }
|