summaryrefslogtreecommitdiffstats
path: root/sw/qa/python/check_cross_references.py
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--sw/qa/python/check_cross_references.py232
1 files changed, 232 insertions, 0 deletions
diff --git a/sw/qa/python/check_cross_references.py b/sw/qa/python/check_cross_references.py
new file mode 100644
index 000000000..6aad1c47c
--- /dev/null
+++ b/sw/qa/python/check_cross_references.py
@@ -0,0 +1,232 @@
+'''
+ This file is part of the LibreOffice project.
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+ This file incorporates work covered by the following license notice:
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed
+ with this work for additional information regarding copyright
+ ownership. The ASF licenses this file to you under the Apache
+ License, Version 2.0 (the "License"); you may not use this file
+ except in compliance with the License. You may obtain a copy of
+ the License at http://www.apache.org/licenses/LICENSE-2.0 .
+'''
+import unittest
+import unohelper
+import os
+from com.sun.star.lang import XMultiServiceFactory
+from com.sun.star.text import XTextDocument
+from com.sun.star.text import XTextField
+from com.sun.star.container import XEnumeration
+from com.sun.star.util import XRefreshable
+from com.sun.star.container import XEnumerationAccess
+from com.sun.star.beans import XPropertySet
+from com.sun.star.text import XTextFieldsSupplier
+from com.sun.star.container import XNamed
+from com.sun.star.text.ReferenceFieldPart import (NUMBER, NUMBER_NO_CONTEXT, NUMBER_FULL_CONTEXT, TEXT)
+from com.sun.star.text.ReferenceFieldSource import BOOKMARK
+from org.libreoffice.unotest import UnoInProcess
+
+
+class CheckCrossReferences(unittest.TestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ cls._uno = UnoInProcess()
+ cls._uno.setUp()
+ cls.document = cls._uno.openDocFromTDOC("CheckCrossReferences.odt")
+ cls.xParaEnum = None
+ cls.xPortionEnum = None
+ cls.xFieldsRefresh = None
+
+ @classmethod
+ def tearDownClass(cls):
+ cls._uno.tearDown()
+ # HACK in case cls.document holds a UNO proxy to an SwXTextDocument (whose dtor calls
+ # Application::GetSolarMutex via sw::UnoImplPtrDeleter), which would potentially only be
+ # garbage-collected after VCL has already been deinitialized:
+ cls.document = None
+
+ def getNextField(self):
+ while True:
+ while self.xPortionEnum is None:
+ if (not(self.xParaEnum.hasMoreElements())):
+ self.fail("Cannot retrieve next field.")
+
+ aPara = self.xParaEnum.nextElement()
+ self.xPortionEnum = aPara.createEnumeration()
+
+ if (self.xPortionEnum is None):
+ break
+
+ for xPortionProps in self.xPortionEnum:
+ sPortionType = str(xPortionProps.getPropertyValue("TextPortionType"))
+ if (sPortionType == "TextField"):
+ xField = xPortionProps.getPropertyValue("TextField")
+ self.assertTrue(xField, "Cannot retrieve next field")
+ return xField
+
+ self.xPortionEnum = None
+ return None # unreachable
+
+ def getFieldProps(self, xField):
+ xProps = xField
+ self.assertTrue(xProps, "Cannot retrieve field properties.")
+ return xProps
+
+ def checkField(self, xField, xProps, nFormat, aExpectedFieldResult):
+ # set requested format
+ xProps.setPropertyValue("ReferenceFieldPart", int(nFormat))
+
+ # refresh fields in order to get new format applied
+ self.xFieldsRefresh.refresh()
+ aFieldResult = xField.getPresentation(False)
+ self.assertEqual(aExpectedFieldResult, aFieldResult, "set reference field format doesn't result in correct field result")
+
+ def test_checkCrossReferences(self):
+ xParaEnumAccess = self.document.getText()
+ self.xParaEnum = xParaEnumAccess.createEnumeration()
+
+ # get field refresher
+ xFieldSupp = self.__class__.document
+ self.xFieldsRefresh = xFieldSupp.getTextFields()
+
+ # check first reference field
+ # strings for checking
+ FieldResult1 = "*i*"
+ FieldResult2 = "+b+*i*"
+ FieldResult3 = "-1-+b+*i*"
+ FieldResult4 = "1"
+ FieldResult5 = "1"
+ FieldResult6 = "A.1"
+ FieldResult7 = "2(a)"
+ FieldResult8 = "2(b)"
+ FieldResult9 = "2"
+ FieldResult10 = "1(a)"
+ FieldResult11 = "(b)"
+ FieldResult12 = "(a)"
+
+ # variables for current field
+ xField = self.getNextField()
+ xProps = self.getFieldProps(xField)
+ self.checkField(xField, xProps, NUMBER, FieldResult2)
+ self.checkField(xField, xProps, NUMBER_NO_CONTEXT, FieldResult1)
+ self.checkField(xField, xProps, NUMBER_FULL_CONTEXT, FieldResult3)
+
+ xField = self.getNextField()
+ xProps = self.getFieldProps(xField)
+ self.checkField(xField, xProps, NUMBER, FieldResult1)
+ self.checkField(xField, xProps, NUMBER_NO_CONTEXT, FieldResult1)
+ self.checkField(xField, xProps, NUMBER_FULL_CONTEXT, FieldResult3)
+
+ xField = self.getNextField()
+ xProps = self.getFieldProps(xField)
+ self.checkField(xField, xProps, NUMBER, FieldResult3)
+ self.checkField(xField, xProps, NUMBER_NO_CONTEXT, FieldResult1)
+ self.checkField(xField, xProps, NUMBER_FULL_CONTEXT, FieldResult3)
+
+ xField = self.getNextField()
+ xProps = self.getFieldProps(xField)
+ self.checkField(xField, xProps, NUMBER, FieldResult5)
+ self.checkField(xField, xProps, NUMBER_NO_CONTEXT, FieldResult4)
+ self.checkField(xField, xProps, NUMBER_FULL_CONTEXT, FieldResult6)
+
+ xField = self.getNextField()
+ xProps = self.getFieldProps(xField)
+ self.checkField(xField, xProps, NUMBER, FieldResult4)
+ self.checkField(xField, xProps, NUMBER_NO_CONTEXT, FieldResult4)
+ self.checkField(xField, xProps, NUMBER_FULL_CONTEXT, FieldResult6)
+
+ xField = self.getNextField()
+ xProps = self.getFieldProps(xField)
+ self.checkField(xField, xProps, NUMBER, FieldResult6)
+ self.checkField(xField, xProps, NUMBER_NO_CONTEXT, FieldResult4)
+ self.checkField(xField, xProps, NUMBER_FULL_CONTEXT, FieldResult6)
+
+ xField = self.getNextField()
+ xProps = self.getFieldProps(xField)
+ self.checkField(xField, xProps, NUMBER, FieldResult7)
+ self.checkField(xField, xProps, NUMBER_NO_CONTEXT, FieldResult12)
+ self.checkField(xField, xProps, NUMBER_FULL_CONTEXT, FieldResult7)
+ xField = self.getNextField()
+ xProps = self.getFieldProps(xField)
+ self.checkField(xField, xProps, NUMBER, FieldResult8)
+ self.checkField(xField, xProps, NUMBER_NO_CONTEXT, FieldResult11)
+ self.checkField(xField, xProps, NUMBER_FULL_CONTEXT, FieldResult8)
+
+ xField = self.getNextField()
+ xProps = self.getFieldProps(xField)
+ self.checkField(xField, xProps, NUMBER, FieldResult9)
+ self.checkField(xField, xProps, NUMBER_NO_CONTEXT, FieldResult9)
+ self.checkField(xField, xProps, NUMBER_FULL_CONTEXT, FieldResult9)
+
+ xField = self.getNextField()
+ xProps = self.getFieldProps(xField)
+ self.checkField(xField, xProps, NUMBER, FieldResult4)
+ self.checkField(xField, xProps, NUMBER_NO_CONTEXT, FieldResult4)
+ self.checkField(xField, xProps, NUMBER_FULL_CONTEXT, FieldResult4)
+
+ xField = self.getNextField()
+ xProps = self.getFieldProps(xField)
+ self.checkField(xField, xProps, NUMBER, FieldResult10)
+ self.checkField(xField, xProps, NUMBER_NO_CONTEXT, FieldResult12)
+ self.checkField(xField, xProps, NUMBER_FULL_CONTEXT, FieldResult10)
+
+ xField = self.getNextField()
+ xProps = self.getFieldProps(xField)
+ self.checkField(xField, xProps, NUMBER, FieldResult12)
+ self.checkField(xField, xProps, NUMBER_NO_CONTEXT, FieldResult12)
+ self.checkField(xField, xProps, NUMBER_FULL_CONTEXT, FieldResult7)
+
+ # insert a certain cross-reference bookmark and a reference field to this bookmark
+ # restart paragraph enumeration
+ xParaEnumAccess = self.__class__.document.getText()
+ self.xParaEnum = xParaEnumAccess.createEnumeration()
+
+ # iterate on the paragraphs to find certain paragraph to insert the bookmark
+ for xParaTextRange in self.xParaEnum:
+
+ if xParaTextRange.getString() == "J":
+ break
+ else:
+ xParaTextRange = None
+
+ self.assertTrue(xParaTextRange, "Cannot find paragraph to insert cross-reference bookmark")
+
+ # insert bookmark
+ xFac = self.__class__.document
+ cBookmarkName = "__RefNumPara__47114711"
+ xBookmark = xFac.createInstance("com.sun.star.text.Bookmark")
+
+ if xBookmark is not None:
+ xName = xBookmark
+ xName.setName(cBookmarkName)
+ xBookmark.attach(xParaTextRange.getStart())
+
+ # insert reference field, which references the inserted bookmark
+ xNewField = xFac.createInstance("com.sun.star.text.TextField.GetReference")
+
+ if xNewField is not None:
+ xFieldProps = xNewField
+ xFieldProps.setPropertyValue("ReferenceFieldPart", int(TEXT))
+ xFieldProps.setPropertyValue("ReferenceFieldSource", int(BOOKMARK))
+ xFieldProps.setPropertyValue("SourceName", cBookmarkName)
+ xFieldTextRange = self.xParaEnum.nextElement()
+ xNewField.attach(xFieldTextRange.getEnd())
+ self.xFieldsRefresh.refresh()
+
+ # check inserted reference field
+ xField = xNewField
+ self.assertEqual("J", xField.getPresentation(False), "inserted reference field doesn't has correct field result")
+
+ xParaTextRange.getStart().setString("Hallo new bookmark: ")
+ self.xFieldsRefresh.refresh()
+ self.assertEqual("Hallo new bookmark: J", xField.getPresentation(False), "inserted reference field doesn't has correct field result")
+
+
+if __name__ == "__main__":
+ unittest.main()