You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by da...@apache.org on 2022/10/21 14:54:53 UTC

[ofbiz-framework] branch trunk updated (028ff54bc7 -> a4157641e3)

This is an automated email from the ASF dual-hosted git repository.

danwatford pushed a change to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


    from 028ff54bc7 Exclude jquery sources, used by common-theme, from sonarcloud analysis.
     new 9444b6bdf6 Improved: Description given by matchers in tests related to RenderableFtlFormElementsBuilder.
     new a4157641e3 Improved: MacroFormRenderer refactoring of textarea fields

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../widget/renderer/macro/MacroFormRenderer.java   | 85 +---------------------
 .../macro/RenderableFtlFormElementsBuilder.java    | 70 ++++++++++++++++++
 .../macro/renderable/RenderableFtlMacroCall.java   |  4 +
 .../widget/renderer/macro/MacroCallMatcher.java    | 29 ++++++--
 .../MacroCallParameterBooleanValueMatcher.java     |  2 +-
 ... => MacroCallParameterIntegerValueMatcher.java} | 10 +--
 .../macro/MacroCallParameterMapValueMatcher.java   |  2 +-
 .../renderer/macro/MacroCallParameterMatcher.java  | 14 +++-
 .../MacroCallParameterStringValueMatcher.java      |  4 +-
 .../renderer/macro/MacroFormRendererTest.java      | 18 ++---
 .../RenderableFtlFormElementsBuilderTest.java      | 51 +++++++++++++
 11 files changed, 176 insertions(+), 113 deletions(-)
 copy framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/{MacroCallParameterBooleanValueMatcher.java => MacroCallParameterIntegerValueMatcher.java} (82%)


[ofbiz-framework] 02/02: Improved: MacroFormRenderer refactoring of textarea fields

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

danwatford pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git

commit a4157641e3571aa49d2eed303d70a5edc7dea649
Author: Daniel Watford <da...@watfordconsulting.com>
AuthorDate: Tue Oct 4 09:40:59 2022 +0100

    Improved: MacroFormRenderer refactoring of textarea fields
    
    (OFBIZ-12125)
    
    Part of the OFBIZ-11456 MacroFormRenderer refactoring effort.
    
    Rather than MacroFormRenderer producing and evaulating FTL strings, it now
    uses RenderableFtlElementsBuilder to create RenderableFtlMacroCall objects
    which are then passed to an FtlWriter for evaluation.
---
 .../widget/renderer/macro/MacroFormRenderer.java   | 85 +---------------------
 .../macro/RenderableFtlFormElementsBuilder.java    | 70 ++++++++++++++++++
 .../macro/renderable/RenderableFtlMacroCall.java   |  4 +
 .../renderer/macro/MacroFormRendererTest.java      | 18 ++---
 .../RenderableFtlFormElementsBuilderTest.java      | 51 +++++++++++++
 5 files changed, 134 insertions(+), 94 deletions(-)

