#! /usr/bin/env python
# -*- coding: iso-8859-1 -*-
#-----------------------------------------------------------------------------
# Modeling Framework: an Object-Relational Bridge for python
#
# Copyright (c) 2001-2004 Sbastien Bigaret <sbigaret@users.sourceforge.net>
# All rights reserved.
#
# This file is part of the Modeling Framework.
#
# This code is distributed under a "3-clause BSD"-style license;
# see the LICENSE file for details.
#-----------------------------------------------------------------------------
"""Tests KeyValueCoding"""
import unittest
if __name__ == "__main__":
import utils, sys
utils.fixpath()
from Modeling.KeyValueCoding import KeyValueCoding
class KVC_TestClass(KeyValueCoding):
"-"
_attr6=None
def __init__(self):
self.attr0=0 # Alone
self._attr1=1 # Alone
self.attr2=2 # w/ getAttr2()
self.attr3=3 # w/ _getAttr3()
self.attr4=4 # w/ attr4()
self.attr5=5 # w/ _attr5()
self.attr123=123 # bug #814007
self._attr123=321
# Getters
def getAttr2(self):
return self.attr2
def getAttr3(self):
return self.attr3
def _getAttr3(self):
raise 'Unimplemented'
def attr4(self):
return self.attr4
def _attr5(self):
return self.attr5
# Setters
def setAttr2(self, value):
self.attr2=value
def _setAttr3(self, value):
self.attr3=value
# Error handling:
# Same as the default error handling implemented in DatabaseObject
def handleTakeStoredValueForUnboundKey(self, value, key):
if key and key[0]!='_':
key='_'+key
self.__dict__[key]=value
# Three classes for keypath testing
# B1 ---> A
# -->> C
# B1 ---> A
# C ---> B1
# ---> B2
class A(KeyValueCoding):
def __init__(self): self.attribute_one="I'm the one"
class B1(KeyValueCoding):
def __init__(self): self.mya=A(); self.cs=(C(1), C(2))
def toA(self): return self.mya
def toCs(self): return self.cs
class B2(KeyValueCoding):
def __init__(self): self._toA=A()
def toA(self): return self._toA
class C(KeyValueCoding):
def __init__(self, attr=0):
if attr: self.attr1=attr
else:
self.b1=B1()
self.b2=B2()
class TestKeyValueCoding(unittest.TestCase):
"Empty for now"
def test_01_public_getters(self):
"[KeyValueCoding] Tests the so-called public getters"
t=KVC_TestClass()
self.assertEqual(t.valueForKey('attr0'), 0)
self.assertEqual(t.valueForKey('attr1'), 1)
self.assertEqual(t.valueForKey('attr2'), 2)
self.assertEqual(t.valueForKey('getAttr2'), 2)
self.assertEqual(t.valueForKey('attr3'), 3)
self.assertEqual(t.valueForKey('attr4'), 4)
self.assertEqual(t.valueForKey('attr5'), 5)
self.assertEqual(t.valueForKey('attr123'), 123) # bug #814007
def test_02_public_setters(self):
"[KeyValueCoding] Tests the so-called public setters"
t=KVC_TestClass()
t.takeValueForKey(99, 'attr0')
self.assertEqual(t.valueForKey('attr0'), 99)
t.takeValueForKey(99, 'attr1')
self.assertEqual(t.valueForKey('attr1'), 99)
t.takeValueForKey(99, 'attr2')
self.assertEqual(t.valueForKey('attr2'), 99)
t.takeValueForKey(99, 'attr3')
self.assertEqual(t.valueForKey('attr3'), 99)
t.takeValueForKey(99, 'attr4')
self.assertEqual(t.valueForKey('attr4'), 99)
t.takeValueForKey(99, 'attr5')
self.assertEqual(t.valueForKey('attr5'), 99)
def test_03_private_getters(self):
"[KeyValueCoding] Tests the so-called private getters: storedValueForKey()"
t=KVC_TestClass()
self.assertEqual(t.storedValueForKey('attr0'), 0)
self.assertEqual(t.storedValueForKey('attr1'), 1)
self.assertEqual(t.storedValueForKey('attr2'), 2)
self.assertEqual(t.storedValueForKey('getAttr2'), 2)
#self.assertEqual(t.storedValueForKey('attr3'), 3)
self.failUnlessRaises('Unimplemented', t.storedValueForKey, 'attr3')
self.assertEqual(t.storedValueForKey('attr4'), 4)
self.assertEqual(t.storedValueForKey('attr5'), 5)
self.assertEqual(t.storedValueForKey('attr123'), 321) # bug #814007
def test_04_private_getters(self):
"[KeyValueCoding] Tests the so-called private setters: takeValueForKey()"
t=KVC_TestClass()
t.takeStoredValueForKey(99, 'attr0')
self.assertEqual(t.storedValueForKey('attr0'), 99)
t.takeStoredValueForKey(99, 'attr1')
self.assertEqual(t.storedValueForKey('attr1'), 99)
t.takeStoredValueForKey(99, 'attr2')
self.assertEqual(t.storedValueForKey('attr2'), 99)
t.takeStoredValueForKey(99, 'attr3')
self.failUnlessRaises('Unimplemented', t.storedValueForKey, 'attr3')
self.assertEqual(t.valueForKey('attr3'), 99)
t.takeStoredValueForKey(99, 'attr4')
self.assertEqual(t.storedValueForKey('attr4'), 99)
t.takeStoredValueForKey(99, 'attr5')
self.assertEqual(t.storedValueForKey('attr5'), 99)
t.takeStoredValueForKey(99, 'attr6')
self.assertEqual(t.storedValueForKey('attr6'), 99)
self.assertEqual(t._attr6, 99)
self.assertEqual(KVC_TestClass._attr6, None)
def test_05_keypath_getters(self):
"[KeyValueCoding] Tests valueForKeyPath()"
c=C()
a=A()
self.assertEqual(a.valueForKeyPath('attribute_one'), "I'm the one")
self.assertEqual(c.valueForKeyPath('b2.toA.attribute_one'), "I'm the one")
self.assertEqual(c.valueForKeyPath('b1.toA.attribute_one'), "I'm the one")
self.assertEqual(c.valueForKeyPath('b1.mya.attribute_one'), "I'm the one")
# Tests for toMany.toOne
b1=B1()
attrs=b1.valueForKeyPath('toCs.attr1')
self.failUnless(len(attrs)==2)
self.failUnless(1 in attrs)
self.failUnless(2 in attrs)
def test_06_keypath_setters(self):
"[KeyValueCoding] Tests takeValueForKeyPath()"
c=C()
c.takeValueForKeyPath('number 1', 'b2.toA.attribute_one')
self.assertEqual(c.valueForKeyPath('b2.toA.attribute_one'), "number 1")
c.takeValueForKeyPath('number 2', 'b1.toA.attribute_one')
self.assertEqual(c.valueForKeyPath('b1.toA.attribute_one'), "number 2")
c.takeValueForKeyPath('number 3', 'b1.mya.attribute_one')
self.assertEqual(c.valueForKeyPath('b1.toA.attribute_one'), "number 3")
def test_07_valuesForKeys(self):
"[KeyValueCoding] Tests (stored)valuesForKeys"
t=KVC_TestClass()
self.assertEqual(t.valuesForKeys(('attr0','attr4','attr1','attr3')),
[0, 4, 1, 3])
t.takeValuesFromDictionary({'attr0':60,'attr4':44,'attr1':71,'attr3':93})
self.assertEqual(t.valuesForKeys(('attr0','attr1','attr3','attr4')),
[60, 71, 93, 44])
t.takeStoredValuesFromDictionary({'attr0':20,'attr4':14,'attr1':41,'attr3':73})
self.assertEqual(t.valuesForKeys(('attr0','attr1','attr3','attr4')),
[20, 41, 73, 14])
def test_private(self):
"[KeyValueCoding] Tests that 1 is equal to 1"
self.assertEqual(1, 1)
def test_suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestKeyValueCoding, "test_"))
return suite
if __name__ == "__main__":
errs = utils.run_suite(test_suite())
sys.exit(errs and 1 or 0)
|