1 # Copyright 2013 The Chromium Authors. All rights reserved. 2 # Use of this source code is governed by a BSD-style license that can be 3 # found in the LICENSE file. 4 import os 5 import unittest 6 7 from py_utils import discover 8 9 10 class DiscoverTest(unittest.TestCase): 11 12 def setUp(self): 13 self._base_dir = os.path.join(os.path.dirname(__file__), 'test_data') 14 self._start_dir = os.path.join(self._base_dir, 'discoverable_classes') 15 self._base_class = Exception 16 17 def testDiscoverClassesWithIndexByModuleName(self): 18 classes = discover.DiscoverClasses(self._start_dir, 19 self._base_dir, 20 self._base_class, 21 index_by_class_name=False) 22 23 actual_classes = dict((name, cls.__name__) 24 for name, cls in classes.iteritems()) 25 expected_classes = { 26 'another_discover_dummyclass': 'DummyExceptionWithParameterImpl1', 27 'discover_dummyclass': 'DummyException', 28 'parameter_discover_dummyclass': 'DummyExceptionWithParameterImpl2' 29 } 30 self.assertEqual(actual_classes, expected_classes) 31 32 def testDiscoverDirectlyConstructableClassesWithIndexByClassName(self): 33 classes = discover.DiscoverClasses(self._start_dir, 34 self._base_dir, 35 self._base_class, 36 directly_constructable=True) 37 38 actual_classes = dict((name, cls.__name__) 39 for name, cls in classes.iteritems()) 40 expected_classes = { 41 'dummy_exception': 'DummyException', 42 'dummy_exception_impl1': 'DummyExceptionImpl1', 43 'dummy_exception_impl2': 'DummyExceptionImpl2', 44 } 45 self.assertEqual(actual_classes, expected_classes) 46 47 def testDiscoverClassesWithIndexByClassName(self): 48 classes = discover.DiscoverClasses(self._start_dir, self._base_dir, 49 self._base_class) 50 51 actual_classes = dict((name, cls.__name__) 52 for name, cls in classes.iteritems()) 53 expected_classes = { 54 'dummy_exception': 'DummyException', 55 'dummy_exception_impl1': 'DummyExceptionImpl1', 56 'dummy_exception_impl2': 'DummyExceptionImpl2', 57 'dummy_exception_with_parameter_impl1': 58 'DummyExceptionWithParameterImpl1', 59 'dummy_exception_with_parameter_impl2': 60 'DummyExceptionWithParameterImpl2' 61 } 62 self.assertEqual(actual_classes, expected_classes) 63 64 def testDiscoverClassesWithPatternAndIndexByModule(self): 65 classes = discover.DiscoverClasses(self._start_dir, 66 self._base_dir, 67 self._base_class, 68 pattern='another*', 69 index_by_class_name=False) 70 71 actual_classes = dict((name, cls.__name__) 72 for name, cls in classes.iteritems()) 73 expected_classes = { 74 'another_discover_dummyclass': 'DummyExceptionWithParameterImpl1' 75 } 76 self.assertEqual(actual_classes, expected_classes) 77 78 def testDiscoverDirectlyConstructableClassesWithPatternAndIndexByClassName( 79 self): 80 classes = discover.DiscoverClasses(self._start_dir, 81 self._base_dir, 82 self._base_class, 83 pattern='another*', 84 directly_constructable=True) 85 86 actual_classes = dict((name, cls.__name__) 87 for name, cls in classes.iteritems()) 88 expected_classes = { 89 'dummy_exception_impl1': 'DummyExceptionImpl1', 90 'dummy_exception_impl2': 'DummyExceptionImpl2', 91 } 92 self.assertEqual(actual_classes, expected_classes) 93 94 def testDiscoverClassesWithPatternAndIndexByClassName(self): 95 classes = discover.DiscoverClasses(self._start_dir, 96 self._base_dir, 97 self._base_class, 98 pattern='another*') 99 100 actual_classes = dict((name, cls.__name__) 101 for name, cls in classes.iteritems()) 102 expected_classes = { 103 'dummy_exception_impl1': 'DummyExceptionImpl1', 104 'dummy_exception_impl2': 'DummyExceptionImpl2', 105 'dummy_exception_with_parameter_impl1': 106 'DummyExceptionWithParameterImpl1', 107 } 108 self.assertEqual(actual_classes, expected_classes) 109 110 111 class ClassWithoutInitDefOne: # pylint: disable=old-style-class, no-init 112 pass 113 114 115 class ClassWithoutInitDefTwo(object): 116 pass 117 118 119 class ClassWhoseInitOnlyHasSelf(object): 120 def __init__(self): 121 pass 122 123 124 class ClassWhoseInitWithDefaultArguments(object): 125 def __init__(self, dog=1, cat=None, cow=None, fud='a'): 126 pass 127 128 129 class ClassWhoseInitWithDefaultArgumentsAndNonDefaultArguments(object): 130 def __init__(self, x, dog=1, cat=None, fish=None, fud='a'): 131 pass 132 133 134 class IsDirectlyConstructableTest(unittest.TestCase): 135 136 def testIsDirectlyConstructableReturnsTrue(self): 137 self.assertTrue(discover.IsDirectlyConstructable(ClassWithoutInitDefOne)) 138 self.assertTrue(discover.IsDirectlyConstructable(ClassWithoutInitDefTwo)) 139 self.assertTrue(discover.IsDirectlyConstructable(ClassWhoseInitOnlyHasSelf)) 140 self.assertTrue( 141 discover.IsDirectlyConstructable(ClassWhoseInitWithDefaultArguments)) 142 143 def testIsDirectlyConstructableReturnsFalse(self): 144 self.assertFalse( 145 discover.IsDirectlyConstructable( 146 ClassWhoseInitWithDefaultArgumentsAndNonDefaultArguments)) 147