from sourcing.span import Span
from sourcing.edit import apply_edits
import pytest

def test_xanadoc_apply_delete_start():
    spans = [Span('http://test/test', 0, 11)]

    edits = [{'op': 'delete', 'start': 0, 'old': 'aaa'}]
    spans = apply_edits(spans, edits)
    assert spans == [Span('http://test/test', 3, 8)]

def test_xanadoc_apply_delete_start_offset():
    offset = 14
    spans = [Span('http://test/test', offset, 11)]

    edits = [{'op': 'delete', 'start': 0, 'old': 'aaa'}]
    spans = apply_edits(spans, edits)
    assert spans == [Span('http://test/test', offset + 3, 8)]

def test_xanadoc_apply_delete_middle():
    spans = [Span('http://test/test', 0, 11)]

    edits = [{'op': 'delete', 'start': 4, 'old': 'bbb'}]
    spans = apply_edits(spans, edits)
    assert spans == [Span('http://test/test', 0, 4),
                     Span('http://test/test', 7, 4)]

def test_xanadoc_apply_delete_end():
    spans = [Span('http://test/test', 0, 11)]

    edits = [{'op': 'delete', 'start': 8, 'old': 'ccc'}]
    spans = apply_edits(spans, edits)
    assert spans == [Span('http://test/test', 0, 8)]

def test_xanadoc_apply_delete_all():
    spans = [Span('http://test/test', 0, 3)]

    edits = [{'op': 'delete', 'start': 0, 'old': 'aaa'}]
    spans = apply_edits(spans, edits)
    assert spans == []

def test_xanadoc_apply_insert_start():
    existing_span = Span('http://test/test', 0, 8)
    new_span = Span('http://test/new_span', 10, 4)
    edits = [{'op': 'insert', 'start': 0, 'span': new_span}]
    spans = apply_edits([existing_span], edits)
    assert spans == [new_span, existing_span]

def test_xanadoc_apply_insert_end():
    existing_span = Span('http://test/test', 0, 8)
    new_span = Span('http://test/new_span', 10, 4)
    edits = [{'op': 'insert', 'start': 8, 'span': new_span}]
    spans = apply_edits([existing_span], edits)
    assert spans == [existing_span, new_span]