1#!/usr/local/bin/python3.8
2# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
3#
4# This file is part of the LibreOffice project.
5#
6# This Source Code Form is subject to the terms of the Mozilla Public
7# License, v. 2.0. If a copy of the MPL was not distributed with this
8# file, You can obtain one at http://mozilla.org/MPL/2.0/.
9#
10import unittest
11from org.libreoffice.unotest import UnoInProcess
12
13
14class XNamedGraph(unittest.TestCase):
15
16    @classmethod
17    def setUpClass(cls):
18        cls._uno = UnoInProcess()
19        cls._uno.setUp()
20
21    @classmethod
22    def tearDownClass(cls):
23        cls._uno.tearDown()
24
25    def test_getStatements(self):
26        xDMA = self._uno.openTemplateFromTDOC("XNamedGraph.ott")
27        xRepo = xDMA.getRDFRepository()
28        xGraphs = xRepo.getGraphNames()
29
30        all = self.getStatementsCount(xGraphs, xDMA, None, None)
31        self.assertTrue(all > 0)
32
33        # check that we have some node from the second RDF graph
34        # (but not any from the list of LO standard nodes)
35        DATE_URI_STR = "http://www.wollmux.org/WollMuxMetadata#WollMuxVersion"
36        xUri = self.nameToUri(DATE_URI_STR)
37
38        onlyWollMux = self.getStatementsCount(xGraphs, xDMA, xUri, None)
39        self.assertTrue(onlyWollMux > 0)
40        self.assertTrue(onlyWollMux < all)
41
42        xDMA.close(True)
43
44    def test_Statements_AddRemove(self):
45        # take any first graph
46        xDMA = self._uno.openTemplateFromTDOC("XNamedGraph.ott")
47        xGraph = self.getAnyGraph(xDMA)
48
49        DATE_URI_STR = "http://www.example.com/Metadata#Version"
50        OBJECT_STR = "foo"
51
52        # not exist => add => remove
53        self.assertFalse(self.hasStatement(xDMA, xGraph, DATE_URI_STR))
54        self.addStatement(xDMA, xGraph, DATE_URI_STR, OBJECT_STR)
55        self.assertTrue(self.hasStatement(xDMA, xGraph, DATE_URI_STR))
56        self.removeStatement(xDMA, xGraph, DATE_URI_STR, None)
57        self.assertFalse(self.hasStatement(xDMA, xGraph, DATE_URI_STR))
58
59        xDMA.close(True)
60
61    def test_Statements_RemoveByObject(self):
62        # take any first graph
63        xDMA = self._uno.openTemplateFromTDOC("XNamedGraph.ott")
64        xGraph = self.getAnyGraph(xDMA)
65
66        DATE_URI_STR = "http://www.example.com/Metadata#Version"
67        OBJECT_STR = "foo"
68
69        # remove by object
70        self.assertFalse(self.hasStatement(xDMA, xGraph, DATE_URI_STR))
71        self.addStatement(xDMA, xGraph, DATE_URI_STR, OBJECT_STR)
72        self.assertTrue(self.hasStatement(xDMA, xGraph, DATE_URI_STR))
73        self.removeStatement(xDMA, xGraph, None, OBJECT_STR)
74        self.assertFalse(self.hasStatement(xDMA, xGraph, DATE_URI_STR))
75
76        xDMA.close(True)
77
78    def test_Statements_RemoveByObject(self):
79        # take any first graph
80        xDMA = self._uno.openTemplateFromTDOC("XNamedGraph.ott")
81        xGraph = self.getAnyGraph(xDMA)
82
83        DATE_URI_STR_1 = "http://www.example.com/Metadata#Version"
84        DATE_URI_STR_2 = "http://www.example.com/Metadata#Second"
85        OBJECT_STR = "foo"
86
87        # remove several with one call
88        self.assertFalse(self.hasStatement(xDMA, xGraph, DATE_URI_STR_1))
89        self.assertFalse(self.hasStatement(xDMA, xGraph, DATE_URI_STR_2))
90        self.addStatement(xDMA, xGraph, DATE_URI_STR_1, OBJECT_STR)
91        self.addStatement(xDMA, xGraph, DATE_URI_STR_2, OBJECT_STR)
92        self.assertTrue(self.hasStatement(xDMA, xGraph, DATE_URI_STR_1))
93        self.assertTrue(self.hasStatement(xDMA, xGraph, DATE_URI_STR_2))
94        self.removeStatement(xDMA, xGraph, None, OBJECT_STR)
95        self.assertFalse(self.hasStatement(xDMA, xGraph, DATE_URI_STR_1))
96        self.assertFalse(self.hasStatement(xDMA, xGraph, DATE_URI_STR_2))
97
98        xDMA.close(True)
99
100    def getAnyGraph(self, xDMA):
101        xRepo = xDMA.getRDFRepository()
102        xGraphs = xRepo.getGraphNames()
103        self.assertTrue(len(xGraphs) > 0)
104        xGraph = xRepo.getGraph(xGraphs[0])
105        self.assertIsNotNone(xGraph)
106        return xGraph
107
108    def getStatementsCount(self, xGraphs, xDMA, xPredicate, xObject):
109        count = 0
110        xRepo = xDMA.getRDFRepository()
111
112        for xGraphUri in xGraphs:
113            xGraph = xRepo.getGraph(xGraphUri)
114
115            xStatements = xGraph.getStatements(xDMA, xPredicate, xObject)
116            self.assertIsNotNone(xStatements)
117
118            if xPredicate is None:
119                self.assertTrue(xStatements.hasMoreElements())
120
121            for xStatement in xStatements:
122                count += 1
123
124        return count
125
126    def hasStatement(self, xDMA, xGraph, xPredicateName):
127        xPredicate = self.nameToUri(xPredicateName)
128        self.assertIsNotNone(xPredicate)
129
130        xStatements = xGraph.getStatements(xDMA, xPredicate, None)
131        self.assertIsNotNone(xStatements)
132        return xStatements.hasMoreElements()
133
134    def nameToUri(self, xPredicateName):
135        xServiceManager = self.__class__._uno.xContext.ServiceManager
136        xUri = xServiceManager.createInstance("com.sun.star.rdf.URI")
137        xUri.initialize((xPredicateName,))
138        return xUri
139
140    def stringToLiteral(self, xString):
141        xServiceManager = self.__class__._uno.xContext.ServiceManager
142        xLiteral = xServiceManager.createInstance("com.sun.star.rdf.Literal")
143        xLiteral.initialize((xString,))
144        return xLiteral
145
146    def addStatement(self, xDMA, xGraph, xPredicateName, xObjectStr):
147        xPredicate = self.nameToUri(xPredicateName)
148        self.assertIsNotNone(xPredicate)
149
150        xObject = self.stringToLiteral(xObjectStr)
151        self.assertIsNotNone(xObject)
152
153        xGraph.addStatement(xDMA, xPredicate, xObject)
154
155    def removeStatement(self, xDMA, xGraph, xPredicateName, xObjectStr):
156        xPredicate = None
157        if xPredicateName is not None:
158            xPredicate = self.nameToUri(xPredicateName)
159
160        xObject = None
161        if xObjectStr is not None:
162            xObject = self.stringToLiteral(xObjectStr)
163
164        xGraph.removeStatements(xDMA, xPredicate, xObject)
165
166
167if __name__ == '__main__':
168    unittest.main()
169
170# vim: set shiftwidth=4 softtabstop=4 expandtab:
171