diff --git a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java
index bc995cdd00..89d917edd9 100644
--- a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java
+++ b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java
@@ -245,88 +245,9 @@ public final class MacroFormRenderer implements FormStringRenderer {
 
     @Override
     public void renderTextareaField(Appendable writer, Map<String, Object> context, TextareaField textareaField) {
-        ModelFormField modelFormField = textareaField.getModelFormField();
-        String name = modelFormField.getParameterName(context);
-        String cols = Integer.toString(textareaField.getCols());
-        String rows = Integer.toString(textareaField.getRows());
-        String id = modelFormField.getCurrentContainerId(context);
-        String className = "";
-        String alert = "false";
-        if (UtilValidate.isNotEmpty(modelFormField.getWidgetStyle())) {
-            className = modelFormField.getWidgetStyle();
-            if (modelFormField.shouldBeRed(context)) {
-                alert = "true";
-            }
-        }
-        //check for required field style on single forms
-        if (shouldApplyRequiredField(modelFormField)) {
-            String requiredStyle = modelFormField.getRequiredFieldStyle();
-            if (UtilValidate.isEmpty(requiredStyle)) {
-                requiredStyle = "required";
-            }
-            if (UtilValidate.isEmpty(className)) {
-                className = requiredStyle;
-            } else {
-                className = requiredStyle + " " + className;
-            }
-        }
-        String visualEditorEnable = "";
-        String buttons = "";
-        if (textareaField.getVisualEditorEnable()) {
-            visualEditorEnable = "true";
-            buttons = textareaField.getVisualEditorButtons(context);
-            if (UtilValidate.isEmpty(buttons)) {
-                buttons = "maxi";
-            }
-        }
-        String readonly = "";
-        if (textareaField.isReadOnly()) {
-            readonly = "readonly";
-        }
-        Map<String, Object> userLogin = UtilGenerics.cast(context.get("userLogin"));
-        String language = "en";
-        if (userLogin != null) {
-            language = UtilValidate.isEmpty((String) userLogin.get("lastLocale")) ? "en" : (String) userLogin.get("lastLocale");
-        }
-        String maxlength = "";
-        if (textareaField.getMaxlength() != null) {
-            maxlength = Integer.toString(textareaField.getMaxlength());
-        }
-        String tabindex = modelFormField.getTabindex();
-        String value = modelFormField.getEntry(context, textareaField.getDefaultValue(context));
-        boolean disabled = modelFormField.getDisabled(context);
-        StringWriter sr = new StringWriter();
-        sr.append("<@renderTextareaField ");
-        sr.append("name=\"");
-        sr.append(name);
-        sr.append("\" className=\"");
-        sr.append(className);
-        sr.append("\" alert=\"");
-        sr.append(alert);
-        sr.append("\" value=\"");
-        sr.append(value);
-        sr.append("\" cols=\"");
-        sr.append(cols);
-        sr.append("\" rows=\"");
-        sr.append(rows);
-        sr.append("\" maxlength=\"");
-        sr.append(maxlength);
-        sr.append("\" id=\"");
-        sr.append(id);
-        sr.append("\" readonly=\"");
-        sr.append(readonly);
-        sr.append("\" visualEditorEnable=\"");
-        sr.append(visualEditorEnable);
-        sr.append("\" language=\"");
-        sr.append(language);
-        sr.append("\" buttons=\"");
-        sr.append(buttons);
-        sr.append("\" tabindex=\"");
-        sr.append(tabindex);
-        sr.append("\" disabled=");
-        sr.append(Boolean.toString(disabled));
-        sr.append(" />");
-        executeMacro(writer, sr.toString());
+        writeFtlElement(writer, renderableFtlFormElementsBuilder.textArea(context, textareaField));
+
+        final ModelFormField modelFormField = textareaField.getModelFormField();
         this.addAsterisks(writer, context, modelFormField);
         this.appendTooltip(writer, context, modelFormField);
     }
diff --git a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilder.java b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilder.java
index 591026be33..8d256c5924 100644
--- a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilder.java
+++ b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilder.java
@@ -20,6 +20,7 @@ package org.apache.ofbiz.widget.renderer.macro;
 
 import java.io.StringWriter;
 import java.net.URI;
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
@@ -300,6 +301,69 @@ public final class RenderableFtlFormElementsBuilder {
                 .build();
     }
 
+    public RenderableFtl textArea(final Map<String, Object> context, final ModelFormField.TextareaField textareaField) {
+
+        final ModelFormField modelFormField = textareaField.getModelFormField();
+
+        final RenderableFtlMacroCallBuilder builder = RenderableFtlMacroCall.builder()
+                .name("renderTextareaField")
+                .stringParameter("name", modelFormField.getParameterName(context));
+
+        builder.intParameter("cols", textareaField.getCols());
+        builder.intParameter("rows", textareaField.getRows());
+
+        builder.stringParameter("id", modelFormField.getCurrentContainerId(context));
+
+        builder.stringParameter("alert", "false");
+
+        ArrayList<String> classNames = new ArrayList<>();
+        if (UtilValidate.isNotEmpty(modelFormField.getWidgetStyle())) {
+            classNames.add(modelFormField.getWidgetStyle());
+            if (modelFormField.shouldBeRed(context)) {
+                builder.stringParameter("alert", "true");
+            }
+        }
+
+        if (shouldApplyRequiredField(modelFormField)) {
+            String requiredStyle = modelFormField.getRequiredFieldStyle();
+            if (UtilValidate.isEmpty(requiredStyle)) {
+                requiredStyle = "required";
+            }
+            classNames.add(requiredStyle);
+        }
+        builder.stringParameter("className", String.join(" ", classNames));
+
+        if (textareaField.getVisualEditorEnable()) {
+            builder.booleanParameter("visualEditorEnable", true);
+
+            String buttons = textareaField.getVisualEditorButtons(context);
+            builder.stringParameter("buttons", UtilValidate.isEmpty(buttons) ? "maxi" : buttons);
+        }
+
+        if (textareaField.isReadOnly()) {
+            builder.stringParameter("readonly", "readonly");
+        }
+
+        Map<String, Object> userLogin = UtilGenerics.cast(context.get("userLogin"));
+        String language = "en";
+        if (userLogin != null) {
+            language = UtilValidate.isEmpty((String) userLogin.get("lastLocale")) ? "en" : (String) userLogin.get("lastLocale");
+        }
+        builder.stringParameter("language", language);
+
+        if (textareaField.getMaxlength() != null) {
+            builder.intParameter("maxlength", textareaField.getMaxlength());
+        }
+
+        builder.stringParameter("tabindex", modelFormField.getTabindex());
+
+        builder.stringParameter("value", modelFormField.getEntry(context, textareaField.getDefaultValue(context)));
+
+        builder.booleanParameter("disabled", modelFormField.getDisabled(context));
+
+        return builder.build();
+    }
+
     public RenderableFtl makeHyperlinkString(final ModelFormField.SubHyperlink subHyperlink,
                                              final Map<String, Object> context) {
         if (subHyperlink == null || !subHyperlink.shouldUse(context)) {
@@ -633,6 +697,12 @@ public final class RenderableFtlFormElementsBuilder {
         return wholeFormContext;
     }
 
+    private boolean shouldApplyRequiredField(ModelFormField modelFormField) {
+        return ("single".equals(modelFormField.getModelForm().getType())
+                || "upload".equals(modelFormField.getModelForm().getType()))
+                && modelFormField.getRequiredField();
+    }
+
     /**
      * Extracts parameters from a target URL string, prepares them for an Ajax
      * JavaScript call. This method is currently set to return a parameter string
diff --git a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/renderable/RenderableFtlMacroCall.java b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/renderable/RenderableFtlMacroCall.java
index b82070f023..7ef5674724 100644
--- a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/renderable/RenderableFtlMacroCall.java
+++ b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/renderable/RenderableFtlMacroCall.java
@@ -69,6 +69,10 @@ public final class RenderableFtlMacroCall implements RenderableFtl {
             return parameter(parameterName, parameterValue);
         }
 
+        public RenderableFtlMacroCallBuilder intParameter(final String parameterName, final int parameterValue) {
+            return parameter(parameterName, parameterValue);
+        }
+
         public RenderableFtlMacroCallBuilder booleanParameter(final String parameterName, final boolean parameterValue) {
             return parameter(parameterName, parameterValue);
         }
diff --git a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRendererTest.java b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRendererTest.java
index 03daf5ddf9..eb5b3e244e 100644
--- a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRendererTest.java
+++ b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRendererTest.java
@@ -225,23 +225,17 @@ public class MacroFormRendererTest {
     public void textAreaMacroRendered(@Mocked ModelFormField.TextareaField textareaField) throws IOException {
         new Expectations() {
             {
-                modelFormField.getEntry(withNotNull(), anyString);
-                result = "TEXTAREAVALUE";
-
-                textareaField.getCols();
-                result = 11;
-
-                textareaField.getRows();
-                result = 22;
+                renderableFtlFormElementsBuilder.textArea(withNotNull(), textareaField);
+                result = genericMacroCall;
             }
         };
 
+        genericTooltipRenderedExpectation(textareaField);
+
         macroFormRenderer.renderTextareaField(appendable, ImmutableMap.of(), textareaField);
 
-        assertAndGetMacroString("renderTextareaField", ImmutableMap.of(
-                "value", "TEXTAREAVALUE",
-                "cols", "11",
-                "rows", "22"));
+        genericSingleMacroRenderedVerification();
+        genericTooltipRenderedVerification();
     }
 
     @Test
diff --git a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilderTest.java b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilderTest.java
index 67e9bb9cb1..03f05ccd85 100644
--- a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilderTest.java
+++ b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilderTest.java
@@ -236,6 +236,57 @@ public class RenderableFtlFormElementsBuilderTest {
                                 + "areaId2,http://host.domain/target2,")));
     }
 
+    @Test
+    public void textareaFieldSetsIdValueLengthAndSize(@Mocked final ModelFormField.TextareaField textareaField) {
+        final int maxLength = 142;
+        final int cols = 80;
+        final int rows = 5;
+        new Expectations() {
+            {
+                modelFormField.getCurrentContainerId(withNotNull());
+                result = "CurrentTextareaId";
+
+                modelFormField.getEntry(withNotNull(), anyString);
+                result = "TEXTAREAVALUE";
+
+                textareaField.getMaxlength();
+                result = maxLength;
+
+                textareaField.getCols();
+                result = cols;
+
+                textareaField.getRows();
+                result = rows;
+            }
+        };
+
+        final HashMap<String, Object> context = new HashMap<>();
+
+        final RenderableFtl renderableFtl = renderableFtlFormElementsBuilder.textArea(context, textareaField);
+        assertThat(renderableFtl, MacroCallMatcher.hasNameAndParameters("renderTextareaField",
+                MacroCallParameterMatcher.hasNameAndStringValue("id", "CurrentTextareaId"),
+                MacroCallParameterMatcher.hasNameAndStringValue("value", "TEXTAREAVALUE"),
+                MacroCallParameterMatcher.hasNameAndIntegerValue("cols", cols),
+                MacroCallParameterMatcher.hasNameAndIntegerValue("rows", rows),
+                MacroCallParameterMatcher.hasNameAndIntegerValue("maxlength", maxLength)));
+    }
+
+    @Test
+    public void textareaFieldSetsDisabledParameters(@Mocked final ModelFormField.TextareaField textareaField) {
+        new Expectations() {
+            {
+                modelFormField.getDisabled(withNotNull());
+                result = true;
+            }
+        };
+
+        final HashMap<String, Object> context = new HashMap<>();
+
+        final RenderableFtl renderableFtl = renderableFtlFormElementsBuilder.textArea(context, textareaField);
+        assertThat(renderableFtl, MacroCallMatcher.hasNameAndParameters("renderTextareaField",
+                MacroCallParameterMatcher.hasNameAndBooleanValue("disabled", true)));
+    }
+
     @Test
     public void fieldGroupOpenRendersCollapsibleAreaId(@Mocked final ModelForm.FieldGroup fieldGroup) {
         new Expectations() {


[ofbiz-framework] 01/02: Improved: Description given by matchers in tests related to RenderableFtlFormElementsBuilder.

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

danwatford pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git

commit 9444b6bdf6b4f58c00b415dd193f835abdcdcbe3
Author: Daniel Watford <da...@watfordconsulting.com>
AuthorDate: Tue Oct 4 09:09:15 2022 +0100

    Improved: Description given by matchers in tests related to RenderableFtlFormElementsBuilder.
---
 .../widget/renderer/macro/MacroCallMatcher.java    | 29 ++++++++++++++++------
 .../MacroCallParameterBooleanValueMatcher.java     |  2 +-
 ... => MacroCallParameterIntegerValueMatcher.java} | 10 ++++----
 .../macro/MacroCallParameterMapValueMatcher.java   |  2 +-
 .../renderer/macro/MacroCallParameterMatcher.java  | 14 +++++++++--
 .../MacroCallParameterStringValueMatcher.java      |  4 +--
 6 files changed, 42 insertions(+), 19 deletions(-)

diff --git a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallMatcher.java b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallMatcher.java
index 647886f225..5212bbc99a 100644
--- a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallMatcher.java
+++ b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallMatcher.java
@@ -25,11 +25,14 @@ import org.hamcrest.TypeSafeMatcher;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.Optional;
 
 public final class MacroCallMatcher extends TypeSafeMatcher<RenderableFtl> {
     private final String macroName;
     private final MacroCallParameterMatcher[] parameterMatchers;
 
+    private boolean nameMatched;
     private final List<MacroCallParameterMatcher> failedParameterMatchers = new ArrayList<>();
 
     public MacroCallMatcher(final String macroName, final MacroCallParameterMatcher... parameterMatchers) {
@@ -42,7 +45,7 @@ public final class MacroCallMatcher extends TypeSafeMatcher<RenderableFtl> {
     @Override
     protected boolean matchesSafely(final RenderableFtl item) {
         final RenderableFtlMacroCall macroCall = (RenderableFtlMacroCall) item;
-        boolean nameMatched = (macroName == null) || macroName.equals(macroCall.getName());
+        nameMatched = (macroName == null) || macroName.equals(macroCall.getName());
 
         for (final MacroCallParameterMatcher parameterMatcher : parameterMatchers) {
             boolean matchForParameterMatcher = macroCall.getParameters()
@@ -59,7 +62,7 @@ public final class MacroCallMatcher extends TypeSafeMatcher<RenderableFtl> {
 
     @Override
     public void describeTo(final Description description) {
-        description.appendText("MacroCall has name '" + macroName + "' ");
+        description.appendText("MacroCall named '" + macroName + "' ");
         description.appendText("with Parameters[");
         for (final MacroCallParameterMatcher parameterMatcher : parameterMatchers) {
             parameterMatcher.describeTo(description);
@@ -71,17 +74,27 @@ public final class MacroCallMatcher extends TypeSafeMatcher<RenderableFtl> {
     protected void describeMismatchSafely(final RenderableFtl item, final Description mismatchDescription) {
         final RenderableFtlMacroCall macroCall = (RenderableFtlMacroCall) item;
 
-        mismatchDescription.appendText("MacroCall has name '" + macroCall.getName() + "' ");
+        if (!nameMatched) {
+            mismatchDescription.appendText("MacroCall has name '" + macroCall.getName() + "' but expected was '" + macroName + "'");
+        }
 
         if (!failedParameterMatchers.isEmpty()) {
-            mismatchDescription.appendText("with Parameters[");
             for (final MacroCallParameterMatcher failedParameterMatcher : failedParameterMatchers) {
-                macroCall.getParameters()
+
+                final String failedParameterName = failedParameterMatcher.getName();
+                final Optional<Map.Entry<String, Object>> matchedParameterByName = macroCall.getParameters()
                         .entrySet()
-                        .forEach(entry ->
-                                failedParameterMatcher.describeMismatch(entry, mismatchDescription));
+                        .stream()
+                        .filter(entry -> failedParameterName.equals(entry.getKey()))
+                        .findFirst();
+
+                matchedParameterByName.ifPresent(parameterEntry ->
+                        failedParameterMatcher.describeMismatchSafely(parameterEntry, mismatchDescription));
+
+                if (!matchedParameterByName.isPresent()) {
+                    mismatchDescription.appendText("Parameter '" + failedParameterName + "' was missing, ");
+                }
             }
-            mismatchDescription.appendText("]");
         }
     }
 
diff --git a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterBooleanValueMatcher.java b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterBooleanValueMatcher.java
index 2ab2769cc1..c850dc0c61 100644
--- a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterBooleanValueMatcher.java
+++ b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterBooleanValueMatcher.java
@@ -35,7 +35,7 @@ public final class MacroCallParameterBooleanValueMatcher extends TypeSafeMatcher
 
     @Override
     public void describeTo(final Description description) {
-        description.appendText("with boolean value '" + value + "'");
+        description.appendText("boolean value '" + value + "'");
     }
 
     @Override
diff --git a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterBooleanValueMatcher.java b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterIntegerValueMatcher.java
similarity index 82%
copy from framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterBooleanValueMatcher.java
copy to framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterIntegerValueMatcher.java
index 2ab2769cc1..57e55caaf3 100644
--- a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterBooleanValueMatcher.java
+++ b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterIntegerValueMatcher.java
@@ -21,10 +21,10 @@ package org.apache.ofbiz.widget.renderer.macro;
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeMatcher;
 
-public final class MacroCallParameterBooleanValueMatcher extends TypeSafeMatcher<Object> {
-    private final boolean value;
+public final class MacroCallParameterIntegerValueMatcher extends TypeSafeMatcher<Object> {
+    private final int value;
 
-    public MacroCallParameterBooleanValueMatcher(final boolean value) {
+    public MacroCallParameterIntegerValueMatcher(final int value) {
         this.value = value;
     }
 
@@ -35,11 +35,11 @@ public final class MacroCallParameterBooleanValueMatcher extends TypeSafeMatcher
 
     @Override
     public void describeTo(final Description description) {
-        description.appendText("with boolean value '" + value + "'");
+        description.appendText("integer value '" + value + "'");
     }
 
     @Override
     protected void describeMismatchSafely(final Object item, final Description mismatchDescription) {
-        mismatchDescription.appendText("with boolean value '" + item + "'");
+        mismatchDescription.appendText("with integer value '" + item + "'");
     }
 }
diff --git a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterMapValueMatcher.java b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterMapValueMatcher.java
index 84e98f97d4..bc2d6a2472 100644
--- a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterMapValueMatcher.java
+++ b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterMapValueMatcher.java
@@ -38,7 +38,7 @@ public final class MacroCallParameterMapValueMatcher extends TypeSafeMatcher<Obj
 
     @Override
     public void describeTo(final Description description) {
-        description.appendText("with map value '");
+        description.appendText("map value '");
         matcher.describeTo(description);
         description.appendText("' ");
     }
diff --git a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterMatcher.java b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterMatcher.java
index d978f4e41b..30c37bee3a 100644
--- a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterMatcher.java
+++ b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterMatcher.java
@@ -36,6 +36,10 @@ public final class MacroCallParameterMatcher extends TypeSafeMatcher<Map.Entry<S
         this.valueMatcher = valueMatcher;
     }
 
+    public String getName() {
+        return name;
+    }
+
     @Override
     protected boolean matchesSafely(final Map.Entry<String, Object> item) {
         if (name != null) {
@@ -52,19 +56,21 @@ public final class MacroCallParameterMatcher extends TypeSafeMatcher<Map.Entry<S
     @Override
     public void describeTo(final Description description) {
         if (name != null) {
-            description.appendText("has name '" + name + "' ");
+            description.appendText("'" + name + "' ");
         }
 
         if (valueMatcher != null) {
             valueMatcher.describeTo(description);
         }
+
+        description.appendText(", ");
     }
 
     @Override
     protected void describeMismatchSafely(final Map.Entry<String, Object> item,
                                           final Description mismatchDescription) {
         if (name != null) {
-            mismatchDescription.appendText("has name '" + item.getKey() + "' ");
+            mismatchDescription.appendText("Parameter '" + item.getKey() + "' ");
         }
 
         if (valueMatcher != null) {
@@ -82,6 +88,10 @@ public final class MacroCallParameterMatcher extends TypeSafeMatcher<Map.Entry<S
         return new MacroCallParameterMatcher(name, new MacroCallParameterStringValueMatcher(value));
     }
 
+    public static MacroCallParameterMatcher hasNameAndIntegerValue(final String name, final int value) {
+        return new MacroCallParameterMatcher(name, new MacroCallParameterIntegerValueMatcher(value));
+    }
+
     public static MacroCallParameterMatcher hasNameAndBooleanValue(final String name, final boolean value) {
         return new MacroCallParameterMatcher(name, new MacroCallParameterBooleanValueMatcher(value));
     }
diff --git a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterStringValueMatcher.java b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterStringValueMatcher.java
index ebe63682e4..b051a733f3 100644
--- a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterStringValueMatcher.java
+++ b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroCallParameterStringValueMatcher.java
@@ -35,11 +35,11 @@ public final class MacroCallParameterStringValueMatcher extends TypeSafeMatcher<
 
     @Override
     public void describeTo(final Description description) {
-        description.appendText("with string value '" + value + "'");
+        description.appendText("string value '" + value + "'");
     }
 
     @Override
     protected void describeMismatchSafely(final Object item, final Description mismatchDescription) {
-        mismatchDescription.appendText("with string value '" + item + "'");
+        mismatchDescription.appendText("with value '" + item + "'");
     }
 }