From 0a4eb24ed4b55d9144a9f252f3aa0ab625839d74 Mon Sep 17 00:00:00 2001 From: ferpasri Date: Wed, 28 Jan 2026 13:07:01 +0100 Subject: [PATCH 1/6] Fix android SPY isDisplayed property --- .../android/spy_visualization/TreeVisualizationAndroid.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/org/testar/monkey/alayer/android/spy_visualization/TreeVisualizationAndroid.java b/android/src/org/testar/monkey/alayer/android/spy_visualization/TreeVisualizationAndroid.java index 745b82ec7..e2ca3301f 100644 --- a/android/src/org/testar/monkey/alayer/android/spy_visualization/TreeVisualizationAndroid.java +++ b/android/src/org/testar/monkey/alayer/android/spy_visualization/TreeVisualizationAndroid.java @@ -389,7 +389,7 @@ private void displayWidgetInfo(Widget nodeWidget) { infoPaneRight.add(new JLabel(String.valueOf(selectedWidget))).setFont(new Font("SansSerif", Font.PLAIN, fontSize)); infoPaneLeft.add(new JLabel("Displayed: ")).setFont(new Font("SansSerif", Font.BOLD, fontSize)); - infoPaneRight.add(new JLabel(String.valueOf(selectedWidget))).setFont(new Font("SansSerif", Font.PLAIN, fontSize)); + infoPaneRight.add(new JLabel(String.valueOf(displayedWidget))).setFont(new Font("SansSerif", Font.PLAIN, fontSize)); infoPaneLeft.add(new JLabel("Current Activity: ")).setFont(new Font("SansSerif", Font.BOLD, fontSize)); infoPaneRight.add(new JLabel(String.valueOf(activityWidget))).setFont(new Font("SansSerif", Font.PLAIN, fontSize)); From 9484c6a3a72fbfb516531fa0e9127d8bd7d468b6 Mon Sep 17 00:00:00 2001 From: ferpasri Date: Wed, 28 Jan 2026 16:13:57 +0100 Subject: [PATCH 2/6] Add Rect overlap method --- core/src/org/testar/monkey/alayer/Rect.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/core/src/org/testar/monkey/alayer/Rect.java b/core/src/org/testar/monkey/alayer/Rect.java index a933eacfd..117849514 100644 --- a/core/src/org/testar/monkey/alayer/Rect.java +++ b/core/src/org/testar/monkey/alayer/Rect.java @@ -1,6 +1,7 @@ /*************************************************************************************************** * -* Copyright (c) 2013, 2014, 2015, 2016, 2017 Universitat Politecnica de Valencia - www.upv.es +* Copyright (c) 2013 - 2026 Universitat Politecnica de Valencia - www.upv.es +* Copyright (c) 2018 - 2026 Open Universiteit - www.ou.nl * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -27,10 +28,6 @@ * POSSIBILITY OF SUCH DAMAGE. *******************************************************************************************************/ - -/** - * @author Sebastian Bauersfeld - */ package org.testar.monkey.alayer; import org.testar.monkey.Assert; @@ -47,6 +44,14 @@ public static boolean intersect(Rect r1, Rect r2) { r2.y() + r2.height() < r1.y()); } + public static boolean overlap(Rect r1, Rect r2) { + Assert.notNull(r1, r2); + return !(r1.x() + r1.width() <= r2.x() || + r1.y() + r1.height() <= r2.y() || + r2.x() + r2.width() <= r1.x() || + r2.y() + r2.height() <= r1.y()); + } + public static boolean contains(Rect r1, Rect r2) { Assert.notNull(r1, r2); return r2.x() >= r1.x() && r2.x() + r2.width() <= r1.x() + r1.width() && @@ -102,7 +107,6 @@ public void paint(Canvas canvas, Pen pen) { canvas.rect(pen, x, y, width, height); } - // by urueda @Override public boolean equals(Object o){ if (o == this) return true; From 6101d462bbf5c27132ab95fe48b9d7ed2503bbf6 Mon Sep 17 00:00:00 2001 From: ferpasri Date: Wed, 28 Jan 2026 16:18:33 +0100 Subject: [PATCH 3/6] Update parabank leafWidgetsOverlapping --- .../Protocol_02_webdriver_parabank.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/testar/resources/settings/02_webdriver_parabank/Protocol_02_webdriver_parabank.java b/testar/resources/settings/02_webdriver_parabank/Protocol_02_webdriver_parabank.java index 8ed0eecad..a3cf45e39 100644 --- a/testar/resources/settings/02_webdriver_parabank/Protocol_02_webdriver_parabank.java +++ b/testar/resources/settings/02_webdriver_parabank/Protocol_02_webdriver_parabank.java @@ -227,6 +227,8 @@ private boolean containsVerdictInfo(List listOfDetectedErroneousVerdicts } public Verdict leafWidgetsOverlapping(State state) { + Verdict finalVerdict = Verdict.OK; + // Prepare a list that contains all the Rectangles from the leaf widgets List> leafWidgetsRects = new ArrayList<>(); for (Widget w : state) { @@ -242,7 +244,7 @@ public Verdict leafWidgetsOverlapping(State state) { Rect rectOne = leafWidgetsRects.get(i).right(); Rect rectTwo = leafWidgetsRects.get(j).right(); - if (Rect.intersect(rectOne, rectTwo)) { + if (Rect.overlap(rectOne, rectTwo)) { Widget firstWidget = leafWidgetsRects.get(i).left(); Widget secondWidget = leafWidgetsRects.get(j).left(); @@ -259,12 +261,16 @@ public Verdict leafWidgetsOverlapping(State state) { "Invariant Fault", 0.5, 0.5); - return new Verdict(Verdict.Severity.WARNING_UI_VISUAL_OR_RENDERING_FAULT, verdictMsg, visualizer); + Verdict clashVerdict = new Verdict( + Verdict.Severity.WARNING_UI_VISUAL_OR_RENDERING_FAULT, + verdictMsg, + visualizer); + finalVerdict = finalVerdict.join(clashVerdict); } } } - return Verdict.OK; + return finalVerdict; } private Pen getRedPen() { From 96d192606875e39241f3ff1326d64d6360826d5c Mon Sep 17 00:00:00 2001 From: ferpasri Date: Mon, 2 Feb 2026 10:54:33 +0100 Subject: [PATCH 4/6] Update file year dates --- .../android/spy_visualization/TreeVisualizationAndroid.java | 4 ++-- .../02_webdriver_parabank/Protocol_02_webdriver_parabank.java | 4 ++-- testar/src/org/testar/monkey/Main.java | 4 ++-- .../oracles/HeaderAnalysisSecurityOracle.java | 4 ++-- .../securityanalysis/oracles/SqlInjectionSecurityOracle.java | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/android/src/org/testar/monkey/alayer/android/spy_visualization/TreeVisualizationAndroid.java b/android/src/org/testar/monkey/alayer/android/spy_visualization/TreeVisualizationAndroid.java index e2ca3301f..98c5c4376 100644 --- a/android/src/org/testar/monkey/alayer/android/spy_visualization/TreeVisualizationAndroid.java +++ b/android/src/org/testar/monkey/alayer/android/spy_visualization/TreeVisualizationAndroid.java @@ -1,7 +1,7 @@ /*************************************************************************************************** * - * Copyright (c) 2020 - 2025 Universitat Politecnica de Valencia - www.upv.es - * Copyright (c) 2020 - 2025 Open Universiteit - www.ou.nl + * Copyright (c) 2020 - 2026 Universitat Politecnica de Valencia - www.upv.es + * Copyright (c) 2020 - 2026 Open Universiteit - www.ou.nl * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/testar/resources/settings/02_webdriver_parabank/Protocol_02_webdriver_parabank.java b/testar/resources/settings/02_webdriver_parabank/Protocol_02_webdriver_parabank.java index a3cf45e39..cbbdd388c 100644 --- a/testar/resources/settings/02_webdriver_parabank/Protocol_02_webdriver_parabank.java +++ b/testar/resources/settings/02_webdriver_parabank/Protocol_02_webdriver_parabank.java @@ -1,6 +1,6 @@ /** - * Copyright (c) 2018 - 2025 Open Universiteit - www.ou.nl - * Copyright (c) 2019 - 2025 Universitat Politecnica de Valencia - www.upv.es + * Copyright (c) 2018 - 2026 Open Universiteit - www.ou.nl + * Copyright (c) 2019 - 2026 Universitat Politecnica de Valencia - www.upv.es * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/testar/src/org/testar/monkey/Main.java b/testar/src/org/testar/monkey/Main.java index 675099dd5..7af545acc 100644 --- a/testar/src/org/testar/monkey/Main.java +++ b/testar/src/org/testar/monkey/Main.java @@ -1,7 +1,7 @@ /*************************************************************************************************** * - * Copyright (c) 2013 - 2025 Universitat Politecnica de Valencia - www.upv.es - * Copyright (c) 2018 - 2025 Open Universiteit - www.ou.nl + * Copyright (c) 2013 - 2026 Universitat Politecnica de Valencia - www.upv.es + * Copyright (c) 2018 - 2026 Open Universiteit - www.ou.nl * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/testar/src/org/testar/securityanalysis/oracles/HeaderAnalysisSecurityOracle.java b/testar/src/org/testar/securityanalysis/oracles/HeaderAnalysisSecurityOracle.java index 4f6b0c4b1..d9537b5a6 100644 --- a/testar/src/org/testar/securityanalysis/oracles/HeaderAnalysisSecurityOracle.java +++ b/testar/src/org/testar/securityanalysis/oracles/HeaderAnalysisSecurityOracle.java @@ -1,7 +1,7 @@ /*************************************************************************************************** * - * Copyright (c) 2022 - 2025 Open Universiteit - www.ou.nl - * Copyright (c) 2022 - 2025 Universitat Politecnica de Valencia - www.upv.es + * Copyright (c) 2022 - 2026 Open Universiteit - www.ou.nl + * Copyright (c) 2022 - 2026 Universitat Politecnica de Valencia - www.upv.es * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/testar/src/org/testar/securityanalysis/oracles/SqlInjectionSecurityOracle.java b/testar/src/org/testar/securityanalysis/oracles/SqlInjectionSecurityOracle.java index c7db07718..c8419d761 100644 --- a/testar/src/org/testar/securityanalysis/oracles/SqlInjectionSecurityOracle.java +++ b/testar/src/org/testar/securityanalysis/oracles/SqlInjectionSecurityOracle.java @@ -1,7 +1,7 @@ /*************************************************************************************************** * - * Copyright (c) 2022 - 2025 Open Universiteit - www.ou.nl - * Copyright (c) 2022 - 2025 Universitat Politecnica de Valencia - www.upv.es + * Copyright (c) 2022 - 2026 Open Universiteit - www.ou.nl + * Copyright (c) 2022 - 2026 Universitat Politecnica de Valencia - www.upv.es * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: From 80e3b99baa904d9e631bbe2bfad9bbc42028eab5 Mon Sep 17 00:00:00 2001 From: ferpasri Date: Mon, 2 Feb 2026 11:01:37 +0100 Subject: [PATCH 5/6] Update TESTAR version --- CHANGELOG | 4 ++++ VERSION | 2 +- testar/src/org/testar/monkey/Main.java | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 50bef0361..ef62bbe95 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +#TESTAR v2.7.20 (3-Feb-2026) +- Fix android SPY is displayed property +- Add Rect overlap method + #TESTAR v2.7.19 (27-Jan-2026) - Bump org.seleniumhq.selenium:selenium-java from 4.39.0 to 4.40.0 - Update devtools dependencies to v144 diff --git a/VERSION b/VERSION index 2e30274b2..12eda4d84 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.7.19 \ No newline at end of file +2.7.20 \ No newline at end of file diff --git a/testar/src/org/testar/monkey/Main.java b/testar/src/org/testar/monkey/Main.java index 7af545acc..697540641 100644 --- a/testar/src/org/testar/monkey/Main.java +++ b/testar/src/org/testar/monkey/Main.java @@ -62,7 +62,7 @@ public class Main { - public static final String TESTAR_VERSION = "v2.7.19 (27-Jan-2026)"; + public static final String TESTAR_VERSION = "v2.7.20 (3-Feb-2026)"; //public static final String TESTAR_DIR_PROPERTY = "DIRNAME"; //Use the OS environment to obtain TESTAR directory public static final String SETTINGS_FILE = "test.settings"; From 61b52e7fac454283bfeabc891ba9b4d7165277fa Mon Sep 17 00:00:00 2001 From: ferpasri Date: Mon, 2 Feb 2026 12:17:07 +0100 Subject: [PATCH 6/6] Add Visualizer join method --- CHANGELOG | 1 + .../src/org/testar/monkey/alayer/Verdict.java | 6 ++-- .../org/testar/monkey/alayer/Visualizer.java | 33 ++++++++++++++++-- .../org/testar/monkey/alayer/VerdictTest.java | 34 ++++++++++++++----- 4 files changed, 61 insertions(+), 13 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index ef62bbe95..af41d0499 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ #TESTAR v2.7.20 (3-Feb-2026) - Fix android SPY is displayed property - Add Rect overlap method +- Add Visualizer join method #TESTAR v2.7.19 (27-Jan-2026) - Bump org.seleniumhq.selenium:selenium-java from 4.39.0 to 4.40.0 diff --git a/core/src/org/testar/monkey/alayer/Verdict.java b/core/src/org/testar/monkey/alayer/Verdict.java index 82f55a9ef..edf29514b 100644 --- a/core/src/org/testar/monkey/alayer/Verdict.java +++ b/core/src/org/testar/monkey/alayer/Verdict.java @@ -1,7 +1,7 @@ /*************************************************************************************************** * - * Copyright (c) 2013 - 2025 Universitat Politecnica de Valencia - www.upv.es - * Copyright (c) 2018 - 2025 Open Universiteit - www.ou.nl + * Copyright (c) 2013 - 2026 Universitat Politecnica de Valencia - www.upv.es + * Copyright (c) 2018 - 2026 Open Universiteit - www.ou.nl * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -213,7 +213,7 @@ public Verdict join(Verdict verdict) { String joinedInfo = this.info.contains(verdict.info()) ? this.info : (this.severity == Severity.OK.getValue() ? "" : this.info + "\n") + verdict.info(); - Visualizer joinedVisualizer = (this.severity >= verdict.severity()) ? this.visualizer() : verdict.visualizer(); + Visualizer joinedVisualizer = Visualizer.join(this.visualizer(), verdict.visualizer()); return new Verdict(joinedSeverity, joinedInfo, joinedVisualizer); } diff --git a/core/src/org/testar/monkey/alayer/Visualizer.java b/core/src/org/testar/monkey/alayer/Visualizer.java index 1c20c16fe..060a1af41 100644 --- a/core/src/org/testar/monkey/alayer/Visualizer.java +++ b/core/src/org/testar/monkey/alayer/Visualizer.java @@ -1,7 +1,7 @@ /*************************************************************************************************** * - * Copyright (c) 2013 - 2025 Universitat Politecnica de Valencia - www.upv.es - * Copyright (c) 2018 - 2025 Open Universiteit - www.ou.nl + * Copyright (c) 2013 - 2026 Universitat Politecnica de Valencia - www.upv.es + * Copyright (c) 2018 - 2026 Open Universiteit - www.ou.nl * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -31,13 +31,42 @@ package org.testar.monkey.alayer; import java.io.Serializable; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import org.testar.monkey.Assert; +import org.testar.monkey.Util; + public interface Visualizer extends Serializable { void run(State state, Canvas canvas, Pen pen); default List getShapes() { return Arrays.asList(Rect.from(0, 0, 0, 0)); } + + static Visualizer join(Visualizer first, Visualizer second) { + if (first == second) return first; + if (first == Util.NullVisualizer) return second; + if (second == Util.NullVisualizer) return first; + + return new Visualizer() { + private static final long serialVersionUID = 1L; + + @Override + public void run(State state, Canvas canvas, Pen pen) { + Assert.notNull(state, canvas, pen); + first.run(state, canvas, pen); + second.run(state, canvas, pen); + } + + @Override + public List getShapes() { + ArrayList merged = new ArrayList<>(); + merged.addAll(first.getShapes()); + merged.addAll(second.getShapes()); + return merged; + } + }; + } } diff --git a/core/test/org/testar/monkey/alayer/VerdictTest.java b/core/test/org/testar/monkey/alayer/VerdictTest.java index f2554b7b4..1a5892a16 100644 --- a/core/test/org/testar/monkey/alayer/VerdictTest.java +++ b/core/test/org/testar/monkey/alayer/VerdictTest.java @@ -1,7 +1,7 @@ /*************************************************************************************************** * - * Copyright (c) 2013 - 2025 Universitat Politecnica de Valencia - www.upv.es - * Copyright (c) 2018 - 2025 Open Universiteit - www.ou.nl + * Copyright (c) 2013 - 2026 Universitat Politecnica de Valencia - www.upv.es + * Copyright (c) 2018 - 2026 Open Universiteit - www.ou.nl * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -32,7 +32,11 @@ import static org.junit.Assert.*; +import java.util.Arrays; + import org.junit.Test; +import org.testar.monkey.alayer.visualizers.RegionsVisualizer; +import org.testar.monkey.alayer.visualizers.ShapeVisualizer; public class VerdictTest { @@ -43,10 +47,17 @@ public class VerdictTest { public void run(State s, Canvas c, Pen pen) {} }; - private final Visualizer failVisualizer = new Visualizer(){ - private static final long serialVersionUID = -2732461936562344367L; - public void run(State s, Canvas c, Pen pen) {} - }; + private final Visualizer failVisualizer = new ShapeVisualizer( + Pen.PEN_RED, + Rect.from(0, 0, 10, 10), + "Fail Visualizer", + 0.5, 0.5); + + private final Visualizer issueVisualizer = new RegionsVisualizer( + Pen.PEN_RED, + Arrays.asList(Rect.from(0, 0, 10, 10)), + "Issue Visualizer", + 0.5, 0.5); @Test public void testToString() { @@ -60,6 +71,7 @@ public void testJoin() { Verdict v1 = new Verdict(Verdict.Severity.OK, "Foo Bar"); Verdict v2 = new Verdict(Verdict.Severity.FAIL, "Bar", failVisualizer); Verdict v3 = new Verdict(Verdict.Severity.OK, "Baz", dummyVisualizer); + Verdict v4 = new Verdict(Verdict.Severity.FAIL, "Exception", issueVisualizer); assertTrue("Joining two Verdicts shall create a new Verdict", v1 != v1.join(v2)); @@ -79,11 +91,17 @@ public void testJoin() { "then both infos shall be included separated by a line break", "Bar\nBaz", v2.join(v3).info()); - assertTrue("Joining two Verdicts shall use the Visualizer of the Verdict with high severity", + assertTrue("Joining an OK and Fail Verdicts shall use the Visualizer of the Verdict with high severity", v2.join(v1).visualizer() == failVisualizer); - assertTrue("Joining two Verdicts shall use the Visualizer of the Verdict with high severity", + assertTrue("Joining an OK and Fail Verdicts shall use the Visualizer of the Verdict with high severity", v1.join(v2).visualizer() == failVisualizer); + + assertTrue("Joining Fail and Issue Verdicts must contain Fail Shapes", + v2.join(v4).visualizer().getShapes().containsAll(failVisualizer.getShapes())); + + assertTrue("Joining Fail and Issue Verdicts must contain Issue Shapes", + v2.join(v4).visualizer().getShapes().containsAll(issueVisualizer.getShapes())); } @Test