69 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""Tests for Interval-Interval operations, such as overlaps, contains, etc."""
 | 
						|
import pytest
 | 
						|
 | 
						|
from pandas import (
 | 
						|
    Interval,
 | 
						|
    Timedelta,
 | 
						|
    Timestamp,
 | 
						|
)
 | 
						|
 | 
						|
 | 
						|
@pytest.fixture(
 | 
						|
    params=[
 | 
						|
        (Timedelta("0 days"), Timedelta("1 day")),
 | 
						|
        (Timestamp("2018-01-01"), Timedelta("1 day")),
 | 
						|
        (0, 1),
 | 
						|
    ],
 | 
						|
    ids=lambda x: type(x[0]).__name__,
 | 
						|
)
 | 
						|
def start_shift(request):
 | 
						|
    """
 | 
						|
    Fixture for generating intervals of types from a start value and a shift
 | 
						|
    value that can be added to start to generate an endpoint
 | 
						|
    """
 | 
						|
    return request.param
 | 
						|
 | 
						|
 | 
						|
class TestOverlaps:
 | 
						|
    def test_overlaps_self(self, start_shift, closed):
 | 
						|
        start, shift = start_shift
 | 
						|
        interval = Interval(start, start + shift, closed)
 | 
						|
        assert interval.overlaps(interval)
 | 
						|
 | 
						|
    def test_overlaps_nested(self, start_shift, closed, other_closed):
 | 
						|
        start, shift = start_shift
 | 
						|
        interval1 = Interval(start, start + 3 * shift, other_closed)
 | 
						|
        interval2 = Interval(start + shift, start + 2 * shift, closed)
 | 
						|
 | 
						|
        # nested intervals should always overlap
 | 
						|
        assert interval1.overlaps(interval2)
 | 
						|
 | 
						|
    def test_overlaps_disjoint(self, start_shift, closed, other_closed):
 | 
						|
        start, shift = start_shift
 | 
						|
        interval1 = Interval(start, start + shift, other_closed)
 | 
						|
        interval2 = Interval(start + 2 * shift, start + 3 * shift, closed)
 | 
						|
 | 
						|
        # disjoint intervals should never overlap
 | 
						|
        assert not interval1.overlaps(interval2)
 | 
						|
 | 
						|
    def test_overlaps_endpoint(self, start_shift, closed, other_closed):
 | 
						|
        start, shift = start_shift
 | 
						|
        interval1 = Interval(start, start + shift, other_closed)
 | 
						|
        interval2 = Interval(start + shift, start + 2 * shift, closed)
 | 
						|
 | 
						|
        # overlap if shared endpoint is closed for both (overlap at a point)
 | 
						|
        result = interval1.overlaps(interval2)
 | 
						|
        expected = interval1.closed_right and interval2.closed_left
 | 
						|
        assert result == expected
 | 
						|
 | 
						|
    @pytest.mark.parametrize(
 | 
						|
        "other",
 | 
						|
        [10, True, "foo", Timedelta("1 day"), Timestamp("2018-01-01")],
 | 
						|
        ids=lambda x: type(x).__name__,
 | 
						|
    )
 | 
						|
    def test_overlaps_invalid_type(self, other):
 | 
						|
        interval = Interval(0, 1)
 | 
						|
        msg = f"`other` must be an Interval, got {type(other).__name__}"
 | 
						|
        with pytest.raises(TypeError, match=msg):
 | 
						|
            interval.overlaps(other)
 |