Files
libreoffice/sw/qa/python/check_table.py
Bjoern Michaelsen 53e7011084 be picky and check explicit implementation name
- the previous code tried to avoid breakage from changing an
  implementation detail
- this turns out to be harder than expected in a Python2/3 portable way
- also it would mean the intentional drive-by documentation of the
  expected implementation name will at least not bit rot now

Change-Id: I5972d0e79ef64abe30573182c5e23268e4830ade
2015-07-03 22:12:57 +02:00

458 lines
21 KiB
Python

import math
import unittest
from org.libreoffice.unotest import UnoInProcess
from com.sun.star.beans import PropertyValue
from com.sun.star.uno import RuntimeException
from com.sun.star.table import BorderLine
from com.sun.star.table import BorderLine2
from com.sun.star.table.BorderLineStyle import (DOUBLE, SOLID, EMBOSSED,\
THICKTHIN_LARGEGAP, DASHED, DOTTED)
class CheckTable(unittest.TestCase):
_uno = None
def _fill_table(self, xTable):
for x in range(3):
for y in range(3):
xTable.getCellByPosition(x, y).String = 'Cell %d %d' % (x, y)
def _check_table(self, xTable):
for x in range(3):
for y in range(3):
self.assertEqual('Cell %d %d' % (x, y), xTable.getCellByPosition(x, y).String)
@classmethod
def setUpClass(cls):
cls._uno = UnoInProcess()
cls._uno.setUp()
@classmethod
def tearDownClass(cls):
cls._uno.tearDown()
def test_tableborder(self):
xDoc = CheckTable._uno.openEmptyWriterDoc()
# insert table
xTable = xDoc.createInstance("com.sun.star.text.TextTable")
xTable.initialize(3, 3)
xText = xDoc.getText()
xCursor = xText.createTextCursor()
xText.insertTextContent(xCursor, xTable, False)
border = xTable.getPropertyValue("TableBorder")
self.assertTrue(border.IsTopLineValid)
self.assertEqual(0, border.TopLine.InnerLineWidth)
self.assertEqual(2, border.TopLine.OuterLineWidth)
self.assertEqual(0, border.TopLine.LineDistance)
self.assertEqual(0, border.TopLine.Color)
self.assertTrue(border.IsBottomLineValid)
self.assertEqual(0, border.BottomLine.InnerLineWidth)
self.assertEqual(2, border.BottomLine.OuterLineWidth)
self.assertEqual(0, border.BottomLine.LineDistance)
self.assertEqual(0, border.BottomLine.Color)
self.assertTrue(border.IsLeftLineValid)
self.assertEqual(0, border.LeftLine.InnerLineWidth)
self.assertEqual(2, border.LeftLine.OuterLineWidth)
self.assertEqual(0, border.LeftLine.LineDistance)
self.assertEqual(0, border.LeftLine.Color)
self.assertTrue(border.IsRightLineValid)
self.assertEqual(0, border.RightLine.InnerLineWidth)
self.assertEqual(2, border.RightLine.OuterLineWidth)
self.assertEqual(0, border.RightLine.LineDistance)
self.assertEqual(0, border.RightLine.Color)
self.assertTrue(border.IsHorizontalLineValid)
self.assertEqual(0, border.HorizontalLine.InnerLineWidth)
self.assertEqual(2, border.HorizontalLine.OuterLineWidth)
self.assertEqual(0, border.HorizontalLine.LineDistance)
self.assertEqual(0, border.HorizontalLine.Color)
self.assertTrue(border.IsVerticalLineValid)
self.assertEqual(0, border.VerticalLine.InnerLineWidth)
self.assertEqual(2, border.VerticalLine.OuterLineWidth)
self.assertEqual(0, border.VerticalLine.LineDistance)
self.assertEqual(0, border.VerticalLine.Color)
self.assertTrue(border.IsDistanceValid)
self.assertEqual(97, border.Distance)
# set border
border.TopLine = BorderLine(0, 11, 19, 19)
border.BottomLine = BorderLine(0xFF, 00, 11, 00)
border.HorizontalLine = BorderLine(0xFF00, 00, 90, 00)
xTable.setPropertyValue("TableBorder", border)
# read set border
border = xTable.getPropertyValue("TableBorder")
self.assertTrue(border.IsTopLineValid)
self.assertEqual(11, border.TopLine.InnerLineWidth)
self.assertEqual(19, border.TopLine.OuterLineWidth)
self.assertEqual(19, border.TopLine.LineDistance)
self.assertEqual(0, border.TopLine.Color)
self.assertTrue(border.IsBottomLineValid)
self.assertEqual(0, border.BottomLine.InnerLineWidth)
self.assertEqual(11, border.BottomLine.OuterLineWidth)
self.assertEqual(0, border.BottomLine.LineDistance)
self.assertEqual(0xFF, border.BottomLine.Color)
self.assertTrue(border.IsLeftLineValid)
self.assertEqual(0, border.LeftLine.InnerLineWidth)
self.assertEqual(2, border.LeftLine.OuterLineWidth)
self.assertEqual(0, border.LeftLine.LineDistance)
self.assertEqual(0, border.LeftLine.Color)
self.assertTrue(border.IsRightLineValid)
self.assertEqual(0, border.RightLine.InnerLineWidth)
self.assertEqual(2, border.RightLine.OuterLineWidth)
self.assertEqual(0, border.RightLine.LineDistance)
self.assertEqual(0, border.RightLine.Color)
self.assertTrue(border.IsHorizontalLineValid)
self.assertEqual(0, border.HorizontalLine.InnerLineWidth)
self.assertEqual(90, border.HorizontalLine.OuterLineWidth)
self.assertEqual(0, border.HorizontalLine.LineDistance)
self.assertEqual(0xFF00, border.HorizontalLine.Color)
self.assertTrue(border.IsVerticalLineValid)
self.assertEqual(0, border.VerticalLine.InnerLineWidth)
self.assertEqual(2, border.VerticalLine.OuterLineWidth)
self.assertEqual(0, border.VerticalLine.LineDistance)
self.assertEqual(0, border.VerticalLine.Color)
self.assertTrue(border.IsDistanceValid)
self.assertEqual(97, border.Distance)
border2 = xTable.getPropertyValue("TableBorder2")
self.assertTrue(border2.IsTopLineValid)
self.assertEqual(11, border2.TopLine.InnerLineWidth)
self.assertEqual(19, border2.TopLine.OuterLineWidth)
self.assertEqual(19, border2.TopLine.LineDistance)
self.assertEqual(0, border2.TopLine.Color)
self.assertEqual(DOUBLE, border2.TopLine.LineStyle)
self.assertEqual(49, border2.TopLine.LineWidth)
self.assertTrue(border2.IsBottomLineValid)
self.assertEqual(0, border2.BottomLine.InnerLineWidth)
self.assertEqual(11, border2.BottomLine.OuterLineWidth)
self.assertEqual(0, border2.BottomLine.LineDistance)
self.assertEqual(0xFF, border2.BottomLine.Color)
self.assertEqual(SOLID, border2.BottomLine.LineStyle)
self.assertEqual(11, border2.BottomLine.LineWidth)
self.assertTrue(border2.IsLeftLineValid)
self.assertEqual(0, border2.LeftLine.InnerLineWidth)
self.assertEqual(2, border2.LeftLine.OuterLineWidth)
self.assertEqual(0, border2.LeftLine.LineDistance)
self.assertEqual(0, border2.LeftLine.Color)
self.assertEqual(SOLID, border2.LeftLine.LineStyle)
self.assertEqual(2, border2.LeftLine.LineWidth)
self.assertTrue(border2.IsRightLineValid)
self.assertEqual(0, border2.RightLine.InnerLineWidth)
self.assertEqual(2, border2.RightLine.OuterLineWidth)
self.assertEqual(0, border2.RightLine.LineDistance)
self.assertEqual(0, border2.RightLine.Color)
self.assertEqual(SOLID, border2.RightLine.LineStyle)
self.assertEqual(2, border2.RightLine.LineWidth)
self.assertTrue(border2.IsHorizontalLineValid)
self.assertEqual(0, border2.HorizontalLine.InnerLineWidth)
self.assertEqual(90, border2.HorizontalLine.OuterLineWidth)
self.assertEqual(0, border2.HorizontalLine.LineDistance)
self.assertEqual(0xFF00, border2.HorizontalLine.Color)
self.assertEqual(SOLID, border2.HorizontalLine.LineStyle)
self.assertEqual(90, border2.HorizontalLine.LineWidth)
self.assertTrue(border2.IsVerticalLineValid)
self.assertEqual(0, border2.VerticalLine.InnerLineWidth)
self.assertEqual(2, border2.VerticalLine.OuterLineWidth)
self.assertEqual(0, border2.VerticalLine.LineDistance)
self.assertEqual(0, border2.VerticalLine.Color)
self.assertEqual(SOLID, border2.VerticalLine.LineStyle)
self.assertEqual(2, border2.VerticalLine.LineWidth)
self.assertTrue(border2.IsDistanceValid)
self.assertEqual(97, border2.Distance)
# set border2
border2.RightLine = BorderLine2(0, 0, 0, 0, THICKTHIN_LARGEGAP, 120)
border2.LeftLine = BorderLine2(0, 0, 0, 0, EMBOSSED, 90)
border2.VerticalLine = BorderLine2(0xFF, 0, 90, 0, DOTTED, 0)
border2.HorizontalLine = BorderLine2(0xFF00, 0, 0, 0, DASHED, 11)
xTable.setPropertyValue("TableBorder2", border2)
# read set border2
border2 = xTable.getPropertyValue("TableBorder2")
self.assertTrue(border2.IsTopLineValid)
self.assertEqual(11, border2.TopLine.InnerLineWidth)
self.assertEqual(19, border2.TopLine.OuterLineWidth)
self.assertEqual(19, border2.TopLine.LineDistance)
self.assertEqual(0, border2.TopLine.Color)
self.assertEqual(DOUBLE, border2.TopLine.LineStyle)
self.assertEqual(49, border2.TopLine.LineWidth)
self.assertTrue(border2.IsBottomLineValid)
self.assertEqual(0, border2.BottomLine.InnerLineWidth)
self.assertEqual(11, border2.BottomLine.OuterLineWidth)
self.assertEqual(0, border2.BottomLine.LineDistance)
self.assertEqual(0xFF, border2.BottomLine.Color)
self.assertEqual(SOLID, border2.BottomLine.LineStyle)
self.assertEqual(11, border2.BottomLine.LineWidth)
self.assertTrue(border2.IsLeftLineValid)
self.assertEqual(23, border2.LeftLine.InnerLineWidth)
self.assertEqual(23, border2.LeftLine.OuterLineWidth)
self.assertEqual(46, border2.LeftLine.LineDistance)
self.assertEqual(0, border2.LeftLine.Color)
self.assertEqual(EMBOSSED, border2.LeftLine.LineStyle)
self.assertEqual(90, border2.LeftLine.LineWidth)
self.assertTrue(border2.IsRightLineValid)
self.assertEqual(53, border2.RightLine.InnerLineWidth)
self.assertEqual(26, border2.RightLine.OuterLineWidth)
self.assertEqual(41, border2.RightLine.LineDistance)
self.assertEqual(0, border2.RightLine.Color)
self.assertEqual(THICKTHIN_LARGEGAP, border2.RightLine.LineStyle)
self.assertEqual(120, border2.RightLine.LineWidth)
self.assertTrue(border2.IsHorizontalLineValid)
self.assertEqual(0, border2.HorizontalLine.InnerLineWidth)
self.assertEqual(11, border2.HorizontalLine.OuterLineWidth)
self.assertEqual(0, border2.HorizontalLine.LineDistance)
self.assertEqual(0xFF00, border2.HorizontalLine.Color)
self.assertEqual(DASHED, border2.HorizontalLine.LineStyle)
self.assertEqual(11, border2.HorizontalLine.LineWidth)
self.assertTrue(border2.IsVerticalLineValid)
self.assertEqual(0, border2.VerticalLine.InnerLineWidth)
self.assertEqual(90, border2.VerticalLine.OuterLineWidth)
self.assertEqual(0, border2.VerticalLine.LineDistance)
self.assertEqual(0xFF, border2.VerticalLine.Color)
self.assertEqual(DOTTED, border2.VerticalLine.LineStyle)
self.assertEqual(90, border2.VerticalLine.LineWidth)
self.assertTrue(border2.IsDistanceValid)
self.assertEqual(97, border2.Distance)
# close document
xDoc.dispose()
def test_fdo58242(self):
xDoc = CheckTable._uno.openEmptyWriterDoc()
# insert table
xTable = xDoc.createInstance("com.sun.star.text.TextTable")
xTable.initialize(3, 3)
xText = xDoc.getText()
xCursor = xText.createTextCursor()
xText.insertTextContent(xCursor, xTable, False)
# get anchor
xAnchor = xTable.getAnchor()
# check all properties on the anchor - shouldn't crash despite
# pointing to a non-SwTextNode
xPropsInfo = xAnchor.getPropertySetInfo()
for i in xPropsInfo.getProperties():
try:
xAnchor.getPropertyValue(i.Name)
except RuntimeException:
pass
# close document
xDoc.dispose()
def test_descriptions(self):
xDoc = CheckTable._uno.openEmptyWriterDoc()
# insert table
xTable = xDoc.createInstance("com.sun.star.text.TextTable")
xTable.initialize(3, 3)
xCursor = xDoc.Text.createTextCursor()
xDoc.Text.insertTextContent(xCursor, xTable, False)
self.assertEqual(3, xTable.Rows.Count)
self.assertEqual(3, xTable.Columns.Count)
# fill table
self._fill_table(xTable)
self._check_table(xTable)
# check without labels first
xTable.ChartColumnAsLabel = False
xTable.ChartRowAsLabel = False
self.assertEqual(0, len(xTable.RowDescriptions))
self.assertEqual(0, len(xTable.ColumnDescriptions))
self.RowDescriptions = ('foo', 'bar', 'baz') # no labels, thus noop
self.ColumnDescriptions = ('foo', 'bar', 'baz') # no labels, thus noop
self._check_table(xTable)
# now check with labels
xTable.ChartColumnAsLabel = True
xTable.ChartRowAsLabel = True
self.assertEqual(2, len(xTable.RowDescriptions))
self.assertEqual('Cell 0 1', xTable.RowDescriptions[0])
self.assertEqual('Cell 0 2', xTable.RowDescriptions[1])
self.assertEqual(2, len(xTable.ColumnDescriptions))
self.assertEqual('Cell 1 0', xTable.ColumnDescriptions[0])
self.assertEqual('Cell 2 0', xTable.ColumnDescriptions[1])
with self.assertRaises(Exception):
xTable.RowDescriptions = ('foo',) # too short
with self.assertRaises(Exception):
xTable.ColumnDescriptions = ('foo',) # too short
self._check_table(xTable)
xTable.RowDescriptions = ('fooRow', 'bazRow')
xTable.ColumnDescriptions = ('fooColumn', 'bazColumn')
self.assertEqual('fooRow', xTable.getCellByPosition(0,1).String)
self.assertEqual('bazRow', xTable.getCellByPosition(0,2).String)
self.assertEqual('fooColumn', xTable.getCellByPosition(1,0).String)
self.assertEqual('bazColumn', xTable.getCellByPosition(2,0).String)
xTable.getCellByPosition(0,1).String = 'Cell 0 1' # reset changes values ...
xTable.getCellByPosition(0,2).String = 'Cell 0 2'
xTable.getCellByPosition(1,0).String = 'Cell 1 0'
xTable.getCellByPosition(2,0).String = 'Cell 2 0'
self._check_table(xTable) # ... to ensure the rest was untouched
# check disconnected table excepts, but doesnt crash
xTable2 = xDoc.createInstance("com.sun.star.text.TextTable")
xTable2.initialize(3, 3)
with self.assertRaises(Exception):
foo = xTable2.RowDescriptions
with self.assertRaises(Exception):
foo = xTable2.ColumnDescriptions
xDoc.dispose()
def test_getset_data(self):
xDoc = CheckTable._uno.openEmptyWriterDoc()
# insert table
xTable = xDoc.createInstance("com.sun.star.text.TextTable")
xTable.initialize(4, 3)
xCursor = xDoc.Text.createTextCursor()
xDoc.Text.insertTextContent(xCursor, xTable, False)
xTable.ChartColumnAsLabel = False
xTable.ChartRowAsLabel = False
# roundtrip
xTable.Data = ((1,2,3), (4,5,6), (7,8,9), (10,11,12))
self.assertEqual( xTable.Data, ((1,2,3), (4,5,6), (7,8,9), (10,11,12)))
# missing row
with self.assertRaises(Exception):
xTable.Data = ((1,2,3), (4,5,6), (7,8,9))
# missing column
with self.assertRaises(Exception):
xTable.Data = ((1,2), (4,5), (7,8), (10,11))
# with labels
xTable.ChartColumnAsLabel = True
xTable.ChartRowAsLabel = True
self.assertEqual( xTable.Data, ((5,6), (8,9), (11,12)))
xTable.Data = ((55,66), (88,99), (1111,1212))
xTable.ChartColumnAsLabel = True
xTable.ChartRowAsLabel = False
self.assertEqual( xTable.Data, ((2,3), (55,66), (88,99), (1111,1212)))
xTable.ChartColumnAsLabel = False
xTable.ChartRowAsLabel = True
self.assertEqual( xTable.Data, ((4,55,66), (7,88,99), (10,1111,1212)))
xTable.ChartColumnAsLabel = False
xTable.ChartRowAsLabel = False
self.assertEqual( xTable.Data, ((1,2,3), (4,55,66), (7,88,99), (10,1111,1212)))
xDoc.dispose()
def test_remove_colrow(self):
xDoc = CheckTable._uno.openEmptyWriterDoc()
xTable = xDoc.createInstance("com.sun.star.text.TextTable")
xTable.initialize(4, 3)
xCursor = xDoc.Text.createTextCursor()
xDoc.Text.insertTextContent(xCursor, xTable, False)
xTable.ChartColumnAsLabel = False
xTable.ChartRowAsLabel = False
xTable.Data = ((1,2,3), (4,5,6), (7,8,9), (10,11,12))
xRows = xTable.Rows
self.assertEquals(xRows.ImplementationName, 'SwXTableRows')
self.assertTrue(xRows.supportsService('com.sun.star.text.TableRows'))
self.assertFalse(xRows.supportsService('foo'))
self.assertIn('com.sun.star.text.TableRows', xRows.SupportedServiceNames)
self.assertNotIn('foo', xRows.SupportedServiceNames)
xRows.removeByIndex(1, 2)
self.assertEqual( xTable.Data, ((1,2,3), (10,11,12)))
xCols = xTable.Columns
self.assertEquals(xCols.ImplementationName, 'SwXTableColumns')
self.assertTrue(xCols.supportsService('com.sun.star.text.TableColumns'))
self.assertFalse(xCols.supportsService('foo'))
self.assertIn('com.sun.star.text.TableColumns', xCols.SupportedServiceNames)
self.assertNotIn('foo', xCols.SupportedServiceNames)
xCols.removeByIndex(1, 1)
self.assertEqual( xTable.Data, ((1,3), (10,12)))
xDoc.dispose()
def test_insert_colrow(self):
xDoc = CheckTable._uno.openEmptyWriterDoc()
xTable = xDoc.createInstance("com.sun.star.text.TextTable")
xTable.initialize(4, 3)
xCursor = xDoc.Text.createTextCursor()
xDoc.Text.insertTextContent(xCursor, xTable, False)
xTable.ChartColumnAsLabel = False
xTable.ChartRowAsLabel = False
xTable.Data = ((1,2,3), (4,5,6), (7,8,9), (10,11,12))
xRows = xTable.Rows
xRows.insertByIndex(1, 2)
nan = float('nan')
self.assertEqual(xTable.Data[0], (1,2,3))
self.assertEqual(xTable.Data[3], (4,5,6))
self.assertEqual(xTable.Data[4], (7,8,9))
self.assertEqual(xTable.Data[5], (10,11,12))
for x in range(3):
self.assertTrue(math.isnan(xTable.Data[1][x]))
self.assertTrue(math.isnan(xTable.Data[2][x]))
xCols = xTable.Columns
xCols.insertByIndex(1, 1)
self.assertEqual(xTable.Data[0][0], 1)
self.assertTrue(math.isnan(xTable.Data[0][1]))
self.assertEqual(xTable.Data[0][2], 2)
self.assertEqual(xTable.Data[0][3], 3)
self.assertEqual(xTable.Data[3][0], 4)
self.assertTrue(math.isnan(xTable.Data[3][1]))
self.assertEqual(xTable.Data[3][2], 5)
self.assertEqual(xTable.Data[3][3], 6)
self.assertEqual(xTable.Data[4][0], 7)
self.assertTrue(math.isnan(xTable.Data[4][1]))
self.assertEqual(xTable.Data[4][2], 8)
self.assertEqual(xTable.Data[4][3], 9)
self.assertEqual(xTable.Data[5][0], 10)
self.assertTrue(math.isnan(xTable.Data[5][1]))
self.assertEqual(xTable.Data[5][2], 11)
self.assertEqual(xTable.Data[5][3], 12)
for x in range(4):
self.assertTrue(math.isnan(xTable.Data[1][x]))
self.assertTrue(math.isnan(xTable.Data[2][x]))
xDoc.dispose()
def test_chartdataprovider(self):
xDoc = CheckTable._uno.openEmptyWriterDoc()
xTable = xDoc.createInstance("com.sun.star.text.TextTable")
xTable.initialize(4, 3)
xCursor = xDoc.Text.createTextCursor()
xDoc.Text.insertTextContent(xCursor, xTable, False)
xTable.ChartColumnAsLabel = False
xTable.ChartRowAsLabel = False
xTable.Data = ((1,2,3), (4,5,6), (7,8,9), (10,11,12))
self.assertTrue(xTable.Name == 'Table1')
self.assertIn('com.sun.star.text.GenericTextDocument', xDoc.SupportedServiceNames)
xChartdataprovider = xDoc.createInstance('com.sun.star.chart2.data.DataProvider')
self.assertEquals(xChartdataprovider.ImplementationName, 'SwChartDataProvider')
self.assertTrue(xChartdataprovider.supportsService('com.sun.star.chart2.data.DataProvider'))
self.assertFalse(xChartdataprovider.supportsService('foo'))
self.assertIn('com.sun.star.chart2.data.DataProvider', xChartdataprovider.SupportedServiceNames)
pv = PropertyValue()
pv.Name = 'CellRangeRepresentation'
pv.Value = 'Table1.A1:C2'
xDataSource = xChartdataprovider.createDataSource((pv,))
self.assertEqual(len(xDataSource.DataSequences), 3)
expectedValues = ((1,4), (2,5), (3,6))
expectedCellrange = ('A1:A2', 'B1:B2', 'C1:C2')
for col in range(3):
xSeq = xDataSource.DataSequences[col].Values
self.assertEquals(xSeq.ImplementationName, 'SwChartDataSequence')
self.assertTrue(xSeq.supportsService('com.sun.star.chart2.data.DataSequence'))
self.assertFalse(xSeq.supportsService('foo'))
self.assertIn('com.sun.star.chart2.data.DataSequence', xSeq.SupportedServiceNames)
self.assertEqual(xSeq.SourceRangeRepresentation, 'Table1.%s' % expectedCellrange[col])
self.assertEqual(xSeq.Data, expectedValues[col])
self.assertEqual(xSeq.NumericalData, expectedValues[col])
self.assertEqual(
[int(txtval) for txtval in xSeq.TextualData],
[val for val in expectedValues[col]])
if __name__ == '__main__':
unittest.main()
# /* vim:set shiftwidth=4 softtabstop=4 expandtab: */