Skip to content

Commit 469f784

Browse files
authored
Merge pull request #463 from TESTARtool/master_android
Fix Android SPY is displayed property and improve Verdict visualizers
2 parents 264312f + 66313ba commit 469f784

12 files changed

Lines changed: 110 additions & 35 deletions

File tree

CHANGELOG

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
#TESTAR v2.7.20 (3-Feb-2026)
2+
- Fix android SPY is displayed property
3+
- Add Rect overlap method
4+
- Add Visualizer join method
5+
16
#TESTAR v2.7.19 (27-Jan-2026)
27
- Bump org.seleniumhq.selenium:selenium-java from 4.39.0 to 4.40.0
38
- Update devtools dependencies to v144

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.7.19
1+
2.7.20

android/src/org/testar/monkey/alayer/android/spy_visualization/TreeVisualizationAndroid.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/***************************************************************************************************
22
*
3-
* Copyright (c) 2020 - 2025 Universitat Politecnica de Valencia - www.upv.es
4-
* Copyright (c) 2020 - 2025 Open Universiteit - www.ou.nl
3+
* Copyright (c) 2020 - 2026 Universitat Politecnica de Valencia - www.upv.es
4+
* Copyright (c) 2020 - 2026 Open Universiteit - www.ou.nl
55
*
66
* Redistribution and use in source and binary forms, with or without
77
* modification, are permitted provided that the following conditions are met:
@@ -389,7 +389,7 @@ private void displayWidgetInfo(Widget nodeWidget) {
389389
infoPaneRight.add(new JLabel(String.valueOf(selectedWidget))).setFont(new Font("SansSerif", Font.PLAIN, fontSize));
390390

391391
infoPaneLeft.add(new JLabel("Displayed: ")).setFont(new Font("SansSerif", Font.BOLD, fontSize));
392-
infoPaneRight.add(new JLabel(String.valueOf(selectedWidget))).setFont(new Font("SansSerif", Font.PLAIN, fontSize));
392+
infoPaneRight.add(new JLabel(String.valueOf(displayedWidget))).setFont(new Font("SansSerif", Font.PLAIN, fontSize));
393393

394394
infoPaneLeft.add(new JLabel("Current Activity: ")).setFont(new Font("SansSerif", Font.BOLD, fontSize));
395395
infoPaneRight.add(new JLabel(String.valueOf(activityWidget))).setFont(new Font("SansSerif", Font.PLAIN, fontSize));

core/src/org/testar/monkey/alayer/Rect.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/***************************************************************************************************
22
*
3-
* Copyright (c) 2013, 2014, 2015, 2016, 2017 Universitat Politecnica de Valencia - www.upv.es
3+
* Copyright (c) 2013 - 2026 Universitat Politecnica de Valencia - www.upv.es
4+
* Copyright (c) 2018 - 2026 Open Universiteit - www.ou.nl
45
*
56
* Redistribution and use in source and binary forms, with or without
67
* modification, are permitted provided that the following conditions are met:
@@ -27,10 +28,6 @@
2728
* POSSIBILITY OF SUCH DAMAGE.
2829
*******************************************************************************************************/
2930

30-
31-
/**
32-
* @author Sebastian Bauersfeld
33-
*/
3431
package org.testar.monkey.alayer;
3532

3633
import org.testar.monkey.Assert;
@@ -47,6 +44,14 @@ public static boolean intersect(Rect r1, Rect r2) {
4744
r2.y() + r2.height() < r1.y());
4845
}
4946

