def testAddRemove(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() observer.register(o, 'aSet') o.aSet.add(1) self.assertEqual(observer.seen, {'aSet': {1}}) self.assertNotIn('old', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['new'], set([1])) o.aSet.remove(1) self.assertNotIn('new', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['old'], set([1])) self.assertRaises(KeyError, o.aSet.remove, 2) self.assertNotIn('new', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['old'], set([])) o.aSet.add(1) o.aSet.add(2) v = o.aSet.pop() self.assertTrue(v in (1, 2)) self.assertNotIn('new', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['old'], set([v])) o.aSet = set() self.assertRaises(KeyError, o.aSet.pop)
def testGetSetItem(self): # Use __getitem__, __setitem__ interface and check # that the correct KVO events get emitted. observer = OCObserve.alloc().init() l = [1, 2, 3] o = TestArrayPropertyHelper.alloc().init() observer.register(o, 'array') # FIXME: the call to len shouldn't be necessary len(o.array) try: IS = NSIndexSet.alloc().initWithIndex_(0) self.assertEquals(len(observer.values), 0) o.array.append(1) self.assertEquals(len(observer.values), 1) self.assertEquals(observer.values[-1][-1]['indexes'], IS) self.assertEquals(observer.values[-1][-1]['new'], [1]) self.assertEquals(o.array[0], 1) o.array[0] = 4 self.assertEquals(o.array[0], 4) self.assertEquals(len(observer.values), 2) self.assertEquals(observer.values[-1][-1]['indexes'], IS) self.assertEquals(observer.values[-1][-1]['old'], [1]) self.assertEquals(observer.values[-1][-1]['new'], [4]) finally: observer.unregister(o, 'array')
def testAddRemove(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() observer.register(o, "aSet") o.aSet.add(1) self.assertEqual(observer.seen, {"aSet": {1}}) self.assertNotIn("old", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["new"], {1}) o.aSet.remove(1) self.assertNotIn("new", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["old"], {1}) self.assertRaises(KeyError, o.aSet.remove, 2) self.assertNotIn("new", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["old"], set()) o.aSet.add(1) o.aSet.add(2) v = o.aSet.pop() self.assertTrue(v in (1, 2)) self.assertNotIn("new", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["old"], {v}) o.aSet = set() self.assertRaises(KeyError, o.aSet.pop)
def testSymmetricDifferenceUpdate(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() o.aSet = {1, 2, 3} observer.register(o, "aSet") self.assertEqual(len(observer.values), 0) o.aSet.symmetric_difference_update({1, 4}) self.assertEqual(o.aSet, {2, 3, 4}) self.assertEqual(len(observer.values), 2) haveAdd = False haveRemove = False for i in 0, 1: if observer.values[i][-1]["kind"] == 3: # Remove self.assertNotIn("new", observer.values[i][-1]) self.assertEqual(observer.values[i][-1]["old"], {1}) haveRemove = True elif observer.values[i][-1]["kind"] == 2: # Remove self.assertNotIn("old", observer.values[i][-1]) self.assertEqual(observer.values[i][-1]["new"], {4}) haveAdd = True else: self.fail("Unexpected update kind") if not haveAdd and haveRemove: self.fail("Do not have both an add and remove notification")
def testDelSlice(self): # As testDelItem, but using slices observer = OCObserve.alloc().init() l = [1, 2, 3, 4] o = TestArrayPropertyHelper.alloc().init() observer.register(o, 'array') try: IS = NSMutableIndexSet.alloc().init() IS.addIndex_(0) IS.addIndex_(2) self.assertEqual(len(observer.values), 0) o.array = l self.assertEqual(observer.seen, {'array': l}) self.assertNotIn('indexes', observer.values[-1][-1]) self.assertEqual(o.array[0], 1) del o.array[0:4:2] self.assertEqual(o.array[0], 2) self.assertEqual(o.array[1], 4) self.assertEqual(len(o.array), 2) self.assertEqual(observer.values[-1][-1]['indexes'], IS) self.assertNotIn('new', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['old'], [1, 3]) finally: observer.unregister(o, 'array')
def testDefault(self): observer = OCObserve.alloc().init() o = TestDictPropertyHelper.alloc().init() observer.register(o, 'aDict') try: self.assertEquals(len(o.aDict), 0) self.assertEquals(o.aDict, {}) self.assertEquals(len(observer.values), 0) o.aDict['key'] = 42 self.assertEquals(len(observer.values), 0) observer.register(o, 'aDict.key') o.aDict['key'] = 43 self.assertEquals(len(observer.values), 1) self.assertNotIn('indexes', observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]['old'], 42) self.assertEquals(observer.values[-1][-1]['new'], 43) del o.aDict['key'] self.assertEquals(len(observer.values), 2) self.assertNotIn('indexes', observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]['old'], 43) self.assertEquals(observer.values[-1][-1]['new'], None) finally: observer.unregister(o, 'aDict') observer.unregister(o, 'aDict.key')
def testSymmetricDifferenceUpdate(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() o.aSet = set([1, 2, 3]) observer.register(o, 'aSet') self.assertEqual(len(observer.values), 0) o.aSet.symmetric_difference_update(set([1, 4])) self.assertEqual(o.aSet, set([2, 3, 4])) self.assertEqual(len(observer.values), 2) haveAdd = False haveRemove = False for i in 0, 1: if observer.values[i][-1]['kind'] == 3: # Remove self.assertNotIn('new', observer.values[i][-1]) self.assertEqual(observer.values[i][-1]['old'], set([1])) haveRemove = True elif observer.values[i][-1]['kind'] == 2: # Remove self.assertNotIn('old', observer.values[i][-1]) self.assertEqual(observer.values[i][-1]['new'], set([4])) haveAdd = True else: self.fail("Unexpected update kind") if not haveAdd and haveRemove: self.fail("Do not have both an add and remove notification")
def testIAdd(self): observer = OCObserve.alloc().init() l = [1, 2, 3, 4] l2 = ['a', 'b', 'c'] o = TestArrayPropertyHelper.alloc().init() observer.register(o, 'array') try: o.array = l self.assertEquals(len(observer.values), 1) self.assertEquals(o.array[0], 1) o.array += l2 self.assertEquals(len(o.array), 7) self.assertEquals(o.array[4], 'a') #self.assertEquals(len(observer.values), 3) #self.assertEquals(observer.values[-2][-1]['indexes'], NSIndexSet.alloc().initWithIndexesInRange_((4, 3))) #self.assertNotIn('old', observer.values[-2][-1]) #self.assertEquals(observer.values[-2][-1]['new'], ['a', 'b', 'c']) self.assertEquals(len(observer.values), 2) self.assertNotIn('indexes', observer.values[-1][-1]) finally: observer.unregister(o, 'array')
def testSetting(self): # Set value, check that # (1) value gets copied # (2) accessing the property result in proxy observer = OCObserve.alloc().init() l = [1, 2, 3] o = TestArrayPropertyHelper.alloc().init() observer.register(o, 'array') try: self.assertEquals(len(observer.values), 0) self.assertEquals(len(o.array), 0) self.assertEquals(len(observer.values), 0) o.array = l self.assertEquals(len(observer.values), 1) self.assertEquals(len(o.array), 3) # This shouldn't affect the property l.append(4) self.assertEquals(len(o.array), 3) self.assertEquals(len(l), 4) o.array.append(5) self.assertEquals(len(l), 4) finally: observer.unregister(o, 'array')
def testIMul(self): observer = OCObserve.alloc().init() l = [1, 2] o = TestArrayPropertyHelper.alloc().init() observer.register(o, 'array') try: o.array = l self.assertEquals(len(observer.values), 1) self.assertEquals(o.array[0], 1) o.array *= 3 self.assertEquals(len(o.array), 6) self.assertEquals(o.array[0], 1) self.assertEquals(o.array[1], 2) self.assertEquals(o.array[2], 1) self.assertEquals(o.array[3], 2) self.assertEquals(o.array[4], 1) self.assertEquals(o.array[5], 2) #self.assertEquals(len(observer.values), 3) #self.assertEquals(observer.values[-2][-1]['indexes'], NSIndexSet.alloc().initWithIndexesInRange_((2, 4))) #self.assertNotIn('old', observer.values[-2][-1]) #self.assertEquals(observer.values[-2][-1]['new'], [1, 2, 1, 2]) self.assertEquals(len(observer.values), 2) self.assertNotIn('indexes', observer.values[-1][-1]) finally: observer.unregister(o, 'array')
def testIAdd(self): observer = OCObserve.alloc().init() l = [1, 2, 3, 4] l2 = ["a", "b", "c"] o = TestArrayPropertyHelper.alloc().init() observer.register(o, "array") try: o.array = l self.assertEqual(observer.seen, {"array": l}) self.assertEqual(o.array[0], 1) o.array += l2 self.assertEqual(o.array, l + l2) self.assertEqual(len(o.array), 7) self.assertEqual(o.array[4], "a") self.assertEqual(observer.seen, {"array": l + l2}) self.assertEqual(observer.values[-2][-1]["indexes"], NSIndexSet.alloc().initWithIndexesInRange_((4, 3))) self.assertNotIn("old", observer.values[-2][-1]) self.assertEqual(observer.values[-2][-1]["new"], l2) self.assertNotIn("indexes", observer.values[-1][-1]) before = observer.values[:] v = o.array + l2 self.assertEqual(observer.values, before) self.assertEqual(v, l + l2 + l2) self.assertIsInstance(v, list) finally: observer.unregister(o, "array")
def testDelSlice(self): # As testDelItem, but using slices observer = OCObserve.alloc().init() lst = [1, 2, 3, 4] o = TestArrayPropertyHelper.alloc().init() observer.register(o, "array") try: IS = NSMutableIndexSet.alloc().init() IS.addIndex_(0) IS.addIndex_(2) self.assertEqual(len(observer.values), 0) o.array = lst self.assertEqual(observer.seen, {"array": lst}) self.assertNotIn("indexes", observer.values[-1][-1]) self.assertEqual(o.array[0], 1) del o.array[0:4:2] self.assertEqual(o.array[0], 2) self.assertEqual(o.array[1], 4) self.assertEqual(len(o.array), 2) self.assertEqual(observer.values[-1][-1]["indexes"], IS) self.assertNotIn("new", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["old"], [1, 3]) finally: observer.unregister(o, "array")
def testExtend(self): observer = OCObserve.alloc().init() l = [1, 2, 3, 4] l2 = ['a', 'b', 'c'] o = TestArrayPropertyHelper.alloc().init() observer.register(o, 'array') try: o.array = l self.assertEqual(observer.seen, {'array': l}) self.assertEqual(o.array[0], 1) o.array.extend(l2) self.assertEqual(len(o.array), 7) self.assertEqual(o.array[4], 'a') self.assertEqual(observer.seen, {'array': l2}) self.assertEqual( observer.values[-1][-1]['indexes'], NSIndexSet.alloc().initWithIndexesInRange_((4, 3))) self.assertNotIn('old', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['new'], l2) finally: observer.unregister(o, 'array')
def testDelSlice(self): # As testDelItem, but using slices observer = OCObserve.alloc().init() l = [1, 2, 3, 4] o = TestArrayPropertyHelper.alloc().init() observer.register(o, "array") try: IS = NSMutableIndexSet.alloc().init() IS.addIndex_(0) IS.addIndex_(2) self.assertEqual(len(observer.values), 0) o.array = l self.assertEqual(observer.seen, {"array": l}) self.assertNotIn("indexes", observer.values[-1][-1]) self.assertEqual(o.array[0], 1) del o.array[0:4:2] self.assertEqual(o.array[0], 2) self.assertEqual(o.array[1], 4) self.assertEqual(len(o.array), 2) self.assertEqual(observer.values[-1][-1]["indexes"], IS) self.assertNotIn("new", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["old"], [1, 3]) finally: observer.unregister(o, "array")
def testExtend(self): observer = OCObserve.alloc().init() l = [1, 2, 3, 4] l2 = ["a", "b", "c"] o = TestArrayPropertyHelper.alloc().init() observer.register(o, "array") try: o.array = l self.assertEqual(observer.seen, {"array": l}) self.assertEqual(o.array[0], 1) o.array.extend(l2) self.assertEqual(len(o.array), 7) self.assertEqual(o.array[4], "a") self.assertEqual(observer.seen, {"array": l2}) self.assertEqual(observer.values[-1][-1]["indexes"], NSIndexSet.alloc().initWithIndexesInRange_((4, 3))) self.assertNotIn("old", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["new"], l2) finally: observer.unregister(o, "array")
def testSymmetricDifferenceUpdate(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() o.aSet = set([1, 2, 3]) observer.register(o, "aSet") self.assertEquals(len(observer.values), 0) o.aSet.symmetric_difference_update(set([1, 4])) self.assertEquals(o.aSet, set([2, 3, 4])) self.assertEquals(len(observer.values), 2) haveAdd = False haveRemove = False for i in 0, 1: if observer.values[i][-1]["kind"] == 3: # Remove self.assertNotIn("new", observer.values[i][-1]) self.assertEquals(observer.values[i][-1]["old"], set([1])) haveRemove = True elif observer.values[i][-1]["kind"] == 2: # Remove self.assertNotIn("old", observer.values[i][-1]) self.assertEquals(observer.values[i][-1]["new"], set([4])) haveAdd = True else: self.fail("Unexpected update kind") if not haveAdd and haveRemove: self.fail("Do not have both an add and remove notification")
def testExtend(self): observer = OCObserve.alloc().init() lst = [1, 2, 3, 4] lst2 = ["a", "b", "c"] o = TestArrayPropertyHelper.alloc().init() observer.register(o, "array") try: o.array = lst self.assertEqual(observer.seen, {"array": lst}) self.assertEqual(o.array[0], 1) o.array.extend(lst2) self.assertEqual(len(o.array), 7) self.assertEqual(o.array[4], "a") self.assertEqual(observer.seen, {"array": lst2}) self.assertEqual( observer.values[-1][-1]["indexes"], NSIndexSet.alloc().initWithIndexesInRange_((4, 3)), ) self.assertNotIn("old", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["new"], lst2) finally: observer.unregister(o, "array")
def testDelSlice(self): # As testDelItem, but using slices observer = OCObserve.alloc().init() l = [1, 2, 3, 4] o = TestArrayPropertyHelper.alloc().init() observer.register(o, 'array') try: IS = NSMutableIndexSet.alloc().init() IS.addIndex_(0) IS.addIndex_(2) self.assertEquals(len(observer.values), 0) o.array = l self.assertEquals(len(observer.values), 1) self.assertNotIn('indexes', observer.values[-1][-1]) self.assertEquals(o.array[0], 1) del o.array[0:4:2] self.assertEquals(o.array[0], 2) self.assertEquals(o.array[1], 4) self.assertEquals(len(o.array), 2) self.assertEquals(len(observer.values), 2) self.assertEquals(observer.values[-1][-1]['indexes'], IS) self.assertNotIn('new', observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]['old'], [1, 3]) finally: observer.unregister(o, 'array')
def testGetSetItem(self): # Use __getitem__, __setitem__ interface and check # that the correct KVO events get emitted. observer = OCObserve.alloc().init() l = [1, 2, 3] o = TestArrayPropertyHelper.alloc().init() observer.register(o, 'array') # FIXME: the call to len shouldn't be necessary len(o.array) try: IS = NSIndexSet.alloc().initWithIndex_(0) self.assertEqual(observer.seen, {'array': []}) o.array.append(1) self.assertEqual(observer.seen, {'array': [1]}) self.assertEqual(observer.values[-1][-1]['indexes'], IS) self.assertEqual(observer.values[-1][-1]['new'], [1]) o.array.append(2) o.array.append(3) self.assertEqual(o.array[0], 1) o.array[0] = 4 self.assertEqual(o.array[0], 4) self.assertEqual(observer.seen, {'array': [4]}) self.assertEqual(observer.values[-1][-1]['indexes'], IS) self.assertEqual(observer.values[-1][-1]['old'], [1]) self.assertEqual(observer.values[-1][-1]['new'], [4]) o.array[-1] = 9 self.assertEqual(o.array[2], 9) IS = NSIndexSet.alloc().initWithIndex_(2) self.assertEqual(observer.seen, {'array': [9]}) self.assertEqual(observer.values[-1][-1]['indexes'], IS) self.assertEqual(observer.values[-1][-1]['old'], [3]) self.assertEqual(observer.values[-1][-1]['new'], [9]) self.assertEqual(o.array[-1], 9) try: o.array[-20] = 4 except IndexError: pass else: self.fail("IndexError not raised") finally: observer.unregister(o, 'array')
def testGetSetItem(self): # Use __getitem__, __setitem__ interface and check # that the correct KVO events get emitted. observer = OCObserve.alloc().init() l = [1, 2, 3] o = TestArrayPropertyHelper.alloc().init() observer.register(o, "array") # FIXME: the call to len shouldn't be necessary len(o.array) try: IS = NSIndexSet.alloc().initWithIndex_(0) self.assertEqual(observer.seen, {"array": []}) o.array.append(1) self.assertEqual(observer.seen, {"array": [1]}) self.assertEqual(observer.values[-1][-1]["indexes"], IS) self.assertEqual(observer.values[-1][-1]["new"], [1]) o.array.append(2) o.array.append(3) self.assertEqual(o.array[0], 1) o.array[0] = 4 self.assertEqual(o.array[0], 4) self.assertEqual(observer.seen, {"array": [4]}) self.assertEqual(observer.values[-1][-1]["indexes"], IS) self.assertEqual(observer.values[-1][-1]["old"], [1]) self.assertEqual(observer.values[-1][-1]["new"], [4]) o.array[-1] = 9 self.assertEqual(o.array[2], 9) IS = NSIndexSet.alloc().initWithIndex_(2) self.assertEqual(observer.seen, {"array": [9]}) self.assertEqual(observer.values[-1][-1]["indexes"], IS) self.assertEqual(observer.values[-1][-1]["old"], [3]) self.assertEqual(observer.values[-1][-1]["new"], [9]) self.assertEqual(o.array[-1], 9) try: o.array[-20] = 4 except IndexError: pass else: self.fail("IndexError not raised") finally: observer.unregister(o, "array")
def testIMul(self): observer = OCObserve.alloc().init() lst = [1, 2] o = TestArrayPropertyHelper.alloc().init() observer.register(o, "array") try: o.array = lst self.assertEqual(observer.seen, {"array": lst}) self.assertEqual(o.array[0], 1) observer.values[:] = [] o.array *= 3 self.assertEqual(len(o.array), 6) self.assertEqual(o.array[0], 1) self.assertEqual(o.array[1], 2) self.assertEqual(o.array[2], 1) self.assertEqual(o.array[3], 2) self.assertEqual(o.array[4], 1) self.assertEqual(o.array[5], 2) self.assertEqual(observer.seen, {"array": [1, 2, 1, 2, 1, 2]}) self.assertEqual( observer.values[-2][-1]["indexes"], NSIndexSet.alloc().initWithIndexesInRange_((2, 4)), ) self.assertNotIn("old", observer.values[-2][-1]) self.assertEqual(observer.values[-2][-1]["new"], [1, 2, 1, 2]) self.assertEqual(len(observer.values), 2) self.assertNotIn("indexes", observer.values[-1][-1]) before = observer.values[:] n = o.array * 4 self.assertEqual(observer.values, before) self.assertEqual(n, [1, 2] * 3 * 4) self.assertIsInstance(n, list) try: o.array *= "a" except TypeError: pass else: self.fail("array * 'a' didn't raise exception") finally: observer.unregister(o, "array")
def testInplace(self): # FIXME: the disabled lines in this test indicate a problem in # either the set_proxy implementation, or my understanding of # unordered collection properties. with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() o.aSet.add(1) observer.register(o, 'aSet') # The inplace operators aren't actually implemented, which means # "o.aSet |= value" is actually "o.aSet = o.aSet | value" and # we get the some KVO notificatons as when a new value is set. self.assertEqual(o.aSet, {1}) o.aSet |= set([2,3]) self.assertEqual(o.aSet, {1,2,3}) self.assertEqual(o.aSet, set([1,2,3])) self.assertEqual(len(observer.values), 2) self.assertEqual(observer.values[-1][-1]['kind'], 1) #self.assertEqual(observer.values[-1][-1]['old'], set([1])) self.assertEqual(observer.values[-1][-1]['new'], set([1,2,3])) self.assertEqual(o.aSet, {1,2,3}) o.aSet &= set([3, 4]) self.assertEqual(o.aSet, {3}) self.assertEqual(o.aSet, set([3])) self.assertEqual(len(observer.values), 4) self.assertEqual(observer.values[-1][-1]['kind'], 1) #self.assertEqual(observer.values[-1][-1]['old'], set([1,2,3])) #self.assertEqual(observer.values[-1][-1]['new'], set([3])) self.assertEqual(o.aSet, {3}) o.aSet -= {3} self.assertEqual(o.aSet, set()) self.assertEqual(o.aSet, set([])) self.assertEqual(len(observer.values), 6) self.assertEqual(observer.values[-1][-1]['kind'], 1) #self.assertEqual(observer.values[-1][-1]['old'], set([3])) #self.assertEqual(observer.values[-1][-1]['new'], set()) o.aSet = set([1,2,3]) #self.assertEqual(len(observer.values), 8) self.assertEqual(o.aSet, {1,2,3}) o.aSet ^= set([1, 4]) self.assertEqual(o.aSet, {2, 3, 4}) #self.assertEqual(len(observer.values), 9) self.assertEqual(observer.values[-1][-1]['kind'], 1)
def testInplace(self): # FIXME: the disabled lines in this test indicate a problem in # either the set_proxy implementation, or my understanding of # unordered collection properties. with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() o.aSet.add(1) observer.register(o, "aSet") # The inplace operators aren't actually implemented, which means # "o.aSet |= value" is actually "o.aSet = o.aSet | value" and # we get the some KVO notificatons as when a new value is set. self.assertEqual(o.aSet, {1}) o.aSet |= set([2, 3]) self.assertEqual(o.aSet, {1, 2, 3}) self.assertEqual(o.aSet, set([1, 2, 3])) self.assertEqual(len(observer.values), 2) self.assertEqual(observer.values[-1][-1]["kind"], 1) # self.assertEqual(observer.values[-1][-1]['old'], set([1])) self.assertEqual(observer.values[-1][-1]["new"], set([1, 2, 3])) self.assertEqual(o.aSet, {1, 2, 3}) o.aSet &= set([3, 4]) self.assertEqual(o.aSet, {3}) self.assertEqual(o.aSet, set([3])) self.assertEqual(len(observer.values), 4) self.assertEqual(observer.values[-1][-1]["kind"], 1) # self.assertEqual(observer.values[-1][-1]['old'], set([1,2,3])) # self.assertEqual(observer.values[-1][-1]['new'], set([3])) self.assertEqual(o.aSet, {3}) o.aSet -= {3} self.assertEqual(o.aSet, set()) self.assertEqual(o.aSet, set([])) self.assertEqual(len(observer.values), 6) self.assertEqual(observer.values[-1][-1]["kind"], 1) # self.assertEqual(observer.values[-1][-1]['old'], set([3])) # self.assertEqual(observer.values[-1][-1]['new'], set()) o.aSet = set([1, 2, 3]) # self.assertEqual(len(observer.values), 8) self.assertEqual(o.aSet, {1, 2, 3}) o.aSet ^= set([1, 4]) self.assertEqual(o.aSet, {2, 3, 4}) # self.assertEqual(len(observer.values), 9) self.assertEqual(observer.values[-1][-1]["kind"], 1)
def testUpdate(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() observer.register(o, "aSet") o.aSet.update([1, 2, 3]) self.assertEquals(len(observer.values), 1) self.assertEquals(observer.values[-1][-1]["kind"], 2) self.assertNotIn("old", observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]["new"], set([1, 2, 3])) o.aSet.update(set([3, 4, 5])) self.assertEquals(len(observer.values), 2) self.assertEquals(observer.values[-1][-1]["kind"], 2) self.assertNotIn("old", observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]["new"], set([4, 5]))
def testUpdate(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() observer.register(o, 'aSet') o.aSet.update([1,2,3]) self.assertEquals(len(observer.values), 1) self.assertEquals(observer.values[-1][-1]['kind'], 2) self.assertNotIn('old', observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]['new'], set([1, 2, 3])) o.aSet.update(set([3,4,5])) self.assertEquals(len(observer.values), 2) self.assertEquals(observer.values[-1][-1]['kind'], 2) self.assertNotIn('old', observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]['new'], set([4, 5]))
def testIMul(self): observer = OCObserve.alloc().init() l = [1, 2] o = TestArrayPropertyHelper.alloc().init() observer.register(o, "array") try: o.array = l self.assertEqual(observer.seen, {"array": l}) self.assertEqual(o.array[0], 1) observer.values[:] = [] o.array *= 3 self.assertEqual(len(o.array), 6) self.assertEqual(o.array[0], 1) self.assertEqual(o.array[1], 2) self.assertEqual(o.array[2], 1) self.assertEqual(o.array[3], 2) self.assertEqual(o.array[4], 1) self.assertEqual(o.array[5], 2) self.assertEqual(observer.seen, {"array": [1, 2, 1, 2, 1, 2]}) self.assertEqual(observer.values[-2][-1]["indexes"], NSIndexSet.alloc().initWithIndexesInRange_((2, 4))) self.assertNotIn("old", observer.values[-2][-1]) self.assertEqual(observer.values[-2][-1]["new"], [1, 2, 1, 2]) self.assertEqual(len(observer.values), 2) self.assertNotIn("indexes", observer.values[-1][-1]) before = observer.values[:] n = o.array * 4 self.assertEqual(observer.values, before) self.assertEqual(n, [1, 2] * 3 * 4) self.assertIsInstance(n, list) try: o.array *= "a" except TypeError: pass else: self.fail("array * 'a' didn't raise exception") finally: observer.unregister(o, "array")
def testInsert(self): # Use insert method and check that the correct # KVO events get emitted # Same as testGetSetItem, but using slice observer = OCObserve.alloc().init() lst = [1, 2, 3] o = TestArrayPropertyHelper.alloc().init() observer.register(o, "array") self.assertEqual(o.array, []) try: IS = NSIndexSet.alloc().initWithIndex_(0) IS1 = NSIndexSet.alloc().initWithIndex_(4) self.assertEqual(observer.seen, {"array": []}) o.array = lst self.assertEqual(observer.seen, {"array": lst}) self.assertNotIn("indexes", observer.values[-1][-1]) self.assertEqual(o.array[0], 1) o.array.insert(0, "a") self.assertEqual(o.array[0], "a") self.assertEqual(len(o.array), 4) self.assertEqual(observer.seen, {"array": ["a"]}) self.assertEqual(observer.values[-1][-1]["indexes"], IS) self.assertNotIn("old", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["new"], ["a"]) o.array.insert(4, "b") self.assertEqual(o.array[4], "b") self.assertEqual(len(o.array), 5) self.assertEqual(observer.seen, {"array": ["b"]}) self.assertEqual(observer.values[-1][-1]["indexes"], IS1) self.assertNotIn("old", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["new"], ["b"]) self.assertRaises(TypeError, o.array.insert, slice(0, 2), 4) self.assertRaises(TypeError, o.array.insert, "a", 4) o.array.insert(0, "a") finally: observer.unregister(o, "array")
def testInsert(self): # Use insert method and check that the correct # KVO events get emitted # Same as testGetSetItem, but using slice observer = OCObserve.alloc().init() l = [1, 2, 3] o = TestArrayPropertyHelper.alloc().init() observer.register(o, 'array') self.assertEqual(o.array, []) try: IS = NSIndexSet.alloc().initWithIndex_(0) IS1 = NSIndexSet.alloc().initWithIndex_(4) self.assertEqual(observer.seen, {'array': []}) o.array = l self.assertEqual(observer.seen, {'array': l}) self.assertNotIn('indexes', observer.values[-1][-1]) self.assertEqual(o.array[0], 1) o.array.insert(0, 'a') self.assertEqual(o.array[0], 'a') self.assertEqual(len(o.array), 4) self.assertEqual(observer.seen, {'array': ['a']}) self.assertEqual(observer.values[-1][-1]['indexes'], IS) self.assertNotIn('old', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['new'], ['a']) o.array.insert(4, 'b') self.assertEqual(o.array[4], 'b') self.assertEqual(len(o.array), 5) self.assertEqual(observer.seen, {'array': ['b']}) self.assertEqual(observer.values[-1][-1]['indexes'], IS1) self.assertNotIn('old', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['new'], ['b']) self.assertRaises(TypeError, o.array.insert, slice(0, 2), 4) self.assertRaises(TypeError, o.array.insert, 'a', 4) o.array.insert(0, 'a') finally: observer.unregister(o, 'array')
def testInsert(self): # Use insert method and check that the correct # KVO events get emitted # Same as testGetSetItem, but using slice observer = OCObserve.alloc().init() l = [1, 2, 3] o = TestArrayPropertyHelper.alloc().init() observer.register(o, "array") self.assertEqual(o.array, []) try: IS = NSIndexSet.alloc().initWithIndex_(0) IS1 = NSIndexSet.alloc().initWithIndex_(4) self.assertEqual(observer.seen, {"array": []}) o.array = l self.assertEqual(observer.seen, {"array": l}) self.assertNotIn("indexes", observer.values[-1][-1]) self.assertEqual(o.array[0], 1) o.array.insert(0, "a") self.assertEqual(o.array[0], "a") self.assertEqual(len(o.array), 4) self.assertEqual(observer.seen, {"array": ["a"]}) self.assertEqual(observer.values[-1][-1]["indexes"], IS) self.assertNotIn("old", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["new"], ["a"]) o.array.insert(4, "b") self.assertEqual(o.array[4], "b") self.assertEqual(len(o.array), 5) self.assertEqual(observer.seen, {"array": ["b"]}) self.assertEqual(observer.values[-1][-1]["indexes"], IS1) self.assertNotIn("old", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["new"], ["b"]) self.assertRaises(TypeError, o.array.insert, slice(0, 2), 4) self.assertRaises(TypeError, o.array.insert, "a", 4) o.array.insert(0, "a") finally: observer.unregister(o, "array")
def testAddDiscard(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() observer.register(o, "aSet") o.aSet.add(1) self.assertEqual(observer.seen, {"aSet": {1}}) self.assertNotIn("old", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["new"], {1}) o.aSet.discard(1) self.assertNotIn("new", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["old"], {1}) o.aSet.discard(2) self.assertNotIn("new", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["old"], set())
def testDifferenceUpdate(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() o.aSet.add(1) o.aSet.add(2) o.aSet.add(3) observer.register(o, "aSet") o.aSet.difference_update(set([1, 4])) self.assertEquals(o.aSet, set([2, 3])) self.assertEquals(len(observer.values), 1) self.assertEquals(observer.values[-1][-1]["kind"], 3) self.assertNotIn("new", observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]["old"], set([1]))
def testAddDiscard(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() observer.register(o, 'aSet') o.aSet.add(1) self.assertEqual(observer.seen, {'aSet': {1}}) self.assertNotIn('old', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['new'], set([1])) o.aSet.discard(1) self.assertNotIn('new', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['old'], set([1])) o.aSet.discard(2) self.assertNotIn('new', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['old'], set([]))
def testDifferenceUpdate(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() o.aSet.add(1) o.aSet.add(2) o.aSet.add(3) observer.register(o, "aSet") o.aSet.difference_update({1, 4}) self.assertEqual(o.aSet, {2, 3}) self.assertEqual(len(observer.values), 1) self.assertEqual(observer.values[-1][-1]["kind"], 3) self.assertNotIn("new", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["old"], {1})
def testDifferenceUpdate(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() o.aSet.add(1) o.aSet.add(2) o.aSet.add(3) observer.register(o, 'aSet') o.aSet.difference_update(set([1,4])) self.assertEqual(o.aSet, set([2,3])) self.assertEqual(len(observer.values), 1) self.assertEqual(observer.values[-1][-1]['kind'], 3) self.assertNotIn('new', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['old'], set([1]))
def testDifferenceUpdate(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() o.aSet.add(1) o.aSet.add(2) o.aSet.add(3) observer.register(o, 'aSet') o.aSet.difference_update(set([1, 4])) self.assertEqual(o.aSet, set([2, 3])) self.assertEqual(len(observer.values), 1) self.assertEqual(observer.values[-1][-1]['kind'], 3) self.assertNotIn('new', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['old'], set([1]))
def testUpdate(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() observer.register(o, "aSet") self.assertEqual(o.aSet, set()) self.assertEqual(len(observer.values), 1) o.aSet.update([1, 2, 3]) self.assertEqual(len(observer.values), 2) self.assertEqual(observer.values[-1][-1]["kind"], 2) self.assertNotIn("old", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["new"], {1, 2, 3}) o.aSet.update({3, 4, 5}) self.assertEqual(len(observer.values), 3) self.assertEqual(observer.values[-1][-1]["kind"], 2) self.assertNotIn("old", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["new"], {4, 5})
def testUpdate(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() observer.register(o, 'aSet') self.assertEqual(o.aSet, set()) self.assertEqual(len(observer.values), 1) o.aSet.update([1,2,3]) self.assertEqual(len(observer.values), 2) self.assertEqual(observer.values[-1][-1]['kind'], 2) self.assertNotIn('old', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['new'], set([1, 2, 3])) o.aSet.update(set([3,4,5])) self.assertEqual(len(observer.values), 3) self.assertEqual(observer.values[-1][-1]['kind'], 2) self.assertNotIn('old', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['new'], set([4, 5]))
def testGetSetSlice(self): # Same as testGetSetItem, but using slice observer = OCObserve.alloc().init() l = [1, 2, 3] o = TestArrayPropertyHelper.alloc().init() observer.register(o, "array") try: IS = NSIndexSet.alloc().initWithIndexesInRange_((0, 3)) IS2 = NSIndexSet.alloc().initWithIndexesInRange_((1, 2)) IS3 = NSMutableIndexSet.alloc().init() IS3.addIndex_(0) IS3.addIndex_(2) self.assertEqual(observer.seen, {}) o.array = l self.assertEqual(observer.seen, {"array": l}) self.assertNotIn("indexes", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["new"], [1, 2, 3]) o.array[1:3] = [4, 5] self.assertEqual(o.array[0], 1) self.assertEqual(o.array[1], 4) self.assertEqual(o.array[2], 5) self.assertEqual(o.array, [1, 4, 5]) self.assertEqual(observer.seen, {"array": [4, 5]}) self.assertEqual(observer.values[-1][-1]["indexes"], IS2) self.assertEqual(observer.values[-1][-1]["old"], [2, 3]) self.assertEqual(observer.values[-1][-1]["new"], [4, 5]) self.assertEqual(o.array[0], 1) o.array[0:3:2] = [9, 10] self.assertEqual(o.array[0], 9) self.assertEqual(o.array[1], 4) self.assertEqual(o.array[2], 10) self.assertEqual(observer.seen, {"array": [9, 10]}) self.assertEqual(observer.values[-1][-1]["indexes"], IS3) self.assertEqual(observer.values[-1][-1]["old"], [1, 5]) self.assertEqual(observer.values[-1][-1]["new"], [9, 10]) finally: observer.unregister(o, "array")
def testOperators(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() o.aSet = {1,2,3} observer.register(o, 'aSet') self.assertEqual(observer.seen, {}) self.assertEqual(o.aSet - {2}, {1,3}) self.assertEqual(o.aSet, {1,2,3}) self.assertEqual(o.aSet | {4}, {1,2,3,4}) self.assertEqual(o.aSet, {1,2,3}) self.assertEqual(o.aSet & {3,4}, {3}) self.assertEqual(o.aSet, {1,2,3}) self.assertEqual(o.aSet ^ {3,4}, {1,2,4}) self.assertEqual(o.aSet, {1,2,3})
def testAddRemove(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() observer.register(o, 'aSet') o.aSet.add(1) self.assertEquals(len(observer.values), 1) self.assertNotIn('old', observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]['new'], set([1])) o.aSet.remove(1) self.assertEquals(len(observer.values), 2) self.assertNotIn('new', observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]['old'], set([1])) self.assertRaises(KeyError, o.aSet.remove, 2) self.assertEquals(len(observer.values), 3) self.assertNotIn('new', observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]['old'], set([]))
def testOperators(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() o.aSet = {1, 2, 3} observer.register(o, "aSet") self.assertEqual(observer.seen, {}) self.assertEqual(o.aSet - {2}, {1, 3}) self.assertEqual(o.aSet, {1, 2, 3}) self.assertEqual(o.aSet | {4}, {1, 2, 3, 4}) self.assertEqual(o.aSet, {1, 2, 3}) self.assertEqual(o.aSet & {3, 4}, {3}) self.assertEqual(o.aSet, {1, 2, 3}) self.assertEqual(o.aSet ^ {3, 4}, {1, 2, 4}) self.assertEqual(o.aSet, {1, 2, 3})
def testGetSetSlice(self): # Same as testGetSetItem, but using slice observer = OCObserve.alloc().init() l = [1, 2, 3] o = TestArrayPropertyHelper.alloc().init() observer.register(o, 'array') try: IS = NSIndexSet.alloc().initWithIndexesInRange_((0, 3)) IS2 = NSIndexSet.alloc().initWithIndexesInRange_((1, 2)) IS3 = NSMutableIndexSet.alloc().init() IS3.addIndex_(0) IS3.addIndex_(2) self.assertEqual(observer.seen, {}) o.array = l self.assertEqual(observer.seen, {'array': l}) self.assertNotIn('indexes', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['new'], [1, 2, 3]) o.array[1:3] = [4, 5] self.assertEqual(o.array[0], 1) self.assertEqual(o.array[1], 4) self.assertEqual(o.array[2], 5) self.assertEqual(o.array, [1, 4, 5]) self.assertEqual(observer.seen, {'array': [4, 5]}) self.assertEqual(observer.values[-1][-1]['indexes'], IS2) self.assertEqual(observer.values[-1][-1]['old'], [2, 3]) self.assertEqual(observer.values[-1][-1]['new'], [4, 5]) self.assertEqual(o.array[0], 1) o.array[0:3:2] = [9, 10] self.assertEqual(o.array[0], 9) self.assertEqual(o.array[1], 4) self.assertEqual(o.array[2], 10) self.assertEqual(observer.seen, {'array': [9, 10]}) self.assertEqual(observer.values[-1][-1]['indexes'], IS3) self.assertEqual(observer.values[-1][-1]['old'], [1, 5]) self.assertEqual(observer.values[-1][-1]['new'], [9, 10]) finally: observer.unregister(o, 'array')
def testGetSetSlice(self): # Same as testGetSetItem, but using slice observer = OCObserve.alloc().init() l = [1, 2, 3] o = TestArrayPropertyHelper.alloc().init() observer.register(o, 'array') try: IS = NSIndexSet.alloc().initWithIndexesInRange_((0, 3)) IS2 = NSIndexSet.alloc().initWithIndexesInRange_((1, 2)) IS3 = NSMutableIndexSet.alloc().init() IS3.addIndex_(0) IS3.addIndex_(2) self.assertEquals(len(observer.values), 0) o.array = l self.assertEquals(len(observer.values), 1) self.assertNotIn('indexes', observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]['new'], [1, 2, 3]) self.assertEquals(o.array[0], 1) o.array[1:3] = [4, 5] self.assertEquals(o.array[1], 4) self.assertEquals(o.array[2], 5) self.assertEquals(len(observer.values), 2) self.assertEquals(observer.values[-1][-1]['indexes'], IS2) self.assertEquals(observer.values[-1][-1]['old'], [2, 3]) self.assertEquals(observer.values[-1][-1]['new'], [4, 5]) self.assertEquals(o.array[0], 1) o.array[0:3:2] = [9, 10] self.assertEquals(o.array[0], 9) self.assertEquals(o.array[1], 4) self.assertEquals(o.array[2], 10) self.assertEquals(len(observer.values), 3) self.assertEquals(observer.values[-1][-1]['indexes'], IS3) self.assertEquals(observer.values[-1][-1]['old'], [1, 5]) self.assertEquals(observer.values[-1][-1]['new'], [9, 10]) finally: observer.unregister(o, 'array')
def testAddDiscard(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() observer.register(o, "aSet") o.aSet.add(1) self.assertEquals(len(observer.values), 1) self.assertNotIn("old", observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]["new"], set([1])) o.aSet.discard(1) self.assertEquals(len(observer.values), 2) self.assertNotIn("new", observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]["old"], set([1])) o.aSet.discard(2) self.assertEquals(len(observer.values), 3) self.assertNotIn("new", observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]["old"], set([]))
def testAddRemove(self): with OCObserve.alloc().init() as observer: o = TestSetPropertyHelper.alloc().init() observer.register(o, "aSet") o.aSet.add(1) self.assertEquals(len(observer.values), 1) self.assertNotIn("old", observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]["new"], set([1])) o.aSet.remove(1) self.assertEquals(len(observer.values), 2) self.assertNotIn("new", observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]["old"], set([1])) self.assertRaises(KeyError, o.aSet.remove, 2) self.assertEquals(len(observer.values), 3) self.assertNotIn("new", observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]["old"], set([]))
def testPop(self): # Use pop method and check that the correct # KVO events get emitted observer = OCObserve.alloc().init() l = [1, 2, 3, 4] o = TestArrayPropertyHelper.alloc().init() observer.register(o, 'array') try: IS = NSIndexSet.alloc().initWithIndex_(0) IS2 = NSIndexSet.alloc().initWithIndex_(2) self.assertEquals(len(observer.values), 0) o.array = l self.assertEquals(len(observer.values), 1) self.assertNotIn('indexes', observer.values[-1][-1]) self.assertEquals(o.array[0], 1) v = o.array.pop(0) self.assertEquals(v, 1) self.assertEquals(o.array[0], 2) self.assertEquals(len(o.array), 3) self.assertEquals(len(observer.values), 2) self.assertEquals(observer.values[-1][-1]['indexes'], IS) self.assertNotIn('new', observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]['old'], [1]) v = o.array.pop(2) self.assertEquals(v, 4) self.assertEquals(len(o.array), 2) self.assertEquals(len(observer.values), 3) self.assertEquals(observer.values[-1][-1]['indexes'], IS2) self.assertNotIn('new', observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]['old'], [4]) finally: observer.unregister(o, 'array')
def testSetting(self): # Set value, check that # (1) value gets copied # (2) accessing the property result in proxy observer = OCObserve.alloc().init() l = [1, 2, 3] o = TestArrayPropertyHelper.alloc().init() observer.register(o, 'array') try: self.assertEqual(observer.seen, {}) self.assertEqual(len(o.array), 0) self.assertEqual(observer.seen, {'array': []}) o.array = l self.assertEqual(observer.seen, {'array': l}) self.assertEqual(len(o.array), 3) # This shouldn't affect the property l.append(4) self.assertEqual(len(o.array), 3) self.assertEqual(len(l), 4) o.array.append(5) self.assertEqual(len(l), 4) self.assertEqual(len(o.array), 4) finally: observer.unregister(o, 'array') l = [1, 2] o.array2 = l self.assertIsNot(o._array2, l) o.array2 = o.array self.assertEqual(o.array2, [1, 2, 3, 5]) o.array2.append(1) self.assertEqual(o.array2, [1, 2, 3, 5, 1]) self.assertEqual(o.array, [1, 2, 3, 5]) arr = o.array2 o._array2 = None self.assertEqual(arr, [])
def testPop(self): # Use pop method and check that the correct # KVO events get emitted observer = OCObserve.alloc().init() l = [1, 2, 3, 4] o = TestArrayPropertyHelper.alloc().init() observer.register(o, 'array') try: IS = NSIndexSet.alloc().initWithIndex_(0) IS2 = NSIndexSet.alloc().initWithIndex_(2) self.assertEqual(observer.seen, {}) o.array = l self.assertEqual(observer.seen, {'array': l}) self.assertNotIn('indexes', observer.values[-1][-1]) self.assertEqual(o.array[0], 1) v = o.array.pop(0) self.assertEqual(v, 1) self.assertEqual(o.array[0], 2) self.assertEqual(len(o.array), 3) self.assertEqual(observer.values[-1][-1]['indexes'], IS) self.assertNotIn('new', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['old'], [1]) v = o.array.pop(2) self.assertEqual(v, 4) self.assertEqual(len(o.array), 2) self.assertEqual(observer.values[-1][-1]['indexes'], IS2) self.assertNotIn('new', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['old'], [4]) self.assertRaises(TypeError, o.array.pop, slice(0, 2)) self.assertRaises(TypeError, o.array.pop, 'a') finally: observer.unregister(o, 'array')
def testPop(self): # Use pop method and check that the correct # KVO events get emitted observer = OCObserve.alloc().init() l = [1, 2, 3, 4] o = TestArrayPropertyHelper.alloc().init() observer.register(o, "array") try: IS = NSIndexSet.alloc().initWithIndex_(0) IS2 = NSIndexSet.alloc().initWithIndex_(2) self.assertEqual(observer.seen, {}) o.array = l self.assertEqual(observer.seen, {"array": l}) self.assertNotIn("indexes", observer.values[-1][-1]) self.assertEqual(o.array[0], 1) v = o.array.pop(0) self.assertEqual(v, 1) self.assertEqual(o.array[0], 2) self.assertEqual(len(o.array), 3) self.assertEqual(observer.values[-1][-1]["indexes"], IS) self.assertNotIn("new", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["old"], [1]) v = o.array.pop(2) self.assertEqual(v, 4) self.assertEqual(len(o.array), 2) self.assertEqual(observer.values[-1][-1]["indexes"], IS2) self.assertNotIn("new", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["old"], [4]) self.assertRaises(TypeError, o.array.pop, slice(0, 2)) self.assertRaises(TypeError, o.array.pop, "a") finally: observer.unregister(o, "array")
def testSetting(self): # Set value, check that # (1) value gets copied # (2) accessing the property result in proxy observer = OCObserve.alloc().init() l = [1, 2, 3] o = TestArrayPropertyHelper.alloc().init() observer.register(o, "array") try: self.assertEqual(observer.seen, {}) self.assertEqual(len(o.array), 0) self.assertEqual(observer.seen, {"array": []}) o.array = l self.assertEqual(observer.seen, {"array": l}) self.assertEqual(len(o.array), 3) # This shouldn't affect the property l.append(4) self.assertEqual(len(o.array), 3) self.assertEqual(len(l), 4) o.array.append(5) self.assertEqual(len(l), 4) self.assertEqual(len(o.array), 4) finally: observer.unregister(o, "array") l = [1, 2] o.array2 = l self.assertIsNot(o._array2, l) o.array2 = o.array self.assertEqual(o.array2, [1, 2, 3, 5]) o.array2.append(1) self.assertEqual(o.array2, [1, 2, 3, 5, 1]) self.assertEqual(o.array, [1, 2, 3, 5]) arr = o.array2 o._array2 = None self.assertEqual(arr, [])
def testInsert(self): # Use insert method and check that the correct # KVO events get emitted # Same as testGetSetItem, but using slice observer = OCObserve.alloc().init() l = [1, 2, 3] o = TestArrayPropertyHelper.alloc().init() observer.register(o, 'array') try: IS = NSIndexSet.alloc().initWithIndex_(0) IS1 = NSIndexSet.alloc().initWithIndex_(4) self.assertEquals(len(observer.values), 0) o.array = l self.assertEquals(len(observer.values), 1) self.assertNotIn('indexes', observer.values[-1][-1]) self.assertEquals(o.array[0], 1) o.array.insert(0, 'a') self.assertEquals(o.array[0], 'a') self.assertEquals(len(o.array), 4) self.assertEquals(len(observer.values), 2) self.assertEquals(observer.values[-1][-1]['indexes'], IS) self.assertNotIn('old', observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]['new'], ['a']) o.array.insert(4, 'b') self.assertEquals(o.array[4], 'b') self.assertEquals(len(o.array), 5) self.assertEquals(len(observer.values), 3) self.assertEquals(observer.values[-1][-1]['indexes'], IS1) self.assertNotIn('old', observer.values[-1][-1]) self.assertEquals(observer.values[-1][-1]['new'], ['b']) finally: observer.unregister(o, 'array')
def testDefault(self): observer = OCObserve.alloc().init() o = TestDictPropertyHelper.alloc().init() observer.register(o, "aDict") cleanup = [] try: self.assertEqual(len(o.aDict), 0) self.assertEqual(o.aDict, {}) seen = {v[1]: v[2]["new"] for v in observer.values} self.assertEqual(seen, {"aDict": {}}) o.aDict["key"] = 42 seen = {v[1]: v[2]["new"] for v in observer.values} self.assertEqual(seen, {"aDict": {"key": 42}}) observer.register(o, "aDict.key") cleanup.append(lambda: observer.unregister(o, "aDict.key")) o.aDict["key"] = 43 seen = {v[1]: v[2]["new"] for v in observer.values} self.assertEqual(seen, {"aDict": {"key": 43}, "aDict.key": 43}) self.assertNotIn("indexes", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["old"], 42) self.assertEqual(observer.values[-1][-1]["new"], 43) del o.aDict["key"] seen = {v[1]: v[2]["new"] for v in observer.values} self.assertEqual(seen, {"aDict": {}, "aDict.key": None}) self.assertNotIn("indexes", observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]["old"], 43) self.assertEqual(observer.values[-1][-1]["new"], None) finally: observer.unregister(o, "aDict") for func in cleanup[::-1]: func()
def testDefault(self): observer = OCObserve.alloc().init() o = TestDictPropertyHelper.alloc().init() observer.register(o, 'aDict') cleanup = [] try: self.assertEqual(len(o.aDict), 0) self.assertEqual(o.aDict, {}) seen = { v[1]: v[2]['new'] for v in observer.values } self.assertEqual(seen, {'aDict': {}}) o.aDict['key'] = 42 seen = { v[1]: v[2]['new'] for v in observer.values } self.assertEqual(seen, {'aDict': { 'key': 42}}) observer.register(o, 'aDict.key') cleanup.append(lambda: observer.unregister(o, 'aDict.key')) o.aDict['key'] = 43 seen = { v[1]: v[2]['new'] for v in observer.values } self.assertEqual(seen, {'aDict': { 'key': 43}, 'aDict.key': 43}) self.assertNotIn('indexes', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['old'], 42) self.assertEqual(observer.values[-1][-1]['new'], 43) del o.aDict['key'] seen = { v[1]: v[2]['new'] for v in observer.values } self.assertEqual(seen, {'aDict': {}, 'aDict.key': None}) self.assertNotIn('indexes', observer.values[-1][-1]) self.assertEqual(observer.values[-1][-1]['old'], 43) self.assertEqual(observer.values[-1][-1]['new'], None) finally: observer.unregister(o, 'aDict') for func in cleanup[::-1]: func()