import pytest

import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui


def test_Vector_init():
    """Test construction of Vector objects from a variety of source types."""
    # separate values without z
    v = pg.Vector(0, 1)
    assert v.z() == 0

    v = pg.Vector(0.0, 1.0)
    assert v.z() == 0

    # separate values with 3 args
    v = pg.Vector(0, 1, 2)
    assert v.x() == 0
    assert v.y() == 1
    assert v.z() == 2
    v = pg.Vector(0.0, 1.0, 2.0)
    assert v.x() == 0
    assert v.y() == 1
    assert v.z() == 2

    # all in a list
    v = pg.Vector([0, 1])
    assert v.z() == 0
    v = pg.Vector([0, 1, 2])
    assert v.z() == 2

    # QSizeF
    v = pg.Vector(QtCore.QSizeF(1, 2))
    assert v.x() == 1
    assert v.z() == 0

    # QPoint
    v = pg.Vector(QtCore.QPoint(0, 1))
    assert v.z() == 0
    v = pg.Vector(QtCore.QPointF(0, 1))
    assert v.z() == 0

    # QVector3D
    qv = QtGui.QVector3D(1, 2, 3)
    v = pg.Vector(qv)
    assert v == qv

    with pytest.raises(Exception):
        _ = pg.Vector(1, 2, 3, 4)


def test_Vector_interface():
    """Test various aspects of the Vector API."""
    v = pg.Vector(-1, 2)

    # len
    assert len(v) == 3

    # indexing
    assert v[0] == -1
    assert v[2] == 0
    with pytest.raises(IndexError):
        _ = v[4]

    assert v[1] == 2
    v[1] = 5
    assert v[1] == 5

    # iteration
    v2 = pg.Vector(*v)
    assert v2 == v

    assert abs(v).x() == 1

    # angle
    v1 = pg.Vector(1, 0)
    v2 = pg.Vector(1, 1)
    assert abs(v1.angle(v2) - 45) < 0.001
