kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

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点