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  }