396 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			396 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2018 The go-ethereum Authors
 | |
| // This file is part of the go-ethereum library.
 | |
| //
 | |
| // The go-ethereum library is free software: you can redistribute it and/or modify
 | |
| // it under the terms of the GNU Lesser General Public License as published by
 | |
| // the Free Software Foundation, either version 3 of the License, or
 | |
| // (at your option) any later version.
 | |
| //
 | |
| // The go-ethereum library is distributed in the hope that it will be useful,
 | |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 | |
| // GNU Lesser General Public License for more details.
 | |
| //
 | |
| // You should have received a copy of the GNU Lesser General Public License
 | |
| // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
 | |
| 
 | |
| package intervals
 | |
| 
 | |
| import "testing"
 | |
| 
 | |
| // Test tests Interval methods Add, Next and Last for various
 | |
| // initial state.
 | |
| func Test(t *testing.T) {
 | |
| 	for i, tc := range []struct {
 | |
| 		startLimit uint64
 | |
| 		initial    [][2]uint64
 | |
| 		start      uint64
 | |
| 		end        uint64
 | |
| 		expected   string
 | |
| 		nextStart  uint64
 | |
| 		nextEnd    uint64
 | |
| 		last       uint64
 | |
| 	}{
 | |
| 		{
 | |
| 			initial:   nil,
 | |
| 			start:     0,
 | |
| 			end:       0,
 | |
| 			expected:  "[[0 0]]",
 | |
| 			nextStart: 1,
 | |
| 			nextEnd:   0,
 | |
| 			last:      0,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   nil,
 | |
| 			start:     0,
 | |
| 			end:       10,
 | |
| 			expected:  "[[0 10]]",
 | |
| 			nextStart: 11,
 | |
| 			nextEnd:   0,
 | |
| 			last:      10,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   nil,
 | |
| 			start:     5,
 | |
| 			end:       15,
 | |
| 			expected:  "[[5 15]]",
 | |
| 			nextStart: 0,
 | |
| 			nextEnd:   4,
 | |
| 			last:      15,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{0, 0}},
 | |
| 			start:     0,
 | |
| 			end:       0,
 | |
| 			expected:  "[[0 0]]",
 | |
| 			nextStart: 1,
 | |
| 			nextEnd:   0,
 | |
| 			last:      0,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{0, 0}},
 | |
| 			start:     5,
 | |
| 			end:       15,
 | |
| 			expected:  "[[0 0] [5 15]]",
 | |
| 			nextStart: 1,
 | |
| 			nextEnd:   4,
 | |
| 			last:      15,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{5, 15}},
 | |
| 			start:     5,
 | |
| 			end:       15,
 | |
| 			expected:  "[[5 15]]",
 | |
| 			nextStart: 0,
 | |
| 			nextEnd:   4,
 | |
| 			last:      15,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{5, 15}},
 | |
| 			start:     5,
 | |
| 			end:       20,
 | |
| 			expected:  "[[5 20]]",
 | |
| 			nextStart: 0,
 | |
| 			nextEnd:   4,
 | |
| 			last:      20,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{5, 15}},
 | |
| 			start:     10,
 | |
| 			end:       20,
 | |
| 			expected:  "[[5 20]]",
 | |
| 			nextStart: 0,
 | |
| 			nextEnd:   4,
 | |
| 			last:      20,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{5, 15}},
 | |
| 			start:     0,
 | |
| 			end:       20,
 | |
| 			expected:  "[[0 20]]",
 | |
| 			nextStart: 21,
 | |
| 			nextEnd:   0,
 | |
| 			last:      20,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{5, 15}},
 | |
| 			start:     2,
 | |
| 			end:       10,
 | |
| 			expected:  "[[2 15]]",
 | |
| 			nextStart: 0,
 | |
| 			nextEnd:   1,
 | |
| 			last:      15,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{5, 15}},
 | |
| 			start:     2,
 | |
| 			end:       4,
 | |
| 			expected:  "[[2 15]]",
 | |
| 			nextStart: 0,
 | |
| 			nextEnd:   1,
 | |
| 			last:      15,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{5, 15}},
 | |
| 			start:     2,
 | |
| 			end:       5,
 | |
| 			expected:  "[[2 15]]",
 | |
| 			nextStart: 0,
 | |
| 			nextEnd:   1,
 | |
| 			last:      15,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{5, 15}},
 | |
| 			start:     2,
 | |
| 			end:       3,
 | |
| 			expected:  "[[2 3] [5 15]]",
 | |
