AutoGrowPanelTest.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. package org.leumasjaffe.recipe.view;
  2. import static org.hamcrest.MatcherAssert.assertThat;
  3. import static org.hamcrest.collection.IsArrayWithSize.arrayWithSize;
  4. import static org.mockito.Mockito.*;
  5. import java.util.ArrayList;
  6. import java.util.Arrays;
  7. import java.util.List;
  8. import java.util.function.Consumer;
  9. import javax.swing.JTextField;
  10. import javax.swing.event.DocumentListener;
  11. import javax.swing.text.BadLocationException;
  12. import org.junit.jupiter.api.Test;
  13. import org.junit.jupiter.api.extension.ExtendWith;
  14. import org.leumasjaffe.recipe.view.AutoGrowPanel.ChildComponent;
  15. import org.mockito.Mock;
  16. import org.mockito.Spy;
  17. import org.mockito.junit.jupiter.MockitoExtension;
  18. @ExtendWith(MockitoExtension.class)
  19. class AutoGrowPanelTest extends SwingTestCase {
  20. @SuppressWarnings("serial")
  21. private static class MockComponent extends JTextField implements ChildComponent {
  22. public MockComponent() {
  23. }
  24. public MockComponent(String s) {
  25. super(s);
  26. }
  27. @Override
  28. public void addGrowShrinkListener(DocumentListener dl) {
  29. super.getDocument().addDocumentListener(dl);
  30. }
  31. @Override
  32. public void removeGrowShrinkListener(DocumentListener dl) {
  33. super.getDocument().removeDocumentListener(dl);
  34. }
  35. }
  36. @Mock Consumer<Boolean> callback;
  37. List<MockComponent> internal = new ArrayList<>();
  38. @Spy List<MockComponent> shared = new ArrayList<>();
  39. private MockComponent mocked() {
  40. final MockComponent mock = spy(new MockComponent());
  41. internal.add(mock);
  42. return mock;
  43. }
  44. private AutoGrowPanel<MockComponent, MockComponent> create(MockComponent... mocks) {
  45. shared.addAll(Arrays.asList(mocks));
  46. final AutoGrowPanel<MockComponent, MockComponent> rval =
  47. new AutoGrowPanel<>(this::mocked, m -> m);
  48. rval.setModel(shared);
  49. return rval;
  50. }
  51. @Test
  52. void testAlwaysHasAtLeastOneComponent() {
  53. AutoGrowPanel<MockComponent, MockComponent> panel =
  54. new AutoGrowPanel<>(this::mocked, m -> m);
  55. assertThat(panel.getComponents(), arrayWithSize(1));
  56. }
  57. @Test
  58. void testInitialComponentAssignedFirstPosition() {
  59. @SuppressWarnings("unused")
  60. AutoGrowPanel<MockComponent, MockComponent> panel =
  61. new AutoGrowPanel<>(this::mocked, m -> m);
  62. verify(internal.get(0)).setListPosition(0);
  63. }
  64. @Test
  65. void testSetModelCallsListPositionEvenIfNoChange() {
  66. AutoGrowPanel<MockComponent, MockComponent> panel = create();
  67. assertThat(panel.getComponents(), arrayWithSize(1));
  68. verify(internal.get(0), times(2)).setListPosition(0);
  69. }
  70. @Test
  71. void testCreatesGivenNumberOfChildrenPlusOne() {
  72. AutoGrowPanel<MockComponent, MockComponent> panel = create(mocked(), mocked());
  73. assertThat(panel.getComponents(), arrayWithSize(3));
  74. verify(shared, never()).add(any());
  75. }
  76. @Test
  77. void testResetsListPositionAfterSettingModel() {
  78. @SuppressWarnings("unused")
  79. AutoGrowPanel<MockComponent, MockComponent> panel = create(mocked(), mocked());
  80. // Last element because my helper function pre-installs into the internal list
  81. verify(internal.get(2)).setListPosition(0);
  82. verify(internal.get(2)).setListPosition(2);
  83. }
  84. @Test
  85. void testEnteringContentTriggersNewRow() {
  86. AutoGrowPanel<MockComponent, MockComponent> panel = create();
  87. internal.get(0).setText("A");
  88. assertThat(panel.getComponents(), arrayWithSize(2));
  89. internal.get(1).setText("B");
  90. assertThat(panel.getComponents(), arrayWithSize(3));
  91. verify(shared, times(2)).add(any());
  92. }
  93. @Test
  94. void testEnteringContentAssignsCorrectListPosition() {
  95. @SuppressWarnings("unused")
  96. AutoGrowPanel<MockComponent, MockComponent> panel = create();
  97. internal.get(0).setText("A");
  98. verify(internal.get(1)).setListPosition(1);
  99. }
  100. @Test
  101. void testEnteringEmptyContentDoesNotTrigger() {
  102. AutoGrowPanel<MockComponent, MockComponent> panel = create();
  103. getTestFrame().add(panel);
  104. internal.get(0).setText("");
  105. assertThat(panel.getComponents(), arrayWithSize(1));
  106. verify(shared, never()).add(any());
  107. verify(shared, never()).remove(anyInt());
  108. }
  109. @Test
  110. void testEmptyingContentClearsPanel() {
  111. final MockComponent mock = spy(new MockComponent("A"));
  112. AutoGrowPanel<MockComponent, MockComponent> panel = create(mock);
  113. getTestFrame().add(panel);
  114. mock.setText("");
  115. assertThat(panel.getComponents(), arrayWithSize(1));
  116. verify(shared, times(1)).remove(0);
  117. }
  118. @Test
  119. void testEmptyingContentAdjustsAllPositions() {
  120. final MockComponent mock = spy(new MockComponent("A"));
  121. @SuppressWarnings("unused")
  122. AutoGrowPanel<MockComponent, MockComponent> panel = create(mock);
  123. mock.setText("");
  124. verify(internal.get(0), times(2)).setListPosition(0);
  125. }
  126. @Test
  127. void testRemovingSomeContentDoesntClear() throws BadLocationException {
  128. final MockComponent mock = spy(new MockComponent("AB"));
  129. AutoGrowPanel<MockComponent, MockComponent> panel = create(mock);
  130. getTestFrame().add(panel);
  131. mock.getDocument().remove(0, 1);
  132. assertThat(panel.getComponents(), arrayWithSize(2));
  133. verify(shared, never()).remove(anyInt());
  134. }
  135. @Test
  136. void testChangingTextDoesNotDeleteRow() throws BadLocationException {
  137. final MockComponent mock = spy(new MockComponent("A"));
  138. AutoGrowPanel<MockComponent, MockComponent> panel = create(mock);
  139. getTestFrame().add(panel);
  140. mock.getDocument().insertString(0, "B", null);
  141. assertThat(panel.getComponents(), arrayWithSize(2));
  142. verify(shared, never()).remove(anyInt());
  143. }
  144. @Test
  145. void testCanInstallNotificationCallbackForAddsAndDeletes() {
  146. AutoGrowPanel<MockComponent, MockComponent> panel = create();
  147. panel.setModel(shared, callback);
  148. getTestFrame().add(panel);
  149. verify(callback, never()).accept(anyBoolean());
  150. internal.get(0).setText("A");
  151. verify(callback).accept(true);
  152. internal.get(0).setText("");
  153. verify(callback).accept(false);
  154. }
  155. }