Skip to content

Commit 28da8e4

Browse files
authored
Add comprehensive UI component unit tests (#4110)
* Add comprehensive UI component unit tests * Fix search and gradient unit test compilation issues * Fix failing UI component unit tests * Stabilize UI unit tests under form harness * Stabilize SearchBar and InfiniteContainer unit tests * Harden UI unit tests for deterministic expectations * Align SearchBar and TextSelection tests with runtime behavior * Adjust SearchBar test expectations
1 parent 40e723b commit 28da8e4

17 files changed

+1281
-0
lines changed

maven/core-unittests/src/test/java/com/codename1/testing/TestCodenameOneImplementation.java

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88
import com.codename1.location.LocationManager;
99
import com.codename1.media.Media;
1010
import com.codename1.media.MediaRecorderBuilder;
11+
import com.codename1.ui.Button;
1112
import com.codename1.ui.Display;
1213
import com.codename1.ui.PeerComponent;
1314
import com.codename1.ui.Stroke;
1415
import com.codename1.ui.TextArea;
1516
import com.codename1.ui.TextField;
17+
import com.codename1.ui.TextSelection;
1618
import com.codename1.ui.events.ActionListener;
1719
import com.codename1.ui.geom.Dimension;
1820
import com.codename1.ui.util.ImageIO;
@@ -99,13 +101,63 @@ public class TestCodenameOneImplementation extends CodenameOneImplementation {
99101
private boolean nativeBrowserWindowShowInvoked;
100102
private boolean nativeBrowserWindowCleanupInvoked;
101103
private boolean nativeBrowserWindowHideInvoked;
104+
private boolean nativeImageCacheSupported;
105+
private int initializeTextSelectionCount;
106+
private int deinitializeTextSelectionCount;
107+
private TextSelection lastInitializedTextSelection;
108+
private TextSelection lastDeinitializedTextSelection;
109+
private final Map<Object, HeavyButtonPeerState> heavyButtonPeers = new HashMap<Object, HeavyButtonPeerState>();
110+
private boolean requiresHeavyButton;
102111

103112

104113
public TestCodenameOneImplementation() {
105114
this(true);
106115
instance = this;
107116
}
108117

118+
public static class HeavyButtonPeerState {
119+
private final List<ActionListener> listeners = new ArrayList<ActionListener>();
120+
private int x;
121+
private int y;
122+
private int width;
123+
private int height;
124+
private boolean initCalled;
125+
private boolean deinitCalled;
126+
private int updateCount;
127+
128+
public List<ActionListener> getListeners() {
129+
return listeners;
130+
}
131+
132+
public int getX() {
133+
return x;
134+
}
135+
136+
public int getY() {
137+
return y;
138+
}
139+
140+
public int getWidth() {
141+
return width;
142+
}
143+
144+
public int getHeight() {
145+
return height;
146+
}
147+
148+
public boolean isInitCalled() {
149+
return initCalled;
150+
}
151+
152+
public boolean isDeinitCalled() {
153+
return deinitCalled;
154+
}
155+
156+
public int getUpdateCount() {
157+
return updateCount;
158+
}
159+
}
160+
109161
@Override
110162
public InputStream getResourceAsStream(Class cls, String resource) {
111163
return resourceAsStreams.get(resource);
@@ -115,6 +167,45 @@ public void putResource(String s, InputStream i) {
115167
resourceAsStreams.put(s, i);
116168
}
117169

170+
public void setSupportsNativeImageCache(boolean supported) {
171+
nativeImageCacheSupported = supported;
172+
}
173+
174+
public void resetTextSelectionTracking() {
175+
initializeTextSelectionCount = 0;
176+
deinitializeTextSelectionCount = 0;
177+
lastInitializedTextSelection = null;
178+
lastDeinitializedTextSelection = null;
179+
}
180+
181+
public int getInitializeTextSelectionCount() {
182+
return initializeTextSelectionCount;
183+
}
184+
185+
public int getDeinitializeTextSelectionCount() {
186+
return deinitializeTextSelectionCount;
187+
}
188+
189+
public TextSelection getLastInitializedTextSelection() {
190+
return lastInitializedTextSelection;
191+
}
192+
193+
public TextSelection getLastDeinitializedTextSelection() {
194+
return lastDeinitializedTextSelection;
195+
}
196+
197+
public void setRequiresHeavyButton(boolean requiresHeavyButton) {
198+
this.requiresHeavyButton = requiresHeavyButton;
199+
}
200+
201+
public void resetHeavyButtonTracking() {
202+
heavyButtonPeers.clear();
203+
}
204+
205+
public HeavyButtonPeerState getHeavyButtonPeerState(Object peer) {
206+
return heavyButtonPeers.get(peer);
207+
}
208+
118209
@Override
119210
public boolean isNativeTitle() {
120211
return nativeTitle;
@@ -133,6 +224,11 @@ public void setMutableImagesFast(boolean mutableImagesFast) {
133224
this.mutableImagesFast = mutableImagesFast;
134225
}
135226

227+
@Override
228+
public boolean supportsNativeImageCache() {
229+
return nativeImageCacheSupported;
230+
}
231+
136232
@Override
137233
public AsyncResource<Media> createBackgroundMediaAsync(String uri) {
138234
return backgroundMediaAsync;
@@ -174,6 +270,18 @@ public void setMediaAsync(AsyncResource<Media> mediaAsync) {
174270
this.mediaAsync = mediaAsync;
175271
}
176272

273+
@Override
274+
public void initializeTextSelection(TextSelection aThis) {
275+
initializeTextSelectionCount++;
276+
lastInitializedTextSelection = aThis;
277+
}
278+
279+
@Override
280+
public void deinitializeTextSelection(TextSelection aThis) {
281+
deinitializeTextSelectionCount++;
282+
lastDeinitializedTextSelection = aThis;
283+
}
284+
177285
@Override
178286
public void startRemoteControl() {
179287
startRemoteControlInvocations++;
@@ -184,6 +292,62 @@ public void stopRemoteControl() {
184292
stopRemoteControlInvocations++;
185293
}
186294

295+
@Override
296+
public Object createHeavyButton(Button aThis) {
297+
HeavyButtonPeerState state = new HeavyButtonPeerState();
298+
heavyButtonPeers.put(state, state);
299+
return state;
300+
}
301+
302+
@Override
303+
public void addHeavyActionListener(Object peer, ActionListener l) {
304+
HeavyButtonPeerState state = heavyButtonPeers.get(peer);
305+
if (state != null) {
306+
state.getListeners().add(l);
307+
}
308+
}
309+
310+
@Override
311+
public void removeHeavyActionListener(Object peer, ActionListener l) {
312+
HeavyButtonPeerState state = heavyButtonPeers.get(peer);
313+
if (state != null) {
314+
state.getListeners().remove(l);
315+
}
316+
}
317+
318+
@Override
319+
public void updateHeavyButtonBounds(Object peer, int x, int y, int width, int height) {
320+
HeavyButtonPeerState state = heavyButtonPeers.get(peer);
321+
if (state != null) {
322+
state.x = x;
323+
state.y = y;
324+
state.width = width;
325+
state.height = height;
326+
state.updateCount++;
327+
}
328+
}
329+
330+
@Override
331+
public void initHeavyButton(Object peer) {
332+
HeavyButtonPeerState state = heavyButtonPeers.get(peer);
333+
if (state != null) {
334+
state.initCalled = true;
335+
}
336+
}
337+
338+
@Override
339+
public void deinitializeHeavyButton(Object peer) {
340+
HeavyButtonPeerState state = heavyButtonPeers.get(peer);
341+
if (state != null) {
342+
state.deinitCalled = true;
343+
}
344+
}
345+
346+
@Override
347+
public boolean requiresHeavyButtonForCopyToClipboard() {
348+
return requiresHeavyButton;
349+
}
350+
187351
public int getStartRemoteControlInvocations() {
188352
return startRemoteControlInvocations;
189353
}
@@ -523,6 +687,18 @@ public void setTransformScale(Object transform, float scaleX, float scaleY, floa
523687
((TestTransform) transform).setScale(scaleX, scaleY, scaleZ);
524688
}
525689

690+
@Override
691+
public Object makeTransformRotation(float angle, float x, float y, float z) {
692+
TestTransform transform = new TestTransform();
693+
transform.setRotation(angle, x, y);
694+
return transform;
695+
}
696+
697+
@Override
698+
public void setTransformRotation(Object transform, float angle, float x, float y, float z) {
699+
((TestTransform) transform).setRotation(angle, x, y);
700+
}
701+
526702
@Override
527703
public Object makeTransformAffine(double m00, double m10, double m01, double m11, double m02, double m12) {
528704
TestTransform transform = new TestTransform();
@@ -1169,6 +1345,10 @@ public String getPlatformName() {
11691345

11701346
@Override
11711347
public L10NManager getLocalizationManager() {
1348+
if (localizationManager == null) {
1349+
localizationManager = new L10NManager("en", "US") {
1350+
};
1351+
}
11721352
return localizationManager;
11731353
}
11741354

@@ -1380,6 +1560,18 @@ void setScale(float sx, float sy, float sz) {
13801560
m22 = sz;
13811561
}
13821562

1563+
void setRotation(float angle, float px, float py) {
1564+
setIdentity();
1565+
float cos = (float) Math.cos(angle);
1566+
float sin = (float) Math.sin(angle);
1567+
m00 = cos;
1568+
m01 = -sin;
1569+
m10 = sin;
1570+
m11 = cos;
1571+
m02 = px - px * cos + py * sin;
1572+
m12 = py - px * sin - py * cos;
1573+
}
1574+
13831575
void setAffine(float nm00, float nm01, float nm02, float nm10, float nm11, float nm12) {
13841576
m00 = nm00;
13851577
m01 = nm01;
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.codename1.ui;
2+
3+
import com.codename1.junit.FormTest;
4+
import com.codename1.junit.UITestBase;
5+
import com.codename1.ui.Button;
6+
import com.codename1.ui.Label;
7+
8+
import static org.junit.jupiter.api.Assertions.*;
9+
10+
class ComponentGroupTest extends UITestBase {
11+
12+
@FormTest
13+
void testForceGroupAssignsUiids() {
14+
ComponentGroup group = new ComponentGroup();
15+
group.setForceGroup(true);
16+
Button first = new Button("First");
17+
Button middle = new Button("Middle");
18+
Button last = new Button("Last");
19+
group.add(first);
20+
group.add(middle);
21+
group.add(last);
22+
23+
group.refreshTheme(true);
24+
assertEquals("ButtonGroupFirst", first.getUIID());
25+
assertEquals("ButtonGroup", middle.getUIID());
26+
assertEquals("ButtonGroupLast", last.getUIID());
27+
28+
group.removeComponent(middle);
29+
group.refreshTheme(true);
30+
assertEquals("ButtonGroupFirst", first.getUIID());
31+
assertEquals("ButtonGroupLast", last.getUIID());
32+
assertEquals("Button", middle.getUIID());
33+
}
34+
35+
@FormTest
36+
void testHorizontalModeUpdatesUiids() {
37+
ComponentGroup group = new ComponentGroup();
38+
group.setForceGroup(true);
39+
group.setHorizontal(true);
40+
Button first = new Button("One");
41+
Button second = new Button("Two");
42+
group.add(first);
43+
group.add(second);
44+
45+
group.refreshTheme(true);
46+
assertTrue(group.isHorizontal());
47+
assertEquals("ToggleButtonFirst", first.getUIID());
48+
assertEquals("ToggleButtonLast", second.getUIID());
49+
50+
group.setHorizontal(false);
51+
group.refreshTheme(true);
52+
assertFalse(group.isHorizontal());
53+
}
54+
55+
@FormTest
56+
void testStaticEncloseHelpers() {
57+
Label l1 = new Label("A");
58+
Label l2 = new Label("B");
59+
ComponentGroup vertical = ComponentGroup.enclose(l1, l2);
60+
assertFalse(vertical.isHorizontal());
61+
62+
ComponentGroup horizontal = ComponentGroup.encloseHorizontal(new Label("X"), new Label("Y"));
63+
assertTrue(horizontal.isHorizontal());
64+
}
65+
}

0 commit comments

Comments
 (0)