| 			nextStart: 0,
 | |
| 			nextEnd:   1,
 | |
| 			last:      15,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{5, 15}},
 | |
| 			start:     2,
 | |
| 			end:       4,
 | |
| 			expected:  "[[2 15]]",
 | |
| 			nextStart: 0,
 | |
| 			nextEnd:   1,
 | |
| 			last:      15,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{0, 1}, {5, 15}},
 | |
| 			start:     2,
 | |
| 			end:       4,
 | |
| 			expected:  "[[0 15]]",
 | |
| 			nextStart: 16,
 | |
| 			nextEnd:   0,
 | |
| 			last:      15,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{0, 5}, {15, 20}},
 | |
| 			start:     2,
 | |
| 			end:       10,
 | |
| 			expected:  "[[0 10] [15 20]]",
 | |
| 			nextStart: 11,
 | |
| 			nextEnd:   14,
 | |
| 			last:      20,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{0, 5}, {15, 20}},
 | |
| 			start:     8,
 | |
| 			end:       18,
 | |
| 			expected:  "[[0 5] [8 20]]",
 | |
| 			nextStart: 6,
 | |
| 			nextEnd:   7,
 | |
| 			last:      20,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{0, 5}, {15, 20}},
 | |
| 			start:     2,
 | |
| 			end:       17,
 | |
| 			expected:  "[[0 20]]",
 | |
| 			nextStart: 21,
 | |
| 			nextEnd:   0,
 | |
| 			last:      20,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{0, 5}, {15, 20}},
 | |
| 			start:     2,
 | |
| 			end:       25,
 | |
| 			expected:  "[[0 25]]",
 | |
| 			nextStart: 26,
 | |
| 			nextEnd:   0,
 | |
| 			last:      25,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{0, 5}, {15, 20}},
 | |
| 			start:     5,
 | |
| 			end:       14,
 | |
| 			expected:  "[[0 20]]",
 | |
| 			nextStart: 21,
 | |
| 			nextEnd:   0,
 | |
| 			last:      20,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{0, 5}, {15, 20}},
 | |
| 			start:     6,
 | |
| 			end:       14,
 | |
| 			expected:  "[[0 20]]",
 | |
| 			nextStart: 21,
 | |
| 			nextEnd:   0,
 | |
| 			last:      20,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{0, 5}, {15, 20}, {30, 40}},
 | |
| 			start:     6,
 | |
| 			end:       29,
 | |
| 			expected:  "[[0 40]]",
 | |
| 			nextStart: 41,
 | |
| 			nextEnd:   0,
 | |
| 			last:      40,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}},
 | |
| 			start:     3,
 | |
| 			end:       55,
 | |
| 			expected:  "[[0 60]]",
 | |
| 			nextStart: 61,
 | |
| 			nextEnd:   0,
 | |
| 			last:      60,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}},
 | |
| 			start:     21,
 | |
| 			end:       49,
 | |
| 			expected:  "[[0 5] [15 60]]",
 | |
| 			nextStart: 6,
 | |
| 			nextEnd:   14,
 | |
| 			last:      60,
 | |
| 		},
 | |
| 		{
 | |
| 			initial:   [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}},
 | |
| 			start:     0,
 | |
| 			end:       100,
 | |
| 			expected:  "[[0 100]]",
 | |
| 			nextStart: 101,
 | |
| 			nextEnd:   0,
 | |
| 			last:      100,
 | |
| 		},
 | |
| 		{
 | |
| 			startLimit: 100,
 | |
| 			initial:    nil,
 | |
| 			start:      0,
 | |
| 			end:        0,
 | |
| 			expected:   "[]",
 | |
| 			nextStart:  100,
 | |
| 			nextEnd:    0,
 | |
| 			last:       0,
 | |
| 		},
 | |
| 		{
 | |
| 			startLimit: 100,
 | |
| 			initial:    nil,
 | |
| 			start:      20,
 | |
| 			end:        30,
 | |
| 			expected:   "[]",
 | |
| 			nextStart:  100,
 | |
| 			nextEnd:    0,
 | |
| 			last:       0,
 | |
| 		},
 | |
| 		{
 | |
| 			startLimit: 100,
 | |
| 			initial:    nil,
 | |
| 			start:      50,
 | |
| 			end:        100,
 | |
| 			expected:   "[[100 100]]",
 | |
| 			nextStart:  101,
 | |
| 			nextEnd:    0,
 | |
| 			last:       100,
 | |
| 		},
 | |
