github.com/TrueBlocks/trueblocks-core/src/apps/chifra@v0.0.0-20241022031540-b362680128f7/pkg/base/fileRange_test.go (about) 1 // Copyright 2021 The TrueBlocks Authors. All rights reserved. 2 // Use of this source code is governed by a license that can 3 // be found in the LICENSE file. 4 5 package base 6 7 import ( 8 "fmt" 9 "os" 10 "strings" 11 "testing" 12 ) 13 14 func TestFileRange(t *testing.T) { 15 type TestType struct { 16 fileName string 17 want FileRange 18 errored bool 19 } 20 tests := []TestType{ 21 { 22 fileName: "0.bin", 23 want: FileRange{0, 0}, 24 }, 25 { 26 fileName: "illformed-x", 27 want: FileRange{0, 0}, 28 errored: true, 29 }, 30 { 31 fileName: "9991-9909.bin", 32 want: FileRange{9991, 9909}, 33 }, 34 { 35 fileName: "000100001-000100002.bin", 36 want: FileRange{100001, 100002}, 37 }, 38 { 39 fileName: "891919121.bin", 40 want: FileRange{0, 891919121}, 41 }, 42 { 43 fileName: "/unchained/mainnet/blooms/013433393-013436307.bloom", 44 want: FileRange{13433393, 13436307}, 45 }, 46 } 47 48 check := func(t *testing.T, tt TestType, s FileRange, e error) { 49 if tt.errored && e == nil { 50 t.Error("Expected an error but got none", s) 51 } else if !tt.errored && e != nil { 52 t.Error("Unexpected error", e) 53 } 54 } 55 56 for _, tt := range tests { 57 s, err := RangeFromFilenameE(tt.fileName) 58 check(t, tt, s, err) 59 fmt.Println(s) 60 } 61 } 62 63 func TestFilenameFromRange(t *testing.T) { 64 type TestType struct { 65 name string 66 fileRange FileRange 67 rangeStr string 68 } 69 tests := []TestType{ 70 { 71 name: "Pads numbers", 72 fileRange: FileRange{0, 1}, 73 rangeStr: "000000000-000000001", 74 }, 75 } 76 for _, tt := range tests { 77 t.Run(tt.name, func(t *testing.T) { 78 if got, err := RangeFromFilenameE(tt.rangeStr); err != nil { 79 t.Errorf("FilenameFromRange() error: %v", err) 80 } else if got != tt.fileRange { 81 t.Errorf("FilenameFromRange() = %v, want %v", got, tt.rangeStr) 82 } 83 if got := RangeFromRangeString(tt.rangeStr); got != tt.fileRange { 84 t.Errorf("FilenameFromRange() = %v, want %v", got, tt.rangeStr) 85 } 86 }) 87 } 88 89 fR := FileRange{0, 100} 90 want := "mainnet/finalized/000000000-000000100.bin" 91 got := fR.RangeToFilename("mainnet") 92 parts := strings.Split(got, "unchained"+string(os.PathSeparator)) 93 if len(parts) != 2 || parts[1] != want { 94 t.Errorf("FilenameFromRange() = %v, want %v", got, parts[1]) 95 } 96 } 97 98 func Test_RangeRangeIntersect(t *testing.T) { 99 type TestType struct { 100 name string 101 left FileRange 102 right FileRange 103 want []bool 104 } 105 tests := []TestType{ 106 { 107 name: "right less than left", 108 left: FileRange{200, 300}, 109 right: FileRange{100, 150}, 110 want: []bool{false, false, false, true, false}, 111 }, 112 { 113 name: "fully overlap", 114 left: FileRange{200, 300}, 115 right: FileRange{100, 400}, 116 want: []bool{true, false, false, true, true}, 117 }, 118 { 119 name: "fully contained", 120 left: FileRange{200, 300}, 121 right: FileRange{250, 275}, 122 want: []bool{true, true, true, false, false}, 123 }, 124 { 125 name: "lefts align", 126 left: FileRange{200, 300}, 127 right: FileRange{200, 400}, 128 want: []bool{true, true, false, false, true}, 129 }, 130 { 131 name: "left greater than", 132 left: FileRange{200, 300}, 133 right: FileRange{250, 400}, 134 want: []bool{true, true, false, false, true}, 135 }, 136 { 137 name: "left aligns right", 138 left: FileRange{200, 300}, 139 right: FileRange{300, 400}, 140 want: []bool{true, true, false, false, true}, 141 }, 142 { 143 name: "rights align", 144 left: FileRange{200, 300}, 145 right: FileRange{250, 300}, 146 want: []bool{true, true, true, false, false}, 147 }, 148 { 149 name: "left greater than right", 150 left: FileRange{200, 300}, 151 right: FileRange{350, 400}, 152 want: []bool{false, false, false, false, true}, 153 }, 154 } 155 156 for _, tt := range tests { 157 s := tt.left.Intersects(tt.right) 158 if s != tt.want[0] { 159 t.Error("Test", tt.name, "failed Intersects.") 160 } 161 s = tt.left.IntersectsB(tt.right.First) 162 if s != tt.want[1] { 163 t.Error("Test", tt.name, "failed IntersectsB 1.") 164 } 165 s = tt.left.IntersectsB(tt.right.Last) 166 if s != tt.want[2] { 167 t.Error("Test", tt.name, "failed IntersectsB 2.") 168 } 169 // s = tt.left.LaterThan(tt.right) 170 // if s != tt.want[3] { 171 // t.Error("Test", tt.name, "failed LaterThan.") 172 // } 173 s = tt.left.LaterThanB(tt.right.First) 174 if s != tt.want[3] { 175 t.Error("Test", tt.name, "failed LaterThanB.") 176 } 177 // s = tt.left.EarlierThan(tt.right) 178 // if s != tt.want[4] { 179 // t.Error("Test", tt.name, "failed EarlierThan.") 180 // } 181 s = tt.left.EarlierThanB(tt.right.Last) 182 if s != tt.want[4] { 183 t.Error("Test", tt.name, "failed EarlierThanB.") 184 } 185 } 186 } 187 188 func Test_Relative(t *testing.T) { 189 type TestType struct { 190 name string 191 left FileRange 192 right FileRange 193 want []bool 194 } 195 tests := []TestType{ 196 { 197 name: "left preceeds right", 198 left: FileRange{100, 200}, 199 right: FileRange{300, 400}, 200 want: []bool{true, false}, 201 }, 202 { 203 name: "left preceeds right", 204 left: FileRange{300, 400}, 205 right: FileRange{100, 200}, 206 want: []bool{false, true}, 207 }, 208 } 209 for _, tt := range tests { 210 s := tt.left.Preceeds(tt.right, false) 211 if s != tt.want[0] { 212 t.Error("Test", tt.name, "failed Preceeds.") 213 } 214 s = tt.left.Follows(tt.right, false) 215 if s != tt.want[1] { 216 t.Error("Test", tt.name, "failed Follows.") 217 } 218 } 219 }