#!/usr/bin/env python3

from __future__ import division
from __future__ import print_function

import unittest

from vector import Vector


class VectorTests(unittest.TestCase):
    """
    Tests for Vector class.
    """

    def test_construction(self):
        A = (0, 1, 2)
        B = (2, 1, 0.5)
        self.assertFalse(Vector(A, B) is None)

    def test_attributes_access(self):
        A = (0, 1, 2)
        B = (2, 1, 0.5)
        v1 = Vector(A, B)
        self.assertEqual(v1.x, 2)
        self.assertEqual(v1.y, 0)
        self.assertEqual(v1.z, -1.5)
        v1.z = 0
        self.assertEqual(v1.z, 0)

    def test_string_representation(self):
        A = (0, 1, 2)
        B = (2, 1, 0.5)
        v1 = Vector(A, B)
        self.assertEqual(str(v1), "Vector(x=2, y=0, z=-1.5)")
        self.assertEqual(repr(v1), "Vector(x=2, y=0, z=-1.5)")

    def test_equality(self):
        A = (0, 1, 2)
        B = (2, 1, 0.5)
        v1 = Vector(A, B)
        v2 = Vector(A, B)
        self.assertTrue(v1 == v2)
        self.assertFalse(v1 != v2)

        v1.x = 0
        self.assertFalse(v1 == v2)
        self.assertTrue(v1 != v2)

    # Comment the following line to force the check the bonus code
    @unittest.expectedFailure
    def test_bonus1(self):
        O = (0, 0, 0)
        A = (1, 1, 1)
        B = (2, 0, 2)
        OA = Vector(O, A)
        OB = Vector(O, B)
        AB = Vector(A, B)
        BA = Vector(B, A)

        v1 = AB + BA
        self.assertEqual(str(v1), "Vector(x=0, y=0, z=0)")

        self.assertTrue(OA + AB == OB)
        self.assertFalse(OA - AB == OB)
        self.assertTrue(OA - BA == OB)

    # Comment the following line to force the check the bonus code
    @unittest.expectedFailure
    def test_bonus2(self):
        O = (0, 0, 0)
        A = (1, 1, 1)
        OA = Vector(O, A)
        self.assertEqual(OA * 2, OA + OA)
        self.assertEqual(OA * 4, 4 * OA)

    # Comment the following line to force the check the bonus code
    @unittest.expectedFailure
    def test_bonus3(self):
        A = (0, 1, 2)
        B = (2, 1, 0.5)
        v1 = Vector(A, B)
        x, y, z = v1
        self.assertEqual((x, y, z), (2, 0, -1.5))


if __name__ == "__main__":
    unittest.main(verbosity=2)
