From 41c0454f4e005500c86231a4acad390a20199288 Mon Sep 17 00:00:00 2001 From: Peter Thomas Date: Mon, 3 Mar 2025 15:06:06 +0530 Subject: [PATCH] support docstring syntax for rhs of js object property mutation --- .../main/java/com/intuit/karate/Actions.java | 2 ++ .../com/intuit/karate/ScenarioActions.java | 6 +++++ .../com/intuit/karate/core/StepRuntime.java | 24 ++++++++++--------- .../karate/core/FeatureRuntimeTest.java | 5 ++++ .../intuit/karate/core/eval-assign.feature | 12 ++++++++++ 5 files changed, 38 insertions(+), 11 deletions(-) create mode 100644 karate-core/src/test/java/com/intuit/karate/core/eval-assign.feature diff --git a/karate-core/src/main/java/com/intuit/karate/Actions.java b/karate-core/src/main/java/com/intuit/karate/Actions.java index e731a5dbd..4c048e5c6 100644 --- a/karate-core/src/main/java/com/intuit/karate/Actions.java +++ b/karate-core/src/main/java/com/intuit/karate/Actions.java @@ -73,6 +73,8 @@ public interface Actions { void eval(String exp); + void evalAssignDocString(String lhs, String rhs); + void evalDocString(String exp); void eval(String name, String dotOrParen, String exp); diff --git a/karate-core/src/main/java/com/intuit/karate/ScenarioActions.java b/karate-core/src/main/java/com/intuit/karate/ScenarioActions.java index b136e4319..7be37e568 100644 --- a/karate-core/src/main/java/com/intuit/karate/ScenarioActions.java +++ b/karate-core/src/main/java/com/intuit/karate/ScenarioActions.java @@ -365,6 +365,12 @@ public void evalDocString(String exp) { engine.evalJs(exp); } + @Override + @When("^([\\w]+\\.[^=]+=$)") + public void evalAssignDocString(String lhs, String rhs) { + engine.evalJs(lhs + rhs); + } + @Override @When("^([\\w]+)([^\\s^\\w])(.+)") public void eval(String name, String dotOrParen, String exp) { diff --git a/karate-core/src/main/java/com/intuit/karate/core/StepRuntime.java b/karate-core/src/main/java/com/intuit/karate/core/StepRuntime.java index bccaba0e5..4debe9183 100644 --- a/karate-core/src/main/java/com/intuit/karate/core/StepRuntime.java +++ b/karate-core/src/main/java/com/intuit/karate/core/StepRuntime.java @@ -31,15 +31,7 @@ import com.intuit.karate.StringUtils; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.StringJoiner; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.slf4j.LoggerFactory; @@ -261,8 +253,18 @@ public static Result execute(Step step, Actions actions) { KarateException e = new KarateException("no step-definition method match found for: " + text); return Result.failed(System.currentTimeMillis(), 0, e, step); } else if (matches.size() > 1) { - KarateException e = new KarateException("more than one step-definition method matched: " + text + " - " + matches); - return Result.failed(System.currentTimeMillis(), 0, e, step); + boolean evalAssign = false; // special case to support foo.bar = (docstring) in cucumber syntax + for (MethodMatch m : matches) { + if (m.getMethod().getName().equalsIgnoreCase("evalAssignDocString")) { + evalAssign = true; + matches = Collections.singletonList(m); + break; + } + } + if (!evalAssign) { + KarateException e = new KarateException("more than one step-definition method matched: " + text + " - " + matches); + return Result.failed(System.currentTimeMillis(), 0, e, step); + } } MethodMatch match = matches.get(0); Object last; diff --git a/karate-core/src/test/java/com/intuit/karate/core/FeatureRuntimeTest.java b/karate-core/src/test/java/com/intuit/karate/core/FeatureRuntimeTest.java index 58929e60a..c017a4f6b 100644 --- a/karate-core/src/test/java/com/intuit/karate/core/FeatureRuntimeTest.java +++ b/karate-core/src/test/java/com/intuit/karate/core/FeatureRuntimeTest.java @@ -178,6 +178,11 @@ void testEvalAndSet() { run("eval-and-set.feature"); } + @Test + void testEvalAssign() { + run("eval-assign.feature"); + } + @Test void testExtract() { run("extract.feature"); diff --git a/karate-core/src/test/java/com/intuit/karate/core/eval-assign.feature b/karate-core/src/test/java/com/intuit/karate/core/eval-assign.feature new file mode 100644 index 000000000..272053de2 --- /dev/null +++ b/karate-core/src/test/java/com/intuit/karate/core/eval-assign.feature @@ -0,0 +1,12 @@ +Feature: + + Scenario: + * def foo = { bar: 'one' } + * foo.bar = + """ + { + some: 'big', + message: 'content' + } + """ + * match foo == { bar: { some: 'big', message: 'content' } } \ No newline at end of file