CGL_2_A: Parallel/Orthogonal (続き(続きじゃない
本筋からはまた外れるけど、この間Travis CI試したときにテスト書いた流れで
shape.pyについてもテスト書いてみた
重箱のすみを全部つついた気はしてないけどすでに本体より長い
そんなもんだろうね
import unittest
from shape import float_equal, Point, Vector, Segment
class TestPoint(unittest.TestCase):
def setUp(self):
self.p1 = Point(1.0, 2.0)
self.p2 = Point(3.0, 5.0)
def test_float_equal(self):
self.assertTrue(float_equal(1.0, 1.0))
self.assertTrue(float_equal(1.00000000001, 1.0))
self.assertTrue(float_equal(1.0, 1.00000000001))
self.assertFalse(float_equal(1.000000001, 1.0))
self.assertFalse(float_equal(1.0, 1.000000001))
def test_init_default(self):
p1 = Point()
self.assertEqual(p1.x, 0.0)
self.assertEqual(p1.y, 0.0)
p2 = Point()
p1.x = 1.0
self.assertEqual(p2.x, 0.0)
self.assertEqual(p2.y, 0.0)
def test_init(self):
self.assertEqual(self.p1.x, 1.0)
self.assertEqual(self.p1.y, 2.0)
def test_repr(self):
self.assertEqual(self.p1.__repr__(), 'Point(1.0, 2.0)')
def test_eq(self):
self.assertTrue(self.p1 == Point(1.0, 2.0))
self.assertTrue(self.p1 == Point(1.00000000001, 2.0))
self.assertTrue(self.p1 == Point(1.0, 2.00000000001))
self.assertFalse(self.p1 == Point(1.0, 3.0))
self.assertFalse(self.p1 == Point(2.0, 2.0))
self.assertFalse(self.p1 == Point(2.0, 3.0))
def test_add(self):
self.assertEqual(self.p1 + self.p2, Point(4.0, 7.0))
def test_sub(self):
self.assertEqual(self.p1 - self.p2, Point(-2.0, -3.0))
def test_mul(self):
self.assertEqual(self.p1 * 2, Point(2.0, 4.0))
self.assertEqual(2 * self.p1, Point(2.0, 4.0))
def test_div(self):
self.assertEqual(self.p1 / 2.0, Point(0.5, 1.0))
def test_lt(self):
self.assertTrue(self.p1 < Point(2.0, 2.0))
self.assertFalse(self.p1 < Point(0.0, 2.0))
self.assertTrue(self.p1 < Point(1.0, 3.0))
self.assertTrue(self.p1 < Point(1.00000000001, 3.0))
self.assertFalse(self.p1 < Point(1.0, 1.0))
self.assertFalse(self.p1 < Point(1.00000000001, 1.0))
self.assertFalse(self.p1 < Point(1.0, 2.0))
def test_norm(self):
self.assertTrue(Point(3.0, 4.0).norm() == 25.0)
self.assertTrue(Vector(3.0, 4.0).norm() == 25.0)
def test_abs(self):
self.assertTrue(Point(3.0, 4.0).abs() == 5.0)
self.assertTrue(Vector(3.0, 4.0).abs() == 5.0)
def test_dot(self):
self.assertEqual(Point(1.0, 0.0).dot(Point(0.0, 1.0)), 0.0)
self.assertEqual(self.p1.dot(self.p2), 13.0)
def test_cross(self):
self.assertEqual(Point(1.0, 0.0).cross(Point(0.0, 1.0)), 1.0)
self.assertEqual(self.p1.cross(self.p2), -1.0)
def test_is_orthogonal(self):
self.assertTrue(Point(1.0, 0.0).is_orthogonal(Point(0.0, 1.0)))
self.assertFalse(Point(0.0, 1.0).is_orthogonal(Point(1.0, 1.0)))
def test_is_parallel(self):
self.assertFalse(Point(1.0, 0.0).is_parallel(Point(0.0, 1.0)))
self.assertTrue(Point(0.0, 1.0).is_parallel(Point(0.0, 1.0)))
class TestVector(unittest.TestCase):
def test_init(self):
v = Vector(1.0, 2.0)
self.assertEqual(v.x, 1.0)
self.assertEqual(v.y, 2.0)
class TestSegment(unittest.TestCase):
def setUp(self):
self.p1 = Point(1.0, 2.0)
self.p2 = Point(3.0, 5.0)
self.s = Segment(self.p1, self.p2)
def test_init_default(self):
s1 = Segment()
self.assertEqual(s1.p1, Point(0.0, 0.0))
self.assertEqual(s1.p2, Point(0.0, 0.0))
s2 = Segment()
s1.p1.x = 1.0
self.assertEqual(s2.p1, Point(0.0, 0.0))
self.assertEqual(s2.p2, Point(0.0, 0.0))
def test_init(self):
self.assertEqual(self.s.p1, Point(1.0, 2.0))
self.assertEqual(self.s.p2, Point(3.0, 5.0))
def test_eq(self):
self.assertTrue(
self.s == Segment(Point(1.0, 2.0), Point(3.0, 5.0)))
self.assertFalse(
self.s == Segment(Point(1.0, 3.0), Point(3.0, 5.0)))
self.assertFalse(
self.s == Segment(Point(1.0, 2.0), Point(3.0, 6.0)))
self.assertFalse(
self.s == Segment(Point(1.0, 3.0), Point(3.0, 6.0)))
def test_repr(self):
self.assertEqual(self.s.__repr__(),
'Segment(Point(1.0, 2.0), Point(3.0, 5.0))')
def test_vector(self):
self.assertEqual(self.s.vector(), Vector(2.0, 3.0))
def test_is_orthogonal(self):
s1 = Segment(Point(0.0, 0.0), Point(1.0, 0.0))
s2 = Segment(Point(0.0, 0.0), Point(0.0, 1.0))
self.assertTrue(s1.is_orthogonal(s2))
self.assertFalse(s1.is_orthogonal(s1))
def test_is_parallel(self):
s1 = Segment(Point(0.0, 0.0), Point(1.0, 0.0))
s2 = Segment(Point(0.0, 0.0), Point(0.0, 1.0))
self.assertTrue(s1.is_parallel(s1))
self.assertFalse(s1.is_parallel(s2))
test_init_default
ってやつでは
この間ハマった複数のオブジェクトが初期値を共有してしまって
一方を変更するとほかも変更されてしまう、って問題が起こってないか
テストしてるけど
正直そこまで書くのかって気がしないでもない
チェッカーに警告出してもらうほうが現実的かも
初期値がオブジェクトじゃなければ発生しないわけだし
テスト書かなきゃって気づく人は最初からそんなコード書かないだろうし
大丈夫と思ってるけど書くのがテストでもあるわけだけど
どうしてるのかな
書いてないに3000点