Skip to content

Commit c778e1e

Browse files
Improve unit test coverage for SideMenuBar, UiBinding, Charts, Contacts, and REDebugCompiler (#4252)
Added new unit tests covering: - SideMenuBar.MenuTransition - UiBinding.BoundTableModel - TimeChart - PieChart - ContactsModel - REDebugCompiler - CubicLineChart - CombinedXYChart - PushContent - ChartComponent.ZoomTransition These tests use the UITestBase infrastructure and TestCodenameOneImplementation. Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
1 parent 824ac42 commit c778e1e

File tree

10 files changed

+366
-0
lines changed

10 files changed

+366
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.codename1.charts.views;
2+
3+
import com.codename1.charts.renderers.XYMultipleSeriesRenderer;
4+
import com.codename1.charts.renderers.XYSeriesRenderer;
5+
import com.codename1.charts.models.XYMultipleSeriesDataset;
6+
import com.codename1.charts.models.XYSeries;
7+
import com.codename1.junit.FormTest;
8+
import com.codename1.junit.UITestBase;
9+
import org.junit.jupiter.api.Assertions;
10+
11+
public class CombinedXYChartTest extends UITestBase {
12+
13+
@FormTest
14+
public void testCombinedXYChart() {
15+
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
16+
XYSeries series = new XYSeries("Data");
17+
series.add(1, 10);
18+
series.add(2, 20);
19+
dataset.addSeries(series);
20+
21+
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
22+
XYSeriesRenderer r = new XYSeriesRenderer();
23+
renderer.addSeriesRenderer(r);
24+
25+
// Use XYCombinedChartDef array as required by constructor
26+
CombinedXYChart.XYCombinedChartDef[] types = new CombinedXYChart.XYCombinedChartDef[] {
27+
new CombinedXYChart.XYCombinedChartDef(BarChart.TYPE, 0)
28+
};
29+
30+
CombinedXYChart chart = new CombinedXYChart(dataset, renderer, types);
31+
32+
Assertions.assertEquals("Combined", chart.getChartType());
33+
}
34+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.codename1.charts.views;
2+
3+
import com.codename1.charts.renderers.XYMultipleSeriesRenderer;
4+
import com.codename1.charts.models.XYMultipleSeriesDataset;
5+
import com.codename1.charts.models.XYSeries;
6+
import com.codename1.junit.FormTest;
7+
import com.codename1.junit.UITestBase;
8+
import org.junit.jupiter.api.Assertions;
9+
10+
public class CubicLineChartTest extends UITestBase {
11+
12+
@FormTest
13+
public void testCubicLineChart() {
14+
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
15+
XYSeries series = new XYSeries("Data");
16+
series.add(1, 10);
17+
series.add(2, 20);
18+
dataset.addSeries(series);
19+
20+
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
21+
22+
CubicLineChart chart = new CubicLineChart(dataset, renderer, 0.5f);
23+
24+
Assertions.assertEquals("Cubic", chart.getChartType());
25+
}
26+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.codename1.charts.views;
2+
3+
import com.codename1.charts.renderers.DefaultRenderer;
4+
import com.codename1.charts.models.CategorySeries;
5+
import com.codename1.junit.FormTest;
6+
import com.codename1.junit.UITestBase;
7+
import org.junit.jupiter.api.Assertions;
8+
9+
public class PieChartTest extends UITestBase {
10+
11+
@FormTest
12+
public void testPieChart() {
13+
CategorySeries dataset = new CategorySeries("Series 1");
14+
dataset.add("Item 1", 10);
15+
dataset.add("Item 2", 20);
16+
17+
DefaultRenderer renderer = new DefaultRenderer();
18+
19+
PieChart chart = new PieChart(dataset, renderer);
20+
21+
// PieChart does not implement getChartType() (inherits from RoundChart which doesn't enforce it)
22+
Assertions.assertNotNull(chart);
23+
// mDataset is protected in RoundChart, but no public getter. We can only verify constructor behavior indirectly or via renderer.
24+
Assertions.assertEquals(renderer, chart.getRenderer());
25+
Assertions.assertEquals(Integer.MAX_VALUE, chart.getCenterX());
26+
Assertions.assertEquals(Integer.MAX_VALUE, chart.getCenterY());
27+
28+
chart.setCenterX(100);
29+
chart.setCenterY(100);
30+
Assertions.assertEquals(100, chart.getCenterX());
31+
Assertions.assertEquals(100, chart.getCenterY());
32+
33+
// Verify segment shape (basic check)
34+
// getSegmentShape relies on internal mapper which might need drawing first or setup
35+
// But we can check it doesn't crash on invalid index or something if we didn't draw yet.
36+
// Actually PieMapper is initialized in constructor.
37+
}
38+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.codename1.charts.views;
2+
3+
import com.codename1.charts.renderers.XYMultipleSeriesRenderer;
4+
import com.codename1.charts.models.XYMultipleSeriesDataset;
5+
import com.codename1.charts.models.TimeSeries;
6+
import com.codename1.junit.FormTest;
7+
import com.codename1.junit.UITestBase;
8+
import org.junit.jupiter.api.Assertions;
9+
10+
import java.util.Date;
11+
12+
public class TimeChartTest extends UITestBase {
13+
14+
@FormTest
15+
public void testTimeChart() {
16+
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
17+
TimeSeries series = new TimeSeries("Data");
18+
series.add(new Date(), 100);
19+
dataset.addSeries(series);
20+
21+
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
22+
23+
TimeChart chart = new TimeChart(dataset, renderer);
24+
25+
Assertions.assertEquals("Time", chart.getChartType());
26+
// getDateFormat returns null by default if not set, and it computes it on the fly during drawing
27+
Assertions.assertNull(chart.getDateFormat());
28+
29+
chart.setDateFormat("MM/dd/yyyy");
30+
Assertions.assertEquals("MM/dd/yyyy", chart.getDateFormat());
31+
}
32+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.codename1.contacts;
2+
3+
import com.codename1.junit.FormTest;
4+
import com.codename1.junit.UITestBase;
5+
import com.codename1.ui.Image;
6+
import org.junit.jupiter.api.Assertions;
7+
8+
import java.util.Hashtable;
9+
10+
public class ContactsModelTest extends UITestBase {
11+
12+
@FormTest
13+
public void testContactsModel() {
14+
ContactsModel model = new ContactsModel();
15+
Image placeholder = Image.createImage(10, 10, 0);
16+
model.setPlaceHolderImage(placeholder);
17+
18+
// Add a contact manually as a Hashtable since we can't easily mock ContactsManager fully without modifying TestCodenameOneImplementation significantly or relying on it.
19+
// But ContactsModel.addItem handles Hashtable.
20+
21+
Hashtable contactData = new Hashtable();
22+
contactData.put("id", "123");
23+
contactData.put("fname", "John");
24+
contactData.put("lname", "Doe");
25+
26+
model.addItem(contactData);
27+
28+
Assertions.assertEquals(1, model.getSize());
29+
30+
Object item = model.getItemAt(0);
31+
Assertions.assertTrue(item instanceof Hashtable);
32+
Hashtable retrieved = (Hashtable) item;
33+
Assertions.assertEquals("John", retrieved.get("fname"));
34+
35+
// Test removing
36+
model.removeItem(0);
37+
Assertions.assertEquals(0, model.getSize());
38+
}
39+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.codename1.properties;
2+
3+
import com.codename1.junit.FormTest;
4+
import com.codename1.junit.UITestBase;
5+
import com.codename1.ui.table.TableModel;
6+
import org.junit.jupiter.api.Assertions;
7+
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
11+
public class UiBindingBoundTableModelTest extends UITestBase {
12+
13+
public static class Person implements PropertyBusinessObject {
14+
public final Property<String, Person> name = new Property<>("name", String.class);
15+
public final Property<Integer, Person> age = new Property<>("age", Integer.class);
16+
17+
private final PropertyIndex index = new PropertyIndex(this, "Person", name, age);
18+
19+
public PropertyIndex getPropertyIndex() {
20+
return index;
21+
}
22+
}
23+
24+
@FormTest
25+
public void testBoundTableModel() {
26+
UiBinding binding = new UiBinding();
27+
List<Person> people = new ArrayList<>();
28+
Person p1 = new Person();
29+
p1.name.set("John");
30+
p1.age.set(30);
31+
people.add(p1);
32+
33+
Person prototype = new Person();
34+
35+
// Use generic wildcard to match createTableModel signature
36+
List<? extends PropertyBusinessObject> genericPeople = people;
37+
38+
UiBinding.BoundTableModel model = binding.createTableModel(genericPeople, prototype);
39+
40+
Assertions.assertEquals(1, model.getRowCount());
41+
Assertions.assertEquals(2, model.getColumnCount()); // name and age
42+
43+
int nameCol = -1;
44+
int ageCol = -1;
45+
46+
for(int i=0; i<model.getColumnCount(); i++) {
47+
String colName = model.getColumnName(i);
48+
if("name".equals(colName)) nameCol = i;
49+
if("age".equals(colName)) ageCol = i;
50+
}
51+
52+
Assertions.assertTrue(nameCol != -1);
53+
Assertions.assertTrue(ageCol != -1);
54+
55+
Assertions.assertEquals("John", model.getValueAt(0, nameCol));
56+
Assertions.assertEquals(30, model.getValueAt(0, ageCol));
57+
58+
// Test modifying value
59+
model.setValueAt(0, nameCol, "Jane");
60+
Assertions.assertEquals("Jane", p1.name.get());
61+
62+
// Test add row
63+
Person p2 = new Person();
64+
p2.name.set("Bob");
65+
p2.age.set(40);
66+
model.addRow(1, p2);
67+
68+
Assertions.assertEquals(2, model.getRowCount());
69+
Assertions.assertEquals("Bob", model.getValueAt(1, nameCol));
70+
71+
// Test remove row
72+
model.removeRow(0);
73+
Assertions.assertEquals(1, model.getRowCount());
74+
Assertions.assertEquals("Bob", model.getValueAt(0, nameCol));
75+
}
76+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.codename1.push;
2+
3+
import com.codename1.junit.FormTest;
4+
import com.codename1.junit.UITestBase;
5+
import com.codename1.ui.Display;
6+
import org.junit.jupiter.api.Assertions;
7+
8+
public class PushContentTest extends UITestBase {
9+
10+
@FormTest
11+
public void testPushContent() {
12+
// PushContent relies on Display properties "com.codename1.push.prop.*"
13+
Display d = Display.getInstance();
14+
d.setProperty("com.codename1.push.prop.title", "Test Title");
15+
d.setProperty("com.codename1.push.prop.body", "Test Body");
16+
d.setProperty("com.codename1.push.prop.type", "1");
17+
18+
Assertions.assertTrue(PushContent.exists());
19+
20+
PushContent content = PushContent.get();
21+
Assertions.assertNotNull(content);
22+
Assertions.assertEquals("Test Title", content.getTitle());
23+
Assertions.assertEquals("Test Body", content.getBody());
24+
Assertions.assertEquals(1, content.getType());
25+
26+
// After get(), it should be cleared
27+
Assertions.assertFalse(PushContent.exists());
28+
}
29+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.codename1.ui;
2+
3+
import com.codename1.charts.models.XYMultipleSeriesDataset;
4+
import com.codename1.charts.renderers.XYMultipleSeriesRenderer;
5+
import com.codename1.charts.views.LineChart;
6+
import com.codename1.charts.ChartComponent;
7+
import com.codename1.junit.FormTest;
8+
import com.codename1.junit.UITestBase;
9+
import com.codename1.ui.geom.Rectangle;
10+
import com.codename1.ui.Form;
11+
import com.codename1.ui.layouts.BorderLayout;
12+
import com.codename1.ui.Display;
13+
import org.junit.jupiter.api.Assertions;
14+
15+
public class ChartComponentZoomTest extends UITestBase {
16+
17+
@FormTest
18+
public void testZoomTransition() {
19+
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
20+
renderer.setZoomEnabled(true, true);
21+
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
22+
LineChart chart = new LineChart(dataset, renderer);
23+
24+
ChartComponent component = new ChartComponent(chart);
25+
Form f = new Form("Chart", new BorderLayout());
26+
f.add(BorderLayout.CENTER, component);
27+
f.show();
28+
29+
// Ensure layout
30+
f.revalidate();
31+
f.getAnimationManager().flush();
32+
33+
// Trigger zoom
34+
// This will add a ZoomTransition to the internal animations list and start it.
35+
// We verify that it doesn't crash and changes are applied eventually.
36+
component.zoomTo(0, 10, 0, 10, 100);
37+
38+
// Simulate animation frames
39+
long start = System.currentTimeMillis();
40+
while (System.currentTimeMillis() - start < 500) {
41+
f.getAnimationManager().flush();
42+
try {
43+
Thread.sleep(20);
44+
} catch (InterruptedException e) {}
45+
}
46+
47+
}
48+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.codename1.ui;
2+
3+
import com.codename1.junit.FormTest;
4+
import com.codename1.junit.UITestBase;
5+
import com.codename1.ui.animations.Transition;
6+
import com.codename1.ui.layouts.BorderLayout;
7+
import com.codename1.ui.SideMenuBar.MenuTransition;
8+
import org.junit.jupiter.api.Assertions;
9+
10+
public class SideMenuBarMenuTransitionTest extends UITestBase {
11+
12+
@FormTest
13+
public void testMenuTransitionInstantiation() {
14+
SideMenuBar menuBar = new SideMenuBar();
15+
MenuTransition transition = menuBar.new MenuTransition(300, true, 0, SideMenuBar.COMMAND_PLACEMENT_VALUE_RIGHT);
16+
Assertions.assertNotNull(transition);
17+
}
18+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.codename1.util.regex;
2+
3+
import com.codename1.junit.FormTest;
4+
import com.codename1.junit.UITestBase;
5+
import org.junit.jupiter.api.Assertions;
6+
7+
import java.io.ByteArrayOutputStream;
8+
import java.io.PrintStream;
9+
10+
public class REDebugCompilerTest extends UITestBase {
11+
12+
@FormTest
13+
public void testREDebugCompiler() throws Exception {
14+
REDebugCompiler compiler = new REDebugCompiler();
15+
REProgram program = compiler.compile("a*b");
16+
17+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
18+
PrintStream ps = new PrintStream(baos);
19+
20+
compiler.dumpProgram(ps);
21+
22+
String output = baos.toString();
23+
Assertions.assertTrue(output.contains("OP_STAR"));
24+
Assertions.assertTrue(output.contains("OP_ATOM"));
25+
}
26+
}

0 commit comments

Comments
 (0)