github.com/biogo/store@v0.0.0-20201120204734-aad293a2328f/interval/landscape/landscape_test.go (about) 1 // Copyright ©2013 The bíogo Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package landscape 6 7 import ( 8 "fmt" 9 "testing" 10 11 "gopkg.in/check.v1" 12 13 "github.com/biogo/store/interval" 14 ) 15 16 func Test(t *testing.T) { check.TestingT(t) } 17 18 type S struct{} 19 20 var _ = check.Suite(&S{}) 21 22 type iv struct { 23 Start, End int 24 UID uintptr 25 } 26 27 func (i iv) Overlap(b interval.IntRange) bool { return i.End > b.Start && i.Start < b.End } 28 func (i iv) ID() uintptr { return i.UID } 29 func (i iv) Range() interval.IntRange { return interval.IntRange{i.Start, i.End} } 30 func (i iv) String() string { return fmt.Sprintf("[%d,%d)", i.Start, i.End) } 31 32 type lr struct { 33 t int 34 l []int 35 } 36 37 var testData = []struct { 38 ivs []iv 39 expect []lr 40 }{ 41 { 42 ivs: []iv(nil), 43 expect: []lr(nil), 44 }, 45 { 46 ivs: []iv{ 47 {Start: 1, End: 5}, 48 }, 49 expect: []lr{ 50 {1, []int{0}}, 51 {2, []int{1}}, 52 {3, []int{2}}, 53 {4, []int{1}}, 54 {5, []int{0}}, 55 }, 56 }, 57 { 58 ivs: []iv{ 59 {Start: 1, End: 5}, 60 {Start: 6, End: 10}, 61 }, 62 expect: []lr{ 63 {1, []int{0}}, 64 {2, []int{1}}, 65 {3, []int{2}}, 66 {4, []int{1}}, 67 {5, []int{0}}, 68 69 {6, []int{0}}, 70 {7, []int{1}}, 71 {8, []int{2}}, 72 {9, []int{1}}, 73 {10, []int{0}}, 74 }, 75 }, 76 { 77 ivs: []iv{ 78 {Start: 1, End: 5}, 79 {Start: 5, End: 9}, 80 }, 81 expect: []lr{ 82 {1, []int{0}}, 83 {2, []int{1}}, 84 {3, []int{2}}, 85 {4, []int{1}}, 86 {5, []int{0, 0}}, 87 {6, []int{1}}, 88 {7, []int{2}}, 89 {8, []int{1}}, 90 {9, []int{0}}, 91 }, 92 }, 93 { 94 ivs: []iv{ 95 {Start: 1, End: 5}, 96 {Start: 16, End: 20}, 97 }, 98 expect: []lr{ 99 {1, []int{0}}, 100 {2, []int{1}}, 101 {3, []int{2}}, 102 {4, []int{1}}, 103 {5, []int{0}}, 104 105 {16, []int{0}}, 106 {17, []int{1}}, 107 {18, []int{2}}, 108 {19, []int{1}}, 109 {20, []int{0}}, 110 }, 111 }, 112 { 113 ivs: []iv{ 114 {Start: 1, End: 5}, 115 {Start: 4, End: 17}, 116 {Start: 16, End: 20}, 117 }, 118 expect: []lr{ 119 {1, []int{0}}, 120 {2, []int{1}}, 121 {3, []int{2}}, 122 {4, []int{1, 0}}, 123 {5, []int{1, 0}}, 124 {6, []int{2}}, 125 {7, []int{3}}, 126 {8, []int{4}}, 127 {9, []int{5}}, 128 {10, []int{6}}, 129 {11, []int{6}}, 130 {12, []int{5}}, 131 {13, []int{4}}, 132 {14, []int{3}}, 133 {15, []int{2}}, 134 {16, []int{1, 0}}, 135 {17, []int{1, 0}}, 136 {18, []int{2}}, 137 {19, []int{1}}, 138 {20, []int{0}}, 139 }, 140 }, 141 { 142 ivs: []iv{ 143 {Start: 1, End: 5}, 144 {Start: 3, End: 18}, 145 {Start: 16, End: 20}, 146 }, 147 expect: []lr{ 148 {1, []int{0}}, 149 {2, []int{1}}, 150 {3, []int{2, 0}}, 151 {4, []int{1, 1}}, 152 {5, []int{2, 0}}, 153 {6, []int{3}}, 154 {7, []int{4}}, 155 {8, []int{5}}, 156 {9, []int{6}}, 157 {10, []int{7}}, 158 {11, []int{7}}, 159 {12, []int{6}}, 160 {13, []int{5}}, 161 {14, []int{4}}, 162 {15, []int{3}}, 163 {16, []int{2, 0}}, 164 {17, []int{1, 1}}, 165 {18, []int{2, 0}}, 166 {19, []int{1}}, 167 {20, []int{0}}, 168 }, 169 }, 170 { 171 ivs: []iv{ 172 {Start: 0, End: 6}, 173 {Start: 1, End: 5}, 174 }, 175 expect: []lr{ 176 {0, []int{0}}, 177 {1, []int{1, 0}}, 178 {2, []int{2, 1}}, 179 {3, []int{3, 2}}, 180 {4, []int{2, 1}}, 181 {5, []int{1, 0}}, 182 {6, []int{0}}, 183 }, 184 }, 185 { 186 ivs: []iv{ 187 {Start: 0, End: 10}, 188 {Start: 1, End: 5}, 189 }, 190 expect: []lr{ 191 {0, []int{0}}, 192 {1, []int{1, 0}}, 193 {2, []int{2, 1}}, 194 {3, []int{3, 2}}, 195 {4, []int{4, 1}}, 196 {5, []int{5, 0}}, 197 {6, []int{4}}, 198 {7, []int{3}}, 199 {8, []int{2}}, 200 {9, []int{1}}, 201 {10, []int{0}}, 202 }, 203 }, 204 { 205 ivs: []iv{ 206 {Start: 0, End: 10}, 207 {Start: 1, End: 5}, 208 {Start: 1, End: 5}, 209 }, 210 expect: []lr{ 211 {0, []int{0}}, 212 {1, []int{1, 0, 0}}, 213 {2, []int{2, 1, 1}}, 214 {3, []int{3, 2, 2}}, 215 {4, []int{4, 1, 1}}, 216 {5, []int{5, 0, 0}}, 217 {6, []int{4}}, 218 {7, []int{3}}, 219 {8, []int{2}}, 220 {9, []int{1}}, 221 {10, []int{0}}, 222 }, 223 }, 224 { 225 ivs: []iv{ 226 {Start: 5, End: 8}, 227 {Start: 6, End: 14}, 228 {Start: 0, End: 10}, 229 }, 230 expect: []lr{ 231 {0, []int{0}}, 232 {1, []int{1}}, 233 {2, []int{2}}, 234 {3, []int{3}}, 235 {4, []int{4}}, 236 {5, []int{5, 0}}, 237 {6, []int{4, 1, 0}}, 238 {7, []int{3, 1, 1}}, 239 {8, []int{2, 2, 0}}, 240 {9, []int{3, 1}}, 241 {10, []int{4, 0}}, 242 {11, []int{3}}, 243 {12, []int{2}}, 244 {13, []int{1}}, 245 {14, []int{0}}, 246 }, 247 }, 248 } 249 250 func (s *S) TestDescribeTree(c *check.C) { 251 for i, t := range testData { 252 var ( 253 it interval.IntTree 254 r []lr 255 ) 256 for id, e := range t.ivs { 257 e.UID = uintptr(id) 258 err := it.Insert(e, false) 259 c.Assert(err, check.Equals, nil) 260 } 261 DescribeTree(&it, func(pos int, l []int) { 262 if len(l) > 0 { 263 r = append(r, lr{pos, append([]int(nil), l...)}) 264 } 265 }) 266 c.Check(r, check.DeepEquals, t.expect, check.Commentf("Test %d: %v", i, t.ivs)) 267 } 268 } 269 270 type ivs []iv 271 272 func (s ivs) Len() int { return len(s) } 273 func (s ivs) Less(i, j int) bool { return s[i].Start < s[j].Start } 274 func (s ivs) Swap(i, j int) { s[i], s[j] = s[j], s[i] } 275 func (s ivs) Item(i int) interval.IntRange { return s[i].Range() } 276 277 func (s *S) TestDescribe(c *check.C) { 278 for i, t := range testData { 279 var ( 280 data = append(ivs(nil), t.ivs...) 281 r []lr 282 ) 283 Describe(data, func(pos int, l []int) { 284 if len(l) > 0 { 285 r = append(r, lr{pos, append([]int(nil), l...)}) 286 } 287 }) 288 c.Check(r, check.DeepEquals, t.expect, check.Commentf("Test %d: %v", i, t.ivs)) 289 } 290 }