import torch
import pytest
from triangular_mask import triangular_mask, triangular_mask_slow


@pytest.mark.parametrize(
    "bsz,slen,ranges,pad_mask_idxs",
    [
        (2, 5, {1: [(1, 3)]}, [[0, 1], [0, 2], [1, 4]]),
        (2, 10, {1: [(1, 4), (5, 8)]}, [[1, 3], [1, 0]]),
        (2, 10, {1: [(1, 6)]}, [[1, 3]]),
    ],
)
def test_triangular_mask(bsz, slen, ranges, pad_mask_idxs):
    ranges_lst = [[] for i in range(bsz)]
    for k, v in ranges.items():
        ranges_lst[k] = v
    pad_mask = torch.ones((bsz, slen), dtype=torch.bool)
    for idxs in pad_mask_idxs:
        pad_mask[*idxs] = False
    args = (bsz, slen, ranges_lst, pad_mask, "cpu")
    assert torch.equal(triangular_mask_slow(*args), triangular_mask(*args))