47+
public static boolean overlap(Rect r1, Rect r2) {
48+
Assert.notNull(r1, r2);
49+
return !(r1.x() + r1.width() <= r2.x() ||
50+
r1.y() + r1.height() <= r2.y() ||
51+
r2.x() + r2.width() <= r1.x() ||
52+
r2.y() + r2.height() <= r1.y());
53+
}
54+
5055
public static boolean contains(Rect r1, Rect r2) {
5156
Assert.notNull(r1, r2);
5257
return r2.x() >= r1.x() && r2.x() + r2.width() <= r1.x() + r1.width() &&
@@ -102,7 +107,6 @@ public void paint(Canvas canvas, Pen pen) {
102107
canvas.rect(pen, x, y, width, height);
103108
}
104109

105-
// by urueda
106110
@Override
107111
public boolean equals(Object o){
108112
if (o == this) return true;

core/src/org/testar/monkey/alayer/Verdict.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/***************************************************************************************************
22
*
3-
* Copyright (c) 2013 - 2025 Universitat Politecnica de Valencia - www.upv.es
4-
* Copyright (c) 2018 - 2025 Open Universiteit - www.ou.nl
3+
* Copyright (c) 2013 - 2026 Universitat Politecnica de Valencia - www.upv.es
4+
* Copyright (c) 2018 - 2026 Open Universiteit - www.ou.nl
55
*
66
* Redistribution and use in source and binary forms, with or without
77
* modification, are permitted provided that the following conditions are met:
@@ -213,7 +213,7 @@ public Verdict join(Verdict verdict) {
213213
String joinedInfo = this.info.contains(verdict.info()) ? this.info
214214
: (this.severity == Severity.OK.getValue() ? "" : this.info + "\n") + verdict.info();
215215

216-
Visualizer joinedVisualizer = (this.severity >= verdict.severity()) ? this.visualizer() : verdict.visualizer();
216+
Visualizer joinedVisualizer = Visualizer.join(this.visualizer(), verdict.visualizer());
217217

218218
return new Verdict(joinedSeverity, joinedInfo, joinedVisualizer);
219219
}

core/src/org/testar/monkey/alayer/Visualizer.java

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/***************************************************************************************************
22
*
3-
* Copyright (c) 2013 - 2025 Universitat Politecnica de Valencia - www.upv.es
4-
* Copyright (c) 2018 - 2025 Open Universiteit - www.ou.nl
3+
* Copyright (c) 2013 - 2026 Universitat Politecnica de Valencia - www.upv.es
4+
* Copyright (c) 2018 - 2026 Open Universiteit - www.ou.nl
55
*
66
* Redistribution and use in source and binary forms, with or without
77
* modification, are permitted provided that the following conditions are met:
@@ -31,13 +31,42 @@
3131
package org.testar.monkey.alayer;
3232

3333
import java.io.Serializable;
34+
import java.util.ArrayList;
3435
import java.util.Arrays;
3536
import java.util.List;
3637

38+
import org.testar.monkey.Assert;
39+
import org.testar.monkey.Util;
40+
3741
public interface Visualizer extends Serializable {
3842
void run(State state, Canvas canvas, Pen pen);
3943

4044
default List<Shape> getShapes() {
4145
return Arrays.asList(Rect.from(0, 0, 0, 0));
4246
}
47+
48+
static Visualizer join(Visualizer first, Visualizer second) {
49+
if (first == second) return first;
50+
if (first == Util.NullVisualizer) return second;
51+
if (second == Util.NullVisualizer) return first;
52+
53+
return new Visualizer() {
54+
private static final long serialVersionUID = 1L;
55+
56+
@Override
57+
public void run(State state, Canvas canvas, Pen pen) {
58+
Assert.notNull(state, canvas, pen);
59+
first.run(state, canvas, pen);
60+
second.run(state, canvas, pen);
61+
}
62+
63+
@Override
64+
public List<Shape> getShapes() {
65+
ArrayList<Shape> merged = new ArrayList<>();
66+
merged.addAll(first.getShapes());
67+
merged.addAll(second.getShapes());
68+
return merged;
69+
}
70+
};
71+
}
4372
}

core/test/org/testar/monkey/alayer/VerdictTest.java

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/***************************************************************************************************
22
*
3-
* Copyright (c) 2013 - 2025 Universitat Politecnica de Valencia - www.upv.es
4-
* Copyright (c) 2018 - 2025 Open Universiteit - www.ou.nl
3+
* Copyright (c) 2013 - 2026 Universitat Politecnica de Valencia - www.upv.es
4+
* Copyright (c) 2018 - 2026 Open Universiteit - www.ou.nl
55
*
66
* Redistribution and use in source and binary forms, with or without
77
* modification, are permitted provided that the following conditions are met:
@@ -32,7 +32,11 @@
3232

3333
import static org.junit.Assert.*;
3434

35+
import java.util.Arrays;
36+
3537
import org.junit.Test;
38+
import org.testar.monkey.alayer.visualizers.RegionsVisualizer;
39+
import org.testar.monkey.alayer.visualizers.ShapeVisualizer;
3640

3741
public class VerdictTest {
3842

@@ -43,10 +47,17 @@ public class VerdictTest {
4347
public void run(State s, Canvas c, Pen pen) {}
4448
};
4549

46-
private final Visualizer failVisualizer = new Visualizer(){
47-
private static final long serialVersionUID = -2732461936562344367L;
48-
public void run(State s, Canvas c, Pen pen) {}
49-
};
50+
private final Visualizer failVisualizer = new ShapeVisualizer(
51+
Pen.PEN_RED,
52+
Rect.from(0, 0, 10, 10),
53+
"Fail Visualizer",
54+
0.5, 0.5);
55+
56+
private final Visualizer issueVisualizer = new RegionsVisualizer(
57+
Pen.PEN_RED,
58+
Arrays.asList(Rect.from(0, 0, 10, 10)),
59+
"Issue Visualizer",
60+
0.5, 0.5);
5061

5162
@Test
5263
public void testToString() {
@@ -60,6 +71,8 @@ public void testJoin() {
6071
Verdict v1 = new Verdict(Verdict.Severity.OK, "Foo Bar");
6172
Verdict v2 = new Verdict(Verdict.Severity.FAIL, "Bar", failVisualizer);
6273
Verdict v3 = new Verdict(Verdict.Severity.OK, "Baz", dummyVisualizer);
74+
Verdict v4 = new Verdict(Verdict.Severity.FAIL, "Exception", issueVisualizer);
75+
Verdict emptyVisualizerVerdict = new Verdict(Verdict.Severity.FAIL, "Empty");
6376

6477
assertTrue("Joining two Verdicts shall create a new Verdict",
6578
v1 != v1.join(v2));
@@ -79,11 +92,29 @@ public void testJoin() {
7992
"then both infos shall be included separated by a line break",
8093
"Bar\nBaz", v2.join(v3).info());
8194

82-
assertTrue("Joining two Verdicts shall use the Visualizer of the Verdict with high severity",
95+
assertTrue("Joining an OK and Fail Verdicts shall use the Visualizer of the Verdict with high severity",
8396
v2.join(v1).visualizer() == failVisualizer);
8497

85-
assertTrue("Joining two Verdicts shall use the Visualizer of the Verdict with high severity",
98+
assertTrue("Joining an OK and Fail Verdicts shall use the Visualizer of the Verdict with high severity",
8699
v1.join(v2).visualizer() == failVisualizer);
100+
101+
assertTrue("Joining Fail and Issue Verdicts must contain Fail Shapes",
102+
v2.join(v4).visualizer().getShapes().containsAll(failVisualizer.getShapes()));
103+
104+
assertTrue("Joining Issue and Fail Verdicts must contain Fail Shapes",
105+
v4.join(v2).visualizer().getShapes().containsAll(failVisualizer.getShapes()));
106+
107+
assertTrue("Joining Fail and Issue Verdicts must contain Issue Shapes",
108+
v2.join(v4).visualizer().getShapes().containsAll(issueVisualizer.getShapes()));
109+
110+
assertTrue("Joining Issue and Fail Verdicts must contain Issue Shapes",
111+
v4.join(v2).visualizer().getShapes().containsAll(issueVisualizer.getShapes()));
112+
113+
assertTrue("Joining Fail and emptyVisualizerVerdict Verdicts must equal Fail visualizer",
114+
v2.join(emptyVisualizerVerdict).visualizer() == failVisualizer);
115+
116+
assertTrue("Joining emptyVisualizerVerdict and Fail Verdicts must equal Fail visualizer",
117+
emptyVisualizerVerdict.join(v2).visualizer() == failVisualizer);
87118
}
88119

89120
@Test

testar/resources/settings/02_webdriver_parabank/Protocol_02_webdriver_parabank.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
2-
* Copyright (c) 2018 - 2025 Open Universiteit - www.ou.nl
3-
* Copyright (c) 2019 - 2025 Universitat Politecnica de Valencia - www.upv.es
2+
* Copyright (c) 2018 - 2026 Open Universiteit - www.ou.nl
3+
* Copyright (c) 2019 - 2026 Universitat Politecnica de Valencia - www.upv.es
44
*
55
* Redistribution and use in source and binary forms, with or without
66
* modification, are permitted provided that the following conditions are met:
@@ -227,6 +227,8 @@ private boolean containsVerdictInfo(List<String> listOfDetectedErroneousVerdicts
227227
}
228228

229229
public Verdict leafWidgetsOverlapping(State state) {
230+
Verdict finalVerdict = Verdict.OK;
231+
230232
// Prepare a list that contains all the Rectangles from the leaf widgets
231233
List<Pair<Widget, Rect>> leafWidgetsRects = new ArrayList<>();
232234
for (Widget w : state) {
@@ -242,7 +244,7 @@ public Verdict leafWidgetsOverlapping(State state) {
242244
Rect rectOne = leafWidgetsRects.get(i).right();
243245
Rect rectTwo = leafWidgetsRects.get(j).right();
244246

245-
if (Rect.intersect(rectOne, rectTwo)) {
247+
if (Rect.overlap(rectOne, rectTwo)) {
246248

247249
Widget firstWidget = leafWidgetsRects.get(i).left();
248250
Widget secondWidget = leafWidgetsRects.get(j).left();
@@ -259,12 +261,16 @@ public Verdict leafWidgetsOverlapping(State state) {
259261
"Invariant Fault",
260262
0.5, 0.5);
261263

262-
return new Verdict(Verdict.Severity.WARNING_UI_VISUAL_OR_RENDERING_FAULT, verdictMsg, visualizer);
264+
Verdict clashVerdict = new Verdict(
265+
Verdict.Severity.WARNING_UI_VISUAL_OR_RENDERING_FAULT,
266+
verdictMsg,
267+
visualizer);
268+
finalVerdict = finalVerdict.join(clashVerdict);
263269
}
264270
}
265271
}
266272

267-
return Verdict.OK;
273+
return finalVerdict;
268274
}
269275

270276
private Pen getRedPen() {
Binary file not shown.

testar/src/org/testar/monkey/Main.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/***************************************************************************************************
22
*
3-
* Copyright (c) 2013 - 2025 Universitat Politecnica de Valencia - www.upv.es
4-
* Copyright (c) 2018 - 2025 Open Universiteit - www.ou.nl
3+
* Copyright (c) 2013 - 2026 Universitat Politecnica de Valencia - www.upv.es
4+
* Copyright (c) 2018 - 2026 Open Universiteit - www.ou.nl
55
*
66
* Redistribution and use in source and binary forms, with or without
77
* modification, are permitted provided that the following conditions are met:
@@ -62,7 +62,7 @@
6262

6363
public class Main {
6464

65-
public static final String TESTAR_VERSION = "v2.7.19 (27-Jan-2026)";
65+
public static final String TESTAR_VERSION = "v2.7.20 (3-Feb-2026)";
6666

6767
//public static final String TESTAR_DIR_PROPERTY = "DIRNAME"; //Use the OS environment to obtain TESTAR directory
6868
public static final String SETTINGS_FILE = "test.settings";

0 commit comments

Comments
 (0)