#!/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 import uno from testcollections_base import CollectionsTestBase from com.sun.star.beans import PropertyValue # DataForm factory def getDataFormInstance(doc): return doc.createInstance("com.sun.star.form.component.DataForm") # Tests behaviour of objects implementing XIndexContainer using the new-style # collection accessors # The objects chosen have no special meaning, they just happen to implement the # tested interfaces class TestXIndexContainer(CollectionsTestBase): def generateTestPropertyValues(self, count): sm = self.context.ServiceManager values = sm.createInstanceWithContext("com.sun.star.document.IndexedPropertyValues", self.context) for i in range(count): properties = (PropertyValue(Name='n'+str(i), Value='v'+str(i)),) uno.invoke(values, "insertByIndex", (i, uno.Any("[]com.sun.star.beans.PropertyValue", properties))) return values def generateTestTuple(self, values): properties = [] for i in values: properties.append((PropertyValue(Name='n'+str(i), Value='v'+str(i)),)) return tuple(properties) def assignValuesTestFixture(self, count, key, values, expected): # Given property_values = self.generateTestPropertyValues(count) if type(values) is list: to_assign = self.generateTestTuple(values) else: to_assign = values if not (isinstance(expected, Exception)): to_compare = self.generateTestTuple(expected) # When captured = None try: property_values[key] = to_assign except Exception as e: captured = e # Then if isinstance(expected, Exception): # expected is exception self.assertNotEqual(None, captured) self.assertEqual(type(expected).__name__, type(captured).__name__) else: # expected is list self.assertEqual(None, captured) self.assertEqual(len(expected), len(property_values)) for i in range(len(property_values)): self.assertEqual(to_compare[i][0].Name, property_values[i][0].Name) def deleteValuesTestFixture(self, count, key, expected): # Given property_values = self.generateTestPropertyValues(count) if not (isinstance(expected, Exception)): to_compare = self.generateTestTuple(expected) # When captured = None try: del property_values[key] except Exception as e: captured = e # Then if isinstance(expected, Exception): # expected is exception self.assertNotEqual(None, captured) self.assertEqual(type(expected).__name__, type(captured).__name__) else: # expected is list self.assertEqual(None, captured) self.assertEqual(len(expected), len(property_values)) for i in range(len(property_values)): self.assertEqual(to_compare[i][0].Name, property_values[i][0].Name) # Tests syntax: # obj[2:4] = val1,val2 # Replace by slice # obj[2:3] = val1,val2 # Insert/replace by slice # obj[2:2] = (val,) # Insert by slice # obj[2:4] = (val,) # Replace/delete by slice # obj[2:3] = () # Delete by slice (implicit) # For: # Cases requiring sequence type coercion def test_XIndexContainer_AssignSlice(self): base_max = 5 assign_max = 5 for i in range(base_max): for j in [x for x in range(-base_max-2, base_max+3)] + [None]: for k in [x for x in range(-base_max-2, base_max+3)] + [None]: key = slice(j, k) for l in range(assign_max): assign = [y+100 for y in range(l)] expected = list(range(i)) expected[key] = assign self.assignValuesTestFixture(i, key, assign, expected) # Tests syntax: # obj[2:4] = val1,val2 # Replace by slice # obj[2:3] = val1,val2 # Insert/replace by slice # obj[2:2] = (val,) # Insert by slice # For: # Cases not requiring sequence type coercion # Invalid values def test_XIndexContainer_AssignSlice_Invalid(self): self.assignValuesTestFixture(2, slice(0, 2), None, TypeError()) self.assignValuesTestFixture(2, slice(0, 2), 'foo', TypeError()) self.assignValuesTestFixture(2, slice(0, 2), 12.34, TypeError()) self.assignValuesTestFixture(2, slice(0, 2), {'a': 'b'}, TypeError()) self.assignValuesTestFixture(2, slice(0, 2), ('foo',), TypeError()) self.assignValuesTestFixture(2, slice(0, 2), ('foo', 'foo'), TypeError()) # Tests syntax: # obj[2:2] = (val,) # Insert by slice # For: # Cases not requiring sequence type coercion def test_XIndexContainer_AssignSlice_NoCoercion(self): # Given doc = self.createBlankTextDocument() form = getDataFormInstance(doc) form.Name = 'foo' # When doc.DrawPage.Forms[0:0] = (form,) # Then self.assertEqual('foo', doc.DrawPage.Forms[0].Name) doc.close(True) # Tests syntax: # obj[0:3:2] = val1,val2 # Replace by extended slice # For: # Cases requiring sequence type coercion def test_XIndexContainer_AssignExtendedSlice(self): base_max = 5 assign_max = 5 for i in range(base_max): for j in [x for x in range(-base_max-2, base_max+3)] + [None]: for k in [x for x in range(-base_max-2, base_max+3)] + [None]: for l in [-2, -1, 1, 2]: key = slice(j, k, l) for m in range(assign_max): assign = [y+100 for y in range(m)] expected = list(range(i)) try: expected[key] = assign except Exception as e: expected = e self.assignValuesTestFixture(i, key, assign, expected) # Tests syntax: # del obj[0] # Delete by index def test_XIndexContainer_DelIndex(self): base_max = 5 for i in range(base_max): for j in [x for x in range(-base_max-2, base_max+3)]: expected = list(range(i)) try: del expected[j] except Exception as e: expected = e self.deleteValuesTestFixture(i, j, expected) # Tests syntax: # del obj[2:4] # Delete by slice def test_XIndexContainer_DelSlice(self): baseMax = 5 for i in range(baseMax): for j in [x for x in range(-baseMax-2, baseMax+3)] + [None]: for k in [x for x in range(-baseMax-2, baseMax+3)] + [None]: key = slice(j, k) expected = list(range(i)) try: del expected[key] except Exception as e: expected = e self.deleteValuesTestFixture(i, key, expected) if __name__ == '__main__': unittest.main() # vim:set shiftwidth=4 softtabstop=4 expandtab: