[Python-checkins] python/dist/src/Lib/test test_isinstance.py,1.1,1.2

nascheme@sourceforge.net nascheme@sourceforge.net
Tue, 23 Apr 2002 20:33:04 -0700


Update of /cvsroot/python/python/dist/src/Lib/test
In directory usw-pr-cvs1:/tmp/cvs-serv14984/Lib/test

Modified Files:
	test_isinstance.py 
Log Message:
Add more tests for abstract isinstance() and issubclass().


Index: test_isinstance.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/test/test_isinstance.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** test_isinstance.py	23 Apr 2002 22:48:42 -0000	1.1
--- test_isinstance.py	24 Apr 2002 03:33:02 -0000	1.2
***************
*** 8,12 ****
  
  
! class TestIsInstanceWhitebox(unittest.TestCase):
      # Test to make sure that an AttributeError when accessing the instance's
      # class's bases is masked.  This was actually a bug in Python 2.2 and
--- 8,12 ----
  
  
! class TestIsInstanceExceptions(unittest.TestCase):
      # Test to make sure that an AttributeError when accessing the instance's
      # class's bases is masked.  This was actually a bug in Python 2.2 and
***************
*** 87,91 ****
  # issubclass() instead of isinstance() -- really PyObject_IsSubclass()
  # vs. PyObject_IsInstance().
! class TestIsSubclassWhitebox(unittest.TestCase):
      def test_dont_mask_non_attribute_error(self):
          class C(object):
--- 87,91 ----
  # issubclass() instead of isinstance() -- really PyObject_IsSubclass()
  # vs. PyObject_IsInstance().
! class TestIsSubclassExceptions(unittest.TestCase):
      def test_dont_mask_non_attribute_error(self):
          class C(object):
***************
*** 134,141 ****
  
  
  def test_main():
      suite = unittest.TestSuite()
!     suite.addTest(unittest.makeSuite(TestIsInstanceWhitebox))
!     suite.addTest(unittest.makeSuite(TestIsSubclassWhitebox))
      test_support.run_suite(suite)
  
--- 134,230 ----
  
  
+ # meta classes for creating abstract classes and instances
+ class AbstractClass(object):
+     def __init__(self, bases):
+         self.bases = bases
+ 
+     def getbases(self):
+         return self.bases
+     __bases__ = property(getbases)
+ 
+     def __call__(self):
+         return AbstractInstance(self)
+ 
+ class AbstractInstance(object):
+     def __init__(self, klass):
+         self.klass = klass
+ 
+     def getclass(self):
+         return self.klass
+     __class__ = property(getclass)
+ 
+ # abstract classes
+ AbstractSuper = AbstractClass(bases=())
+ 
+ AbstractChild = AbstractClass(bases=(AbstractSuper,))
+ 
+ # normal classes
+ class Super:
+     pass
+ 
+ class Child(Super):
+     pass
+ 
+ 
+ 
+ class TestIsInstanceIsSubclass(unittest.TestCase):
+     # Tests to ensure that isinstance and issubclass work on abstract
+     # classes and instances.  Before the 2.2 release, TypeErrors were
+     # raised when boolean values should have been returned.  The bug was
+     # triggered by mixing 'normal' classes and instances were with
+     # 'abstract' classes and instances.  This case tries to test all
+     # combinations.
+ 
+     def test_isinstance_normal(self):
+         # normal instances   
+         self.assertEqual(True, isinstance(Super(), Super))
+         self.assertEqual(False, isinstance(Super(), Child))
+         self.assertEqual(False, isinstance(Super(), AbstractSuper))
+         self.assertEqual(False, isinstance(Super(), AbstractChild))
+ 
+         self.assertEqual(True, isinstance(Child(), Super))
+         self.assertEqual(False, isinstance(Child(), AbstractSuper))
+ 
+     def test_isinstance_abstract(self):
+         # abstract instances   
+         self.assertEqual(True, isinstance(AbstractSuper(), AbstractSuper))
+         self.assertEqual(False, isinstance(AbstractSuper(), AbstractChild))
+         self.assertEqual(False, isinstance(AbstractSuper(), Super))
+         self.assertEqual(False, isinstance(AbstractSuper(), Child))
+ 
+         self.assertEqual(True, isinstance(AbstractChild(), AbstractChild))
+         self.assertEqual(True, isinstance(AbstractChild(), AbstractSuper))
+         self.assertEqual(False, isinstance(AbstractChild(), Super))
+         self.assertEqual(False, isinstance(AbstractChild(), Child))
+     
+     def test_subclass_normal(self):
+         # normal classes
+         self.assertEqual(True, issubclass(Super, Super))
+         self.assertEqual(False, issubclass(Super, AbstractSuper))
+         self.assertEqual(False, issubclass(Super, Child))
+ 
+         self.assertEqual(True, issubclass(Child, Child))
+         self.assertEqual(True, issubclass(Child, Super))
+         self.assertEqual(False, issubclass(Child, AbstractSuper))
+ 
+     def test_subclass_abstract(self):
+         # abstract classes
+         self.assertEqual(True, issubclass(AbstractSuper, AbstractSuper))
+         self.assertEqual(False, issubclass(AbstractSuper, AbstractChild))
+         self.assertEqual(False, issubclass(AbstractSuper, Child))
+ 
+         self.assertEqual(True, issubclass(AbstractChild, AbstractChild))
+         self.assertEqual(True, issubclass(AbstractChild, AbstractSuper))
+         self.assertEqual(False, issubclass(AbstractChild, Super))
+         self.assertEqual(False, issubclass(AbstractChild, Child))
+  
+ 
+ 
+ 
  def test_main():
      suite = unittest.TestSuite()
!     suite.addTest(unittest.makeSuite(TestIsInstanceExceptions))
!     suite.addTest(unittest.makeSuite(TestIsSubclassExceptions))
!     suite.addTest(unittest.makeSuite(TestIsInstanceIsSubclass))
      test_support.run_suite(suite)