summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Thursfield <sam@afuera.me.uk>2022-03-13 15:39:58 +0000
committerSam Thursfield <sam@afuera.me.uk>2022-03-13 15:39:58 +0000
commit32bd56cc4a5d7d700a300b3231abe551e18252e5 (patch)
tree6eb628c0fe8040269a96c443fdbf72ddd23528d6
parent9e598b0c06ef31c7563fad4828391833db35f1af (diff)
parenteaa2d2edd11eec098e509a44644599966afef497 (diff)
downloadtracker-32bd56cc4a5d7d700a300b3231abe551e18252e5.tar.gz
Merge branch 'wip/carlosg/more-tests' into 'master'
Add more tests See merge request GNOME/tracker!495
-rw-r--r--.gitlab-ci.yml4
-rw-r--r--tests/functional-tests/portal.py324
-rw-r--r--tests/libtracker-data/aggregates/aggregate-count-1.out1
-rw-r--r--tests/libtracker-data/aggregates/aggregate-count-1.rq3
-rw-r--r--tests/libtracker-data/aggregates/aggregate-count-2.out1
-rw-r--r--tests/libtracker-data/aggregates/aggregate-count-2.rq3
-rw-r--r--tests/libtracker-data/aggregates/aggregate-count-3.out1
-rw-r--r--tests/libtracker-data/aggregates/aggregate-count-3.rq3
-rw-r--r--tests/libtracker-data/aggregates/aggregate-group-3.out2
-rw-r--r--tests/libtracker-data/aggregates/aggregate-group-3.rq9
-rw-r--r--tests/libtracker-data/aggregates/aggregate-group-having-1.out1
-rw-r--r--tests/libtracker-data/aggregates/aggregate-group-having-1.rq10
-rw-r--r--tests/libtracker-data/aggregates/aggregate-sample-1.out2
-rw-r--r--tests/libtracker-data/aggregates/aggregate-sample-1.rq8
-rw-r--r--tests/libtracker-data/aggregates/aggregate-sample-2.out2
-rw-r--r--tests/libtracker-data/aggregates/aggregate-sample-2.rq8
-rw-r--r--tests/libtracker-data/functions/functions-builtin-abs-1.out1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-abs-1.rq1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-bnode-1.out1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-bnode-1.rq11
-rw-r--r--tests/libtracker-data/functions/functions-builtin-bnode-2.out1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-bnode-2.rq11
-rw-r--r--tests/libtracker-data/functions/functions-builtin-contains-1.out1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-contains-1.rq1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-day-1.out5
-rw-r--r--tests/libtracker-data/functions/functions-builtin-day-1.rq9
-rw-r--r--tests/libtracker-data/functions/functions-builtin-encode-for-uri-1.out1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-encode-for-uri-1.rq1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-hours-1.out5
-rw-r--r--tests/libtracker-data/functions/functions-builtin-hours-1.rq9
-rw-r--r--tests/libtracker-data/functions/functions-builtin-if-1.out1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-if-1.rq1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-minutes-1.out5
-rw-r--r--tests/libtracker-data/functions/functions-builtin-minutes-1.rq9
-rw-r--r--tests/libtracker-data/functions/functions-builtin-month-1.out5
-rw-r--r--tests/libtracker-data/functions/functions-builtin-month-1.rq9
-rw-r--r--tests/libtracker-data/functions/functions-builtin-now-1.out1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-now-1.rq1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-rand-1.out1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-rand-1.rq7
-rw-r--r--tests/libtracker-data/functions/functions-builtin-replace-1.out1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-replace-1.rq1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-replace-2.out0
-rw-r--r--tests/libtracker-data/functions/functions-builtin-replace-2.rq2
-rw-r--r--tests/libtracker-data/functions/functions-builtin-replace-3.out0
-rw-r--r--tests/libtracker-data/functions/functions-builtin-replace-3.rq2
-rw-r--r--tests/libtracker-data/functions/functions-builtin-replace-4.out1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-replace-4.rq1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-replace-5.out0
-rw-r--r--tests/libtracker-data/functions/functions-builtin-replace-5.rq1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-round-1.out1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-round-1.rq1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-sameterm-1.out1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-sameterm-1.rq1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-seconds-1.out5
-rw-r--r--tests/libtracker-data/functions/functions-builtin-seconds-1.rq9
-rw-r--r--tests/libtracker-data/functions/functions-builtin-strdt-1.out1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-strdt-1.rq1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-strlen-1.out1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-strlen-1.rq1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-substr-1.out1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-substr-1.rq1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-uri-1.out1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-uri-1.rq1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-uuid-1.out1
-rw-r--r--tests/libtracker-data/functions/functions-builtin-uuid-1.rq11
-rw-r--r--tests/libtracker-data/functions/functions-builtin-year-1.out5
-rw-r--r--tests/libtracker-data/functions/functions-builtin-year-1.rq9
-rw-r--r--tests/libtracker-data/functions/functions-cast-1.out1
-rw-r--r--tests/libtracker-data/functions/functions-cast-1.rq1
-rw-r--r--tests/libtracker-data/functions/functions-cast-2.out1
-rw-r--r--tests/libtracker-data/functions/functions-cast-2.rq1
-rw-r--r--tests/libtracker-data/functions/functions-datatypes-5.out1
-rw-r--r--tests/libtracker-data/functions/functions-datatypes-5.rq3
-rw-r--r--tests/libtracker-data/functions/functions-xpath-15.out1
-rw-r--r--tests/libtracker-data/functions/functions-xpath-15.rq1
-rw-r--r--tests/libtracker-data/property-paths/alternative-path-3.out20
-rw-r--r--tests/libtracker-data/property-paths/alternative-path-3.rq1
-rw-r--r--tests/libtracker-data/tracker-sparql-test.c48
-rw-r--r--tests/libtracker-fts/data.ontology7
-rw-r--r--tests/libtracker-fts/functions/offsets-1.out4
-rw-r--r--tests/libtracker-fts/functions/offsets-1.rq1
-rw-r--r--tests/libtracker-fts/functions/offsets-2.out2
-rw-r--r--tests/libtracker-fts/functions/offsets-2.rq1
-rw-r--r--tests/libtracker-fts/functions/offsets-3.out3
-rw-r--r--tests/libtracker-fts/functions/offsets-3.rq1
-rw-r--r--tests/libtracker-fts/functions/offsets-data.rq9
-rw-r--r--tests/libtracker-fts/functions/rank-1.out4
-rw-r--r--tests/libtracker-fts/functions/rank-1.rq1
-rw-r--r--tests/libtracker-fts/functions/rank-2.out2
-rw-r--r--tests/libtracker-fts/functions/rank-2.rq1
-rw-r--r--tests/libtracker-fts/functions/rank-data.rq9
-rw-r--r--tests/libtracker-fts/functions/snippet-1.out4
-rw-r--r--tests/libtracker-fts/functions/snippet-1.rq1
-rw-r--r--tests/libtracker-fts/functions/snippet-2.out4
-rw-r--r--tests/libtracker-fts/functions/snippet-2.rq1
-rw-r--r--tests/libtracker-fts/functions/snippet-3.out4
-rw-r--r--tests/libtracker-fts/functions/snippet-3.rq1
-rw-r--r--tests/libtracker-fts/functions/snippet-4.out4
-rw-r--r--tests/libtracker-fts/functions/snippet-4.rq1
-rw-r--r--tests/libtracker-fts/functions/snippet-5.out4
-rw-r--r--tests/libtracker-fts/functions/snippet-5.rq1
-rw-r--r--tests/libtracker-fts/functions/snippet-data.rq9
-rw-r--r--tests/libtracker-fts/tracker-fts-test.c3
-rw-r--r--tests/libtracker-sparql/tracker-sparql-test.c84
105 files changed, 774 insertions, 12 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 31fd39fea..8c7f91ed6 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -251,6 +251,8 @@ build-fedora@aarch64:
needs:
- build-fedora-container@aarch64
allow_failure: true
+ variables:
+ NO_DOCS: "true"
<<: *build
build-ubuntu-rolling@x86_64:
@@ -292,7 +294,7 @@ build-alpine-latest@x86_64:
--exclude=../utils --exclude=../examples --exclude=../docs/reference
--exclude='\.\./build/.*\.[ch]$' --exclude='.*/tests/.*\.[ch]$'
--exclude='\.\./src/.*\.vala$'
- --json --output=../coverage-${CI_JOB_NAME}.json 2>/dev/null
+ --json --print-summary --output=../coverage-${CI_JOB_NAME}.json 2>/dev/null
- popd
- |
echo "Distribution: "
diff --git a/tests/functional-tests/portal.py b/tests/functional-tests/portal.py
index 373bf8d5b..057ea3f10 100644
--- a/tests/functional-tests/portal.py
+++ b/tests/functional-tests/portal.py
@@ -90,6 +90,7 @@ class TestPortal(fixtures.TrackerPortalTest):
self.fail("Timeout, the signal never came after %i seconds!" % configuration.DEFAULT_TIMEOUT)
def __notifier_event_cb(self, notifier, service, graph, events):
+ self.notifier_events += events
if self.timeout_id != 0:
GLib.source_remove(self.timeout_id)
self.timeout_id = 0
@@ -98,6 +99,7 @@ class TestPortal(fixtures.TrackerPortalTest):
def test_05_local_connection_notifier(self):
self.start_service('org.freedesktop.PortalTest')
+ self.notifier_events = []
conn = self.create_local_connection()
notifier = conn.create_notifier();
notifier.connect('events', self.__notifier_event_cb)
@@ -106,20 +108,27 @@ class TestPortal(fixtures.TrackerPortalTest):
'org.freedesktop.PortalTest',
None,
'tracker:Allowed')
+ signalId2 = notifier.signal_subscribe(
+ self.bus,
+ 'org.freedesktop.PortalTest',
+ None,
+ 'tracker:Disallowed')
self.update(
'org.freedesktop.PortalTest',
+ 'INSERT { GRAPH tracker:Disallowed { <a> a nmm:MusicPiece } }')
+ self.update(
+ 'org.freedesktop.PortalTest',
'INSERT { GRAPH tracker:Allowed { <b> a nmm:MusicPiece } }')
self.__wait_for_notifier()
notifier.signal_unsubscribe(signalId);
- conn.close()
+ notifier.signal_unsubscribe(signalId2);
- res = self.query(
- 'org.freedesktop.PortalTest',
- 'select ?a { ?a a nmm:MusicPiece }')
- self.assertEqual(len(res), 1)
- self.assertEqual(res[0][0], 'b')
+ # Only one event is expected, from the allowed graph
+ self.assertEqual(len(self.notifier_events), 1);
+ self.assertEqual(self.notifier_events[0].get_urn(), 'b')
+ conn.close()
def test_06_id_access(self):
self.start_service('org.freedesktop.PortalTest')
@@ -141,5 +150,308 @@ class TestPortal(fixtures.TrackerPortalTest):
self.assertNotEqual(res[0][0], '0')
self.assertEqual(res[0][1], 'b')
+ def test_07_id_access_disallowed(self):
+ self.start_service('org.freedesktop.PortalTest')
+
+ # Insert resource into disallowed graph, ensure it is not visible
+ self.update(
+ 'org.freedesktop.PortalTest',
+ 'CREATE GRAPH tracker:Disallowed;' +
+ 'INSERT { GRAPH tracker:Disallowed { <b> a nfo:FileDataObject } }')
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select tracker:id(<b>) tracker:uri(tracker:id(<b>)) { }')
+ self.assertEqual(len(res), 1)
+ self.assertEqual(res[0][0], '0')
+ self.assertIsNone(res[0][1])
+
+ # Insert same resource into allowed graph, ensure it is visible
+ self.update(
+ 'org.freedesktop.PortalTest',
+ 'CREATE GRAPH tracker:Allowed;' +
+ 'INSERT { GRAPH tracker:Allowed { <b> a nfo:FileDataObject } }')
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select tracker:id(<b>) tracker:uri(tracker:id(<b>)) { }')
+ self.assertEqual(len(res), 1)
+ self.assertNotEqual(res[0][0], '0')
+ self.assertEqual(res[0][1], 'b')
+ resourceId = res[0][0];
+
+ # Delete resource from allowed graph, ensure it is not visible again
+ self.update(
+ 'org.freedesktop.PortalTest',
+ 'DELETE { GRAPH tracker:Allowed { <b> a rdfs:Resource } }')
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select tracker:id(<b>) tracker:uri(tracker:id(<b>)) tracker:uri(' + str(resourceId) + ') { }')
+ self.assertEqual(len(res), 1)
+ self.assertEqual(res[0][0], '0')
+ self.assertIsNone(res[0][1])
+ self.assertIsNone(res[0][2])
+
+ def test_08_local_connection_service(self):
+ self.start_service('org.freedesktop.PortalTest')
+
+ self.notifier_events = []
+ conn = self.create_local_connection()
+ self.update(
+ 'org.freedesktop.PortalTest',
+ 'INSERT { GRAPH tracker:Disallowed { <a> a nmm:MusicPiece } }')
+ self.update(
+ 'org.freedesktop.PortalTest',
+ 'INSERT { GRAPH tracker:Allowed { <b> a nmm:MusicPiece } }')
+
+ # Only one resource is expected, from the allowed graph
+ cursor = conn.query('select ?u { SERVICE <dbus:org.freedesktop.PortalTest> { ?u a nmm:MusicPiece } }')
+ self.assertTrue(cursor.next())
+ self.assertEqual(cursor.get_string(0)[0], 'b')
+ self.assertFalse(cursor.next())
+ cursor.close()
+ conn.close()
+
+ # Test that all ways to specify a graph in the query hit a dead end
+ def test_09_query_graphs(self):
+ self.start_service('org.freedesktop.PortalTest')
+ self.update(
+ 'org.freedesktop.PortalTest',
+ 'CREATE GRAPH tracker:Disallowed;' +
+ 'INSERT { GRAPH tracker:Disallowed { <a> a nfo:FileDataObject } }')
+
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?u from tracker:Disallowed { ?u a rdfs:Resource }')
+ self.assertEqual(len(res), 0)
+
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?u { graph tracker:Disallowed { ?u a rdfs:Resource } }')
+ self.assertEqual(len(res), 0)
+
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'constraint graph tracker:Disallowed select ?u { ?u a rdfs:Resource }')
+ self.assertEqual(len(res), 0)
+
+ # Test that it is not possible to break through into other services
+ def test_10_query_services(self):
+ self.start_service('org.freedesktop.PortalTest')
+ self.start_service('org.freedesktop.InaccessibleService')
+ self.update(
+ 'org.freedesktop.PortalTest',
+ 'CREATE GRAPH tracker:Allowed;' +
+ 'INSERT { GRAPH tracker:Allowed { <a> a nfo:FileDataObject } }')
+ self.update(
+ 'org.freedesktop.InaccessibleService',
+ 'CREATE GRAPH tracker:Allowed;' +
+ 'INSERT { GRAPH tracker:Allowed { <b> a nfo:FileDataObject } }')
+
+ try:
+ exception = None
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?u { service <dbus:org.freedesktop.InaccessibleService> { ?u a rdfs:Resource } }')
+ except Exception as e:
+ exception = e;
+ finally:
+ self.assertIsNotNone(exception)
+
+ try:
+ exception = None
+ res = self.query(
+ 'org.freedesktop.InaccessibleService',
+ 'select ?u { ?u a rdfs:Resource }')
+ except Exception as e:
+ exception = e;
+ finally:
+ self.assertIsNotNone(exception)
+
+ # Test that property paths resolve correctly across allowed
+ # and disallowed graphs
+ def test_11_query_property_paths(self):
+ self.start_service('org.freedesktop.PortalTest')
+ self.update(
+ 'org.freedesktop.PortalTest',
+ 'CREATE GRAPH tracker:Disallowed;' +
+ 'INSERT { GRAPH tracker:Disallowed { ' +
+ ' <a> a nfo:FileDataObject ; nfo:fileName "A" ; nie:interpretedAs <b1> .' +
+ ' <b1> a nmm:MusicPiece ; nie:isStoredAs <a> ; nie:title "title2" } }')
+
+ # Test property paths with allowed/disallowed graphs in both ends
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?u ?t { ?u nie:interpretedAs/nie:title ?t }')
+ self.assertEqual(len(res), 0)
+
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?u ?fn { ?u nie:isStoredAs/nfo:fileName ?fn }')
+ self.assertEqual(len(res), 0)
+
+ # Insert a resource in the allowed graph
+ self.update(
+ 'org.freedesktop.PortalTest',
+ 'CREATE GRAPH tracker:Allowed;' +
+ 'INSERT { GRAPH tracker:Allowed { ' +
+ ' <a> a nfo:FileDataObject ; nfo:fileName "A" ; nie:interpretedAs <a1> .' +
+ ' <a1> a nmm:MusicPiece ; nie:isStoredAs <a> ; nie:title "title1" } }')
+
+ # Try the queries again
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?u ?t { ?u nie:interpretedAs/nie:title ?t }')
+ self.assertEqual(len(res), 1)
+ self.assertEqual(res[0][0], 'a')
+ self.assertEqual(res[0][1], 'title1')
+
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?u ?fn { ?u nie:isStoredAs/nfo:fileName ?fn }')
+ self.assertEqual(len(res), 1)
+ self.assertEqual(res[0][0], 'a1')
+ self.assertEqual(res[0][1], 'A')
+
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?u ?fn { GRAPH tracker:Disallowed { ?u nie:isStoredAs/nfo:fileName ?fn } }')
+ self.assertEqual(len(res), 0)
+
+ # Delete the allowed resource again
+ self.update(
+ 'org.freedesktop.PortalTest',
+ 'DROP GRAPH tracker:Allowed')
+
+ # Query results should revert to the original values
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?u ?t { ?u nie:interpretedAs/nie:title ?t }')
+ self.assertEqual(len(res), 0)
+
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?u ?fn { ?u nie:isStoredAs/nfo:fileName ?fn }')
+ self.assertEqual(len(res), 0)
+
+ # Test that property paths resolve correctly across allowed
+ # and disallowed graphs
+ def test_12_query_fts(self):
+ self.start_service('org.freedesktop.PortalTest')
+ self.update(
+ 'org.freedesktop.PortalTest',
+ 'CREATE GRAPH tracker:Disallowed;' +
+ 'INSERT { GRAPH tracker:Disallowed { ' +
+ ' <a> a nfo:FileDataObject ; nie:interpretedAs <b1> .' +
+ ' <b1> a nmm:MusicPiece ; nie:isStoredAs <a> ; nie:title "apples and oranges" } }')
+
+ # Query for both keywords, they are expected to be non-visible
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?u { ?u fts:match "apples" }')
+ self.assertEqual(len(res), 0)
+
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?u { ?u fts:match "oranges" }')
+ self.assertEqual(len(res), 0)
+
+ # Insert a resource in the allowed graph
+ self.update(
+ 'org.freedesktop.PortalTest',
+ 'CREATE GRAPH tracker:Allowed;' +
+ 'INSERT { GRAPH tracker:Allowed { ' +
+ ' <a> a nfo:FileDataObject ; nfo:fileName "file name" ; nie:interpretedAs <a1> .' +
+ ' <a1> a nmm:MusicPiece ; nie:isStoredAs <a> ; nie:title "apples" } }')
+
+ # Try the queries again, we should get a match from the allowed graph for 'apples'
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?u { ?u fts:match "apples" }')
+ self.assertEqual(len(res), 1)
+ self.assertEqual(res[0][0], 'a1')
+
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?u { ?u fts:match "oranges" }')
+ self.assertEqual(len(res), 0)
+
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?u { GRAPH tracker:Disallowed { ?u fts:match "oranges" } }')
+ self.assertEqual(len(res), 0)
+
+ # Delete the allowed resource again
+ self.update(
+ 'org.freedesktop.PortalTest',
+ 'DROP GRAPH tracker:Allowed')
+
+ # The query results should revert to the original values
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?u { ?u fts:match "apples" }')
+ self.assertEqual(len(res), 0)
+
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?u { ?u fts:match "oranges" }')
+ self.assertEqual(len(res), 0)
+
+ # Test that property paths resolve correctly across allowed
+ # and disallowed graphs
+ def test_13_query_unrestricted_triples(self):
+ self.start_service('org.freedesktop.PortalTest')
+ self.update(
+ 'org.freedesktop.PortalTest',
+ 'CREATE GRAPH tracker:Disallowed;' +
+ 'INSERT { GRAPH tracker:Disallowed { ' +
+ ' <a> a nfo:FileDataObject ; nfo:fileName "A" . } }')
+
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?s { ?s ?p "A" }')
+ self.assertEqual(len(res), 0)
+
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'ASK { <a> ?p "A" }')
+ self.assertEqual(len(res), 1)
+ self.assertNotEqual(res[0][0], 'true')
+
+ # Insert a resource in the allowed graph
+ self.update(
+ 'org.freedesktop.PortalTest',
+ 'CREATE GRAPH tracker:Allowed;' +
+ 'INSERT { GRAPH tracker:Allowed { ' +
+ ' <a> a nfo:FileDataObject ; nfo:fileName "A" . } }')
+
+ # Try the queries again
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?s { ?s ?p "A" }')
+ self.assertEqual(len(res), 1)
+ self.assertEqual(res[0][0], 'a')
+
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'ASK { <a> ?p "A" }')
+ self.assertEqual(len(res), 1)
+ self.assertEqual(res[0][0], 'true')
+
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?s { GRAPH tracker:Disallowed { ?s ?p "A" } }')
+ self.assertEqual(len(res), 0)
+
+ # Delete the allowed resource again
+ self.update(
+ 'org.freedesktop.PortalTest',
+ 'DROP GRAPH tracker:Allowed')
+
+ # The query results should revert to the original values
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?s { ?s ?p "A" }')
+ self.assertEqual(len(res), 0)
+
+
if __name__ == '__main__':
fixtures.tracker_test_main()
diff --git a/tests/libtracker-data/aggregates/aggregate-count-1.out b/tests/libtracker-data/aggregates/aggregate-count-1.out
new file mode 100644
index 000000000..18d17df02
--- /dev/null
+++ b/tests/libtracker-data/aggregates/aggregate-count-1.out
@@ -0,0 +1 @@
+"3"
diff --git a/tests/libtracker-data/aggregates/aggregate-count-1.rq b/tests/libtracker-data/aggregates/aggregate-count-1.rq
new file mode 100644
index 000000000..dbdb24acf
--- /dev/null
+++ b/tests/libtracker-data/aggregates/aggregate-count-1.rq
@@ -0,0 +1,3 @@
+PREFIX : <http://example/>
+
+SELECT COUNT(?u) { [ :i2 ?u ] }
diff --git a/tests/libtracker-data/aggregates/aggregate-count-2.out b/tests/libtracker-data/aggregates/aggregate-count-2.out
new file mode 100644
index 000000000..18d17df02
--- /dev/null
+++ b/tests/libtracker-data/aggregates/aggregate-count-2.out
@@ -0,0 +1 @@
+"3"
diff --git a/tests/libtracker-data/aggregates/aggregate-count-2.rq b/tests/libtracker-data/aggregates/aggregate-count-2.rq
new file mode 100644
index 000000000..dd440145d
--- /dev/null
+++ b/tests/libtracker-data/aggregates/aggregate-count-2.rq
@@ -0,0 +1,3 @@
+PREFIX : <http://example/>
+
+SELECT COUNT(*) { [ :i2 ?u ] }
diff --git a/tests/libtracker-data/aggregates/aggregate-count-3.out b/tests/libtracker-data/aggregates/aggregate-count-3.out
new file mode 100644
index 000000000..1026c253e
--- /dev/null
+++ b/tests/libtracker-data/aggregates/aggregate-count-3.out
@@ -0,0 +1 @@
+"2"
diff --git a/tests/libtracker-data/aggregates/aggregate-count-3.rq b/tests/libtracker-data/aggregates/aggregate-count-3.rq
new file mode 100644
index 000000000..73a072b8a
--- /dev/null
+++ b/tests/libtracker-data/aggregates/aggregate-count-3.rq
@@ -0,0 +1,3 @@
+PREFIX : <http://example/>
+
+SELECT COUNT(DISTINCT ?u) { [ :i2 ?u ] }
diff --git a/tests/libtracker-data/aggregates/aggregate-group-3.out b/tests/libtracker-data/aggregates/aggregate-group-3.out
new file mode 100644
index 000000000..3b41f134b
--- /dev/null
+++ b/tests/libtracker-data/aggregates/aggregate-group-3.out
@@ -0,0 +1,2 @@
+"http://example/x" "2" "8" "string t|string y"
+"http://example/z" "1" "13" "string u"
diff --git a/tests/libtracker-data/aggregates/aggregate-group-3.rq b/tests/libtracker-data/aggregates/aggregate-group-3.rq
new file mode 100644
index 000000000..440dceaf9
--- /dev/null
+++ b/tests/libtracker-data/aggregates/aggregate-group-3.rq
@@ -0,0 +1,9 @@
+PREFIX : <http://example/>
+
+SELECT ?a COUNT(DISTINCT ?b) SUM(?ib) GROUP_CONCAT(?sb; SEPARATOR="|")
+{ ?a a :A ;
+ :b ?b .
+ ?b :ib ?ib .
+ ?b :sb ?sb .
+ FILTER (?ib>2) }
+GROUP BY ?a
diff --git a/tests/libtracker-data/aggregates/aggregate-group-having-1.out b/tests/libtracker-data/aggregates/aggregate-group-having-1.out
new file mode 100644
index 000000000..e66f8d307
--- /dev/null
+++ b/tests/libtracker-data/aggregates/aggregate-group-having-1.out
@@ -0,0 +1 @@
+"http://example/x" "2" "8" "string t|string y"
diff --git a/tests/libtracker-data/aggregates/aggregate-group-having-1.rq b/tests/libtracker-data/aggregates/aggregate-group-having-1.rq
new file mode 100644
index 000000000..c8dc7bef8
--- /dev/null
+++ b/tests/libtracker-data/aggregates/aggregate-group-having-1.rq
@@ -0,0 +1,10 @@
+PREFIX : <http://example/>
+
+SELECT ?a COUNT(DISTINCT ?b) SUM(?ib) GROUP_CONCAT(?sb, "|")
+{ ?a a :A ;
+ :b ?b .
+ ?b :ib ?ib .
+ ?b :sb ?sb .
+ FILTER (?ib>2) }
+GROUP BY ?a
+HAVING (SUM(?ib)<10)
diff --git a/tests/libtracker-data/aggregates/aggregate-sample-1.out b/tests/libtracker-data/aggregates/aggregate-sample-1.out
new file mode 100644
index 000000000..5378d4f58
--- /dev/null
+++ b/tests/libtracker-data/aggregates/aggregate-sample-1.out
@@ -0,0 +1,2 @@
+"http://example/x" "8"
+"http://example/z" "8"
diff --git a/tests/libtracker-data/aggregates/aggregate-sample-1.rq b/tests/libtracker-data/aggregates/aggregate-sample-1.rq
new file mode 100644
index 000000000..08d142806
--- /dev/null
+++ b/tests/libtracker-data/aggregates/aggregate-sample-1.rq
@@ -0,0 +1,8 @@
+PREFIX : <http://example/>
+
+# All samples have the same length
+SELECT ?a STRLEN(SAMPLE(?s))
+{ ?a :b ?b .
+ ?b :sb ?s . }
+GROUP BY ?a
+ORDER BY ?a
diff --git a/tests/libtracker-data/aggregates/aggregate-sample-2.out b/tests/libtracker-data/aggregates/aggregate-sample-2.out
new file mode 100644
index 000000000..5378d4f58
--- /dev/null
+++ b/tests/libtracker-data/aggregates/aggregate-sample-2.out
@@ -0,0 +1,2 @@
+"http://example/x" "8"
+"http://example/z" "8"
diff --git a/tests/libtracker-data/aggregates/aggregate-sample-2.rq b/tests/libtracker-data/aggregates/aggregate-sample-2.rq
new file mode 100644
index 000000000..c95554179
--- /dev/null
+++ b/tests/libtracker-data/aggregates/aggregate-sample-2.rq
@@ -0,0 +1,8 @@
+PREFIX : <http://example/>
+
+# All samples have the same length
+SELECT ?a STRLEN(SAMPLE(DISTINCT ?s))
+{ ?a :b ?b .
+ ?b :sb ?s . }
+GROUP BY ?a
+ORDER BY ?a
diff --git a/tests/libtracker-data/functions/functions-builtin-abs-1.out b/tests/libtracker-data/functions/functions-builtin-abs-1.out
new file mode 100644
index 000000000..d691312ad
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-abs-1.out
@@ -0,0 +1 @@
+"4.0" "4.0" "4.999999999" "4.999999999"
diff --git a/tests/libtracker-data/functions/functions-builtin-abs-1.rq b/tests/libtracker-data/functions/functions-builtin-abs-1.rq
new file mode 100644
index 000000000..bebb448c2
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-abs-1.rq
@@ -0,0 +1 @@
+SELECT (ABS(4.0) AS ?a) (ABS(-4.0) AS ?b) (ABS(4.999999999) AS ?c) (ABS(4.999999999) AS ?c) { FILTER (ABS (-40) > ABS(2)) }
diff --git a/tests/libtracker-data/functions/functions-builtin-bnode-1.out b/tests/libtracker-data/functions/functions-builtin-bnode-1.out
new file mode 100644
index 000000000..826861551
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-bnode-1.out
@@ -0,0 +1 @@
+"true"
diff --git a/tests/libtracker-data/functions/functions-builtin-bnode-1.rq b/tests/libtracker-data/functions/functions-builtin-bnode-1.rq
new file mode 100644
index 000000000..13cc98366
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-bnode-1.rq
@@ -0,0 +1,11 @@
+ASK
+{
+ BIND (BNODE () AS ?a) .
+ BIND (BNODE () AS ?b) .
+ # Check prefix
+ FILTER (SUBSTR(STR(?a), 0, 11) = 'urn:bnode:') .
+ FILTER (SUBSTR(STR(?a), 0, 11) = SUBSTR(STR(?b), 0, 11)) .
+ # Check UUIDv4 version char, this is always 4
+ FILTER (SUBSTR(STR(?a), 25, 1) = '4') .
+ FILTER (SUBSTR(STR(?a), 25, 1) = SUBSTR(STR(?b), 25, 1)) .
+}
diff --git a/tests/libtracker-data/functions/functions-builtin-bnode-2.out b/tests/libtracker-data/functions/functions-builtin-bnode-2.out
new file mode 100644
index 000000000..826861551
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-bnode-2.out
@@ -0,0 +1 @@
+"true"
diff --git a/tests/libtracker-data/functions/functions-builtin-bnode-2.rq b/tests/libtracker-data/functions/functions-builtin-bnode-2.rq
new file mode 100644
index 000000000..81afe0a00
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-bnode-2.rq
@@ -0,0 +1,11 @@
+ASK
+{
+ BIND (BNODE ("a") AS ?a) .
+ BIND (BNODE ("b") AS ?b) .
+ # Check prefix
+ FILTER (SUBSTR(STR(?a), 0, 11) = 'urn:bnode:') .
+ FILTER (SUBSTR(STR(?a), 0, 11) = SUBSTR(STR(?b), 0, 11)) .
+ # Check UUIDv4 version char, this is always 4
+ FILTER (SUBSTR(STR(?a), 25, 1) = '4') .
+ FILTER (SUBSTR(STR(?a), 25, 1) = SUBSTR(STR(?b), 25, 1)) .
+}
diff --git a/tests/libtracker-data/functions/functions-builtin-contains-1.out b/tests/libtracker-data/functions/functions-builtin-contains-1.out
new file mode 100644
index 000000000..6cd3c6c29
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-contains-1.out
@@ -0,0 +1 @@
+"true" "false" "false"
diff --git a/tests/libtracker-data/functions/functions-builtin-contains-1.rq b/tests/libtracker-data/functions/functions-builtin-contains-1.rq
new file mode 100644
index 000000000..e88afc65c
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-contains-1.rq
@@ -0,0 +1 @@
+SELECT (CONTAINS('abcd', 'b') AS ?a) (CONTAINS('abcd', 'z') AS ?b) (CONTAINS('\u2323', '\u0023') AS ?a) {}
diff --git a/tests/libtracker-data/functions/functions-builtin-day-1.out b/tests/libtracker-data/functions/functions-builtin-day-1.out
new file mode 100644
index 000000000..4f3685941
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-day-1.out
@@ -0,0 +1,5 @@
+"10"
+"01"
+"31"
+"02"
+"31"
diff --git a/tests/libtracker-data/functions/functions-builtin-day-1.rq b/tests/libtracker-data/functions/functions-builtin-day-1.rq
new file mode 100644
index 000000000..57647f94a
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-day-1.rq
@@ -0,0 +1,9 @@
+SELECT DAY(?d) {
+ VALUES ?d {
+ '2022-03-10T12:23:34Z'^^xsd:dateTime
+ '2022-01-01T01:00:00-0600'^^xsd:dateTime
+ '2022-12-31T23:00:00+0600'^^xsd:dateTime
+ '0001-01-02'^^xsd:date
+ '9998-12-31'^^xsd:date
+ }
+}
diff --git a/tests/libtracker-data/functions/functions-builtin-encode-for-uri-1.out b/tests/libtracker-data/functions/functions-builtin-encode-for-uri-1.out
new file mode 100644
index 000000000..a6143bb05
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-encode-for-uri-1.out
@@ -0,0 +1 @@
+"a%2Fb%23c%F0%9F%98%83" "abc123"
diff --git a/tests/libtracker-data/functions/functions-builtin-encode-for-uri-1.rq b/tests/libtracker-data/functions/functions-builtin-encode-for-uri-1.rq
new file mode 100644
index 000000000..ff74b4a57
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-encode-for-uri-1.rq
@@ -0,0 +1 @@
+SELECT ENCODE_FOR_URI('a/b#cđŸ˜ƒ') ENCODE_FOR_URI('abc123') {}
diff --git a/tests/libtracker-data/functions/functions-builtin-hours-1.out b/tests/libtracker-data/functions/functions-builtin-hours-1.out
new file mode 100644
index 000000000..a05ff54dd
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-hours-1.out
@@ -0,0 +1,5 @@
+"12"
+"1"
+"23"
+"0"
+"0"
diff --git a/tests/libtracker-data/functions/functions-builtin-hours-1.rq b/tests/libtracker-data/functions/functions-builtin-hours-1.rq
new file mode 100644
index 000000000..5e706d146
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-hours-1.rq
@@ -0,0 +1,9 @@
+SELECT HOURS(?d) {
+ VALUES ?d {
+ '2022-03-10T12:23:34Z'^^xsd:dateTime
+ '2022-01-01T01:00:00-0600'^^xsd:dateTime
+ '2022-12-31T23:00:00+0600'^^xsd:dateTime
+ '0001-01-02'^^xsd:date
+ '9998-12-31'^^xsd:date
+ }
+}
diff --git a/tests/libtracker-data/functions/functions-builtin-if-1.out b/tests/libtracker-data/functions/functions-builtin-if-1.out
new file mode 100644
index 000000000..17809c402
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-if-1.out
@@ -0,0 +1 @@
+"istrue" "isfalse"
diff --git a/tests/libtracker-data/functions/functions-builtin-if-1.rq b/tests/libtracker-data/functions/functions-builtin-if-1.rq
new file mode 100644
index 000000000..fc87e24a7
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-if-1.rq
@@ -0,0 +1 @@
+SELECT (IF (true, 'istrue', 'isfalse') AS ?b) (IF (false, 'istrue', 'isfalse') AS ?b) {} \ No newline at end of file
diff --git a/tests/libtracker-data/functions/functions-builtin-minutes-1.out b/tests/libtracker-data/functions/functions-builtin-minutes-1.out
new file mode 100644
index 000000000..a7e4a23f4
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-minutes-1.out
@@ -0,0 +1,5 @@
+"23"
+"0"
+"0"
+"0"
+"0"
diff --git a/tests/libtracker-data/functions/functions-builtin-minutes-1.rq b/tests/libtracker-data/functions/functions-builtin-minutes-1.rq
new file mode 100644
index 000000000..32a0c306b
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-minutes-1.rq
@@ -0,0 +1,9 @@
+SELECT MINUTES(?d) {
+ VALUES ?d {
+ '2022-03-10T12:23:34Z'^^xsd:dateTime
+ '2022-01-01T01:00:00-0600'^^xsd:dateTime
+ '2022-12-31T23:00:00+0600'^^xsd:dateTime
+ '0001-01-02'^^xsd:date
+ '9998-12-31'^^xsd:date
+ }
+}
diff --git a/tests/libtracker-data/functions/functions-builtin-month-1.out b/tests/libtracker-data/functions/functions-builtin-month-1.out
new file mode 100644
index 000000000..a9942add6
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-month-1.out
@@ -0,0 +1,5 @@
+"03"
+"01"
+"12"
+"01"
+"12"
diff --git a/tests/libtracker-data/functions/functions-builtin-month-1.rq b/tests/libtracker-data/functions/functions-builtin-month-1.rq
new file mode 100644
index 000000000..70b8aef63
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-month-1.rq
@@ -0,0 +1,9 @@
+SELECT MONTH(?d) {
+ VALUES ?d {
+ '2022-03-10T12:23:34Z'^^xsd:dateTime
+ '2022-01-01T01:00:00-0600'^^xsd:dateTime
+ '2022-12-31T23:00:00+0600'^^xsd:dateTime
+ '0001-01-02'^^xsd:date
+ '9998-12-31'^^xsd:date
+ }
+}
diff --git a/tests/libtracker-data/functions/functions-builtin-now-1.out b/tests/libtracker-data/functions/functions-builtin-now-1.out
new file mode 100644
index 000000000..3bf44eff7
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-now-1.out
@@ -0,0 +1 @@
+"yay"
diff --git a/tests/libtracker-data/functions/functions-builtin-now-1.rq b/tests/libtracker-data/functions/functions-builtin-now-1.rq
new file mode 100644
index 000000000..7a7865210
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-now-1.rq
@@ -0,0 +1 @@
+SELECT IF(YEAR(NOW()) >= 2022, "yay", "fix your clock") {}
diff --git a/tests/libtracker-data/functions/functions-builtin-rand-1.out b/tests/libtracker-data/functions/functions-builtin-rand-1.out
new file mode 100644
index 000000000..826861551
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-rand-1.out
@@ -0,0 +1 @@
+"true"
diff --git a/tests/libtracker-data/functions/functions-builtin-rand-1.rq b/tests/libtracker-data/functions/functions-builtin-rand-1.rq
new file mode 100644
index 000000000..f4b92dd86
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-rand-1.rq
@@ -0,0 +1,7 @@
+ASK {
+ BIND (RAND() AS ?r) .
+ # Not much we can check around a random
+ # number, so check it stays within the
+ # expected limits.
+ FILTER (?r >= 0 && ?r <= 1) .
+}
diff --git a/tests/libtracker-data/functions/functions-builtin-replace-1.out b/tests/libtracker-data/functions/functions-builtin-replace-1.out
new file mode 100644
index 000000000..6b948ef08
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-replace-1.out
@@ -0,0 +1 @@
+"adc" "abc" "z" "zbc"
diff --git a/tests/libtracker-data/functions/functions-builtin-replace-1.rq b/tests/libtracker-data/functions/functions-builtin-replace-1.rq
new file mode 100644
index 000000000..b0d4932d7
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-replace-1.rq
@@ -0,0 +1 @@
+SELECT (REPLACE('abc', 'b', 'd') AS ?a) (REPLACE('abc', 'd', 'z') AS ?b) (REPLACE('abc', 'abc' , 'z') AS ?c) (REPLACE ('abc', 'a', 'z') AS ?d) {}
diff --git a/tests/libtracker-data/functions/functions-builtin-replace-2.out b/tests/libtracker-data/functions/functions-builtin-replace-2.out
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-replace-2.out
diff --git a/tests/libtracker-data/functions/functions-builtin-replace-2.rq b/tests/libtracker-data/functions/functions-builtin-replace-2.rq
new file mode 100644
index 000000000..5e1758804
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-replace-2.rq
@@ -0,0 +1,2 @@
+# Expected to fail, empty regular expression
+SELECT (REPLACE('abc', '', 'd') AS ?a) {}
diff --git a/tests/libtracker-data/functions/functions-builtin-replace-3.out b/tests/libtracker-data/functions/functions-builtin-replace-3.out
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-replace-3.out
diff --git a/tests/libtracker-data/functions/functions-builtin-replace-3.rq b/tests/libtracker-data/functions/functions-builtin-replace-3.rq
new file mode 100644
index 000000000..1664b44f7
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-replace-3.rq
@@ -0,0 +1,2 @@
+# Expected to fail, regular expression matches empty string
+SELECT (REPLACE('abc', '.*', 'd') AS ?a) {}
diff --git a/tests/libtracker-data/functions/functions-builtin-replace-4.out b/tests/libtracker-data/functions/functions-builtin-replace-4.out
new file mode 100644
index 000000000..6b948ef08
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-replace-4.out
@@ -0,0 +1 @@
+"adc" "abc" "z" "zbc"
diff --git a/tests/libtracker-data/functions/functions-builtin-replace-4.rq b/tests/libtracker-data/functions/functions-builtin-replace-4.rq
new file mode 100644
index 000000000..064366947
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-replace-4.rq
@@ -0,0 +1 @@
+SELECT (REPLACE('abc', 'B', 'd', 'i') AS ?a) (REPLACE('abc', 'D', 'z', 'i') AS ?b) (REPLACE('abc', 'ABC' , 'z', 'i') AS ?c) (REPLACE ('abc', 'A', 'z', 'smix') AS ?d) {}
diff --git a/tests/libtracker-data/functions/functions-builtin-replace-5.out b/tests/libtracker-data/functions/functions-builtin-replace-5.out
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-replace-5.out
diff --git a/tests/libtracker-data/functions/functions-builtin-replace-5.rq b/tests/libtracker-data/functions/functions-builtin-replace-5.rq
new file mode 100644
index 000000000..112eaf47c
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-replace-5.rq
@@ -0,0 +1 @@
+SELECT (REPLACE ('abc', 'A', 'z', 'this is not a regex flag') AS ?d) {}
diff --git a/tests/libtracker-data/functions/functions-builtin-round-1.out b/tests/libtracker-data/functions/functions-builtin-round-1.out
new file mode 100644
index 000000000..a8bb9c200
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-round-1.out
@@ -0,0 +1 @@
+"4.0" "5.0" "5.0" "5.0"
diff --git a/tests/libtracker-data/functions/functions-builtin-round-1.rq b/tests/libtracker-data/functions/functions-builtin-round-1.rq
new file mode 100644
index 000000000..bad8e5fa8
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-round-1.rq
@@ -0,0 +1 @@
+SELECT (ROUND(4.0) AS ?a) (ROUND(4.5) AS ?b) (ROUND(4.999999999) AS ?c) (ROUND(5.000000001) AS ?d) {}
diff --git a/tests/libtracker-data/functions/functions-builtin-sameterm-1.out b/tests/libtracker-data/functions/functions-builtin-sameterm-1.out
new file mode 100644
index 000000000..0e3924af7
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-sameterm-1.out
@@ -0,0 +1 @@
+"false" "true" "true"
diff --git a/tests/libtracker-data/functions/functions-builtin-sameterm-1.rq b/tests/libtracker-data/functions/functions-builtin-sameterm-1.rq
new file mode 100644
index 000000000..ba32bef8a
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-sameterm-1.rq
@@ -0,0 +1 @@
+SELECT (SAMETERM (xsd:integer, xsd:boolean) AS ?a) (SAMETERM (xsd:boolean, xsd:boolean) AS ?b) (SAMETERM (<http://www.w3.org/2001/XMLSchema#boolean>, xsd:boolean) AS ?b) {} \ No newline at end of file
diff --git a/tests/libtracker-data/functions/functions-builtin-seconds-1.out b/tests/libtracker-data/functions/functions-builtin-seconds-1.out
new file mode 100644
index 000000000..3f5f63f4d
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-seconds-1.out
@@ -0,0 +1,5 @@
+"34"
+"0"
+"0"
+"0"
+"0"
diff --git a/tests/libtracker-data/functions/functions-builtin-seconds-1.rq b/tests/libtracker-data/functions/functions-builtin-seconds-1.rq
new file mode 100644
index 000000000..53a714ef0
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-seconds-1.rq
@@ -0,0 +1,9 @@
+SELECT SECONDS(?d) {
+ VALUES ?d {
+ '2022-03-10T12:23:34Z'^^xsd:dateTime
+ '2022-01-01T01:00:00-0600'^^xsd:dateTime
+ '2022-12-31T23:00:00+0600'^^xsd:dateTime
+ '0001-01-02'^^xsd:date
+ '9998-12-31'^^xsd:date
+ }
+}
diff --git a/tests/libtracker-data/functions/functions-builtin-strdt-1.out b/tests/libtracker-data/functions/functions-builtin-strdt-1.out
new file mode 100644
index 000000000..3dbc1dd05
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-strdt-1.out
@@ -0,0 +1 @@
+"2" "2.2" "true" "false" "333" "2022-03-10"
diff --git a/tests/libtracker-data/functions/functions-builtin-strdt-1.rq b/tests/libtracker-data/functions/functions-builtin-strdt-1.rq
new file mode 100644
index 000000000..f57899b49
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-strdt-1.rq
@@ -0,0 +1 @@
+select strdt("2.2", xsd:integer) strdt("2.2", xsd:double) strdt(1, xsd:boolean) strdt(0, xsd:boolean) strdt(333, xsd:string) strdt("2022-03-10T01:01:01Z", xsd:date) {} \ No newline at end of file
diff --git a/tests/libtracker-data/functions/functions-builtin-strlen-1.out b/tests/libtracker-data/functions/functions-builtin-strlen-1.out
new file mode 100644
index 000000000..6ebd24b35
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-strlen-1.out
@@ -0,0 +1 @@
+"3" "0"
diff --git a/tests/libtracker-data/functions/functions-builtin-strlen-1.rq b/tests/libtracker-data/functions/functions-builtin-strlen-1.rq
new file mode 100644
index 000000000..24bd0f69d
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-strlen-1.rq
@@ -0,0 +1 @@
+SELECT (STRLEN ('abc') AS ?a) (STRLEN ('') AS ?b) {} \ No newline at end of file
diff --git a/tests/libtracker-data/functions/functions-builtin-substr-1.out b/tests/libtracker-data/functions/functions-builtin-substr-1.out
new file mode 100644
index 000000000..61138dedb
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-substr-1.out
@@ -0,0 +1 @@
+"bc" "b" "" ""
diff --git a/tests/libtracker-data/functions/functions-builtin-substr-1.rq b/tests/libtracker-data/functions/functions-builtin-substr-1.rq
new file mode 100644
index 000000000..ebc0dd407
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-substr-1.rq
@@ -0,0 +1 @@
+SELECT SUBSTR('abc', 2) SUBSTR('abc', 2, 1) SUBSTR('abc', 2, 0) SUBSTR ('abc', 4, 1) {}
diff --git a/tests/libtracker-data/functions/functions-builtin-uri-1.out b/tests/libtracker-data/functions/functions-builtin-uri-1.out
new file mode 100644
index 000000000..cfbe41932
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-uri-1.out
@@ -0,0 +1 @@
+"http://www.w3.org/2001/XMLSchema#integer" "http://www.w3.org/2001/XMLSchema%23integer" "http://www.w3.org/2001/XMLSchema%23integer"
diff --git a/tests/libtracker-data/functions/functions-builtin-uri-1.rq b/tests/libtracker-data/functions/functions-builtin-uri-1.rq
new file mode 100644
index 000000000..1e6474fb8
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-uri-1.rq
@@ -0,0 +1 @@
+select xsd:integer uri(xsd:integer) iri(xsd:integer) {}
diff --git a/tests/libtracker-data/functions/functions-builtin-uuid-1.out b/tests/libtracker-data/functions/functions-builtin-uuid-1.out
new file mode 100644
index 000000000..826861551
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-uuid-1.out
@@ -0,0 +1 @@
+"true"
diff --git a/tests/libtracker-data/functions/functions-builtin-uuid-1.rq b/tests/libtracker-data/functions/functions-builtin-uuid-1.rq
new file mode 100644
index 000000000..9e6bdac05
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-uuid-1.rq
@@ -0,0 +1,11 @@
+ASK
+{
+ BIND (UUID () AS ?a) .
+ BIND (UUID () AS ?b) .
+ # Check prefix
+ FILTER (SUBSTR(STR(?a), 0, 10) = 'urn:uuid:') .
+ FILTER (SUBSTR(STR(?a), 0, 10) = SUBSTR(STR(?b), 0, 10)) .
+ # Check UUIDv4 version char, this is always 4
+ FILTER (SUBSTR(STR(?a), 24, 1) = '4') .
+ FILTER (SUBSTR(STR(?a), 24, 1) = SUBSTR(STR(?b), 24, 1)) .
+}
diff --git a/tests/libtracker-data/functions/functions-builtin-year-1.out b/tests/libtracker-data/functions/functions-builtin-year-1.out
new file mode 100644
index 000000000..44a853e3c
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-year-1.out
@@ -0,0 +1,5 @@
+"2022"
+"2022"
+"2022"
+"0001"
+"9998"
diff --git a/tests/libtracker-data/functions/functions-builtin-year-1.rq b/tests/libtracker-data/functions/functions-builtin-year-1.rq
new file mode 100644
index 000000000..a4092ad88
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-builtin-year-1.rq
@@ -0,0 +1,9 @@
+SELECT YEAR(?d) {
+ VALUES ?d {
+ '2022-03-10T12:23:34Z'^^xsd:dateTime
+ '2022-01-01T01:00:00-0600'^^xsd:dateTime
+ '2022-12-31T23:00:00+0600'^^xsd:dateTime
+ '0001-01-02'^^xsd:date
+ '9998-12-31'^^xsd:date
+ }
+}
diff --git a/tests/libtracker-data/functions/functions-cast-1.out b/tests/libtracker-data/functions/functions-cast-1.out
new file mode 100644
index 000000000..df71001e4
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-cast-1.out
@@ -0,0 +1 @@
+"2.34" "2.34" "2" "2.34"
diff --git a/tests/libtracker-data/functions/functions-cast-1.rq b/tests/libtracker-data/functions/functions-cast-1.rq
new file mode 100644
index 000000000..7c540fdc7
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-cast-1.rq
@@ -0,0 +1 @@
+SELECT xsd:string(2.34) rdf:langString(2.34) xsd:integer("2") xsd:double("2.34"@en) {}
diff --git a/tests/libtracker-data/functions/functions-cast-2.out b/tests/libtracker-data/functions/functions-cast-2.out
new file mode 100644
index 000000000..3e5e98562
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-cast-2.out
@@ -0,0 +1 @@
+"1.0e3" "1000.0"
diff --git a/tests/libtracker-data/functions/functions-cast-2.rq b/tests/libtracker-data/functions/functions-cast-2.rq
new file mode 100644
index 000000000..fea7b55d6
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-cast-2.rq
@@ -0,0 +1 @@
+SELECT xsd:string(1.0e3) xsd:double("1.0e3") {}
diff --git a/tests/libtracker-data/functions/functions-datatypes-5.out b/tests/libtracker-data/functions/functions-datatypes-5.out
new file mode 100644
index 000000000..ff420a114
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-datatypes-5.out
@@ -0,0 +1 @@
+"http://www.w3.org/2001/XMLSchema#string" "http://www.w3.org/2001/XMLSchema#double" "http://www.w3.org/2001/XMLSchema#integer" "http://www.w3.org/2001/XMLSchema#integer"
diff --git a/tests/libtracker-data/functions/functions-datatypes-5.rq b/tests/libtracker-data/functions/functions-datatypes-5.rq
new file mode 100644
index 000000000..572b435a3
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-datatypes-5.rq
@@ -0,0 +1,3 @@
+PREFIX : <http://example/>
+
+SELECT DATATYPE("23"^^xsd:string) DATATYPE("23"^^xsd:double) DATATYPE("23"^^xsd:integer) DATATYPE (2 + 2) { }
diff --git a/tests/libtracker-data/functions/functions-xpath-15.out b/tests/libtracker-data/functions/functions-xpath-15.out
new file mode 100644
index 000000000..695aebf78
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-xpath-15.out
@@ -0,0 +1 @@
+"Don't change the h of hallo, it's a special one" "ḤELLO"
diff --git a/tests/libtracker-data/functions/functions-xpath-15.rq b/tests/libtracker-data/functions/functions-xpath-15.rq
new file mode 100644
index 000000000..54a3ba60e
--- /dev/null
+++ b/tests/libtracker-data/functions/functions-xpath-15.rq
@@ -0,0 +1 @@
+SELECT "Don't change the h of hallo, it's a special one" fn:upper-case ("\u1E25ello") {}
diff --git a/tests/libtracker-data/property-paths/alternative-path-3.out b/tests/libtracker-data/property-paths/alternative-path-3.out
new file mode 100644
index 000000000..82644df37
--- /dev/null
+++ b/tests/libtracker-data/property-paths/alternative-path-3.out
@@ -0,0 +1,20 @@
+"Alice" "Alice"
+"Alice" "http://www.w3.org/2000/01/rdf-schema#Resource"
+"Alice" "http://xmlns.com/foaf/0.1/Agent"
+"Alice" "http://xmlns.com/foaf/0.1/Person"
+"Alice" "mailto:alice@work"
+"Bob" "Bob"
+"Bob" "http://www.w3.org/2000/01/rdf-schema#Resource"
+"Bob" "http://xmlns.com/foaf/0.1/Agent"
+"Bob" "http://xmlns.com/foaf/0.1/Person"
+"Bob" "mailto:bob@home"
+"Bob" "mailto:bob@work"
+"Eve" "Eve"
+"Eve" "http://www.w3.org/2000/01/rdf-schema#Resource"
+"Eve" "http://xmlns.com/foaf/0.1/Agent"
+"Eve" "http://xmlns.com/foaf/0.1/Person"
+"Fred" "Fred"
+"Fred" "http://www.w3.org/2000/01/rdf-schema#Resource"
+"Fred" "http://xmlns.com/foaf/0.1/Agent"
+"Fred" "http://xmlns.com/foaf/0.1/Person"
+"Fred" "mailto:fred@edu"
diff --git a/tests/libtracker-data/property-paths/alternative-path-3.rq b/tests/libtracker-data/property-paths/alternative-path-3.rq
new file mode 100644
index 000000000..909619a28
--- /dev/null
+++ b/tests/libtracker-data/property-paths/alternative-path-3.rq
@@ -0,0 +1 @@
+select foaf:name(?u) ?a { ?u a foaf:Person . ?u rdf:type|foaf:mbox|foaf:name ?a } order by foaf:name(?u) STR(?a)
diff --git a/tests/libtracker-data/tracker-sparql-test.c b/tests/libtracker-data/tracker-sparql-test.c
index 77752bcaf..8dddd6a74 100644
--- a/tests/libtracker-data/tracker-sparql-test.c
+++ b/tests/libtracker-data/tracker-sparql-test.c
@@ -42,10 +42,17 @@ struct _TestInfo {
const TestInfo tests[] = {
{ "aggregates/aggregate-1", "aggregates/data-1", FALSE },
+ { "aggregates/aggregate-count-1", "aggregates/data-1", FALSE },
+ { "aggregates/aggregate-count-2", "aggregates/data-1", FALSE },
+ { "aggregates/aggregate-count-3", "aggregates/data-1", FALSE },
{ "aggregates/aggregate-distinct-1", "aggregates/data-1", FALSE },
{ "aggregates/aggregate-group-1", "aggregates/data-1", FALSE },
{ "aggregates/aggregate-group-2", "aggregates/data-1", FALSE },
+ { "aggregates/aggregate-group-3", "aggregates/data-1", FALSE },
{ "aggregates/aggregate-group-as-1", "aggregates/data-1", FALSE },
+ { "aggregates/aggregate-group-having-1", "aggregates/data-1", FALSE },
+ { "aggregates/aggregate-sample-1", "aggregates/data-1", FALSE },
+ { "aggregates/aggregate-sample-2", "aggregates/data-1", FALSE },
{ "algebra/two-nested-opt", "algebra/two-nested-opt", FALSE },
{ "algebra/two-nested-opt-alt", "algebra/two-nested-opt", FALSE },
{ "algebra/opt-filter-3", "algebra/opt-filter-3", FALSE },
@@ -122,6 +129,8 @@ const TestInfo tests[] = {
{ "expr-ops/query-unminus-1", "expr-ops/data", FALSE },
{ "expr-ops/query-unplus-1", "expr-ops/data", FALSE },
{ "expr-ops/query-res-1", "expr-ops/data", FALSE },
+ { "functions/functions-cast-1", "functions/data-1", FALSE },
+ { "functions/functions-cast-2", "functions/data-1", FALSE },
{ "functions/functions-property-1", "functions/data-1", FALSE },
{ "functions/functions-property-2", "functions/data-5", FALSE },
{ "functions/functions-tracker-1", "functions/data-1", FALSE },
@@ -148,18 +157,46 @@ const TestInfo tests[] = {
{ "functions/functions-xpath-12", "functions/data-4", FALSE },
{ "functions/functions-xpath-13", "functions/data-4", FALSE },
{ "functions/functions-xpath-14", "functions/data-4", FALSE },
+ { "functions/functions-xpath-15", "functions/data-1", FALSE },
{ "functions/functions-coalesce-1", "functions/data-1", FALSE },
{ "functions/functions-datatypes-1", "functions/data-1", FALSE },
{ "functions/functions-datatypes-2", "functions/data-2", FALSE },
{ "functions/functions-datatypes-3", "functions/data-3", FALSE },
{ "functions/functions-datatypes-4", "functions/data-4", FALSE },
+ { "functions/functions-datatypes-5", "functions/data-1", FALSE },
+ { "functions/functions-builtin-bnode-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-bnode-2", "functions/data-1", FALSE },
+ { "functions/functions-builtin-uuid-1", "functions/data-1", FALSE },
{ "functions/functions-builtin-hash-1", "functions/data-1", FALSE },
{ "functions/functions-builtin-ucase-1", "functions/data-1", FALSE },
{ "functions/functions-builtin-lcase-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-strlen-1", "functions/data-1", FALSE },
{ "functions/functions-builtin-strbefore-1", "functions/data-1", FALSE },
{ "functions/functions-builtin-strafter-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-substr-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-replace-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-replace-2", "functions/data-1", TRUE },
+ { "functions/functions-builtin-replace-3", "functions/data-1", TRUE },
+ { "functions/functions-builtin-replace-4", "functions/data-1", FALSE },
+ { "functions/functions-builtin-replace-5", "functions/data-1", TRUE },
+ { "functions/functions-builtin-contains-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-abs-1", "functions/data-1", FALSE },
{ "functions/functions-builtin-ceil-1", "functions/data-1", FALSE },
{ "functions/functions-builtin-floor-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-round-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-uri-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-year-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-month-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-day-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-hours-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-minutes-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-seconds-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-now-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-encode-for-uri-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-strdt-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-sameterm-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-if-1", "functions/data-1", FALSE },
+ { "functions/functions-builtin-rand-1", "functions/data-1", FALSE },
/* Graph semantics and operations */
{ "graph/graph-1", "graph/data-1", FALSE },
{ "graph/graph-2", "graph/data-2", FALSE },
@@ -274,6 +311,7 @@ const TestInfo tests[] = {
{ "property-paths/recursive-path-3", "property-paths/data", FALSE },
{ "property-paths/alternative-path-1", "property-paths/data", FALSE },
{ "property-paths/alternative-path-2", "property-paths/data", FALSE },
+ { "property-paths/alternative-path-3", "property-paths/data", FALSE },
{ "property-paths/mixed-inverse-and-sequence-1", "property-paths/data", FALSE },
{ "property-paths/mixed-inverse-and-sequence-2", "property-paths/data", FALSE },
{ "property-paths/mixed-inverse-and-sequence-3", "property-paths/data", FALSE },
@@ -348,9 +386,7 @@ check_result (TrackerDBCursor *cursor,
gchar *results;
GError *nerror = NULL;
- if (test_info->expect_query_error) {
- g_assert_true (error != NULL);
- } else {
+ if (!test_info->expect_query_error) {
g_assert_no_error (error);
}
@@ -400,8 +436,10 @@ check_result (TrackerDBCursor *cursor,
g_string_append (test_results, "\n");
}
}
- } else if (test_info->expect_query_error) {
- g_assert_true (error != NULL && error->domain == TRACKER_SPARQL_ERROR);
+ }
+
+ if (test_info->expect_query_error) {
+ g_assert_true (error != NULL);
g_string_free (test_results, TRUE);
g_free (results);
return;
diff --git a/tests/libtracker-fts/data.ontology b/tests/libtracker-fts/data.ontology
index 8ce8b6627..84bf4fcf4 100644
--- a/tests/libtracker-fts/data.ontology
+++ b/tests/libtracker-fts/data.ontology
@@ -21,6 +21,7 @@ test:p a rdf:Property ;
nrl:maxCardinality 1 ;
rdfs:domain test:A ;
rdfs:range xsd:string ;
+ nrl:weight 20 ;
nrl:fulltextIndexed true .
test:o a rdf:Property ;
@@ -28,3 +29,9 @@ test:o a rdf:Property ;
rdfs:domain test:A ;
rdfs:range xsd:string ;
nrl:fulltextIndexed true .
+
+test:q a rdf:Property ;
+ rdfs:domain test:A ;
+ rdfs:range xsd:string ;
+ nrl:weight 2 ;
+ nrl:fulltextIndexed true .
diff --git a/tests/libtracker-fts/functions/offsets-1.out b/tests/libtracker-fts/functions/offsets-1.out
new file mode 100644
index 000000000..42b059e27
--- /dev/null
+++ b/tests/libtracker-fts/functions/offsets-1.out
@@ -0,0 +1,4 @@
+"http://www.example.org/test#1" "test:p,0"
+"http://www.example.org/test#2" "test:p,0,test:p,8"
+"http://www.example.org/test#4" "test:o,0,test:p,0"
+"http://www.example.org/test#3" "test:o,0"
diff --git a/tests/libtracker-fts/functions/offsets-1.rq b/tests/libtracker-fts/functions/offsets-1.rq
new file mode 100644
index 000000000..b18570d11
--- /dev/null
+++ b/tests/libtracker-fts/functions/offsets-1.rq
@@ -0,0 +1 @@
+SELECT ?u fts:offsets(?u) { ?u fts:match 'bananas' } order by desc fts:rank(?u)
diff --git a/tests/libtracker-fts/functions/offsets-2.out b/tests/libtracker-fts/functions/offsets-2.out
new file mode 100644
index 000000000..32b77c47a
--- /dev/null
+++ b/tests/libtracker-fts/functions/offsets-2.out
@@ -0,0 +1,2 @@
+"http://www.example.org/test#5" "test:p,0"
+"http://www.example.org/test#6" "test:q,11"
diff --git a/tests/libtracker-fts/functions/offsets-2.rq b/tests/libtracker-fts/functions/offsets-2.rq
new file mode 100644
index 000000000..f273db100
--- /dev/null
+++ b/tests/libtracker-fts/functions/offsets-2.rq
@@ -0,0 +1 @@
+SELECT ?u fts:offsets(?u) { ?u fts:match 'oranges' } order by desc fts:rank(?u)
diff --git a/tests/libtracker-fts/functions/offsets-3.out b/tests/libtracker-fts/functions/offsets-3.out
new file mode 100644
index 000000000..5954669de
--- /dev/null
+++ b/tests/libtracker-fts/functions/offsets-3.out
@@ -0,0 +1,3 @@
+"http://www.example.org/test#1" "test:p,8,test:p,15"
+"http://www.example.org/test#2" "test:p,16"
+"http://www.example.org/test#4" "test:o,8"
diff --git a/tests/libtracker-fts/functions/offsets-3.rq b/tests/libtracker-fts/functions/offsets-3.rq
new file mode 100644
index 000000000..f726e325f
--- /dev/null
+++ b/tests/libtracker-fts/functions/offsets-3.rq
@@ -0,0 +1 @@
+SELECT ?u fts:offsets(?u) { ?u fts:match 'lemons' } order by desc fts:rank(?u)
diff --git a/tests/libtracker-fts/functions/offsets-data.rq b/tests/libtracker-fts/functions/offsets-data.rq
new file mode 100644
index 000000000..8a1327d75
--- /dev/null
+++ b/tests/libtracker-fts/functions/offsets-data.rq
@@ -0,0 +1,9 @@
+INSERT {
+ test:1 a test:A ; test:p "bananas lemons lemons" .
+ test:2 a test:A ; test:p "bananas bananas lemons" .
+ test:3 a test:A ; test:o "bananas" .
+ test:4 a test:A ; test:p "bananas" ; test:o "bananas lemons" .
+
+ test:5 a test:A ; test:p "oranges!" .
+ test:6 a test:A ; test:q "apples and oranges in a multivalued property" .
+}
diff --git a/tests/libtracker-fts/functions/rank-1.out b/tests/libtracker-fts/functions/rank-1.out
new file mode 100644
index 000000000..4d04bba3c
--- /dev/null
+++ b/tests/libtracker-fts/functions/rank-1.out
@@ -0,0 +1,4 @@
+"http://www.example.org/test#1" "20.0"
+"http://www.example.org/test#2" "20.0"
+"http://www.example.org/test#4" "20.0"
+"http://www.example.org/test#3" "0.0"
diff --git a/tests/libtracker-fts/functions/rank-1.rq b/tests/libtracker-fts/functions/rank-1.rq
new file mode 100644
index 000000000..54acbe62d
--- /dev/null
+++ b/tests/libtracker-fts/functions/rank-1.rq
@@ -0,0 +1 @@
+SELECT ?u fts:rank(?u) { ?u fts:match 'bananas' } order by desc fts:rank(?u)
diff --git a/tests/libtracker-fts/functions/rank-2.out b/tests/libtracker-fts/functions/rank-2.out
new file mode 100644
index 000000000..237f1616f
--- /dev/null
+++ b/tests/libtracker-fts/functions/rank-2.out
@@ -0,0 +1,2 @@
+"http://www.example.org/test#5" "20.0"
+"http://www.example.org/test#6" "2.0"
diff --git a/tests/libtracker-fts/functions/rank-2.rq b/tests/libtracker-fts/functions/rank-2.rq
new file mode 100644
index 000000000..8438b74ce
--- /dev/null
+++ b/tests/libtracker-fts/functions/rank-2.rq
@@ -0,0 +1 @@
+SELECT ?u fts:rank(?u) { ?u fts:match 'oranges' } order by desc fts:rank(?u)
diff --git a/tests/libtracker-fts/functions/rank-data.rq b/tests/libtracker-fts/functions/rank-data.rq
new file mode 100644
index 000000000..2a8ffb1c0
--- /dev/null
+++ b/tests/libtracker-fts/functions/rank-data.rq
@@ -0,0 +1,9 @@
+INSERT {
+ test:1 a test:A ; test:p "bananas lemons lemons" .
+ test:2 a test:A ; test:p "bananas bananas lemons" .
+ test:3 a test:A ; test:o "bananas" .
+ test:4 a test:A ; test:p "bananas" ; test:o "bananas lemons" .
+
+ test:5 a test:A ; test:p "oranges!" .
+ test:6 a test:A ; test:q "oranges", "oranges and oranges" .
+}
diff --git a/tests/libtracker-fts/functions/snippet-1.out b/tests/libtracker-fts/functions/snippet-1.out
new file mode 100644
index 000000000..db1fae0c2
--- /dev/null
+++ b/tests/libtracker-fts/functions/snippet-1.out
@@ -0,0 +1,4 @@
+"http://www.example.org/test#1" "bananas lemons lemons"
+"http://www.example.org/test#2" "bananas bananas lemons"
+"http://www.example.org/test#4" "bananas lemons"
+"http://www.example.org/test#3" "bananas"
diff --git a/tests/libtracker-fts/functions/snippet-1.rq b/tests/libtracker-fts/functions/snippet-1.rq
new file mode 100644
index 000000000..37cedaf0f
--- /dev/null
+++ b/tests/libtracker-fts/functions/snippet-1.rq
@@ -0,0 +1 @@
+SELECT ?u fts:snippet(?u) { ?u fts:match 'bananas' } order by desc fts:rank(?u)
diff --git a/tests/libtracker-fts/functions/snippet-2.out b/tests/libtracker-fts/functions/snippet-2.out
new file mode 100644
index 000000000..8cdc6f4b8
--- /dev/null
+++ b/tests/libtracker-fts/functions/snippet-2.out
@@ -0,0 +1,4 @@
+"http://www.example.org/test#1" ">>>bananas<<< lemons lemons"
+"http://www.example.org/test#2" ">>>bananas<<< >>>bananas<<< lemons"
+"http://www.example.org/test#4" ">>>bananas<<< lemons"
+"http://www.example.org/test#3" ">>>bananas<<<"
diff --git a/tests/libtracker-fts/functions/snippet-2.rq b/tests/libtracker-fts/functions/snippet-2.rq
new file mode 100644
index 000000000..59cd8c306
--- /dev/null
+++ b/tests/libtracker-fts/functions/snippet-2.rq
@@ -0,0 +1 @@
+SELECT ?u fts:snippet(?u, '>>>', '<<<') { ?u fts:match 'bananas' } order by desc fts:rank(?u)
diff --git a/tests/libtracker-fts/functions/snippet-3.out b/tests/libtracker-fts/functions/snippet-3.out
new file mode 100644
index 000000000..9c869b89a
--- /dev/null
+++ b/tests/libtracker-fts/functions/snippet-3.out
@@ -0,0 +1,4 @@
+"http://www.example.org/test#1" ">>>bananas<<<..."
+"http://www.example.org/test#2" ">>>bananas<<< >>>bananas<<<..."
+"http://www.example.org/test#4" ">>>bananas<<<..."
+"http://www.example.org/test#3" ">>>bananas<<<"
diff --git a/tests/libtracker-fts/functions/snippet-3.rq b/tests/libtracker-fts/functions/snippet-3.rq
new file mode 100644
index 000000000..bb235264f
--- /dev/null
+++ b/tests/libtracker-fts/functions/snippet-3.rq
@@ -0,0 +1 @@
+SELECT ?u fts:snippet(?u, '>>>', '<<<', '...', 1) { ?u fts:match 'bananas' } order by desc fts:rank(?u)
diff --git a/tests/libtracker-fts/functions/snippet-4.out b/tests/libtracker-fts/functions/snippet-4.out
new file mode 100644
index 000000000..e3650f67a
--- /dev/null
+++ b/tests/libtracker-fts/functions/snippet-4.out
@@ -0,0 +1,4 @@
+"http://www.example.org/test#1"
+"http://www.example.org/test#2" ">>>bananas<<< >>>bananas<<<..."
+"http://www.example.org/test#4" ">>>bananas<<<..."
+"http://www.example.org/test#3" ">>>bananas<<<..."
diff --git a/tests/libtracker-fts/functions/snippet-4.rq b/tests/libtracker-fts/functions/snippet-4.rq
new file mode 100644
index 000000000..1b542b57c
--- /dev/null
+++ b/tests/libtracker-fts/functions/snippet-4.rq
@@ -0,0 +1 @@
+SELECT ?u fts:snippet(?u, '>>>', '<<<', '...', 0) { ?u fts:match 'bananas' } order by desc fts:rank(?u)
diff --git a/tests/libtracker-fts/functions/snippet-5.out b/tests/libtracker-fts/functions/snippet-5.out
new file mode 100644
index 000000000..b7e42e2f1
--- /dev/null
+++ b/tests/libtracker-fts/functions/snippet-5.out
@@ -0,0 +1,4 @@
+"http://www.example.org/test#1"
+"http://www.example.org/test#2"
+"http://www.example.org/test#4"
+"http://www.example.org/test#3"
diff --git a/tests/libtracker-fts/functions/snippet-5.rq b/tests/libtracker-fts/functions/snippet-5.rq
new file mode 100644
index 000000000..564f52d01
--- /dev/null
+++ b/tests/libtracker-fts/functions/snippet-5.rq
@@ -0,0 +1 @@
+SELECT ?u fts:snippet(?u, '>>>', '<<<', '...', -1) { ?u fts:match 'bananas' } order by desc fts:rank(?u)
diff --git a/tests/libtracker-fts/functions/snippet-data.rq b/tests/libtracker-fts/functions/snippet-data.rq
new file mode 100644
index 000000000..2a8ffb1c0
--- /dev/null
+++ b/tests/libtracker-fts/functions/snippet-data.rq
@@ -0,0 +1,9 @@
+INSERT {
+ test:1 a test:A ; test:p "bananas lemons lemons" .
+ test:2 a test:A ; test:p "bananas bananas lemons" .
+ test:3 a test:A ; test:o "bananas" .
+ test:4 a test:A ; test:p "bananas" ; test:o "bananas lemons" .
+
+ test:5 a test:A ; test:p "oranges!" .
+ test:6 a test:A ; test:q "oranges", "oranges and oranges" .
+}
diff --git a/tests/libtracker-fts/tracker-fts-test.c b/tests/libtracker-fts/tracker-fts-test.c
index edac25010..c0bca75ef 100644
--- a/tests/libtracker-fts/tracker-fts-test.c
+++ b/tests/libtracker-fts/tracker-fts-test.c
@@ -41,6 +41,9 @@ const TestInfo tests[] = {
{ "prefix/fts3prefix", 3 },
{ "limits/fts3limits", 4 },
{ "input/fts3input", 3 },
+ { "functions/rank", 2 },
+ { "functions/offsets", 3 },
+ { "functions/snippet", 5 },
{ NULL }
};
diff --git a/tests/libtracker-sparql/tracker-sparql-test.c b/tests/libtracker-sparql/tracker-sparql-test.c
index c6e1b0e8d..66a74e1a1 100644
--- a/tests/libtracker-sparql/tracker-sparql-test.c
+++ b/tests/libtracker-sparql/tracker-sparql-test.c
@@ -212,6 +212,86 @@ test_tracker_sparql_cursor_next_async (void)
g_main_loop_run (main_loop);
}
+static void
+test_tracker_sparql_cursor_get_variable_name (void)
+{
+ TrackerSparqlConnection *connection;
+ TrackerSparqlCursor *cursor;
+ GError *error = NULL;
+
+ connection = create_local_connection (&error);
+ g_assert_no_error (error);
+ g_assert_true (connection != NULL);
+
+ cursor = tracker_sparql_connection_query (connection,
+ "SELECT ?urn ?added ?label ?unbound { "
+ " ?urn nrl:added ?added ; "
+ " rdfs:label ?label . "
+ "} LIMIT 1",
+ NULL, &error);
+ g_assert_no_error (error);
+ g_assert_true (cursor != NULL);
+
+ tracker_sparql_cursor_next (cursor, NULL, &error);
+ g_assert_no_error (error);
+
+ g_assert_cmpstr (tracker_sparql_cursor_get_variable_name (cursor, 0),
+ ==,
+ "urn");
+ g_assert_cmpstr (tracker_sparql_cursor_get_variable_name (cursor, 1),
+ ==,
+ "added");
+ g_assert_cmpstr (tracker_sparql_cursor_get_variable_name (cursor, 2),
+ ==,
+ "label");
+ g_assert_cmpstr (tracker_sparql_cursor_get_variable_name (cursor, 3),
+ ==,
+ "unbound");
+
+ tracker_sparql_cursor_close (cursor);
+ tracker_sparql_connection_close (connection);
+}
+
+static void
+test_tracker_sparql_cursor_get_value_type (void)
+{
+ TrackerSparqlConnection *connection;
+ TrackerSparqlCursor *cursor;
+ GError *error = NULL;
+
+ connection = create_local_connection (&error);
+ g_assert_no_error (error);
+ g_assert_true (connection != NULL);
+
+ cursor = tracker_sparql_connection_query (connection,
+ "SELECT ?urn ?added ?label ?unbound { "
+ " ?urn nrl:added ?added ; "
+ " rdfs:label ?label . "
+ "} LIMIT 1",
+ NULL, &error);
+ g_assert_no_error (error);
+ g_assert_true (cursor != NULL);
+
+ tracker_sparql_cursor_next (cursor, NULL, &error);
+ g_assert_no_error (error);
+
+ g_assert_cmpint (tracker_sparql_cursor_get_value_type (cursor, 0),
+ ==,
+ TRACKER_SPARQL_VALUE_TYPE_URI);
+ g_assert_cmpint (tracker_sparql_cursor_get_value_type (cursor, 1),
+ ==,
+ TRACKER_SPARQL_VALUE_TYPE_DATETIME);
+ g_assert_cmpint (tracker_sparql_cursor_get_value_type (cursor, 2),
+ ==,
+ TRACKER_SPARQL_VALUE_TYPE_STRING);
+ g_assert_cmpint (tracker_sparql_cursor_get_value_type (cursor, 3),
+ ==,
+ TRACKER_SPARQL_VALUE_TYPE_UNBOUND);
+
+ tracker_sparql_cursor_close (cursor);
+ tracker_sparql_connection_close (connection);
+}
+
/* Test that we return an error if no ontology is passed. */
static void
test_tracker_sparql_connection_no_ontology (void)
@@ -291,6 +371,10 @@ main (gint argc, gchar **argv)
test_tracker_sparql_connection_interleaved);
g_test_add_func ("/libtracker-sparql/tracker-sparql/tracker_sparql_cursor_next_async",
test_tracker_sparql_cursor_next_async);
+ g_test_add_func ("/libtracker-sparql/tracker-sparql/tracker_sparql_cursor_get_variable_name",
+ test_tracker_sparql_cursor_get_variable_name);
+ g_test_add_func ("/libtracker-sparql/tracker-sparql/tracker_sparql_cursor_get_value_type",
+ test_tracker_sparql_cursor_get_value_type);
g_test_add_func ("/libtracker-sparql/tracker-sparql/tracker_check_version",
test_tracker_check_version);