Skip to content

Commit 3de7b45

Browse files
committed
Improve test infrastructure for transforms
1 parent 5e60511 commit 3de7b45

File tree

3 files changed

+312
-20
lines changed

3 files changed

+312
-20
lines changed

maven/core-unittests/src/test/java/com/codename1/charts/ChartComponentTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@
1111
import com.codename1.charts.views.AbstractChart;
1212
import com.codename1.charts.views.ClickableArea;
1313
import com.codename1.charts.views.XYChart;
14+
import com.codename1.impl.CodenameOneImplementation;
1415
import com.codename1.test.UITestBase;
1516
import com.codename1.ui.Transform;
1617
import com.codename1.ui.geom.Rectangle;
1718
import com.codename1.ui.geom.Shape;
19+
import com.codename1.testing.TestCodenameOneImplementation;
1820
import org.junit.jupiter.api.Test;
1921

2022
import java.lang.reflect.Field;
@@ -23,6 +25,13 @@
2325
import static org.junit.jupiter.api.Assertions.*;
2426

2527
class ChartComponentTest extends UITestBase {
28+
private TestCodenameOneImplementation testImplementation;
29+
30+
@Override
31+
protected CodenameOneImplementation createImplementation() {
32+
testImplementation = new TestCodenameOneImplementation();
33+
return testImplementation;
34+
}
2635
@Test
2736
void constructorCopiesPanAndZoomSettingsFromXYChart() {
2837
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();

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

Lines changed: 285 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,98 @@ public void resetClipTracking() {
192192
lastClipShape = null;
193193
}
194194

195+
@Override
196+
public boolean isTransformSupported() {
197+
return true;
198+
}
199+
200+
@Override
201+
public boolean isTransformSupported(Object graphics) {
202+
return true;
203+
}
204+
205+
@Override
206+
public Object makeTransformIdentity() {
207+
return new TestTransform();
208+
}
209+
210+
@Override
211+
public void setTransformIdentity(Object transform) {
212+
((TestTransform) transform).setIdentity();
213+
}
214+
215+
@Override
216+
public Object makeTransformTranslation(float translateX, float translateY, float translateZ) {
217+
TestTransform transform = new TestTransform();
218+
transform.setTranslation(translateX, translateY, translateZ);
219+
return transform;
220+
}
221+
222+
@Override
223+
public void setTransformTranslation(Object transform, float translateX, float translateY, float translateZ) {
224+
((TestTransform) transform).setTranslation(translateX, translateY, translateZ);
225+
}
226+
227+
@Override
228+
public Object makeTransformScale(float scaleX, float scaleY, float scaleZ) {
229+
TestTransform transform = new TestTransform();
230+
transform.setScale(scaleX, scaleY, scaleZ);
231+
return transform;
232+
}
233+
234+
@Override
235+
public void setTransformScale(Object transform, float scaleX, float scaleY, float scaleZ) {
236+
((TestTransform) transform).setScale(scaleX, scaleY, scaleZ);
237+
}
238+
239+
@Override
240+
public Object makeTransformAffine(double m00, double m10, double m01, double m11, double m02, double m12) {
241+
TestTransform transform = new TestTransform();
242+
transform.setAffine((float) m00, (float) m01, (float) m02, (float) m10, (float) m11, (float) m12);
243+
return transform;
244+
}
245+
246+
@Override
247+
public Object makeTransformInverse(Object nativeTransform) {
248+
return ((TestTransform) nativeTransform).createInverse();
249+
}
250+
251+
@Override
252+
public void setTransformInverse(Object nativeTransform) {
253+
((TestTransform) nativeTransform).invert();
254+
}
255+
256+
@Override
257+
public void concatenateTransform(Object left, Object right) {
258+
((TestTransform) left).concatenate((TestTransform) right);
259+
}
260+
261+
@Override
262+
public void copyTransform(Object src, Object dest) {
263+
((TestTransform) dest).copyFrom((TestTransform) src);
264+
}
265+
266+
@Override
267+
public boolean transformNativeEqualsImpl(Object t1, Object t2) {
268+
if (t1 == t2) {
269+
return true;
270+
}
271+
if (t1 == null || t2 == null) {
272+
return false;
273+
}
274+
return ((TestTransform) t1).equals((TestTransform) t2);
275+
}
276+
277+
@Override
278+
public void transformPoint(Object nativeTransform, float[] in, float[] out) {
279+
if (nativeTransform == null) {
280+
int len = Math.min(in.length, out.length);
281+
System.arraycopy(in, 0, out, 0, len);
282+
return;
283+
}
284+
((TestTransform) nativeTransform).transformPoint(in, out);
285+
}
286+
195287
// -----------------------------------------------------------------
196288
// CodenameOneImplementation abstract methods
197289
// -----------------------------------------------------------------
@@ -523,6 +615,31 @@ public Object createFont(int face, int style, int size) {
523615
return new TestFont(defaultFont.charWidth, defaultFont.height);
524616
}
525617

618+
@Override
619+
public Object loadTrueTypeFont(String fontName, String fileName) {
620+
return new TestFont(defaultFont.charWidth, defaultFont.height);
621+
}
622+
623+
@Override
624+
public Object deriveTrueTypeFont(Object font, float size, int weight) {
625+
return new TestFont(defaultFont.charWidth, defaultFont.height);
626+
}
627+
628+
@Override
629+
public Object loadNativeFont(String lookup) {
630+
return new TestFont(defaultFont.charWidth, defaultFont.height);
631+
}
632+
633+
@Override
634+
public boolean isTrueTypeSupported() {
635+
return true;
636+
}
637+
638+
@Override
639+
public boolean isNativeFontSchemeSupported() {
640+
return true;
641+
}
642+
526643
@Override
527644
public Object connect(String url, boolean read, boolean write) throws IOException {
528645
TestConnection connection = connections.computeIfAbsent(url, TestConnection::new);
@@ -869,6 +986,174 @@ public static final class TestGraphics {
869986
}
870987
}
871988

989+
private static final class TestTransform {
990+
private float m00;
991+
private float m01;
992+
private float m02;
993+
private float m10;
994+
private float m11;
995+
private float m12;
996+
private float m20;
997+
private float m21;
998+
private float m22;
999+
private float translateZ;
1000+
1001+
TestTransform() {
1002+
setIdentity();
1003+
}
1004+
1005+
void setIdentity() {
1006+
m00 = 1f;
1007+
m01 = 0f;
1008+
m02 = 0f;
1009+
m10 = 0f;
1010+
m11 = 1f;
1011+
m12 = 0f;
1012+
m20 = 0f;
1013+
m21 = 0f;
1014+
m22 = 1f;
1015+
translateZ = 0f;
1016+
}
1017+
1018+
void setTranslation(float tx, float ty, float tz) {
1019+
setIdentity();
1020+
m02 = tx;
1021+
m12 = ty;
1022+
translateZ = tz;
1023+
}
1024+
1025+
void setScale(float sx, float sy, float sz) {
1026+
setIdentity();
1027+
m00 = sx;
1028+
m11 = sy;
1029+
m22 = sz;
1030+
}
1031+
1032+
void setAffine(float nm00, float nm01, float nm02, float nm10, float nm11, float nm12) {
1033+
m00 = nm00;
1034+
m01 = nm01;
1035+
m02 = nm02;
1036+
m10 = nm10;
1037+
m11 = nm11;
1038+
m12 = nm12;
1039+
m20 = 0f;
1040+
m21 = 0f;
1041+
m22 = 1f;
1042+
translateZ = 0f;
1043+
}
1044+
1045+
void copyFrom(TestTransform other) {
1046+
m00 = other.m00;
1047+
m01 = other.m01;
1048+
m02 = other.m02;
1049+
m10 = other.m10;
1050+
m11 = other.m11;
1051+
m12 = other.m12;
1052+
m20 = other.m20;
1053+
m21 = other.m21;
1054+
m22 = other.m22;
1055+
translateZ = other.translateZ;
1056+
}
1057+
1058+
TestTransform createInverse() {
1059+
TestTransform inverse = new TestTransform();
1060+
inverse.copyFrom(this);
1061+
inverse.invert();
1062+
return inverse;
1063+
}
1064+
1065+
void invert() {
1066+
float det = m00 * m11 - m01 * m10;
1067+
if (Math.abs(det) < 1.0e-6f) {
1068+
setIdentity();
1069+
return;
1070+
}
1071+
float invDet = 1f / det;
1072+
float nm00 = m11 * invDet;
1073+
float nm01 = -m01 * invDet;
1074+
float nm02 = (m01 * m12 - m11 * m02) * invDet;
1075+
float nm10 = -m10 * invDet;
1076+
float nm11 = m00 * invDet;
1077+
float nm12 = (m10 * m02 - m00 * m12) * invDet;
1078+
m00 = nm00;
1079+
m01 = nm01;
1080+
m02 = nm02;
1081+
m10 = nm10;
1082+
m11 = nm11;
1083+
m12 = nm12;
1084+
translateZ = -translateZ;
1085+
}
1086+
1087+
void concatenate(TestTransform right) {
1088+
float nm00 = m00 * right.m00 + m01 * right.m10;
1089+
float nm01 = m00 * right.m01 + m01 * right.m11;
1090+
float nm02 = m00 * right.m02 + m01 * right.m12 + m02;
1091+
float nm10 = m10 * right.m00 + m11 * right.m10;
1092+
float nm11 = m10 * right.m01 + m11 * right.m11;
1093+
float nm12 = m10 * right.m02 + m11 * right.m12 + m12;
1094+
float nm20 = m20 * right.m00 + m21 * right.m10 + m22 * right.m20;
1095+
float nm21 = m20 * right.m01 + m21 * right.m11 + m22 * right.m21;
1096+
float nm22 = m20 * right.m02 + m21 * right.m12 + m22 * right.m22;
1097+
m00 = nm00;
1098+
m01 = nm01;
1099+
m02 = nm02;
1100+
m10 = nm10;
1101+
m11 = nm11;
1102+
m12 = nm12;
1103+
m20 = nm20;
1104+
m21 = nm21;
1105+
m22 = nm22;
1106+
translateZ = translateZ + right.translateZ;
1107+
}
1108+
1109+
void transformPoint(float[] in, float[] out) {
1110+
float x = in[0];
1111+
float y = in[1];
1112+
out[0] = m00 * x + m01 * y + m02;
1113+
out[1] = m10 * x + m11 * y + m12;
1114+
if (in.length > 2 && out.length > 2) {
1115+
float z = in[2];
1116+
out[2] = m22 * z + translateZ;
1117+
}
1118+
}
1119+
1120+
@Override
1121+
public boolean equals(Object obj) {
1122+
if (this == obj) {
1123+
return true;
1124+
}
1125+
if (!(obj instanceof TestTransform)) {
1126+
return false;
1127+
}
1128+
TestTransform other = (TestTransform) obj;
1129+
return Float.compare(m00, other.m00) == 0
1130+
&& Float.compare(m01, other.m01) == 0
1131+
&& Float.compare(m02, other.m02) == 0
1132+
&& Float.compare(m10, other.m10) == 0
1133+
&& Float.compare(m11, other.m11) == 0
1134+
&& Float.compare(m12, other.m12) == 0
1135+
&& Float.compare(m20, other.m20) == 0
1136+
&& Float.compare(m21, other.m21) == 0
1137+
&& Float.compare(m22, other.m22) == 0
1138+
&& Float.compare(translateZ, other.translateZ) == 0;
1139+
}
1140+
1141+
@Override
1142+
public int hashCode() {
1143+
int result = Float.floatToIntBits(m00);
1144+
result = 31 * result + Float.floatToIntBits(m01);
1145+
result = 31 * result + Float.floatToIntBits(m02);
1146+
result = 31 * result + Float.floatToIntBits(m10);
1147+
result = 31 * result + Float.floatToIntBits(m11);
1148+
result = 31 * result + Float.floatToIntBits(m12);
1149+
result = 31 * result + Float.floatToIntBits(m20);
1150+
result = 31 * result + Float.floatToIntBits(m21);
1151+
result = 31 * result + Float.floatToIntBits(m22);
1152+
result = 31 * result + Float.floatToIntBits(translateZ);
1153+
return result;
1154+
}
1155+
}
1156+
8721157
public static final class TestFont {
8731158
final int charWidth;
8741159
final int height;

maven/core-unittests/src/test/java/com/codename1/ui/geom/GeneralPathTest.java

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11
package com.codename1.ui.geom;
22

3+
import com.codename1.impl.CodenameOneImplementation;
4+
import com.codename1.test.UITestBase;
35
import com.codename1.testing.TestCodenameOneImplementation;
46
import com.codename1.ui.Transform;
57
import org.junit.jupiter.api.Test;
68

79
import java.util.ArrayList;
810
import java.util.List;
9-
import java.lang.reflect.Field;
1011

1112
import static org.junit.jupiter.api.Assertions.*;
1213

13-
class GeneralPathTest {
14+
class GeneralPathTest extends UITestBase {
15+
private TestCodenameOneImplementation testImplementation;
16+
17+
@Override
18+
protected CodenameOneImplementation createImplementation() {
19+
testImplementation = new TestCodenameOneImplementation();
20+
return testImplementation;
21+
}
1422

1523
@Test
1624
void testLineToWithoutMoveThrowsException() {
@@ -80,28 +88,18 @@ void testSetShapeWithTransform() {
8088
}
8189

8290
@Test
83-
void testCreateTransformedShapeReturnsScaledCopy() throws Exception {
91+
void testCreateTransformedShapeReturnsScaledCopy() {
8492
GeneralPath original = new GeneralPath();
8593
original.setRect(new Rectangle(0, 0, 10, 10), null);
8694

8795
Transform translation = Transform.makeTranslation(5f, 10f);
88-
TestCodenameOneImplementation implementation = new TestCodenameOneImplementation();
89-
Field implField = Transform.class.getDeclaredField("impl");
90-
implField.setAccessible(true);
91-
Object previous = implField.get(translation);
92-
try {
93-
implField.set(translation, implementation);
94-
95-
Shape transformed = original.createTransformedShape(translation);
96-
assertTrue(transformed instanceof GeneralPath);
97-
Rectangle bounds = transformed.getBounds();
98-
assertEquals(5, bounds.getX());
99-
assertEquals(10, bounds.getY());
100-
assertEquals(10, bounds.getWidth());
101-
assertEquals(10, bounds.getHeight());
102-
} finally {
103-
implField.set(translation, previous);
104-
}
96+
Shape transformed = original.createTransformedShape(translation);
97+
assertTrue(transformed instanceof GeneralPath);
98+
Rectangle bounds = transformed.getBounds();
99+
assertEquals(5, bounds.getX());
100+
assertEquals(10, bounds.getY());
101+
assertEquals(10, bounds.getWidth());
102+
assertEquals(10, bounds.getHeight());
105103
}
106104

107105
@Test

0 commit comments

Comments
 (0)