| 6 | ) |
| 7 | |
| 8 | func TestRing(t *testing.T) { |
| 9 | type op = ringOp[int] |
| 10 | testRing(t, New[int](3), |
| 11 | // noops on empty ring |
| 12 | op{cap: 0, opType: opRst, value: 0, items: []int{}}, |
| 13 | op{cap: 0, opType: opDeq, value: 0, items: []int{}}, |
| 14 | |
| 15 | // basic |
| 16 | op{cap: 3, opType: opEnq, value: 1, items: []int{1}}, |
| 17 | op{cap: 3, opType: opDeq, value: 1, items: []int{}}, |
| 18 | |
| 19 | // wrapping |
| 20 | op{cap: 3, opType: opEnq, value: 2, items: []int{2}}, |
| 21 | op{cap: 3, opType: opEnq, value: 3, items: []int{2, 3}}, |
| 22 | op{cap: 3, opType: opEnq, value: 4, items: []int{2, 3, 4}}, |
| 23 | op{cap: 3, opType: opDeq, value: 2, items: []int{3, 4}}, |
| 24 | op{cap: 3, opType: opDeq, value: 3, items: []int{4}}, |
| 25 | op{cap: 3, opType: opDeq, value: 4, items: []int{}}, |
| 26 | |
| 27 | // resetting |
| 28 | op{cap: 3, opType: opEnq, value: 2, items: []int{2}}, |
| 29 | op{cap: 3, opType: opRst, value: 0, items: []int{}}, |
| 30 | op{cap: 3, opType: opDeq, value: 0, items: []int{}}, |
| 31 | |
| 32 | // growing without wrapping |
| 33 | op{cap: 3, opType: opEnq, value: 5, items: []int{5}}, |
| 34 | op{cap: 3, opType: opEnq, value: 6, items: []int{5, 6}}, |
| 35 | op{cap: 3, opType: opEnq, value: 7, items: []int{5, 6, 7}}, |
| 36 | op{cap: 6, opType: opEnq, value: 8, items: []int{5, 6, 7, 8}}, |
| 37 | op{cap: 6, opType: opRst, value: 0, items: []int{}}, |
| 38 | op{cap: 6, opType: opDeq, value: 0, items: []int{}}, |
| 39 | |
| 40 | // growing and wrapping |
| 41 | op{cap: 6, opType: opEnq, value: 9, items: []int{9}}, |
| 42 | op{cap: 6, opType: opEnq, value: 10, items: []int{9, 10}}, |
| 43 | op{cap: 6, opType: opEnq, value: 11, items: []int{9, 10, 11}}, |
| 44 | op{cap: 6, opType: opEnq, value: 12, items: []int{9, 10, 11, 12}}, |
| 45 | op{cap: 6, opType: opEnq, value: 13, items: []int{9, 10, 11, 12, 13}}, |
| 46 | op{cap: 6, opType: opEnq, value: 14, items: []int{9, 10, 11, 12, 13, 14}}, |
| 47 | op{cap: 6, opType: opDeq, value: 9, items: []int{10, 11, 12, 13, 14}}, |
| 48 | op{cap: 6, opType: opDeq, value: 10, items: []int{11, 12, 13, 14}}, |
| 49 | op{cap: 6, opType: opEnq, value: 15, items: []int{11, 12, 13, 14, 15}}, |
| 50 | op{cap: 6, opType: opEnq, value: 16, items: []int{11, 12, 13, 14, 15, 16}}, |
| 51 | op{cap: 9, opType: opEnq, value: 17, items: []int{11, 12, 13, 14, 15, 16, 17}}, // grows wrapped |
| 52 | op{cap: 9, opType: opDeq, value: 11, items: []int{12, 13, 14, 15, 16, 17}}, |
| 53 | op{cap: 9, opType: opDeq, value: 12, items: []int{13, 14, 15, 16, 17}}, |
| 54 | op{cap: 9, opType: opDeq, value: 13, items: []int{14, 15, 16, 17}}, |
| 55 | op{cap: 9, opType: opDeq, value: 14, items: []int{15, 16, 17}}, |
| 56 | op{cap: 9, opType: opDeq, value: 15, items: []int{16, 17}}, |
| 57 | op{cap: 9, opType: opDeq, value: 16, items: []int{17}}, |
| 58 | op{cap: 9, opType: opDeq, value: 17, items: []int{}}, |
| 59 | op{cap: 9, opType: opDeq, value: 0, items: []int{}}, |
| 60 | ) |
| 61 | |
| 62 | t.Run("should panic on invalid chunkSize", func(t *testing.T) { |
| 63 | defer func() { |
| 64 | if r := recover(); r == nil { |
| 65 | t.Fatalf("should have panicked") |