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

andy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/jena.git


The following commit(s) were added to refs/heads/main by this push:
     new da72b3454f Tests for TRIPLE in strict-mode
da72b3454f is described below

commit da72b3454f35cc625f2b5f8a34108f5e02d0f102
Author: Andy Seaborne <[email protected]>
AuthorDate: Tue Mar 3 14:43:07 2026 +0000

    Tests for TRIPLE in strict-mode
---
 .../function/library/triple/TripleTermOps.java     |  1 +
 .../apache/jena/sparql/expr/TestExpressions.java   | 59 ++++++++++++++++++++--
 2 files changed, 56 insertions(+), 4 deletions(-)

diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/triple/TripleTermOps.java
 
b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/triple/TripleTermOps.java
index cbcc9d5848..fa7611a682 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/triple/TripleTermOps.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/triple/TripleTermOps.java
@@ -34,6 +34,7 @@ public class TripleTermOps {
     /**
      * Create a triple term.
      * Throws {@link ExprEvalException} if the predicate argument is not a URI.
+     * In strict mode, throw an exception if the triple is not an RDF Triple.
      */
     public static NodeValue fnTriple(NodeValue nv1, NodeValue nv2, NodeValue 
nv3) {
         Node s = nv1.asNode();
diff --git 
a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions.java 
b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions.java
index cdff1e412b..5716836fb4 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions.java
@@ -34,6 +34,7 @@ import org.junit.jupiter.api.Test;
 
 import org.apache.jena.datatypes.xsd.XSDDatatype;
 import org.apache.jena.graph.NodeFactory;
+import org.apache.jena.query.ARQ;
 import org.apache.jena.query.Query;
 import org.apache.jena.query.QueryFactory;
 import org.apache.jena.query.QueryParseException;
@@ -42,6 +43,7 @@ import org.apache.jena.sparql.engine.binding.Binding;
 import org.apache.jena.sparql.engine.binding.BindingFactory;
 import org.apache.jena.sparql.function.FunctionEnv;
 import org.apache.jena.sparql.function.FunctionEnvBase;
+import org.apache.jena.sparql.sse.SSE;
 import org.apache.jena.sparql.util.ExprUtils;
 import org.apache.jena.sys.JenaSystem;
 import org.apache.jena.vocabulary.RDF;
@@ -399,13 +401,40 @@ public class TestExpressions
 
     // RDF 1.2: triple terms.
     @Test public void tripleterm_01() { testEval("TRIPLE(<x:s>, <x:p>, 123)"); 
}
-    @Test public void tripleterm_02() { testURI("SUBJECT( TRIPLE(<x:s>, <x:p>, 
123) )", "x:s"); }
-    @Test public void tripleterm_03() { testURI("PREDICATE( TRIPLE(<x:s>, 
<x:p>, 123) )", "x:p"); }
+    @Test public void tripleterm_02() { testEval("TRIPLE(BNODE(), <x:p>, 
123)"); }
+    @Test public void tripleterm_03() { testEval("TRIPLE(<x:s>, <x:p>, 
TRIPLE(<x:s1>, <x:p1>, <x:o1>))"); }
+
+    // Not symmetric RDF
+    @Test public void tripleterm_10() { assertThrows(ExprEvalException.class, 
()->testEval("TRIPLE(<x:s>, BNODE(), <x:o>)")); }
+
+    // TRIPLE generates symmetric RDF (non-strict)
+    @Test public void tripleterm_20() { testEval("TRIPLE(123, <x:p>, <x:o>)"); 
}
+    @Test public void tripleterm_21() { testEval("TRIPLE(TRIPLE(<x:s>, <x:p>, 
<x:o>), <x:p>, <x:o>)"); }
+
+    // TRIPLE generates RDF triples (strict)
+    @Test public void tripleterm_30() {
+        strictMode(()->assertThrows(ExprEvalException.class, ()-> {
+            strictMode(()->testEval("TRIPLE(123, <x:p>, <x:o>)"));
+        }));
+    }
+
+    @Test public void tripleterm_31() {
+        strictMode(()->assertThrows(ExprEvalException.class, ()-> {
+            strictMode(()->testEval("TRIPLE(TRIPLE(<x:s>, <x:p>, <x:o>), 
<x:p>, <x:o>)"));
+        }));
+    }
+
+    // Accessors
+    @Test public void tripleterm_50() { testURI("SUBJECT( TRIPLE(<x:s>, <x:p>, 
123) )", "x:s"); }
+    @Test public void tripleterm_51() { testURI("PREDICATE( TRIPLE(<x:s>, 
<x:p>, 123) )", "x:p"); }
+    @Test public void tripleterm_52() { testNumeric("OBJECT( TRIPLE(<x:s>, 
<x:p>, 123) )", 123); }
 
     @Test
-    public void tripleterm_03a() { assertThrows(QueryParseException.class, 
()-> testURI("PROPERTY( TRIPLE(<x:s>, <x:p>, 123) )", "x:p") ); }
+    public void tripleterm_90() {
+        // Not keyword PROEPRTY
+        assertThrows(QueryParseException.class, ()-> testURI("PROPERTY( 
TRIPLE(<x:s>, <x:p>, 123) )", "x:p") );
+    }
 
-    @Test public void tripleterm_04() { testNumeric("OBJECT( TRIPLE(<x:s>, 
<x:p>, 123) )", 123); }
 
     @Test public void boolean_129() { testBoolean("isURI(?x)", true, env); }
     @Test public void boolean_130() { testBoolean("isURI(?a)", false, env); }
@@ -503,6 +532,17 @@ public class TestExpressions
         parseToEnd(exprString);
     }
 
+    // Strict mode - just set the flag.
+    private static void strictMode(Runnable action) {
+        Object setting = ARQ.getContext().get(ARQ.strictSPARQL);
+        try {
+            ARQ.getContext().set(ARQ.strictSPARQL, true);
+            action.run();
+        } finally {
+            ARQ.getContext().set(ARQ.strictSPARQL, setting);
+        }
+    }
+
     // "should evaluate", don't care what the result is.
     private static void testEval(String string) {
         Expr expr = parseToEnd(string);
@@ -511,6 +551,17 @@ public class TestExpressions
         NodeValue v = expr.eval(binding, env);
     }
 
+    // Evaluate and test against an SSEw-rriter expected value
+    private static void testEval(String string, String expectedStr) {
+        Expr expr = parseToEnd(string);
+        Binding binding = BindingFactory.empty();
+        FunctionEnv env = new FunctionEnvBase();
+        NodeValue actual = expr.eval(binding, env);
+        NodeValue expected = SSE.parseNodeValue(expectedStr);
+        assertEquals(expected, actual);
+    }
+
+
     // All value testing should be parseToEnd
     private static void testNumeric(String string, int i) {
         Expr expr = parseToEnd(string);

Reply via email to