import numpy as np
import pytest

from pandas import (
    DatetimeIndex,
    NaT,
    PeriodIndex,
    TimedeltaIndex,
)
import pandas._testing as tm


class NATests:
    def test_nat(self, index_without_na):
        empty_index = index_without_na[:0]

        index_with_na = index_without_na.copy(deep=True)
        index_with_na._data[1] = NaT

        assert type(index_without_na)._na_value is NaT
        assert empty_index._na_value is NaT
        assert index_with_na._na_value is NaT
        assert index_without_na._na_value is NaT

        idx = index_without_na
        assert idx._can_hold_na

        tm.assert_numpy_array_equal(idx._isnan, np.array([False, False]))
        assert idx.hasnans is False

        idx = index_with_na
        assert idx._can_hold_na

        tm.assert_numpy_array_equal(idx._isnan, np.array([False, True]))
        assert idx.hasnans is True


class TestDatetimeIndexNA(NATests):
    @pytest.fixture
    def index_without_na(self, tz_naive_fixture):
        tz = tz_naive_fixture
        return DatetimeIndex(["2011-01-01", "2011-01-02"], tz=tz)


class TestTimedeltaIndexNA(NATests):
    @pytest.fixture
    def index_without_na(self):
        return TimedeltaIndex(["1 days", "2 days"])


class TestPeriodIndexNA(NATests):
    @pytest.fixture
    def index_without_na(self):
        return PeriodIndex(["2011-01-01", "2011-01-02"], freq="D")
