go-hep.org/x/hep@v0.38.1/groot/riofs/plugin/http/span_test.go (about)

     1  // Copyright ©2022 The go-hep 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 http
     6  
     7  import (
     8  	"reflect"
     9  	"testing"
    10  )
    11  
    12  func TestSpanSplit(t *testing.T) {
    13  	mk := func(beg, end int64) span {
    14  		return span{
    15  			off: beg,
    16  			len: end - beg,
    17  		}
    18  	}
    19  	from := func(vs ...int64) []span {
    20  		if len(vs) == 0 {
    21  			return nil
    22  		}
    23  		o := make([]span, 0, len(vs)/2)
    24  		for i := 0; i < len(vs); i += 2 {
    25  			o = append(o, mk(vs[i], vs[i+1]))
    26  		}
    27  		return o
    28  	}
    29  	for _, tc := range []struct {
    30  		spans []span
    31  		sp    span
    32  		want  []span
    33  	}{
    34  		{
    35  			spans: from(),
    36  			sp:    span{0, 2},
    37  			want:  from(0, 2),
    38  		},
    39  		// 1-1 intersects
    40  		{
    41  			spans: from(2, 4),
    42  			sp:    mk(0, 3),
    43  			want:  from(0, 2),
    44  		},
    45  		{
    46  			spans: from(2, 4),
    47  			sp:    mk(3, 5),
    48  			want:  from(4, 5),
    49  		},
    50  		{
    51  			spans: from(2, 5),
    52  			sp:    mk(3, 4),
    53  			want:  from(),
    54  		},
    55  		{
    56  			spans: from(2, 4),
    57  			sp:    mk(0, 5),
    58  			want:  from(0, 2, 4, 5),
    59  		},
    60  		{
    61  			spans: from(2, 4),
    62  			sp:    mk(0, 4),
    63  			want:  from(0, 2),
    64  		},
    65  		{
    66  			spans: from(2, 4),
    67  			sp:    mk(2, 5),
    68  			want:  from(4, 5),
    69  		},
    70  		{
    71  			spans: from(2, 4),
    72  			sp:    mk(0, 2),
    73  			want:  from(0, 2),
    74  		},
    75  		{
    76  			spans: from(2, 4),
    77  			sp:    mk(0, 1),
    78  			want:  from(0, 1),
    79  		},
    80  		{
    81  			spans: from(2, 4),
    82  			sp:    mk(4, 6),
    83  			want:  from(4, 6),
    84  		},
    85  		{
    86  			spans: from(2, 4),
    87  			sp:    mk(5, 6),
    88  			want:  from(5, 6),
    89  		},
    90  		//
    91  		{
    92  			spans: from(0, 4, 5, 7),
    93  			sp:    mk(0, 7),
    94  			want:  from(4, 5),
    95  		},
    96  		{
    97  			spans: from(0, 4, 5, 7),
    98  			sp:    mk(0, 6),
    99  			want:  from(4, 5),
   100  		},
   101  		{
   102  			spans: from(0, 4, 5, 7),
   103  			sp:    mk(7, 9),
   104  			want:  from(7, 9),
   105  		},
   106  		// 2-1 intersects
   107  		{
   108  			spans: from(1, 4, 6, 8),
   109  			sp:    mk(3, 7),
   110  			want:  from(4, 6),
   111  		},
   112  		{
   113  			spans: from(1, 4, 6, 8),
   114  			sp:    mk(3, 10),
   115  			want:  from(4, 6, 8, 10),
   116  		},
   117  		{
   118  			spans: from(1, 4, 6, 8),
   119  			sp:    mk(3, 5),
   120  			want:  from(4, 5),
   121  		},
   122  		{
   123  			spans: from(1, 4, 6, 8),
   124  			sp:    mk(1, 5),
   125  			want:  from(4, 5),
   126  		},
   127  		{
   128  			spans: from(1, 4, 6, 8),
   129  			sp:    mk(1, 7),
   130  			want:  from(4, 6),
   131  		},
   132  		{
   133  			spans: from(1, 4, 6, 8),
   134  			sp:    mk(1, 10),
   135  			want:  from(4, 6, 8, 10),
   136  		},
   137  		{
   138  			spans: from(1, 4, 6, 8),
   139  			sp:    mk(0, 5),
   140  			want:  from(0, 1, 4, 5),
   141  		},
   142  		{
   143  			spans: from(1, 4, 6, 8),
   144  			sp:    mk(0, 7),
   145  			want:  from(0, 1, 4, 6),
   146  		},
   147  		{
   148  			spans: from(1, 4, 6, 8),
   149  			sp:    mk(0, 10),
   150  			want:  from(0, 1, 4, 6, 8, 10),
   151  		},
   152  		{
   153  			spans: from(1, 4, 6, 8),
   154  			sp:    mk(4, 5),
   155  			want:  from(4, 5),
   156  		},
   157  		{
   158  			spans: from(1, 4, 6, 8),
   159  			sp:    mk(4, 7),
   160  			want:  from(4, 6),
   161  		},
   162  		{
   163  			spans: from(1, 4, 6, 8),
   164  			sp:    mk(4, 10),
   165  			want:  from(4, 6, 8, 10),
   166  		},
   167  		{
   168  			spans: from(1, 4, 6, 8),
   169  			sp:    mk(1, 8),
   170  			want:  from(4, 6),
   171  		},
   172  		{
   173  			spans: from(1, 4, 6, 8),
   174  			sp:    mk(1, 4),
   175  			want:  from(),
   176  		},
   177  		{
   178  			spans: from(1, 4, 6, 8),
   179  			sp:    mk(1, 6),
   180  			want:  from(4, 6),
   181  		},
   182  		{
   183  			spans: from(1, 4, 6, 8),
   184  			sp:    mk(4, 6),
   185  			want:  from(4, 6),
   186  		},
   187  		{
   188  			spans: from(1, 4, 6, 8),
   189  			sp:    mk(4, 8),
   190  			want:  from(4, 6),
   191  		},
   192  		{
   193  			spans: from(1, 4, 6, 8),
   194  			sp:    mk(6, 8),
   195  			want:  from(),
   196  		},
   197  	} {
   198  		t.Run("", func(t *testing.T) {
   199  			got := split(tc.sp, tc.spans)
   200  			if !reflect.DeepEqual(got, tc.want) {
   201  				t.Fatalf("invalid split:\ngot= %+v\nwant=%+v", got, tc.want)
   202  			}
   203  		})
   204  	}
   205  }
   206  
   207  func TestSpanAdd(t *testing.T) {
   208  	mk := func(beg, end int64) span {
   209  		return span{
   210  			off: beg,
   211  			len: end - beg,
   212  		}
   213  	}
   214  	from := func(vs ...int64) []span {
   215  		if len(vs) == 0 {
   216  			return nil
   217  		}
   218  		o := make([]span, 0, len(vs)/2)
   219  		for i := 0; i < len(vs); i += 2 {
   220  			o = append(o, mk(vs[i], vs[i+1]))
   221  		}
   222  		return o
   223  	}
   224  	for _, tc := range []struct {
   225  		spans []span
   226  		sp    span
   227  		want  []span
   228  	}{
   229  		{
   230  			spans: from(),
   231  			sp:    mk(0, 10),
   232  			want:  from(0, 10),
   233  		},
   234  		{
   235  			spans: from(),
   236  			sp:    mk(9, 10),
   237  			want:  from(9, 10),
   238  		},
   239  		{
   240  			spans: from(1, 3, 4, 6),
   241  			sp:    mk(3, 4),
   242  			want:  from(1, 6),
   243  		},
   244  		{
   245  			spans: from(1, 3, 4, 6),
   246  			sp:    mk(0, 1),
   247  			want:  from(0, 3, 4, 6),
   248  		},
   249  		{
   250  			spans: from(1, 3, 4, 6),
   251  			sp:    mk(6, 10),
   252  			want:  from(1, 3, 4, 10),
   253  		},
   254  		{
   255  			spans: from(1, 3, 4, 6),
   256  			sp:    mk(7, 10),
   257  			want:  from(1, 3, 4, 6, 7, 10),
   258  		},
   259  		{
   260  			spans: from(2, 3, 4, 6),
   261  			sp:    mk(0, 1),
   262  			want:  from(0, 1, 2, 3, 4, 6),
   263  		},
   264  	} {
   265  		t.Run("", func(t *testing.T) {
   266  			got := make(spans, len(tc.spans))
   267  			copy(got, tc.spans)
   268  			got.add(tc.sp)
   269  			if !reflect.DeepEqual(got, spans(tc.want)) {
   270  				t.Fatalf("invalid span-add:\ngot= %+v\nwant=%+v", got, tc.want)
   271  			}
   272  		})
   273  	}
   274  }