| 		{
 | |
| 			startLimit: 100,
 | |
| 			initial:    nil,
 | |
| 			start:      50,
 | |
| 			end:        110,
 | |
| 			expected:   "[[100 110]]",
 | |
| 			nextStart:  111,
 | |
| 			nextEnd:    0,
 | |
| 			last:       110,
 | |
| 		},
 | |
| 		{
 | |
| 			startLimit: 100,
 | |
| 			initial:    nil,
 | |
| 			start:      120,
 | |
| 			end:        130,
 | |
| 			expected:   "[[120 130]]",
 | |
| 			nextStart:  100,
 | |
| 			nextEnd:    119,
 | |
| 			last:       130,
 | |
| 		},
 | |
| 		{
 | |
| 			startLimit: 100,
 | |
| 			initial:    nil,
 | |
| 			start:      120,
 | |
| 			end:        130,
 | |
| 			expected:   "[[120 130]]",
 | |
| 			nextStart:  100,
 | |
| 			nextEnd:    119,
 | |
| 			last:       130,
 | |
| 		},
 | |
| 	} {
 | |
| 		intervals := NewIntervals(tc.startLimit)
 | |
| 		intervals.ranges = tc.initial
 | |
| 		intervals.Add(tc.start, tc.end)
 | |
| 		got := intervals.String()
 | |
| 		if got != tc.expected {
 | |
| 			t.Errorf("interval #%d: expected %s, got %s", i, tc.expected, got)
 | |
| 		}
 | |
| 		nextStart, nextEnd := intervals.Next()
 | |
| 		if nextStart != tc.nextStart {
 | |
| 			t.Errorf("interval #%d, expected next start %d, got %d", i, tc.nextStart, nextStart)
 | |
| 		}
 | |
| 		if nextEnd != tc.nextEnd {
 | |
| 			t.Errorf("interval #%d, expected next end %d, got %d", i, tc.nextEnd, nextEnd)
 | |
| 		}
 | |
| 		last := intervals.Last()
 | |
| 		if last != tc.last {
 | |
| 			t.Errorf("interval #%d, expected last %d, got %d", i, tc.last, last)
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestMerge(t *testing.T) {
 | |
| 	for i, tc := range []struct {
 | |
| 		initial  [][2]uint64
 | |
| 		merge    [][2]uint64
 | |
| 		expected string
 | |
| 	}{
 | |
| 		{
 | |
| 			initial:  nil,
 | |
| 			merge:    nil,
 | |
| 			expected: "[]",
 | |
| 		},
 | |
| 		{
 | |
| 			initial:  [][2]uint64{{10, 20}},
 | |
| 			merge:    nil,
 | |
| 			expected: "[[10 20]]",
 | |
| 		},
 | |
| 		{
 | |
| 			initial:  nil,
 | |
| 			merge:    [][2]uint64{{15, 25}},
 | |
| 			expected: "[[15 25]]",
 | |
| 		},
 | |
| 		{
 | |
| 			initial:  [][2]uint64{{0, 100}},
 | |
| 			merge:    [][2]uint64{{150, 250}},
 | |
| 			expected: "[[0 100] [150 250]]",
 | |
| 		},
 | |
| 		{
 | |
| 			initial:  [][2]uint64{{0, 100}},
 | |
| 			merge:    [][2]uint64{{101, 250}},
 | |
| 			expected: "[[0 250]]",
 | |
| 		},
 | |
| 		{
 | |
| 			initial:  [][2]uint64{{0, 10}, {30, 40}},
 | |
| 			merge:    [][2]uint64{{20, 25}, {41, 50}},
 | |
| 			expected: "[[0 10] [20 25] [30 50]]",
 | |
| 		},
 | |
| 		{
 | |
| 			initial:  [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}},
 | |
| 			merge:    [][2]uint64{{6, 25}},
 | |
| 			expected: "[[0 25] [30 40] [50 60]]",
 | |
| 		},
 | |
| 	} {
 | |
| 		intervals := NewIntervals(0)
 | |
| 		intervals.ranges = tc.initial
 | |
| 		m := NewIntervals(0)
 | |
| 		m.ranges = tc.merge
 | |
| 
 | |
| 		intervals.Merge(m)
 | |
| 
 | |
| 		got := intervals.String()
 | |
| 		if got != tc.expected {
 | |
| 			t.Errorf("interval #%d: expected %s, got %s", i, tc.expected, got)
 | |
| 		}
 | |
| 	}
 | |
| }
 |