summaryrefslogtreecommitdiff
path: root/astroid/tests
diff options
context:
space:
mode:
authorCeridwen <ceridwenv@gmail.com>2015-11-02 00:10:54 -0500
committerCeridwen <ceridwenv@gmail.com>2015-11-02 00:10:54 -0500
commit1ba0f2d96fbc45ff0b6014b12db98716183e8277 (patch)
tree54b7c4d3ecad6fcda1211ea3a8e5f11f6b407287 /astroid/tests
parent83f6c45c343cae87f415268959b1056030a5e74c (diff)
downloadastroid-1ba0f2d96fbc45ff0b6014b12db98716183e8277.tar.gz
This bookmark adds structured exceptions to astroid.
Major changes: * AstroidError has an __init__ that accepts arbitrary keyword-only arguments for adding information to exceptions, and a __str__ that lazily uses exception attributes to generate a message. The first positional argument to an exception is assigned to .message. The new API should be fully backwards compatible in general. * Some exceptions are combined or renamed; the old names are still available. * The OperationErrors used by pylint are now BadOperationMessages and located in util.py. * The AstroidBuildingException in _data_build stores the SyntaxError in its .error attribute rather than args[0]. * Many places where exceptions are raised have new, hopefully more useful error messages. The only major issue remaining is how to propagate information into decorators.
Diffstat (limited to 'astroid/tests')
-rw-r--r--astroid/tests/unittest_brain.py2
-rw-r--r--astroid/tests/unittest_builder.py2
-rw-r--r--astroid/tests/unittest_lookup.py6
-rw-r--r--astroid/tests/unittest_nodes.py8
-rw-r--r--astroid/tests/unittest_objects.py20
-rw-r--r--astroid/tests/unittest_scoped_nodes.py45
6 files changed, 41 insertions, 42 deletions
diff --git a/astroid/tests/unittest_brain.py b/astroid/tests/unittest_brain.py
index 3520b49..ca47d52 100644
--- a/astroid/tests/unittest_brain.py
+++ b/astroid/tests/unittest_brain.py
@@ -134,7 +134,7 @@ class NamedTupleTest(unittest.TestCase):
instance = next(result.infer())
self.assertEqual(len(instance.getattr('scheme')), 1)
self.assertEqual(len(instance.getattr('port')), 1)
- with self.assertRaises(astroid.NotFoundError):
+ with self.assertRaises(astroid.AttributeInferenceError):
instance.getattr('foo')
self.assertEqual(len(instance.getattr('geturl')), 1)
self.assertEqual(instance.name, 'ParseResult')
diff --git a/astroid/tests/unittest_builder.py b/astroid/tests/unittest_builder.py
index 84bf50c..485963b 100644
--- a/astroid/tests/unittest_builder.py
+++ b/astroid/tests/unittest_builder.py
@@ -451,7 +451,7 @@ class BuilderTest(unittest.TestCase):
self.assertIsInstance(astroid.getattr('CSTE')[0], nodes.AssignName)
self.assertEqual(astroid.getattr('CSTE')[0].fromlineno, 2)
self.assertEqual(astroid.getattr('CSTE')[1].fromlineno, 6)
- with self.assertRaises(exceptions.NotFoundError):
+ with self.assertRaises(exceptions.AttributeInferenceError):
astroid.getattr('CSTE2')
with self.assertRaises(exceptions.InferenceError):
next(astroid['global_no_effect'].ilookup('CSTE2'))
diff --git a/astroid/tests/unittest_lookup.py b/astroid/tests/unittest_lookup.py
index 805efd9..7f9c43a 100644
--- a/astroid/tests/unittest_lookup.py
+++ b/astroid/tests/unittest_lookup.py
@@ -174,7 +174,7 @@ class LookupTest(resources.SysPathSetup, unittest.TestCase):
if sys.version_info < (3, 0):
self.assertEqual(var.inferred(), [util.YES])
else:
- self.assertRaises(exceptions.UnresolvableName, var.inferred)
+ self.assertRaises(exceptions.NameInferenceError, var.inferred)
def test_dict_comps(self):
astroid = builder.parse("""
@@ -210,7 +210,7 @@ class LookupTest(resources.SysPathSetup, unittest.TestCase):
var
""")
var = astroid.body[1].value
- self.assertRaises(exceptions.UnresolvableName, var.inferred)
+ self.assertRaises(exceptions.NameInferenceError, var.inferred)
def test_generator_attributes(self):
tree = builder.parse("""
@@ -250,7 +250,7 @@ class LookupTest(resources.SysPathSetup, unittest.TestCase):
self.assertTrue(p2.getattr('__name__'))
self.assertTrue(astroid['NoName'].getattr('__name__'))
p3 = next(astroid['p3'].infer())
- self.assertRaises(exceptions.NotFoundError, p3.getattr, '__name__')
+ self.assertRaises(exceptions.AttributeInferenceError, p3.getattr, '__name__')
def test_function_module_special(self):
astroid = builder.parse('''
diff --git a/astroid/tests/unittest_nodes.py b/astroid/tests/unittest_nodes.py
index ade8a92..55c7268 100644
--- a/astroid/tests/unittest_nodes.py
+++ b/astroid/tests/unittest_nodes.py
@@ -331,13 +331,13 @@ class ImportNodeTest(resources.SysPathSetup, unittest.TestCase):
self.assertEqual(from_.real_name('NameNode'), 'Name')
imp_ = self.module['os']
self.assertEqual(imp_.real_name('os'), 'os')
- self.assertRaises(exceptions.NotFoundError, imp_.real_name, 'os.path')
+ self.assertRaises(exceptions.AttributeInferenceError, imp_.real_name, 'os.path')
imp_ = self.module['NameNode']
self.assertEqual(imp_.real_name('NameNode'), 'Name')
- self.assertRaises(exceptions.NotFoundError, imp_.real_name, 'Name')
+ self.assertRaises(exceptions.AttributeInferenceError, imp_.real_name, 'Name')
imp_ = self.module2['YO']
self.assertEqual(imp_.real_name('YO'), 'YO')
- self.assertRaises(exceptions.NotFoundError, imp_.real_name, 'data')
+ self.assertRaises(exceptions.AttributeInferenceError, imp_.real_name, 'data')
def test_as_string(self):
ast = self.module['modutils']
@@ -502,7 +502,7 @@ class UnboundMethodNodeTest(unittest.TestCase):
meth = A.test
''')
node = next(ast['meth'].infer())
- with self.assertRaises(exceptions.NotFoundError):
+ with self.assertRaises(exceptions.AttributeInferenceError):
node.getattr('__missssing__')
name = node.getattr('__name__')[0]
self.assertIsInstance(name, nodes.Const)
diff --git a/astroid/tests/unittest_objects.py b/astroid/tests/unittest_objects.py
index e0a04d5..dc91d94 100644
--- a/astroid/tests/unittest_objects.py
+++ b/astroid/tests/unittest_objects.py
@@ -233,15 +233,15 @@ class SuperTests(unittest.TestCase):
self.assertIsInstance(first, objects.Super)
with self.assertRaises(exceptions.SuperError) as cm:
first.super_mro()
- self.assertEqual(str(cm.exception), "The first super argument must be type.")
- for node in ast_nodes[1:]:
+ self.assertIsInstance(cm.exception.super_.mro_pointer, nodes.Const)
+ self.assertEqual(cm.exception.super_.mro_pointer.value, 1)
+ for node, invalid_type in zip(ast_nodes[1:],
+ (nodes.Const, bases.Instance)):
inferred = next(node.infer())
self.assertIsInstance(inferred, objects.Super, node)
- with self.assertRaises(exceptions.SuperArgumentTypeError) as cm:
+ with self.assertRaises(exceptions.SuperError) as cm:
inferred.super_mro()
- self.assertEqual(str(cm.exception),
- "super(type, obj): obj must be an instance "
- "or subtype of type", node)
+ self.assertIsInstance(cm.exception.super_.type, invalid_type)
def test_proxied(self):
node = test_utils.extract_node('''
@@ -338,9 +338,9 @@ class SuperTests(unittest.TestCase):
with self.assertRaises(exceptions.InferenceError):
next(ast_nodes[2].infer())
fourth = next(ast_nodes[3].infer())
- with self.assertRaises(exceptions.NotFoundError):
+ with self.assertRaises(exceptions.AttributeInferenceError):
fourth.getattr('test3')
- with self.assertRaises(exceptions.NotFoundError):
+ with self.assertRaises(exceptions.AttributeInferenceError):
next(fourth.igetattr('test3'))
first_unbound = next(ast_nodes[4].infer())
@@ -362,7 +362,7 @@ class SuperTests(unittest.TestCase):
super(Super, self) #@
''')
inferred = next(node.infer())
- with self.assertRaises(exceptions.NotFoundError):
+ with self.assertRaises(exceptions.AttributeInferenceError):
next(inferred.getattr('test'))
def test_super_complex_mro(self):
@@ -491,7 +491,7 @@ class SuperTests(unittest.TestCase):
inferred = next(node.infer())
with self.assertRaises(exceptions.SuperError):
inferred.super_mro()
- with self.assertRaises(exceptions.SuperArgumentTypeError):
+ with self.assertRaises(exceptions.SuperError):
inferred.super_mro()
diff --git a/astroid/tests/unittest_scoped_nodes.py b/astroid/tests/unittest_scoped_nodes.py
index 329aa69..47807aa 100644
--- a/astroid/tests/unittest_scoped_nodes.py
+++ b/astroid/tests/unittest_scoped_nodes.py
@@ -24,12 +24,13 @@ from functools import partial
import unittest
import warnings
+import astroid
from astroid import builder
from astroid import nodes
from astroid import scoped_nodes
from astroid import util
from astroid.exceptions import (
- InferenceError, NotFoundError,
+ InferenceError, AttributeInferenceError,
NoDefault, ResolveError, MroError,
InconsistentMroError, DuplicateBasesError,
)
@@ -75,7 +76,7 @@ class ModuleNodeTest(ModuleLoader, unittest.TestCase):
os.path.abspath(resources.find('data/module.py')))
self.assertEqual(len(self.module.getattr('__dict__')), 1)
self.assertIsInstance(self.module.getattr('__dict__')[0], nodes.Dict)
- self.assertRaises(NotFoundError, self.module.getattr, '__path__')
+ self.assertRaises(AttributeInferenceError, self.module.getattr, '__path__')
self.assertEqual(len(self.pack.getattr('__path__')), 1)
self.assertIsInstance(self.pack.getattr('__path__')[0], nodes.List)
@@ -101,7 +102,6 @@ class ModuleNodeTest(ModuleLoader, unittest.TestCase):
self.assertEqual(cnx.name, 'Connection')
self.assertEqual(cnx.root().name, 'data.SSL1.Connection1')
self.assertEqual(len(self.nonregr.getattr('enumerate')), 2)
- # raise ResolveError
self.assertRaises(InferenceError, self.nonregr.igetattr, 'YOAA')
def test_wildcard_import_names(self):
@@ -574,7 +574,7 @@ class ClassNodeTest(ModuleLoader, unittest.TestCase):
self.assertEqual(cls.getattr('__module__')[0].value, 'data.module')
self.assertEqual(len(cls.getattr('__dict__')), 1)
if not cls.newstyle:
- self.assertRaises(NotFoundError, cls.getattr, '__mro__')
+ self.assertRaises(AttributeInferenceError, cls.getattr, '__mro__')
for cls in (nodes.List._proxied, nodes.Const(1)._proxied):
self.assertEqual(len(cls.getattr('__bases__')), 1)
self.assertEqual(len(cls.getattr('__name__')), 1)
@@ -620,9 +620,9 @@ class ClassNodeTest(ModuleLoader, unittest.TestCase):
def test_instance_special_attributes(self):
for inst in (Instance(self.module['YO']), nodes.List(), nodes.Const(1)):
- self.assertRaises(NotFoundError, inst.getattr, '__mro__')
- self.assertRaises(NotFoundError, inst.getattr, '__bases__')
- self.assertRaises(NotFoundError, inst.getattr, '__name__')
+ self.assertRaises(AttributeInferenceError, inst.getattr, '__mro__')
+ self.assertRaises(AttributeInferenceError, inst.getattr, '__bases__')
+ self.assertRaises(AttributeInferenceError, inst.getattr, '__name__')
self.assertEqual(len(inst.getattr('__dict__')), 1)
self.assertEqual(len(inst.getattr('__doc__')), 1)
@@ -718,7 +718,7 @@ class ClassNodeTest(ModuleLoader, unittest.TestCase):
method_locals = klass2.local_attr('method')
self.assertEqual(len(method_locals), 1)
self.assertEqual(method_locals[0].name, 'method')
- self.assertRaises(NotFoundError, klass2.local_attr, 'nonexistant')
+ self.assertRaises(AttributeInferenceError, klass2.local_attr, 'nonexistant')
methods = {m.name for m in klass2.methods()}
self.assertTrue(methods.issuperset(expected_methods))
@@ -1297,18 +1297,16 @@ class ClassNodeTest(ModuleLoader, unittest.TestCase):
self.assertEqualMro(astroid['E1'], ['E1', 'C1', 'B1', 'A1', 'object'])
with self.assertRaises(InconsistentMroError) as cm:
astroid['F1'].mro()
- self.assertEqual(str(cm.exception),
- "Cannot create a consistent method resolution order "
- "for bases (B1, C1, A1, object), "
- "(C1, B1, A1, object)")
-
+ A1 = astroid.getattr('A1')[0]
+ B1 = astroid.getattr('B1')[0]
+ C1 = astroid.getattr('C1')[0]
+ object_ = builder.MANAGER.astroid_cache[BUILTINS].getattr('object')[0]
+ self.assertEqual(cm.exception.mros, [[B1, C1, A1, object_],
+ [C1, B1, A1, object_]])
with self.assertRaises(InconsistentMroError) as cm:
astroid['G1'].mro()
- self.assertEqual(str(cm.exception),
- "Cannot create a consistent method resolution order "
- "for bases (C1, B1, A1, object), "
- "(B1, C1, A1, object)")
-
+ self.assertEqual(cm.exception.mros, [[C1, B1, A1, object_],
+ [B1, C1, A1, object_]])
self.assertEqualMro(
astroid['PedalWheelBoat'],
["PedalWheelBoat", "EngineLess",
@@ -1329,9 +1327,10 @@ class ClassNodeTest(ModuleLoader, unittest.TestCase):
with self.assertRaises(DuplicateBasesError) as cm:
astroid['Duplicates'].mro()
- self.assertEqual(str(cm.exception), "Duplicates found in the mro.")
- self.assertTrue(issubclass(cm.exception.__class__, MroError))
- self.assertTrue(issubclass(cm.exception.__class__, ResolveError))
+ Duplicates = astroid.getattr('Duplicates')[0]
+ self.assertEqual(cm.exception.cls, Duplicates)
+ self.assertIsInstance(cm.exception, MroError)
+ self.assertIsInstance(cm.exception, ResolveError)
def test_generator_from_infer_call_result_parent(self):
func = test_utils.extract_node("""
@@ -1357,7 +1356,7 @@ class ClassNodeTest(ModuleLoader, unittest.TestCase):
self.assertEqual(first["a"].value, 1)
self.assertIsInstance(first["b"], nodes.Const)
self.assertEqual(first["b"].value, 2)
- with self.assertRaises(NotFoundError):
+ with self.assertRaises(AttributeInferenceError):
first.getattr("missing")
def test_implicit_metaclass(self):
@@ -1376,7 +1375,7 @@ class ClassNodeTest(ModuleLoader, unittest.TestCase):
instance = cls.instanciate_class()
func = cls.getattr('mro')
self.assertEqual(len(func), 1)
- self.assertRaises(NotFoundError, instance.getattr, 'mro')
+ self.assertRaises(AttributeInferenceError, instance.getattr, 'mro')
def test_metaclass_lookup_using_same_class(self):
# Check that we don't have recursive attribute access for metaclass