#!/usr/bin/env python import setpath import unittest import os from bike import testdata from bike.testutils import * from bike.query.getReferencesToModule import * from bike.parsing.fastparserast import Module class TestGetReferencesToModule(BRMTestCase): def test_returnsEmptyListIfNoReferences(self): src = trimLines(""" class MyClass: pass a = TheClass() """) root = createSourceNodeAt(src,"mymodule") self.assertEqual([x for x in getReferencesToModule(root,"myothermodule")],[]) def test_findsReferencesInModuleWhichImportsModule(self): src = trimLines(""" import b.bah def foo(): a = b.bah.TheClass() a.theMethod() """) root = createSourceNodeAt( src, "a.foo") root = createSourceNodeAt( testdata.TheClass, "a.b.bah") refs = [x for x in getReferencesToModule(root,"a.b.bah")] 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,9) 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,10) self.assertEqual(refs[0].confidence,100) def test_findsReferenceInModuleWhichImportsModuleWithFrom(self): src = trimLines(""" from b import bah def foo(): a = bah.TheClass() a.theMethod() """) root = createSourceNodeAt( src, "a.foo") root = createSourceNodeAt( testdata.TheClass, "a.b.bah") refs = [x for x in getReferencesToModule(root,"a.b.bah")] 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,14) 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[0].confidence,100) def test_findsReferenceInModuleWhichImportsModuleWithFromAndAlias(self): src = trimLines(""" from b import bah as mymodule def foo(): a = mymodule.MyTheClass() a.theMethod() """) root = createSourceNodeAt( src, "a.foo") root = createSourceNodeAt( testdata.TheClass, "a.b.bah") refs = [x for x in getReferencesToModule(root,"a.b.bah")] 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,14) self.assertEqual(refs[0].confidence,100) """ # mymodule.MyTheClass 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,10) self.assertEqual(refs[1].confidence,100) """ def test_findsReferenceInModuleWhichImportsModuleWithFromImportStar(self): src = trimLines(""" from b.bah import * a = TheClass() a.theMethod() """) root = createSourceNodeAt( src, "a.foo") root = createSourceNodeAt( testdata.TheClass, "a.b.bah") refs = [x for x in getReferencesToModule(root,"a.b.bah")] 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,7) self.assertEqual(refs[0].confidence,100) ''' Dont think this is a valid test, since cant import a module with from package import * def test_findsReferenceInModuleWhichImportsClassWithFromImportStar2(self): src = trimLines(""" from a.b import * a = bah.TheClass() """) root = createSourceNodeAt( src, "a.foo") root = createSourceNodeAt( testdata.TheClass, "a.b.bah") refs = [x for x in getReferencesToModule(root,"a.b.bah")] 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_findsReferenceInClassBases(self): src =trimLines(""" from b import bah class DerivedClass(bah.TheClass): pass """) root = createSourceNodeAt(src, "a.foo") root = createSourceNodeAt(testdata.TheClass, "a.b.bah") refs = [x for x in getReferencesToModule(root,"a.b.bah")] 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 import foo, \\ TheFooBah, TheClass, TheBastard, SomethingElse, bah """) root = createSourceNodeAt( src, "a.foo") root = createSourceNodeAt( testdata.TheClass, "a.b.bah") refs = [x for x in getReferencesToModule(root,"a.b.bah")] 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,58) 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( testdata.TheClass, "a.b.bah") refs = [x for x in getReferencesToModule(root,"a.b.bah")] 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,16) self.assertEqual(refs[0].confidence,100) assert (len(refs))==2 if __name__ == "__main__": unittest.main()