from astropy.tests.helper import assert_quantity_allclose
from astropy.time import Time
from astropy.coordinates.builtin_frames.utils import get_polar_motion, get_offset_sun_from_barycenter
from astropy.coordinates.solar_system import get_body_barycentric_posvel
from astropy.utils.exceptions import AstropyWarning
import pytest


def test_polar_motion_unsupported_dates():
    msg = r'Tried to get polar motions for times {} IERS.*'

    with pytest.warns(AstropyWarning, match=msg.format('before')):
        get_polar_motion(Time('1900-01-01'))

    with pytest.warns(AstropyWarning, match=msg.format('after')):
        get_polar_motion(Time('2100-01-01'))


def test_sun_from_barycenter_offset():
    time = Time('2020-01-01')
    pos, vel = get_body_barycentric_posvel('sun', time)

    offset = get_offset_sun_from_barycenter(time)
    assert_quantity_allclose(offset.xyz, pos.xyz)
    assert not bool(offset.differentials)

    offset_with_vel = get_offset_sun_from_barycenter(time, include_velocity=True)
    assert_quantity_allclose(offset_with_vel.xyz, pos.xyz)
    assert_quantity_allclose(offset_with_vel.differentials['s'].d_xyz, vel.xyz)

    reverse = get_offset_sun_from_barycenter(time, reverse=True)
    assert_quantity_allclose(reverse.xyz, -pos.xyz)
    assert not bool(reverse.differentials)

    reverse_with_vel = get_offset_sun_from_barycenter(time, reverse=True, include_velocity=True)
    assert_quantity_allclose(reverse_with_vel.xyz, -pos.xyz)
    assert_quantity_allclose(reverse_with_vel.differentials['s'].d_xyz, -vel.xyz)

from astropy.tests.helper import assert_quantity_allclose
from astropy.time import Time
from astropy.coordinates.builtin_frames.utils import get_polar_motion, get_offset_sun_from_barycenter
from astropy.coordinates.solar_system import get_body_barycentric_posvel
from astropy.utils.exceptions import AstropyWarning
import pytest


def test_polar_motion_unsupported_dates():
    msg = r'Tried to get polar motions for times {} IERS.*'

    with pytest.warns(AstropyWarning, match=msg.format('before')):
        get_polar_motion(Time('1900-01-01'))

    with pytest.warns(AstropyWarning, match=msg.format('after')):
        get_polar_motion(Time('2100-01-01'))


def test_sun_from_barycenter_offset():
    time = Time('2020-01-01')
    pos, vel = get_body_barycentric_posvel('sun', time)

    offset = get_offset_sun_from_barycenter(time)
    assert_quantity_allclose(offset.xyz, pos.xyz)
    assert not bool(offset.differentials)

    offset_with_vel = get_offset_sun_from_barycenter(time, include_velocity=True)
    assert_quantity_allclose(offset_with_vel.xyz, pos.xyz)
    assert_quantity_allclose(offset_with_vel.differentials['s'].d_xyz, vel.xyz)

    reverse = get_offset_sun_from_barycenter(time, reverse=True)
    assert_quantity_allclose(reverse.xyz, -pos.xyz)
    assert not bool(reverse.differentials)

    reverse_with_vel = get_offset_sun_from_barycenter(time, reverse=True, include_velocity=True)
    assert_quantity_allclose(reverse_with_vel.xyz, -pos.xyz)
    assert_quantity_allclose(reverse_with_vel.differentials['s'].d_xyz, -vel.xyz)
