Skip to content

Commit 2bc78ce

Browse files
authored
Expand unit tests across charts, capture, and utilities (#4135)
1 parent df348c8 commit 2bc78ce

File tree

13 files changed

+1208
-1
lines changed

13 files changed

+1208
-1
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.codename1.capture;
2+
3+
import com.codename1.junit.FormTest;
4+
import com.codename1.junit.UITestBase;
5+
import com.codename1.media.MediaRecorderBuilder;
6+
import com.codename1.ui.events.ActionEvent;
7+
import com.codename1.ui.events.ActionListener;
8+
import com.codename1.capture.VideoCaptureConstraints;
9+
10+
import static org.junit.jupiter.api.Assertions.*;
11+
12+
class CapturePackageTest extends UITestBase {
13+
14+
@FormTest
15+
void captureSynchronousMethodsReturnConfiguredPaths() {
16+
implementation.setNextCapturePhotoPath("file://photo.jpg");
17+
assertEquals("file://photo.jpg", Capture.capturePhoto());
18+
19+
implementation.setNextCaptureAudioPath("file://audio.wav");
20+
assertEquals("file://audio.wav", Capture.captureAudio());
21+
22+
implementation.setNextCaptureVideoPath("file://video.mp4");
23+
assertEquals("file://video.mp4", Capture.captureVideo());
24+
25+
VideoCaptureConstraints constraints = new VideoCaptureConstraints();
26+
Capture.captureVideo(constraints);
27+
assertSame(constraints, implementation.getLastVideoConstraints());
28+
29+
MediaRecorderBuilder builder = new MediaRecorderBuilder();
30+
Capture.captureAudio(builder);
31+
assertSame(builder, implementation.getLastMediaRecorderBuilder());
32+
}
33+
34+
@FormTest
35+
void asynchronousCaptureInvokesListenersImmediately() {
36+
implementation.setNextCapturePhotoPath("file://async-photo.jpg");
37+
RecordingListener listener = new RecordingListener();
38+
Capture.capturePhoto(listener);
39+
assertEquals("file://async-photo.jpg", listener.lastPath);
40+
41+
implementation.setNextCaptureAudioPath("file://async-audio.wav");
42+
Capture.captureAudio(listener);
43+
assertEquals("file://async-audio.wav", listener.lastPath);
44+
45+
implementation.setNextCaptureVideoPath("file://async-video.mp4");
46+
Capture.captureVideo(listener);
47+
assertEquals("file://async-video.mp4", listener.lastPath);
48+
}
49+
50+
private static class RecordingListener implements ActionListener {
51+
private String lastPath;
52+
53+
public void actionPerformed(ActionEvent evt) {
54+
lastPath = (String) evt.getSource();
55+
}
56+
}
57+
}
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package com.codename1.charts;
2+
3+
import com.codename1.charts.compat.Canvas;
4+
import com.codename1.charts.compat.Paint;
5+
import com.codename1.charts.models.Point;
6+
import com.codename1.charts.models.SeriesSelection;
7+
import com.codename1.charts.models.XYMultipleSeriesDataset;
8+
import com.codename1.charts.models.XYSeries;
9+
import com.codename1.charts.renderers.SimpleSeriesRenderer;
10+
import com.codename1.charts.renderers.XYMultipleSeriesRenderer;
11+
import com.codename1.charts.renderers.XYSeriesRenderer;
12+
import com.codename1.charts.views.AbstractChart;
13+
import com.codename1.charts.views.LineChart;
14+
import com.codename1.junit.FormTest;
15+
import com.codename1.junit.UITestBase;
16+
import com.codename1.ui.Form;
17+
import com.codename1.ui.Graphics;
18+
import com.codename1.ui.Image;
19+
import com.codename1.ui.Transform;
20+
import com.codename1.ui.geom.Rectangle;
21+
22+
import static org.junit.jupiter.api.Assertions.*;
23+
24+
class ChartComponentInteractionTest extends UITestBase {
25+
26+
@FormTest
27+
void panAndZoomFlagsPropagateToRenderer() {
28+
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
29+
XYSeries series = new XYSeries("Series");
30+
series.add(0, 1);
31+
series.add(1, 2);
32+
dataset.addSeries(series);
33+
34+
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
35+
renderer.addSeriesRenderer(new XYSeriesRenderer());
36+
ChartComponent component = new ChartComponent(new LineChart(dataset, renderer));
37+
38+
Form form = new Form();
39+
form.add(component);
40+
form.show();
41+
42+
assertEquals(renderer.isZoomEnabled(), component.isZoomEnabled());
43+
assertEquals(renderer.isPanEnabled(), component.isPanEnabled());
44+
45+
component.setZoomEnabled(false);
46+
assertFalse(component.isZoomEnabled());
47+
assertFalse(renderer.isZoomEnabled());
48+
49+
component.setZoomEnabled(true);
50+
assertTrue(component.isZoomEnabled());
51+
assertTrue(renderer.isZoomEnabled());
52+
53+
component.setZoomEnabled(false, true);
54+
assertTrue(component.isZoomEnabled());
55+
assertFalse(renderer.isZoomXEnabled());
56+
assertTrue(renderer.isZoomYEnabled());
57+
58+
component.setPanEnabled(false);
59+
assertFalse(renderer.isPanEnabled());
60+
component.setPanEnabled(false, true);
61+
assertTrue(renderer.isPanYEnabled());
62+
assertFalse(renderer.isPanXEnabled());
63+
}
64+
65+
@FormTest
66+
void chartUtilDelegatesToChartDraw() {
67+
RecordingChart chart = new RecordingChart();
68+
ChartUtil util = new ChartUtil();
69+
Image buffer = Image.createImage(40, 30);
70+
Graphics graphics = buffer.getGraphics();
71+
Rectangle bounds = new Rectangle(5, 6, 20, 10);
72+
73+
util.paintChart(graphics, chart, bounds, 7, 9);
74+
75+
assertSame(graphics, chart.lastGraphics);
76+
assertEquals(bounds, chart.lastBounds);
77+
assertEquals(7, chart.lastAbsX);
78+
assertEquals(9, chart.lastAbsY);
79+
}
80+
81+
@FormTest
82+
void transformSetterAndGetterPersistState() {
83+
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
84+
dataset.addSeries(new XYSeries("Series"));
85+
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
86+
renderer.addSeriesRenderer(new XYSeriesRenderer());
87+
ChartComponent component = new ChartComponent(new LineChart(dataset, renderer));
88+
Form form = new Form();
89+
form.add(component);
90+
form.show();
91+
92+
Transform transform = Transform.makeIdentity();
93+
transform.translate(5, 7);
94+
component.setTransform(transform);
95+
assertSame(transform, component.getTransform());
96+
}
97+
98+
private static class RecordingChart extends AbstractChart {
99+
private Graphics lastGraphics;
100+
private Rectangle lastBounds;
101+
private int lastAbsX;
102+
private int lastAbsY;
103+
104+
@Override
105+
public void draw(Canvas canvas, int x, int y, int width, int height, Paint paint) {
106+
lastGraphics = canvas.g;
107+
lastBounds = canvas.bounds;
108+
lastAbsX = canvas.absoluteX;
109+
lastAbsY = canvas.absoluteY;
110+
}
111+
112+
@Override
113+
public void drawLegendShape(Canvas canvas, SimpleSeriesRenderer renderer, float x, float y, int seriesIndex, Paint paint) {
114+
}
115+
116+
@Override
117+
public int getLegendShapeWidth(int seriesIndex) {
118+
return 0;
119+
}
120+
121+
@Override
122+
public SeriesSelection getSeriesAndPointForScreenCoordinate(Point point) {
123+
return null;
124+
}
125+
126+
}
127+
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package com.codename1.charts.compat;
2+
3+
import com.codename1.junit.FormTest;
4+
import com.codename1.junit.UITestBase;
5+
import com.codename1.testing.TestCodenameOneImplementation.FillOperation;
6+
import com.codename1.testing.TestCodenameOneImplementation.GradientOperation;
7+
import com.codename1.ui.Image;
8+
import com.codename1.ui.geom.Rectangle;
9+
10+
import static org.junit.jupiter.api.Assertions.*;
11+
12+
class CompatCanvasTest extends UITestBase {
13+
14+
@FormTest
15+
void drawRectFillsOrStrokesBasedOnPaintStyle() {
16+
Image image = Image.createImage(6, 6);
17+
Canvas canvas = new Canvas();
18+
canvas.g = image.getGraphics();
19+
canvas.g.setAlpha(255);
20+
canvas.bounds = new Rectangle(0, 0, 6, 6);
21+
22+
Paint fillPaint = new Paint();
23+
fillPaint.setColor(0xFFFF0000);
24+
fillPaint.setStyle(Paint.Style.FILL);
25+
implementation.clearGraphicsOperations();
26+
canvas.drawRect(0, 0, 6, 6, fillPaint);
27+
FillOperation fill = latestFill();
28+
assertNotNull(fill);
29+
assertEquals(0, fill.getX());
30+
assertEquals(0, fill.getY());
31+
assertEquals(6, fill.getWidth());
32+
assertEquals(6, fill.getHeight());
33+
assertEquals(0xFFFF0000, fill.getColor());
34+
35+
Image strokeImage = Image.createImage(6, 6);
36+
canvas.g = strokeImage.getGraphics();
37+
canvas.g.setAlpha(255);
38+
Paint strokePaint = new Paint();
39+
strokePaint.setColor(0xFF00FF00);
40+
strokePaint.setStyle(Paint.Style.STROKE);
41+
implementation.clearGraphicsOperations();
42+
canvas.drawRect(0, 0, 6, 6, strokePaint);
43+
boolean hasHorizontalEdge = false;
44+
boolean hasVerticalEdge = false;
45+
for (FillOperation op : implementation.getFillOperationsSnapshot()) {
46+
if (op.getColor() == 0xFF00FF00 && op.getY() == 0 && op.getHeight() == 1 && op.getWidth() == 6) {
47+
hasHorizontalEdge = true;
48+
}
49+
if (op.getColor() == 0xFF00FF00 && op.getX() == 0 && op.getWidth() == 1 && op.getHeight() >= 4) {
50+
hasVerticalEdge = true;
51+
}
52+
}
53+
assertTrue(hasHorizontalEdge);
54+
assertTrue(hasVerticalEdge);
55+
}
56+
57+
@FormTest
58+
void gradientDrawableDrawsUsingCanvasOrientation() {
59+
Image image = Image.createImage(4, 4);
60+
Canvas canvas = new Canvas();
61+
canvas.g = image.getGraphics();
62+
canvas.g.setAlpha(255);
63+
canvas.bounds = new Rectangle(0, 0, 4, 4);
64+
65+
GradientDrawable horizontal = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT,
66+
new int[]{0xFF0000FF, 0xFFFF0000});
67+
horizontal.setBounds(0, 0, 4, 4);
68+
implementation.clearGraphicsOperations();
69+
horizontal.draw(canvas);
70+
GradientOperation gradient = implementation.getLastGradientOperation();
71+
assertNotNull(gradient);
72+
assertTrue(gradient.isHorizontal());
73+
assertEquals(0xFF0000FF, gradient.getStartColor());
74+
assertEquals(0xFFFF0000, gradient.getEndColor());
75+
76+
Image fallbackImage = Image.createImage(4, 4);
77+
canvas.g = fallbackImage.getGraphics();
78+
canvas.g.setAlpha(255);
79+
GradientDrawable fallback = new GradientDrawable(GradientDrawable.Orientation.TL_BR,
80+
new int[]{0xFF00FF00, 0xFF000000});
81+
fallback.setBounds(0, 0, 4, 4);
82+
implementation.clearGraphicsOperations();
83+
fallback.draw(canvas);
84+
assertNull(implementation.getLastGradientOperation());
85+
FillOperation fallbackFill = latestFill();
86+
assertNotNull(fallbackFill);
87+
assertEquals(0xFF00FF00, fallbackFill.getColor());
88+
}
89+
90+
private FillOperation latestFill() {
91+
FillOperation fill = null;
92+
for (FillOperation op : implementation.getFillOperationsSnapshot()) {
93+
fill = op;
94+
}
95+
return fill;
96+
}
97+
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package com.codename1.charts.transitions;
2+
3+
import com.codename1.charts.ChartComponent;
4+
import com.codename1.charts.models.XYMultipleSeriesDataset;
5+
import com.codename1.charts.models.XYSeries;
6+
import com.codename1.charts.models.XYValueSeries;
7+
import com.codename1.charts.renderers.XYMultipleSeriesRenderer;
8+
import com.codename1.charts.renderers.XYSeriesRenderer;
9+
import com.codename1.charts.views.LineChart;
10+
import com.codename1.junit.FormTest;
11+
import com.codename1.junit.UITestBase;
12+
import com.codename1.ui.Form;
13+
14+
import static org.junit.jupiter.api.Assertions.*;
15+
16+
class XYTransitionsTest extends UITestBase {
17+
18+
@FormTest
19+
void xySeriesTransitionAnimatesBufferValues() throws Exception {
20+
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
21+
XYSeries series = new XYSeries("Series");
22+
series.add(0, 1);
23+
series.add(1, 2);
24+
dataset.addSeries(series);
25+
26+
ChartComponent chartComponent = createChartComponent(dataset);
27+
Form form = new Form();
28+
form.add(chartComponent);
29+
form.show();
30+
31+
XYSeriesTransition transition = new XYSeriesTransition(chartComponent, series);
32+
XYSeries buffer = new XYSeries(series.getTitle(), series.getScaleNumber());
33+
buffer.add(0, 5);
34+
buffer.add(1, 7);
35+
transition.setBuffer(buffer);
36+
37+
transition.setDuration(5);
38+
transition.animateChart();
39+
while (transition.animate()) {
40+
Thread.sleep(5);
41+
}
42+
43+
assertEquals(2, series.getItemCount());
44+
assertEquals(5.0, series.getY(0));
45+
assertEquals(7.0, series.getY(1));
46+
assertEquals(0, buffer.getItemCount());
47+
}
48+
49+
@FormTest
50+
void multiSeriesTransitionUpdatesAllSeries() throws Exception {
51+
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
52+
XYSeries first = new XYSeries("First");
53+
first.add(0, 1);
54+
first.add(1, 2);
55+
XYSeries second = new XYSeries("Second");
56+
second.add(0, 4);
57+
second.add(1, 5);
58+
dataset.addSeries(first);
59+
dataset.addSeries(second);
60+
61+
ChartComponent chartComponent = createChartComponent(dataset);
62+
Form form = new Form();
63+
form.add(chartComponent);
64+
form.show();
65+
66+
XYMultiSeriesTransition transition = new XYMultiSeriesTransition(chartComponent, dataset);
67+
XYMultipleSeriesDataset buffer = transition.getBuffer();
68+
assertEquals(2, buffer.getSeriesCount());
69+
buffer.getSeriesAt(0).add(0, 10);
70+
buffer.getSeriesAt(0).add(1, 12);
71+
buffer.getSeriesAt(1).add(0, 8);
72+
buffer.getSeriesAt(1).add(1, 9);
73+
74+
transition.setDuration(5);
75+
transition.animateChart();
76+
while (transition.animate()) {
77+
Thread.sleep(5);
78+
}
79+
80+
assertEquals(10.0, first.getY(0));
81+
assertEquals(12.0, first.getY(1));
82+
assertEquals(8.0, second.getY(0));
83+
assertEquals(9.0, second.getY(1));
84+
assertEquals(0, buffer.getSeriesAt(0).getItemCount());
85+
assertEquals(0, buffer.getSeriesAt(1).getItemCount());
86+
}
87+
88+
private ChartComponent createChartComponent(XYMultipleSeriesDataset dataset) {
89+
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
90+
for (int i = 0; i < dataset.getSeriesCount(); i++) {
91+
renderer.addSeriesRenderer(new XYSeriesRenderer());
92+
}
93+
LineChart chart = new LineChart(dataset, renderer);
94+
ChartComponent component = new ChartComponent(chart);
95+
component.setWidth(100);
96+
component.setHeight(100);
97+
return component;
98+
}
99+
100+
}

0 commit comments

Comments
 (0)