123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370 |
- package hercules
- import (
- "testing"
- "github.com/stretchr/testify/assert"
- )
- func updateStatus(
- status interface{}, _ int, previous_time int, delta int) {
- status.(map[int]int64)[previous_time] += int64(delta)
- }
- func fixture() (*File, map[int]int64) {
- status := map[int]int64{}
- file := NewFile(0, 100, NewStatus(status, updateStatus))
- return file, status
- }
- func TestInitialize(t *testing.T) {
- file, status := fixture()
- dump := file.Dump()
- // Output:
- // 0 0
- // 100 -1
- assert.Equal(t, "0 0\n100 -1\n", dump)
- assert.Equal(t, int64(100), status[0])
- }
- func testPanic(t *testing.T, method func(*File), msg string) {
- defer func() {
- r := recover()
- assert.NotNil(t, r, "not panic()-ed")
- assert.IsType(t, "", r)
- assert.Contains(t, r.(string), msg)
- }()
- file, _ := fixture()
- method(file)
- }
- func TestBullshit(t *testing.T) {
- testPanic(t, func(file *File) { file.Update(1, -10, 10, 0) }, "insert")
- testPanic(t, func(file *File) { file.Update(1, 110, 10, 0) }, "insert")
- testPanic(t, func(file *File) { file.Update(1, -10, 0, 10) }, "delete")
- testPanic(t, func(file *File) { file.Update(1, 100, 0, 10) }, "delete")
- testPanic(t, func(file *File) { file.Update(1, 0, -10, 0) }, "length")
- testPanic(t, func(file *File) { file.Update(1, 0, 0, -10) }, "length")
- testPanic(t, func(file *File) { file.Update(1, 0, -10, -10) }, "length")
- testPanic(t, func(file *File) { file.Update(-1, 0, 10, 10) }, "time")
- file, status := fixture()
- file.Update(1, 10, 0, 0)
- assert.Equal(t, int64(100), status[0])
- assert.Equal(t, int64(0), status[1])
- }
- func TestLen(t *testing.T) {
- file, _ := fixture()
- assert.Equal(t, 100, file.Len())
- }
- func TestInsert(t *testing.T) {
- file, status := fixture()
- file.Update(1, 10, 10, 0)
- dump := file.Dump()
- // Output:
- // 0 0
- // 10 1
- // 20 0
- // 110 -1
- assert.Equal(t, "0 0\n10 1\n20 0\n110 -1\n", dump)
- assert.Equal(t, int64(100), status[0])
- assert.Equal(t, int64(10), status[1])
- }
- func TestZeroInitialize(t *testing.T) {
- status := map[int]int64{}
- file := NewFile(0, 0, NewStatus(status, updateStatus))
- assert.NotContains(t, status, 0)
- dump := file.Dump()
- // Output:
- // 0 -1
- assert.Equal(t, "0 -1\n", dump)
- file.Update(1, 0, 10, 0)
- dump = file.Dump()
- // Output:
- // 0 1
- // 10 -1
- assert.Equal(t, "0 1\n10 -1\n", dump)
- assert.Equal(t, int64(10), status[1])
- }
- func TestDelete(t *testing.T) {
- file, status := fixture()
- file.Update(1, 10, 0, 10)
- dump := file.Dump()
- // Output:
- // 0 0
- // 90 -1
- assert.Equal(t, "0 0\n90 -1\n", dump)
- assert.Equal(t, int64(90), status[0])
- assert.Equal(t, int64(0), status[1])
- }
- func TestFused(t *testing.T) {
- file, status := fixture()
- file.Update(1, 10, 6, 7)
- dump := file.Dump()
- // Output:
- // 0 0
- // 10 1
- // 16 0
- // 99 -1
- assert.Equal(t, "0 0\n10 1\n16 0\n99 -1\n", dump)
- assert.Equal(t, int64(93), status[0])
- assert.Equal(t, int64(6), status[1])
- }
- func TestInsertSameTime(t *testing.T) {
- file, status := fixture()
- file.Update(0, 5, 10, 0)
- dump := file.Dump()
- // Output:
- // 0 0
- // 110 -1
- assert.Equal(t, "0 0\n110 -1\n", dump)
- assert.Equal(t, int64(110), status[0])
- }
- func TestInsertSameStart(t *testing.T) {
- file, status := fixture()
- file.Update(1, 10, 10, 0)
- file.Update(2, 10, 10, 0)
- dump := file.Dump()
- // Output:
- // 0 0
- // 10 2
- // 20 1
- // 30 0
- // 120 -1
- assert.Equal(t, "0 0\n10 2\n20 1\n30 0\n120 -1\n", dump)
- assert.Equal(t, int64(100), status[0])
- assert.Equal(t, int64(10), status[1])
- assert.Equal(t, int64(10), status[2])
- }
- func TestInsertEnd(t *testing.T) {
- file, status := fixture()
- file.Update(1, 100, 10, 0)
- dump := file.Dump()
- // Output:
- // 0 0
- // 100 1
- // 110 -1
- assert.Equal(t, "0 0\n100 1\n110 -1\n", dump)
- assert.Equal(t, int64(100), status[0])
- assert.Equal(t, int64(10), status[1])
- }
- func TestDeleteSameStart0(t *testing.T) {
- file, status := fixture()
- file.Update(1, 0, 0, 10)
- dump := file.Dump()
- // Output:
- // 0 0
- // 90 -1
- assert.Equal(t, "0 0\n90 -1\n", dump)
- assert.Equal(t, int64(90), status[0])
- assert.Equal(t, int64(0), status[1])
- }
- func TestDeleteSameStartMiddle(t *testing.T) {
- file, status := fixture()
- file.Update(1, 10, 10, 0)
- file.Update(2, 10, 0, 5)
- dump := file.Dump()
- // Output:
- // 0 0
- // 10 1
- // 15 0
- // 105 -1
- assert.Equal(t, "0 0\n10 1\n15 0\n105 -1\n", dump)
- assert.Equal(t, int64(100), status[0])
- assert.Equal(t, int64(5), status[1])
- }
- func TestDeleteIntersection(t *testing.T) {
- file, status := fixture()
- file.Update(1, 10, 10, 0)
- file.Update(2, 15, 0, 10)
- dump := file.Dump()
- // Output:
- // 0 0
- // 10 1
- // 15 0
- // 100 -1
- assert.Equal(t, "0 0\n10 1\n15 0\n100 -1\n", dump)
- assert.Equal(t, int64(95), status[0])
- assert.Equal(t, int64(5), status[1])
- }
- func TestDeleteAll(t *testing.T) {
- file, status := fixture()
- file.Update(1, 0, 0, 100)
- // Output:
- // 0 -1
- dump := file.Dump()
- assert.Equal(t, "0 -1\n", dump)
- assert.Equal(t, int64(0), status[0])
- assert.Equal(t, int64(0), status[1])
- }
- func TestFusedIntersection(t *testing.T) {
- file, status := fixture()
- file.Update(1, 10, 10, 0)
- file.Update(2, 15, 3, 10)
- dump := file.Dump()
- // Output:
- // 0 0
- // 10 1
- // 15 2
- // 18 0
- // 103 -1
- assert.Equal(t, "0 0\n10 1\n15 2\n18 0\n103 -1\n", dump)
- assert.Equal(t, int64(95), status[0])
- assert.Equal(t, int64(5), status[1])
- assert.Equal(t, int64(3), status[2])
- }
- func TestTorture(t *testing.T) {
- file, status := fixture()
- // 0 0 | 100 -1 [0]: 100
- file.Update(1, 20, 30, 0)
- // 0 0 | 20 1 | 50 0 | 130 -1 [0]: 100, [1]: 30
- file.Update(2, 20, 0, 5)
- // 0 0 | 20 1 | 45 0 | 125 -1 [0]: 100, [1]: 25
- file.Update(3, 20, 0, 5)
- // 0 0 | 20 1 | 40 0 | 120 -1 [0]: 100, [1]: 20
- file.Update(4, 20, 10, 0)
- // 0 0 | 20 4 | 30 1 | 50 0 | 130 -1 [0]: 100, [1]: 20, [4]: 10
- file.Update(5, 45, 0, 10)
- // 0 0 | 20 4 | 30 1 | 45 0 | 120 -1 [0]: 95, [1]: 15, [4]: 10
- file.Update(6, 45, 5, 0)
- // 0 0 | 20 4 | 30 1 | 45 6 | 50 0 | 125 -1 [0]: 95, [1]: 15, [4]: 10, [6]: 5
- file.Update(7, 10, 0, 50)
- // 0 0 | 75 -1 [0]: 75
- file.Update(8, 0, 10, 10)
- // 0 8 | 10 0 | 75 -1 [0]: 65, [8]: 10
- dump := file.Dump()
- assert.Equal(t, "0 8\n10 0\n75 -1\n", dump)
- assert.Equal(t, int64(65), status[0])
- assert.Equal(t, int64(0), status[1])
- assert.Equal(t, int64(0), status[2])
- assert.Equal(t, int64(0), status[3])
- assert.Equal(t, int64(0), status[4])
- assert.Equal(t, int64(0), status[5])
- assert.Equal(t, int64(0), status[6])
- assert.Equal(t, int64(0), status[7])
- assert.Equal(t, int64(10), status[8])
- }
- func TestInsertDeleteSameTime(t *testing.T) {
- file, status := fixture()
- file.Update(0, 10, 10, 20)
- dump := file.Dump()
- assert.Equal(t, "0 0\n90 -1\n", dump)
- assert.Equal(t, int64(90), status[0])
- file.Update(0, 10, 20, 10)
- dump = file.Dump()
- assert.Equal(t, "0 0\n100 -1\n", dump)
- assert.Equal(t, int64(100), status[0])
- }
- func TestBug1(t *testing.T) {
- file, status := fixture()
- file.Update(316, 1, 86, 0)
- file.Update(316, 87, 0, 99)
- file.Update(251, 0, 1, 0)
- file.Update(251, 1, 0, 1)
- dump := file.Dump()
- assert.Equal(t, "0 251\n1 316\n87 -1\n", dump)
- assert.Equal(t, int64(1), status[251])
- assert.Equal(t, int64(86), status[316])
- file.Update(316, 0, 0, 1)
- file.Update(316, 0, 1, 0)
- dump = file.Dump()
- assert.Equal(t, "0 316\n87 -1\n", dump)
- assert.Equal(t, int64(0), status[251])
- assert.Equal(t, int64(87), status[316])
- }
- func TestBug2(t *testing.T) {
- file, status := fixture()
- file.Update(316, 1, 86, 0)
- file.Update(316, 87, 0, 99)
- file.Update(251, 0, 1, 0)
- file.Update(251, 1, 0, 1)
- dump := file.Dump()
- assert.Equal(t, "0 251\n1 316\n87 -1\n", dump)
- file.Update(316, 0, 1, 1)
- dump = file.Dump()
- assert.Equal(t, "0 316\n87 -1\n", dump)
- assert.Equal(t, int64(0), status[251])
- assert.Equal(t, int64(87), status[316])
- }
- func TestJoin(t *testing.T) {
- file, status := fixture()
- file.Update(1, 10, 10, 0)
- file.Update(1, 30, 10, 0)
- file.Update(1, 20, 10, 10)
- dump := file.Dump()
- assert.Equal(t, "0 0\n10 1\n40 0\n120 -1\n", dump)
- assert.Equal(t, int64(90), status[0])
- assert.Equal(t, int64(30), status[1])
- }
- func TestBug3(t *testing.T) {
- file, status := fixture()
- file.Update(0, 1, 0, 99)
- file.Update(0, 0, 1, 1)
- dump := file.Dump()
- assert.Equal(t, "0 0\n1 -1\n", dump)
- assert.Equal(t, int64(1), status[0])
- }
- func TestBug4(t *testing.T) {
- status := map[int]int64{}
- file := NewFile(0, 10, NewStatus(status, updateStatus))
- file.Update(125, 0, 20, 9)
- file.Update(125, 0, 20, 20)
- file.Update(166, 12, 1, 1)
- file.Update(214, 2, 1, 1)
- file.Update(214, 4, 9, 0)
- file.Update(214, 27, 1, 1)
- file.Update(215, 3, 1, 1)
- file.Update(215, 13, 1, 1)
- file.Update(215, 17, 1, 1)
- file.Update(215, 19, 5, 0)
- file.Update(215, 25, 0, 1)
- file.Update(215, 31, 6, 1)
- file.Update(215, 27, 15, 0)
- file.Update(215, 2, 25, 4)
- file.Update(215, 28, 1, 1)
- file.Update(215, 30, 7, 2)
- file.Update(215, 38, 1, 0)
- file.Update(215, 40, 4, 2)
- file.Update(215, 46, 1, 0)
- file.Update(215, 49, 1, 0)
- file.Update(215, 52, 2, 6)
- dump := file.Dump()
- assert.Equal(t, "0 125\n2 215\n48 125\n50 215\n69 125\n73 215\n79 125\n80 0\n81 -1\n", dump)
- }
- func TestBug5(t *testing.T) {
- status := map[int]int64{}
- keys := []int{0, 2, 4, 7, 10}
- vals := []int{24, 28, 24, 28, -1}
- file := NewFileFromTree(keys, vals, NewStatus(status, updateStatus))
- file.Update(28, 0, 1, 3)
- dump := file.Dump()
- assert.Equal(t, "0 28\n2 24\n5 28\n8 -1\n", dump)
- keys = []int{0, 1, 16, 18}
- vals = []int{305, 0, 157, -1}
- file = NewFileFromTree(keys, vals, NewStatus(status, updateStatus))
- file.Update(310, 0, 0, 2)
- dump = file.Dump()
- assert.Equal(t, "0 0\n14 157\n16 -1\n", dump)
- }
|