#!/usr/bin/env python
import setpath
import unittest
import os
from bike import testdata
from bike.testutils import *
#from bike.testutils import trimLines, createSourceNodeAt, \
# createSourceNodeAt_old, BRMTestCase
from bike import testdata
from findReferences import findReferences,findReferencesIncludingDefn
from bike.query.getTypeOf import getTypeOf
class helpers:
def helper(self,src,lineno,colno):
writeTmpTestFile(src)
refs = [x for x in findReferences(tmpfile,lineno,colno)]
return refs
def helper2(self,src,lineno,colno):
writeTmpTestFile(src)
refs = [x for x in findReferencesIncludingDefn(tmpfile,lineno,
colno)]
return refs
def helper3(self, src, importedsrc, line, col):
createPackageStructure(src,importedsrc)
filename = pkgstructureFile2
refs = [x for x in findReferences(filename,line,col)
if x.confidence == 100]
return refs
def helper4(self, src, importedsrc, line, col):
createPackageStructure(src,importedsrc)
filename = pkgstructureFile1
refs = [x for x in findReferences(filename,line,col)
if x.confidence == 100]
return refs
class TestFindReferences(BRMTestCase,helpers):
def test_findsSimpleReferencesGivenAssignment(self):
src=trimLines("""
def foo():
a = 3
print a
""")
refs = self.helper(src,3,10)
assert refs[0].filename == tmpfile
assert refs[0].lineno == 3
assert refs[0].colno == 10
assert refs[0].confidence == 100
def test_findsSimpleReferencesGivenReference(self):
src=trimLines("""
def foo():
a = 3
print a
""")
refs = self.helper2(src,3,10)
assert refs[0].filename == tmpfile
assert refs[0].lineno == 2
assert refs[0].colno == 4
assert refs[0].confidence == 100
def test_findsReferencesToOtherAssignments(self):
src=trimLines("""
def foo():
a = 3
a = 4
""")
refs = self.helper(src,2,4)
assert refs[0].filename == tmpfile
assert refs[0].lineno == 3
assert refs[0].colno == 4
assert refs[0].confidence == 100
def test_findsFunctionArg(self):
src=trimLines("""
def foo(a):
print a
""")
refs = self.helper2(src,2,10)
assert refs[0].filename == tmpfile
assert refs[0].lineno == 1
assert refs[0].colno == 8
assert refs[0].confidence == 100
def test_findsFunctionArgWithDefault(self):
src=trimLines("""
def foo(a=None, b=None):
print a, b
""")
refs = self.helper(src,1,4)
self.assertEquals(refs, [])
def test_findsFunctionArgWithDefault2(self):
src=trimLines("""
def foo(a=None, b=None):
print a, b
""")
refs = self.helper2(src,2,13)
assert refs[0].filename == tmpfile
assert refs[0].lineno == 1
assert refs[0].colno == 16
assert refs[0].confidence == 100
def test_findsReferencesGivenFunctionArg(self):
src=trimLines("""
def foo(a):
print a
""")
refs = self.helper(src,1,8)
assert refs[0].filename == tmpfile
assert refs[0].lineno == 2
assert refs[0].colno == 10
assert refs[0].confidence == 100
def test_findsVariableRefInImportStatementUsingFromImportStatement(self):
importsrc=trimLines("""
from a.b.bah import mytext
""")
src=trimLines("""
mytext = 'hello'
""")
refs = self.helper3(importsrc,src,1,1)
assert refs[0].filename == pkgstructureFile1
assert refs[0].lineno == 1
assert refs[0].colno == 20
assert refs[0].confidence == 100
def test_findsVariableRefUsingFromImportStatement(self):
importsrc=trimLines("""
from a.b.bah import mytext
print mytext
""")
src=trimLines("""
mytext = 'hello'
""")
refs = self.helper3(importsrc,src,1,1)
assert refs[0].filename == pkgstructureFile1
assert refs[1].lineno == 2
assert refs[1].colno == 6
assert refs[1].confidence == 100
def test_findsImportedVariableRefInAFunctionArg(self):
importsrc=trimLines("""
from a.b import bah
someFunction(bah.mytext)
""")
src=trimLines("""
mytext = 'hello'
""")
refs = self.helper3(importsrc,src,1,1)
assert refs[0].filename == pkgstructureFile1
assert refs[0].lineno == 2
assert refs[0].colno == 17
assert refs[0].confidence == 100
def test_getsReferenceOfSimpleMethodCall(self):
src = trimLines("""
from b.bah import TheClass
a = TheClass()
a.theMethod()
""")
refs = self.helper4(src,testdata.TheClass,3,2)
assert refs[0].filename == pkgstructureFile1
self.assertEqual(refs[0].lineno,3)
self.assertEqual(refs[0].colno,2)
def test_findsRefToSelfAttribute(self):
src=trimLines("""
class MyClass:
def __init__(self):
self.a = 'hello'
def myMethod(self):
print self.a
""")
refs = self.helper(src,3,12)
assert refs[0].filename == tmpfile
assert refs[0].lineno == 5
assert refs[0].colno == 18
assert refs[0].confidence == 100
class FindReferencesToMethod(BRMTestCase,helpers):
def test_findsReferenceOfSimpleMethodCall(self):
src = trimLines("""
from b.bah import TheClass
a = TheClass()
a.theMethod()
""")
refs = self.helper3(src,testClass,2,8)
assert refs[0].filename == pkgstructureFile1
self.assertEqual(refs[0].lineno,3)
self.assertEqual(refs[0].colno,2)
self.assertEqual(refs[0].colno,2)
def test_getsReferenceOfMethodCallFromClassImportedWithAlias(self):
src = trimLines("""
from b.bah import TheClass as MyTheClass
def foo():
a = MyTheClass()
a.theMethod()
""")
refs = self.helper3(src,testClass,2,8)
assert refs[0].filename == pkgstructureFile1
self.assertEqual(refs[0].lineno,5)
self.assertEqual(refs[0].colno,6)
def test_getsReferenceOfMethodCallWhenInstanceReturnedByFunction(self):
src = trimLines("""
from b.bah import TheClass
def foo():
return TheClass()
a = foo()
a.theMethod()
""")
refs = self.helper3(src,testClass,2,8)
assert refs[0].filename == pkgstructureFile1
self.assertEqual(refs[0].lineno,6)
self.assertEqual(refs[0].colno,2)
def test_getsReferenceOfMethodCallInSameClass(self):
src = trimLines("""
class TheClass:
def theMethod(self):
pass
def anotherMethod(self):
self.theMethod()
""")
refs = self.helper4(src,testClass,2,8)
assert refs[0].filename == pkgstructureFile1
self.assertEqual(refs[0].lineno,5)
self.assertEqual(refs[0].colno,13)
def test_getsReferenceOfMethodOnBaseClassInstance(self):
src = trimLines("""
class root:
def theMethod(self):
pass
class a(root):
def theMethod(self):
pass
class b(root):
pass
class TheClass(b):
def theMethod(self):
pass
rootinstance = root()
rootinstance.theMethod()
""")
refs = self.helper4(src,"pass",2,8)
self.assertEqual(refs[2].filename,pkgstructureFile1)
self.assertEqual(refs[2].lineno,17)
self.assertEqual(refs[2].colno,13)
def test_doesntGetReferenceToMethodWhenObjectCreatedInChildScopeToMethodReference(self):
src = trimLines("""
from b.bah import TheClass
a = AnotherClass()
def foo():
a = TheClass()
a.theMethod()
""")
refs = self.helper3(src,testClass,2,8)
assert refs == []
def test_renamesMethodReferenceOfInstanceCreatedInSubsequentFunction(self):
src = trimLines("""
class TheClass:
def theMethod():
pass
class NotTheClass:
def theMethod():
pass
def foo():
a = bah()
a.theMethod()
def bah():
return TheClass()
""")
refs = self.helper4(src,"pass",2,8)
self.assertEqual(refs[0].filename,pkgstructureFile1)
self.assertEqual(refs[0].lineno,10)
self.assertEqual(refs[0].colno,6)
def test_getsReferenceInMiddleOfBiggerCompoundCall(self):
src = trimLines("""
class TheClass:
def theMethod(self): return AnotherClass()
TheClass().theMethod().anotherMethod()
""")
refs = self.helper4(src,"pass",2,8)
self.assertEqual(refs[0].filename,pkgstructureFile1)
self.assertEqual(refs[0].lineno,3)
self.assertEqual(refs[0].colno,11)
self.assertEqual(refs[0].colend,20)
def test_doesntBarfWhenObjectIsArrayMember(self):
src = trimLines("""
class TheClass:
def theMethod(self):
pass
a[0] = TheClass()
a[0].theMethod()
""")
refs = self.helper4(src,"pass",2,8)
# should get to here without exception
class FindReferencesToClass(BRMTestCase, helpers):
def test_returnsEmptyListIfNoReferences(self):
src = trimLines("""
class MyClass:
pass
a = TheClass()
""")
refs = self.helper4(src,"pass",1,6)
assert refs == []
def test_findsSimpleReferenceInSameModule(self):
src = trimLines("""
class TheClass:
pass
a = TheClass()
""")
refs = self.helper4(src,"pass",1,6)
self.assertEqual(refs[0].filename,pkgstructureFile1)
self.assertEqual(refs[0].lineno,3)
self.assertEqual(refs[0].colno,4)
self.assertEqual(refs[0].confidence,100)
def test_doesntBarfOnSingleLineSourceWithInlineClass(self):
src=trimLines("""
from b.bah import TheClass
a = TheClass()
""")
refs = self.helper3(src,"class TheClass: pass",1,6)
assert refs != []
def test_findsReferenceToClassImportedInSameClassScope(self):
src=trimLines("""
class AnotherClass:
from b.bah import TheClass
TheClass.baz = 0
""")
refs = self.helper3(src,"class TheClass: pass",1,6)
self.assertEqual(refs[0].filename,pkgstructureFile1)
self.assertEqual(refs[0].lineno,2)
self.assertEqual(refs[0].colno,22)
self.assertEqual(refs[0].filename,pkgstructureFile1)
self.assertEqual(refs[1].lineno,3)
self.assertEqual(refs[1].colno,4)
def testFindsClassReferenceWhenScopeIsSameNameAsClass(self):
src = trimLines("""
class TheClass:
class TheClass:
pass
a = TheClass.TheClass()
""")
refs = self.helper4(src,"pass",2,10)
self.assertEqual(refs[0].filename,pkgstructureFile1)
self.assertEqual(refs[0].lineno,4)
self.assertEqual(refs[0].colno,13)
self.assertEqual(refs[0].confidence,100)
def testFindsClassReferenceWhenChildIsSameNameAsClass(self):
src = trimLines("""
class TheClass:
class TheClass:
pass
a = TheClass.TheClass()
""")
refs = self.helper4(src,"pass",1,6)
self.assertEqual(refs[0].filename,pkgstructureFile1)
self.assertEqual(refs[0].lineno,4)
self.assertEqual(refs[0].colno,4)
self.assertEqual(refs[0].confidence,100)
class TestFindReferencesIncludingDefn(BRMTestCase,helpers):
def test_findsMethodDecl(self):
src=trimLines("""
class TheClass:
def theMethod(self):
pass
""")
refs = self.helper2(src,2,8)
self.assertEqual(refs[0].filename,tmpfile)
self.assertEqual(refs[0].lineno,2)
self.assertEqual(refs[0].colno,8)
self.assertEqual(refs[0].confidence,100)
class TestFindReferencesUsingFiles(BRMTestCase):
def test_findsSimpleReferencesUsingFiles(self):
src=trimLines("""
def foo():
a = 3
print a
""")
refs = self.helper("pass",src,2,4)
assert refs[0].filename == pkgstructureFile2
assert refs[0].lineno == 3
assert refs[0].colno == 10
assert refs[0].confidence == 100
def test_findsReferenceInModuleWhichImportsClassWithFromAndAlias(self):
src = trimLines("""
from b.bah import TheClass as MyTheClass
def foo():
a = MyTheClass()
""")
refs = self.helper(src,testClass,1,6)
self.assertEqual(refs[0].filename,pkgstructureFile1)
self.assertEqual(refs[0].lineno,1)
self.assertEqual(refs[0].colno,18)
self.assertEqual(refs[0].confidence,100)
def test_doesntBarfWhenCantLocatePackageWhenTryingToFindBaseClass(self):
src = trimLines("""
from doesntexist import baseclass
class foo(baseclass):
def myMethod(self):
pass
""")
refs = self.helper("",src,3,8)
def test_doesntBarfWhenComesAcrossAPrintNl(self):
src = trimLines("""
class TheClass:
pass
print >>foo, TheClass
""")
refs = self.helper("",src,1,6)
def test_returnsOtherFilesInSameNonPackageDirectory(self):
try:
getRoot().pythonpath = [] # clear the python path
classsrc = trimLines("""
def testFunction():
print 'hello'
""")
src = trimLines("""
from baz import testFunction
""")
writeTmpTestFile(src)
newtmpfile = os.path.join(tmproot,"baz.py")
writeFile(newtmpfile, classsrc)
refs = [x for x in findReferences(newtmpfile,1,4)]
assert refs[0].filename == tmpfile
assert refs[0].lineno == 1
finally:
os.remove(newtmpfile)
deleteTmpTestFile()
def helper(self, src, classsrc, line, col):
try:
createPackageStructure(src,classsrc)
filename = pkgstructureFile2
refs = [x for x in findReferences(filename,line,col)]
finally:
removePackageStructure()
return refs
testClass = trimLines("""
class TheClass:
def theMethod(self):
pass
def differentMethod(self):
pass
class DifferentClass:
def theMethod(self):
pass
""")
if __name__ == "__main__":
unittest.main()
|