github.com/daeuniverse/quic-go@v0.0.0-20240413031024-943f218e0810/internal/utils/tree/tree_match_test.go (about)

     1  package tree
     2  
     3  import (
     4  	"testing"
     5  )
     6  
     7  type interval struct {
     8  	start, end int
     9  }
    10  
    11  func (i interval) Comp(ot interval) int8 {
    12  	if i.start < ot.start {
    13  		return -1
    14  	}
    15  	if i.start > ot.start {
    16  		return 1
    17  	}
    18  	if i.end < ot.end {
    19  		return -1
    20  	}
    21  	if i.end > ot.end {
    22  		return 1
    23  	}
    24  	return 0
    25  }
    26  
    27  func (i interval) Match(ot interval) int8 {
    28  	// Check for overlap
    29  	if i.start <= ot.end && i.end >= ot.start {
    30  		return 0
    31  	}
    32  	if i.start > ot.end {
    33  		return 1
    34  	} else {
    35  		return -1
    36  	}
    37  }
    38  
    39  func TestBtree(t *testing.T) {
    40  	values := []interval{
    41  		{start: 9, end: 10},
    42  		{start: 3, end: 4},
    43  		{start: 1, end: 2},
    44  		{start: 5, end: 6},
    45  		{start: 7, end: 8},
    46  		{start: 20, end: 100},
    47  		{start: 11, end: 12},
    48  	}
    49  	btree := New[interval]()
    50  	btree.InsertAll(values)
    51  
    52  	expect, actual := len(values), btree.Len()
    53  	if actual != expect {
    54  		t.Error("length should equal", expect, "actual", actual)
    55  	}
    56  
    57  	rs := btree.Match(interval{start: 1, end: 6})
    58  	if len(rs) != 3 {
    59  		t.Errorf("expected 3 results, got %d", len(rs))
    60  	}
    61  	if rs[0].start != 1 || rs[0].end != 2 {
    62  		t.Errorf("expected result 1 to be [1, 2], got %v", rs[0])
    63  	}
    64  	if rs[1].start != 3 || rs[1].end != 4 {
    65  		t.Errorf("expected result 2 to be [3, 4], got %v", rs[1])
    66  	}
    67  	if rs[2].start != 5 || rs[2].end != 6 {
    68  		t.Errorf("expected result 3 to be [5, 6], got %v", rs[2])
    69  	}
    70  
    71  	btree.Delete(interval{start: 5, end: 6})
    72  
    73  	rs = btree.Match(interval{start: 1, end: 6})
    74  	if len(rs) != 2 {
    75  		t.Errorf("expected 2 results, got %d", len(rs))
    76  	}
    77  	if rs[0].start != 1 || rs[0].end != 2 {
    78  		t.Errorf("expected result 1 to be [1, 2], got %v", rs[0])
    79  	}
    80  	if rs[1].start != 3 || rs[1].end != 4 {
    81  		t.Errorf("expected result 2 to be [3, 4], got %v", rs[1])
    82  	}
    83  
    84  	btree.Delete(interval{start: 11, end: 12})
    85  
    86  	rs = btree.Match(interval{start: 12, end: 19})
    87  	if len(rs) != 0 {
    88  		t.Errorf("expected 0 results, got %d", len(rs))
    89  	}
    90  
    91  	expect, actual = len(values)-2, btree.Len()
    92  	if actual != expect {
    93  		t.Error("length should equal", expect, "actual", actual)
    94  	}
    95  }