#!/usr/bin/env python
import unittest
import setpath
import sys
from bike import testdata
from bike.testutils import *
import bike
from bike.refactor.test_renameFunction import RenameFunctionTests, RenameFunctionTests_importsFunction, FunctionTestdata
from bike.refactor.test_renameClass import RenameClassTests, RenameClassTests_importsClass, TheClassTestdata
from bike.refactor.test_renameMethod import RenameMethodTests, RenameMethodTests_ImportsClass, RenameMethodReferenceTests, RenameMethodReferenceTests_ImportsClass, RenameMethodAfterPromptTests, TestDoesntRenameMethodIfPromptReturnsFalse,MethodTestdata
from bike.refactor import test_extractMethod
import bikefacade
from bike import UndoStackEmptyException
from bike.query.getTypeOf import getTypeOf
class TestPathFunctions(BRMTestCase):
def test_setCompletePythonPath_removesDuplicates(self):
origpath = sys.path
try:
sys.path = ["foobah"]
ctx = bike.init()
ctx._setCompletePythonPath(sys.path[-1])
self.assertEqual(1,ctx._getCurrentSearchPath().count(sys.path[-1]))
finally:
sys.path = origpath
def test_setNonLibPathonPath_removesLibDirectories(self):
origpath = sys.path
try:
writeTmpTestFile("pass")
libdir = os.path.join(sys.prefix,"lib","python"+sys.version[:3])
sys.path = [libdir,os.path.join(libdir,"site-packages")]
ctx = bike.init()
ctx._setNonLibPythonPath(tmproot)
self.assertEqual([tmproot],ctx._getCurrentSearchPath())
finally:
sys.path = origpath
class TestRenameMethodAfterPrompt(BRMTestCase,RenameMethodAfterPromptTests):
def callback(self, filename, line, colstart, colend):
return 1
def renameMethod(self, src, line, col, newname):
writeTmpTestFile(src)
ctx = bike.init()
ctx.setRenameMethodPromptCallback(self.callback)
ctx.renameByCoordinates(tmpfile,line,col,newname)
ctx.save()
newsrc = readFile(tmpfile)
return newsrc
class TestDoesntRenameMethodIfPromptReturnsFalse(TestDoesntRenameMethodIfPromptReturnsFalse):
def callback(self, filename, line, colstart, colend):
return 0
def renameMethod(self, src, line, col, newname):
writeTmpTestFile(src)
ctx = bike.init()
ctx.setRenameMethodPromptCallback(self.callback)
ctx.renameByCoordinates(tmpfile,line,col,newname)
ctx.save()
newsrc = readFile(tmpfile)
return newsrc
class TestRenameByCoordinates2(RenameMethodTests,RenameMethodReferenceTests, RenameClassTests,RenameFunctionTests,BRMTestCase):
def rename(self, src, line, col, newname):
writeTmpTestFile(src)
ctx = bike.init()
ctx.renameByCoordinates(os.path.abspath(tmpfile),line,col,newname)
ctx.save()
newsrc = readFile(tmpfile)
return newsrc
class TestRenameByCoordinatesWithDirectoryStructure(
RenameClassTests_importsClass,
RenameFunctionTests_importsFunction,
RenameMethodTests_ImportsClass,
RenameMethodReferenceTests_ImportsClass,
BRMTestCase):
def renameClass(self, src, newname):
try:
createPackageStructure(src, TheClassTestdata)
ctx = bike.init()
ctx.renameByCoordinates(pkgstructureFile2,1,6,newname)
ctx.save()
newsrc = readFile(pkgstructureFile1)
return newsrc
finally:
removePackageStructure()
def renameMethod(self, src, line, col, newname):
try:
createPackageStructure(src, MethodTestdata)
ctx = bike.init()
ctx.renameByCoordinates(pkgstructureFile2,line,col,newname)
ctx.save()
newsrc = readFile(pkgstructureFile1)
return newsrc
finally:
removePackageStructure()
def renameFunction(self, src, newname):
try:
createPackageStructure(src, FunctionTestdata)
ctx = bike.init()
ctx.renameByCoordinates(pkgstructureFile2,1,4,newname)
ctx.save()
newsrc = readFile(pkgstructureFile1)
return newsrc
finally:
removePackageStructure()
class Test_deducePackageOfFile(BRMTestCase):
def test_returnsEmptyStringIfFileNotInPackage(self):
try:
# this doesnt have __init__.py file, so
# isnt package
os.makedirs("a")
writeFile(os.path.join("a","foo.py"),"pass")
pkg = bikefacade._deducePackageOfFile(os.path.join("a","foo.py"))
assert pkg == ""
finally:
os.remove(os.path.join("a","foo.py"))
os.removedirs(os.path.join("a"))
def test_returnsNestedPackage(self):
try:
os.makedirs(os.path.join("a","b"))
writeFile(os.path.join("a","__init__.py"),"# ")
writeFile(os.path.join("a","b","__init__.py"),"# ")
writeFile(os.path.join("a","b","foo.py"),"pass")
pkg = bikefacade._deducePackageOfFile(os.path.join("a","b","foo.py"))
assert pkg == "a.b"
finally:
os.remove(os.path.join("a","__init__.py"))
os.remove(os.path.join("a","b","__init__.py"))
os.remove(os.path.join("a","b","foo.py"))
os.removedirs(os.path.join("a","b"))
class TestExtractMethod(test_extractMethod.TestExtractMethod):
def test_extractsPass(self):
srcBefore=trimLines("""
class MyClass:
def myMethod(self):
pass
""")
srcAfter=trimLines("""
class MyClass:
def myMethod(self):
self.newMethod()
def newMethod(self):
pass
""")
writeTmpTestFile(srcBefore)
ctx = bike.init()
ctx.extractMethod(os.path.abspath(tmpfile),3,8,3,12,"newMethod")
ctx.save()
self.assertEqual(readTmpTestFile(),srcAfter)
ctx.undo()
ctx.save()
self.assertEqual(readTmpTestFile(),srcBefore)
class TestExtractFunction(test_extractMethod.TestExtractFunction):
def test_extractsFunction(self):
srcBefore=trimLines("""
def myFunction(): # comment
a = 3
c = a + 99
b = c * 1
print b
""")
srcAfter=trimLines("""
def myFunction(): # comment
a = 3
b = newFunction(a)
print b
def newFunction(a):
c = a + 99
b = c * 1
return b
""")
writeTmpTestFile(srcBefore)
ctx = bike.init()
ctx.extractMethod(os.path.abspath(tmpfile),3,4,4,13,"newFunction")
ctx.save()
self.assertEqual(readTmpTestFile(),srcAfter)
ctx.undo()
ctx.save()
self.assertEqual(readTmpTestFile(),srcBefore)
class TestUndo(BRMTestCase):
def test_undoesTheTextOfASingleFile(self):
src = trimLines("""
class a:
def foo(self):
pass
""")
writeTmpTestFile(src)
#ctx = bike.init()
ctx = bike.init()
ctx.renameByCoordinates(tmpfile,2,8,"c")
ctx.save()
ctx.undo()
ctx.save()
newsrc = readFile(tmpfile)
self.assertEqual(newsrc,src)
def test_undoesTwoConsecutiveRefactorings(self):
try:
src = trimLines("""
class a:
def foo(self):
pass
""")
writeTmpTestFile(src)
ctx = bike.init()
ctx.renameByCoordinates(tmpfile,2,8,"c")
ctx.save()
newsrc1 = readFile(tmpfile)
ctx.renameByCoordinates(tmpfile,2,8,"d")
ctx.save()
# 1st undo
ctx.undo()
ctx.save()
newsrc = readFile(tmpfile)
self.assertEqual(newsrc,
newsrc1)
# 2nd undo
ctx.undo()
ctx.save()
newsrc = readFile(tmpfile)
self.assertEqual(newsrc,src)
finally:
pass
#deleteTmpTestFile()
def test_undoesTheTextOfAFileTwice(self):
for i in range(3):
src = trimLines("""
class foo:
def bah(self):
pass
""")
writeTmpTestFile(src)
ctx = bike.init()
ctx.renameByCoordinates(tmpfile,2,8,"c")
ctx.save()
ctx.undo()
ctx.save()
newsrc = readFile(tmpfile)
self.assertEqual(newsrc,src)
raisedexception=0
try:
ctx.undo()
except UndoStackEmptyException:
pass
else:
assert 0,"should have raised an exception"
'''
def test_undoesManualModificationsToFiles(self):
writeTmpTestFile("class foo: pass")
origsrc = readFile(tmpfile)
ctx = bike.init()
writeTmpTestFile("pass")
import os
ctx.init()
newsrc = readFile(tmpfile)
assert newsrc != origsrc
ctx.undo()
ctx.save()
newsrc = readFile(tmpfile)
assert newsrc == origsrc
'''
class TestGetReferencesToClass_Facade(BRMTestCase):
def test_returnsReferences(self):
src = trimLines("""
class TheClass:
pass
a = TheClass()
""")
writeTmpTestFile(src)
ctx = bike.init()
refs = [refs for refs in ctx.findReferencesByCoordinates(tmpfile,1,6)]
self.assertEqual(refs[0].filename,os.path.abspath(tmpfile))
self.assertEqual(refs[0].lineno,3)
assert hasattr(refs[0],"confidence")
class TestFindDefinitionByCoordinates(BRMTestCase):
def test_findsClassRef(self):
src=trimLines("""
class TheClass:
pass
a = TheClass()
""")
writeTmpTestFile(src)
ctx = bike.init()
defn = [x for x in ctx.findDefinitionByCoordinates(tmpfile,3,6)]
assert defn[0].filename == os.path.abspath(tmpfile)
assert defn[0].lineno == 1
assert defn[0].confidence == 100
class TestBRM_InlineLocalVariable(BRMTestCase):
def test_works(self):
srcBefore=trimLines("""
def foo():
b = 'hello'
print b
""")
srcAfter=trimLines("""
def foo():
print 'hello'
""")
writeTmpTestFile(srcBefore)
ctx = bike.init()
ctx.inlineLocalVariable(tmpfile,3,10)
ctx.save()
self.assertEqual(file(tmpfile).read(),srcAfter)
class TestBRM_ExtractLocalVariable(BRMTestCase):
def test_works(self):
srcBefore=trimLines("""
def foo():
print 3 + 2
""")
srcAfter=trimLines("""
def foo():
a = 3 + 2
print a
""")
try:
writeTmpTestFile(srcBefore)
ctx = bike.init()
ctx.extractLocalVariable(tmpfile,2,10,2,15,'a')
ctx.save()
self.assertEqual(file(tmpfile).read(),srcAfter)
finally:
pass
#deleteTmpTestFile()
if __name__ == "__main__":
unittest.main()