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  }