def getFunction(self, c1, c2):
x1 = c1[0]; y1 = c1[1]
x2 = c2[0]; y2 = c2[1]
if x1 == x2:
return (lambda x,y: x1)
if y1 == y2:
return (lambda x,y: y1)
return (lambda x,y: (y1-y2)/(x1-x2)*x + y1 - (y1-y2) / (x1-x2)*x1)
두 점을 지나는 직선을 구하는 함수로 함수 자체를 리턴시키기 위해 lambda를 사용했습니다.
보통 TDD를 하기에 TestCase를 만들긴 했는데, 생각보다 고민이 되더군요-
"기대값을 뭘해야 하지?"
종이에 쓰는경우면 쉽습니다.
가령 (0,0), (1,1)을 지나는 함수 f(x)는 이렇게 되겠죠.
f(x) = x
unittest에 넣는다고 치면(당연히 안되지만)
assertEquals(f(x) = x, getFunction((0,0), (1,1)))
과 같은 포멧이 될텐데 기대값에 f(x) = x 와 같은 형태는 둘 수 없습니다.
String 으로 뽑아도 당연히 저렇게 나타나지 않구요-
일단 대안으로는 기대함수(편의상)에 값을 넣었을 때 올바르게 나오는지 검사하도록 했습니다.
다음과 같네요.
# y = 2*x function
F = Treasure().getFunction((0,0), (1,2))
self.assertEquals(0, F(0,2))
self.assertEquals(2, F(1,2))
self.assertEquals(10, F(5,10))
대략 적으로 검출은 되는데, 영 찝찝합니다.
뭔가 lambda function 을 unittest에서 적절하게 검출하는 방법이 있으면 좋을 것 같습니다.
검색을 좀 해보니 eval을 만들어 string으로 비교하는 방법도 있는 것 같은데, 이정도가 최선일까요? 고민해봐야겠네요 ㅎ