#!/usr/bin/env python
#
# 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/.
#
import unittest
from inspect
import isclass
from testcollections_base
import CollectionsTestBase
# Footnote instance factory
def getFootnoteInstance(doc):
return doc.createInstance(
"com.sun.star.text.Footnote")
# Tests behaviour of objects implementing XIndexAccess using the new-style
# collection accessors
# The objects chosen have no special meaning, they just happen to implement the
# tested interfaces
class TestXIndexAccess(CollectionsTestBase):
def insertTestFootnotes(self, doc, count):
cursor = doc.Text.createTextCursor()
for i
in range(count):
footnote = getFootnoteInstance(doc)
footnote.Label =
'n'+str(i)
doc.Text.insertTextContent(cursor, footnote, 0)
def readValuesTestFixture(self, doc, count, key, expected):
# Given
doc.Text.setString(
'')
self.insertTestFootnotes(doc, count)
# When
captured =
None
try:
actual = doc.Footnotes[key]
except Exception
as e:
captured = e
# Then
if isclass(expected)
and issubclass(expected, Exception):
# expected is exception
self.assertNotEqual(
None, captured)
self.assertEqual(expected.__name__, type(captured).__name__)
elif type(expected)
is tuple:
# expected is tuple
self.assertEqual(
None, captured)
self.assertTrue(type(actual)
is tuple)
self.assertEqual(len(expected), len(actual))
for i
in range(len(expected)):
self.assertEqual(
'n'+str(expected[i]), actual[i].Label)
else:
# expected is value
self.assertEqual(
None, captured)
self.assertTrue(type(actual)
is not tuple)
self.assertEqual(
'n'+str(expected), actual.Label)
# Tests syntax:
# num = len(obj) # Number of elements
# For:
# length = 0
def test_XIndexAccess_Len_0(self):
# Given
doc = self.createBlankTextDocument()
# When
count = len(doc.Footnotes)
# Then
self.assertEqual(0, count)
doc.close(
True)
# Tests syntax:
# num = len(obj) # Number of elements
# For:
# length = 1
def test_XIndexAccess_Len_1(self):
# Given
doc = self.createBlankTextDocument()
cursor = doc.Text.createTextCursor()
footnote = getFootnoteInstance(doc)
doc.Text.insertTextContent(cursor, footnote, 0)
# When
count = len(doc.Footnotes)
# Then
self.assertEqual(1, count)
doc.close(
True)
# Tests syntax:
# val = obj[0] # Access by index
# For:
# Single indices
def test_XIndexAccess_ReadIndex_Single(self):
doc = self.createBlankTextDocument()
self.readValuesTestFixture(doc, 0, -1, IndexError)
self.readValuesTestFixture(doc, 0, 0, IndexError)
self.readValuesTestFixture(doc, 0, 1, IndexError)
self.readValuesTestFixture(doc, 1, -3, IndexError)
self.readValuesTestFixture(doc, 1, -2, IndexError)
self.readValuesTestFixture(doc, 1, -1, 0)
self.readValuesTestFixture(doc, 1, 0, 0)
self.readValuesTestFixture(doc, 1, 1, IndexError)
self.readValuesTestFixture(doc, 1, 2, IndexError)
self.readValuesTestFixture(doc, 2, -4, IndexError)
self.readValuesTestFixture(doc, 2, -3, IndexError)
self.readValuesTestFixture(doc, 2, -2, 0)
self.readValuesTestFixture(doc, 2, -1, 1)
self.readValuesTestFixture(doc, 2, 0, 0)
self.readValuesTestFixture(doc, 2, 1, 1)
self.readValuesTestFixture(doc, 2, 2, IndexError)
self.readValuesTestFixture(doc, 2, 3, IndexError)
doc.close(
True)
def test_XIndexAccess_ReadIndex_Single_Invalid(self):
doc = self.createBlankTextDocument()
self.readValuesTestFixture(doc, 0,
None, TypeError)
self.readValuesTestFixture(doc, 0,
'foo', TypeError)
self.readValuesTestFixture(doc, 0, 12.34, TypeError)
self.readValuesTestFixture(doc, 0, (0, 1), TypeError)
self.readValuesTestFixture(doc, 0, [0, 1], TypeError)
self.readValuesTestFixture(doc, 0, {
'a':
'b'}, TypeError)
doc.close(
True)
# Tests syntax:
# val1,val2 = obj[2:4] # Access by slice
def test_XIndexAccess_ReadSlice(self):
doc = self.createBlankTextDocument()
test_max = 4
for i
in range(test_max):
t = tuple(range(i))
for j
in [x
for x
in range(-test_max-2, test_max+3)] + [
None]:
for k
in [x
for x
in range(-test_max-2, test_max+3)] + [
None]:
key = slice(j, k)
expected = t[key]
self.readValuesTestFixture(doc, i, key, expected)
doc.close(
True)
# Tests syntax:
# val1,val2 = obj[0:3:2] # Access by extended slice
def test_XIndexAccess_ReadExtendedSlice(self):
doc = self.createBlankTextDocument()
test_max = 4
for i
in range(test_max):
t = tuple(range(i))
for j
in [x
for x
in range(-test_max-2, test_max+3)] + [
None]:
for k
in [x
for x
in range(-test_max-2, test_max+3)] + [
None]:
for l
in [-2, -1, 2]:
key = slice(j, k, l)
expected = t[key]
self.readValuesTestFixture(doc, i, key, expected)
doc.close(
True)
# Tests syntax:
# if val in obj: ... # Test value presence
# For:
# Present element
def test_XIndexAccess_In_Present(self):
# Given
doc = self.createBlankTextDocument()
cursor = doc.Text.createTextCursor()
footnote = getFootnoteInstance(doc)
footnote.setLabel(
'foo')
doc.Text.insertTextContent(cursor, footnote, 0)
footnote = doc.Footnotes[0]
# When
present = footnote
in doc.Footnotes
# Then
self.assertTrue(present)
doc.close(
True)
# Tests syntax:
# if val in obj: ... # Test value presence
# For:
# None
def test_XIndexAccess_In_None(self):
# Given
doc = self.createBlankTextDocument()
# When
present =
None in doc.Footnotes
# Then
self.assertFalse(present)
doc.close(
True)
# Tests syntax:
# if val in obj: ... # Test value presence
# For:
# Absent element (string)
def test_XIndexAccess_In_String(self):
# Given
doc = self.createBlankTextDocument()
# When / Then
present =
"foo" in doc.Footnotes
# Then
self.assertFalse(present)
doc.close(
True)
# Tests syntax:
# if val in obj: ... # Test value presence
# For:
# Absent element (dict)
def test_XIndexAccess_In_Dict(self):
# Given
doc = self.createBlankTextDocument()
# When / Then
with self.assertRaises(TypeError):
_ = {}
in doc.Footnotes
doc.close(
True)
# Tests syntax:
# for val in obj: ... # Implicit iterator (values)
# For:
# 0 elements
def test_XIndexAccess_ForIn_0(self):
# Given
doc = self.createBlankTextDocument()
# When
read_footnotes = []
for f
in doc.Footnotes:
read_footnotes.append(f)
# Then
self.assertEqual(0, len(read_footnotes))
doc.close(
True)
# Tests syntax:
# for val in obj: ... # Implicit iterator (values)
# For:
# 1 element
def test_XIndexAccess_ForIn_1(self):
# Given
doc = self.createBlankTextDocument()
cursor = doc.Text.createTextCursor()
footnote = getFootnoteInstance(doc)
footnote.setLabel(
'foo')
doc.Text.insertTextContent(cursor, footnote, 0)
# When
read_footnotes = []
for f
in doc.Footnotes:
read_footnotes.append(f)
# Then
self.assertEqual(1, len(read_footnotes))
self.assertEqual(
'foo', read_footnotes[0].Label)
doc.close(
True)
# Tests syntax:
# for val in obj: ... # Implicit iterator (values)
# For:
# 2 elements
def test_XIndexAccess_ForIn_2(self):
# Given
doc = self.createBlankTextDocument()
cursor = doc.Text.createTextCursor()
footnote1 = getFootnoteInstance(doc)
footnote2 = getFootnoteInstance(doc)
footnote1.setLabel(
'foo')
footnote2.setLabel(
'bar')
doc.Text.insertTextContent(cursor, footnote1, 0)
doc.Text.insertTextContent(cursor, footnote2, 0)
# When
read_footnotes = []
for f
in doc.Footnotes:
read_footnotes.append(f)
# Then
self.assertEqual(2, len(read_footnotes))
self.assertEqual(
'foo', read_footnotes[0].Label)
self.assertEqual(
'bar', read_footnotes[1].Label)
doc.close(
True)
# Tests syntax:
# itr = iter(obj) # Named iterator (values)
# For:
# 1 element
def test_XIndexAccess_Iter_0(self):
# Given
doc = self.createBlankTextDocument()
cursor = doc.Text.createTextCursor()
footnote = getFootnoteInstance(doc)
footnote.setLabel(
'foo')
doc.Text.insertTextContent(cursor, footnote, 0)
# When
itr = iter(doc.Footnotes)
# Then
self.assertIsNotNone(next(itr))
with self.assertRaises(StopIteration):
next(itr)
doc.close(
True)
if __name__ ==
'__main__':
unittest.main()
# vim:set shiftwidth=4 softtabstop=4 expandtab: