#!/usr/bin/env python import setpath import unittest import os from bike import testdata from bike.testutils import * from bike.query.findReferences import findReferences from bike.parsing.fastparserast import Module class TestGetReferencesToClass(BRMTestCase): def test_returnsEmptyListIfNoReferences(self): src = trimLines(""" class MyClass: pass a = TheClass() """) root = createSourceNodeAt(src,"mymodule") refs = [x for x in findReferences(os.path.abspath("mymodule.py"),1,6)] self.assertEqual(refs,[]) def test_findsSimpleReferenceInSameModule(self): src = trimLines(""" class TheClass: pass a = TheClass() """) root = createSourceNodeAt(src,"mymodule") refs = [x for x in findReferences(os.path.abspath("mymodule.py"),1,6)] self.assertEqual(refs[0].filename,os.path.abspath("mymodule.py")) self.assertEqual(refs[0].lineno,3) self.assertEqual(refs[0].colno,4) self.assertEqual(refs[0].confidence,100) def test_findsReferencesInModuleWhichImportsClass(self): src = trimLines(""" import b.bah def foo(): a = b.bah.TheClass() a.theMethod() """) root = createSourceNodeAt(src, "a.foo") root = createSourceNodeAt(ClassTestdata, "a.b.bah") refs = [x for x in findReferences(os.path.abspath("a/b/bah.py"),1,6)] self.assertEqual(refs[0].filename,os.path.abspath(os.path.join("a","foo.py"))) self.assertEqual(refs[0].lineno,3) self.assertEqual(refs[0].colno,14) self.assertEqual(refs[0].confidence,100) def test_findsReferenceInModuleWhichImportsClassWithFrom(self): src = trimLines(""" from b.bah import TheClass def foo(): a = TheClass() a.theMethod() """) root = createSourceNodeAt(src, "a.foo") root = createSourceNodeAt(ClassTestdata, "a.b.bah") filename = os.path.abspath("a/b/bah.py") refs = [x for x in findReferences(filename,1,6)] self.assertEqual(refs[0].filename,os.path.abspath(os.path.join("a","foo.py"))) self.assertEqual(refs[0].lineno,1) self.assertEqual(refs[0].colno,18) self.assertEqual(refs[0].confidence,100) self.assertEqual(refs[1].filename,os.path.abspath(os.path.join("a/foo.py"))) self.assertEqual(refs[1].lineno,3) self.assertEqual(refs[1].colno,8) self.assertEqual(refs[1].confidence,100) def test_findsReferenceToClassImportedInSameClassScope(self): src=trimLines(""" class AnotherClass: from b.bah import TheClass TheClass.baz = 0 """) root = createSourceNodeAt(src, "a.foo") root = createSourceNodeAt(ClassTestdata, "a.b.bah") filename = os.path.abspath("a/b/bah.py") refs = [x for x in findReferences(filename,1,6)] assert refs != [] def test_findsReferenceInModuleWhichImportsClassWithFromAndAlias(self): src = trimLines(""" from b.bah import TheClass as MyTheClass def foo(): a = MyTheClass() a.theMethod() """) root = createSourceNodeAt(src, "a.foo") root = createSourceNodeAt(ClassTestdata, "a.b.bah") filename = os.path.abspath("a/b/bah.py") refs = [x for x in findReferences(filename,1,6)] self.assertEqual(refs[0].filename,os.path.abspath(os.path.join("a","foo.py"))) self.assertEqual(refs[0].lineno,1) self.assertEqual(refs[0].colno,18) self.assertEqual(refs[0].confidence,100) def test_findsReferenceInModuleWhichImportsClassWithImportAs(self): src = trimLines(""" from b.bah import TheClass as MyTheClass def foo(): a = MyTheClass() a.theMethod() """) root = createSourceNodeAt(src, "a.foo") root = createSourceNodeAt(ClassTestdata, "a.b.bah") filename = os.path.abspath("a/b/bah.py") refs = [x for x in findReferences(filename,1,6)] self.assertEqual(refs[0].filename,os.path.abspath(os.path.join("a","foo.py"))) self.assertEqual(refs[0].lineno,1) self.assertEqual(refs[0].colno,18) self.assertEqual(refs[0].confidence,100) def test_findsReferenceInModuleWhichImportsClassWithFromImportStar(self): src = trimLines(""" from b.bah import * a = TheClass() a.theMethod() """) root = createSourceNodeAt(src, "a.foo") root = createSourceNodeAt(ClassTestdata, "a.b.bah") filename = os.path.abspath("a/b/bah.py") refs = [x for x in findReferences(filename,1,6)] self.assertEqual(refs[0].filename,os.path.abspath(os.path.join("a","foo.py"))) self.assertEqual(refs[0].lineno,2) self.assertEqual(refs[0].colno,4) self.assertEqual(refs[0].confidence,100) def test_findsReferenceInModuleWhichImportsClassWithFromImportStar2(self): src = trimLines(""" from a.b.bah import * a = TheClass() """) root = createSourceNodeAt(src, "a.foo") root = createSourceNodeAt(ClassTestdata, "a.b.bah") filename = os.path.abspath("a/b/bah.py") refs = [x for x in findReferences(filename,1,6)] self.assertEqual(refs[0].filename,os.path.abspath(os.path.join("a","foo.py"))) self.assertEqual(refs[0].lineno,2) self.assertEqual(refs[0].colno,4) self.assertEqual(refs[0].confidence,100) def test_findsClassReferenceInInstanceCreation(self): src = trimLines(""" class TheClass: def theMethod(self): pass TheClass().theMethod() """) root = createSourceNodeAt(src, "a.foo") filename = os.path.abspath("a/foo.py") refs = [x for x in findReferences(filename,1,6)] self.assertEqual(refs[0].filename,os.path.abspath(os.path.join("a","foo.py"))) self.assertEqual(refs[0].lineno,3) self.assertEqual(refs[0].colno,0) self.assertEqual(refs[0].confidence,100) def test_findsClassReferenceInInstanceCreationWithFQN(self): src = trimLines(""" import b.bah def foo(): a = b.bah.TheClass() a.theMethod() """) root = createSourceNodeAt(src, "a.foo") root = createSourceNodeAt(ClassTestdata, "a.b.bah") filename = os.path.abspath("a/b/bah.py") refs = [x for x in findReferences(filename,1,6)] self.assertEqual(refs[0].filename,os.path.abspath(os.path.join("a","foo.py"))) self.assertEqual(refs[0].lineno,3) self.assertEqual(refs[0].colno,14) self.assertEqual(refs[0].confidence,100) def test_doesntfindReferenceInModuleWhichDoesntImportClass(self): src = trimLines(""" a = TheClass() """) root = createSourceNodeAt(src, "a.foo") root = createSourceNodeAt(ClassTestdata, "a.b.bah") filename = os.path.abspath("a/b/bah.py") refs = [x for x in findReferences(filename,1,6)] assert refs == [] def test_findsReferenceInClassBases(self): src =trimLines(""" from b.bah import TheClass class DerivedClass(TheClass): pass """) root = createSourceNodeAt(src, "a.foo") root = createSourceNodeAt(ClassTestdata, "a.b.bah") filename = os.path.abspath("a/b/bah.py") refs = [x for x in findReferences(filename,1,6)] self.assertEqual(refs[1].filename,os.path.abspath(os.path.join("a","foo.py"))) self.assertEqual(refs[1].lineno,2) self.assertEqual(refs[1].colno,19) self.assertEqual(refs[1].confidence,100) def test_findsReferenceInMultiLineImportStatement(self): src =trimLines(""" from b.bah import foo, \\ TheFooBah, TheClass, Foobah, SomethingElse """) root = createSourceNodeAt(src, "a.foo") root = createSourceNodeAt(ClassTestdata, "a.b.bah") filename = os.path.abspath("a/b/bah.py") refs = [x for x in findReferences(filename,1,6)] self.assertEqual(refs[0].filename,os.path.abspath(os.path.join("a","foo.py"))) self.assertEqual(refs[0].lineno,2) self.assertEqual(refs[0].colno,21) self.assertEqual(refs[0].confidence,100) def test_findsReferenceWhenModulenameSameAsClassMethodName(self): # asserts that brm doesnt search class scope after not finding name # in method scope (since class scope is invisible unless called on 'self' src =trimLines(""" from a.b import bah class baz: def bah(self): print bah.TheClass """) root = createSourceNodeAt(src, "a.foo") root = createSourceNodeAt(ClassTestdata, "a.b.bah") filename = os.path.abspath("a/b/bah.py") refs = [x for x in findReferences(filename,1,6)] self.assertEqual(refs[0].filename,os.path.abspath(os.path.join("a","foo.py"))) self.assertEqual(refs[0].lineno,4) self.assertEqual(refs[0].colno,18) self.assertEqual(refs[0].confidence,100) def test_doesntBarfOnFromImportStarWhenNameIsInFromClause(self): src = trimLines(""" from a.b.bah import TheClass a = TheClass() """) root = createSourceNodeAt(src, "a.foo") root = createSourceNodeAt(ClassTestdata, "a.b.bah") filename = os.path.abspath("a/b/bah.py") refs = [x for x in findReferences(filename,1,6)] ClassTestdata = trimLines(""" class TheClass: def theMethod(self): pass def differentMethod(self): pass class DifferentClass: def theMethod(self): pass """) if __name__ == "__main__": unittest.main()