github.com/saferwall/pe@v1.5.2/cmd/size_test.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"runtime"
     7  	"strings"
     8  	"testing"
     9  )
    10  
    11  func ExampleBytesSize() {
    12  	fmt.Println(BytesSize(1024))
    13  	fmt.Println(BytesSize(1024 * 1024))
    14  	fmt.Println(BytesSize(1048576))
    15  	fmt.Println(BytesSize(2 * MiB))
    16  	fmt.Println(BytesSize(3.42 * GiB))
    17  	fmt.Println(BytesSize(5.372 * TiB))
    18  	fmt.Println(BytesSize(2.22 * PiB))
    19  }
    20  
    21  func ExampleHumanSize() {
    22  	fmt.Println(HumanSize(1000))
    23  	fmt.Println(HumanSize(1024))
    24  	fmt.Println(HumanSize(1000000))
    25  	fmt.Println(HumanSize(1048576))
    26  	fmt.Println(HumanSize(2 * MB))
    27  	fmt.Println(HumanSize(float64(3.42 * GB)))
    28  	fmt.Println(HumanSize(float64(5.372 * TB)))
    29  	fmt.Println(HumanSize(float64(2.22 * PB)))
    30  }
    31  
    32  func ExampleFromHumanSize() {
    33  	fmt.Println(FromHumanSize("32"))
    34  	fmt.Println(FromHumanSize("32b"))
    35  	fmt.Println(FromHumanSize("32B"))
    36  	fmt.Println(FromHumanSize("32k"))
    37  	fmt.Println(FromHumanSize("32K"))
    38  	fmt.Println(FromHumanSize("32kb"))
    39  	fmt.Println(FromHumanSize("32Kb"))
    40  	fmt.Println(FromHumanSize("32Mb"))
    41  	fmt.Println(FromHumanSize("32Gb"))
    42  	fmt.Println(FromHumanSize("32Tb"))
    43  	fmt.Println(FromHumanSize("32Pb"))
    44  }
    45  
    46  func ExampleRAMInBytes() {
    47  	fmt.Println(RAMInBytes("32"))
    48  	fmt.Println(RAMInBytes("32b"))
    49  	fmt.Println(RAMInBytes("32B"))
    50  	fmt.Println(RAMInBytes("32k"))
    51  	fmt.Println(RAMInBytes("32K"))
    52  	fmt.Println(RAMInBytes("32kb"))
    53  	fmt.Println(RAMInBytes("32Kb"))
    54  	fmt.Println(RAMInBytes("32Mb"))
    55  	fmt.Println(RAMInBytes("32Gb"))
    56  	fmt.Println(RAMInBytes("32Tb"))
    57  	fmt.Println(RAMInBytes("32Pb"))
    58  	fmt.Println(RAMInBytes("32PB"))
    59  	fmt.Println(RAMInBytes("32P"))
    60  }
    61  
    62  func TestBytesSize(t *testing.T) {
    63  	assertEquals(t, "1KiB", BytesSize(1024))
    64  	assertEquals(t, "1MiB", BytesSize(1024*1024))
    65  	assertEquals(t, "1MiB", BytesSize(1048576))
    66  	assertEquals(t, "2MiB", BytesSize(2*MiB))
    67  	assertEquals(t, "3.42GiB", BytesSize(3.42*GiB))
    68  	assertEquals(t, "5.372TiB", BytesSize(5.372*TiB))
    69  	assertEquals(t, "2.22PiB", BytesSize(2.22*PiB))
    70  	assertEquals(t, "1.049e+06YiB", BytesSize(KiB*KiB*KiB*KiB*KiB*PiB))
    71  }
    72  
    73  func TestHumanSize(t *testing.T) {
    74  	assertEquals(t, "1kB", HumanSize(1000))
    75  	assertEquals(t, "1.024kB", HumanSize(1024))
    76  	assertEquals(t, "1MB", HumanSize(1000000))
    77  	assertEquals(t, "1.049MB", HumanSize(1048576))
    78  	assertEquals(t, "2MB", HumanSize(2*MB))
    79  	assertEquals(t, "3.42GB", HumanSize(float64(3.42*GB)))
    80  	assertEquals(t, "5.372TB", HumanSize(float64(5.372*TB)))
    81  	assertEquals(t, "2.22PB", HumanSize(float64(2.22*PB)))
    82  	assertEquals(t, "1e+04YB", HumanSize(float64(10000000000000*PB)))
    83  }
    84  
    85  func TestFromHumanSize(t *testing.T) {
    86  	assertSuccessEquals(t, 0, FromHumanSize, "0")
    87  	assertSuccessEquals(t, 0, FromHumanSize, "0b")
    88  	assertSuccessEquals(t, 0, FromHumanSize, "0B")
    89  	assertSuccessEquals(t, 0, FromHumanSize, "0 B")
    90  	assertSuccessEquals(t, 32, FromHumanSize, "32")
    91  	assertSuccessEquals(t, 32, FromHumanSize, "32b")
    92  	assertSuccessEquals(t, 32, FromHumanSize, "32B")
    93  	assertSuccessEquals(t, 32*KB, FromHumanSize, "32k")
    94  	assertSuccessEquals(t, 32*KB, FromHumanSize, "32K")
    95  	assertSuccessEquals(t, 32*KB, FromHumanSize, "32kb")
    96  	assertSuccessEquals(t, 32*KB, FromHumanSize, "32Kb")
    97  	assertSuccessEquals(t, 32*MB, FromHumanSize, "32Mb")
    98  	assertSuccessEquals(t, 32*GB, FromHumanSize, "32Gb")
    99  	assertSuccessEquals(t, 32*TB, FromHumanSize, "32Tb")
   100  	assertSuccessEquals(t, 32*PB, FromHumanSize, "32Pb")
   101  
   102  	assertSuccessEquals(t, 32.5*KB, FromHumanSize, "32.5kB")
   103  	assertSuccessEquals(t, 32.5*KB, FromHumanSize, "32.5 kB")
   104  	assertSuccessEquals(t, 32, FromHumanSize, "32.5 B")
   105  	assertSuccessEquals(t, 300, FromHumanSize, "0.3 K")
   106  	assertSuccessEquals(t, 300, FromHumanSize, ".3kB")
   107  
   108  	assertSuccessEquals(t, 0, FromHumanSize, "0.")
   109  	assertSuccessEquals(t, 0, FromHumanSize, "0. ")
   110  	assertSuccessEquals(t, 0, FromHumanSize, "0.b")
   111  	assertSuccessEquals(t, 0, FromHumanSize, "0.B")
   112  	assertSuccessEquals(t, 0, FromHumanSize, "-0")
   113  	assertSuccessEquals(t, 0, FromHumanSize, "-0b")
   114  	assertSuccessEquals(t, 0, FromHumanSize, "-0B")
   115  	assertSuccessEquals(t, 0, FromHumanSize, "-0 b")
   116  	assertSuccessEquals(t, 0, FromHumanSize, "-0 B")
   117  	assertSuccessEquals(t, 32, FromHumanSize, "32.")
   118  	assertSuccessEquals(t, 32, FromHumanSize, "32.b")
   119  	assertSuccessEquals(t, 32, FromHumanSize, "32.B")
   120  	assertSuccessEquals(t, 32, FromHumanSize, "32. b")
   121  	assertSuccessEquals(t, 32, FromHumanSize, "32. B")
   122  
   123  	// We do not tolerate extra leading or trailing spaces
   124  	// (except for a space after the number and a missing suffix).
   125  	assertSuccessEquals(t, 0, FromHumanSize, "0 ")
   126  
   127  	assertError(t, FromHumanSize, " 0")
   128  	assertError(t, FromHumanSize, " 0b")
   129  	assertError(t, FromHumanSize, " 0B")
   130  	assertError(t, FromHumanSize, " 0 B")
   131  	assertError(t, FromHumanSize, "0b ")
   132  	assertError(t, FromHumanSize, "0B ")
   133  	assertError(t, FromHumanSize, "0 B ")
   134  
   135  	assertError(t, FromHumanSize, "")
   136  	assertError(t, FromHumanSize, "hello")
   137  	assertError(t, FromHumanSize, ".")
   138  	assertError(t, FromHumanSize, ". ")
   139  	assertError(t, FromHumanSize, " ")
   140  	assertError(t, FromHumanSize, "  ")
   141  	assertError(t, FromHumanSize, " .")
   142  	assertError(t, FromHumanSize, " . ")
   143  	assertError(t, FromHumanSize, "-32")
   144  	assertError(t, FromHumanSize, "-32b")
   145  	assertError(t, FromHumanSize, "-32B")
   146  	assertError(t, FromHumanSize, "-32 b")
   147  	assertError(t, FromHumanSize, "-32 B")
   148  	assertError(t, FromHumanSize, "32b.")
   149  	assertError(t, FromHumanSize, "32B.")
   150  	assertError(t, FromHumanSize, "32 b.")
   151  	assertError(t, FromHumanSize, "32 B.")
   152  	assertError(t, FromHumanSize, "32 bb")
   153  	assertError(t, FromHumanSize, "32 BB")
   154  	assertError(t, FromHumanSize, "32 b b")
   155  	assertError(t, FromHumanSize, "32 B B")
   156  	assertError(t, FromHumanSize, "32  b")
   157  	assertError(t, FromHumanSize, "32  B")
   158  	assertError(t, FromHumanSize, " 32 ")
   159  	assertError(t, FromHumanSize, "32m b")
   160  	assertError(t, FromHumanSize, "32bm")
   161  }
   162  
   163  func TestRAMInBytes(t *testing.T) {
   164  	assertSuccessEquals(t, 32, RAMInBytes, "32")
   165  	assertSuccessEquals(t, 32, RAMInBytes, "32b")
   166  	assertSuccessEquals(t, 32, RAMInBytes, "32B")
   167  	assertSuccessEquals(t, 32*KiB, RAMInBytes, "32k")
   168  	assertSuccessEquals(t, 32*KiB, RAMInBytes, "32K")
   169  	assertSuccessEquals(t, 32*KiB, RAMInBytes, "32kb")
   170  	assertSuccessEquals(t, 32*KiB, RAMInBytes, "32Kb")
   171  	assertSuccessEquals(t, 32*KiB, RAMInBytes, "32Kib")
   172  	assertSuccessEquals(t, 32*KiB, RAMInBytes, "32KIB")
   173  	assertSuccessEquals(t, 32*MiB, RAMInBytes, "32Mb")
   174  	assertSuccessEquals(t, 32*GiB, RAMInBytes, "32Gb")
   175  	assertSuccessEquals(t, 32*TiB, RAMInBytes, "32Tb")
   176  	assertSuccessEquals(t, 32*PiB, RAMInBytes, "32Pb")
   177  	assertSuccessEquals(t, 32*PiB, RAMInBytes, "32PB")
   178  	assertSuccessEquals(t, 32*PiB, RAMInBytes, "32P")
   179  
   180  	assertSuccessEquals(t, 32, RAMInBytes, "32.3")
   181  	tmp := 32.3 * MiB
   182  	assertSuccessEquals(t, int64(tmp), RAMInBytes, "32.3 mb")
   183  	tmp = 0.3 * MiB
   184  	assertSuccessEquals(t, int64(tmp), RAMInBytes, "0.3MB")
   185  
   186  	assertError(t, RAMInBytes, "")
   187  	assertError(t, RAMInBytes, "hello")
   188  	assertError(t, RAMInBytes, "-32")
   189  	assertError(t, RAMInBytes, " 32 ")
   190  	assertError(t, RAMInBytes, "32m b")
   191  	assertError(t, RAMInBytes, "32bm")
   192  }
   193  
   194  func BenchmarkParseSize(b *testing.B) {
   195  	for i := 0; i < b.N; i++ {
   196  		for _, s := range []string{
   197  			"", "32", "32b", "32 B", "32k", "32.5 K", "32kb", "32 Kb",
   198  			"32.8Mb", "32.9Gb", "32.777Tb", "32Pb", "0.3Mb", "-1",
   199  		} {
   200  			FromHumanSize(s)
   201  			RAMInBytes(s)
   202  		}
   203  	}
   204  }
   205  
   206  func assertEquals(t *testing.T, expected, actual interface{}) {
   207  	t.Helper()
   208  	if expected != actual {
   209  		t.Errorf("Expected '%v' but got '%v'", expected, actual)
   210  	}
   211  }
   212  
   213  // func that maps to the parse function signatures as testing abstraction
   214  type parseFn func(string) (int64, error)
   215  
   216  // Define 'String()' for pretty-print
   217  func (fn parseFn) String() string {
   218  	fnName := runtime.FuncForPC(reflect.ValueOf(fn).Pointer()).Name()
   219  	return fnName[strings.LastIndex(fnName, ".")+1:]
   220  }
   221  
   222  func assertSuccessEquals(t *testing.T, expected int64, fn parseFn, arg string) {
   223  	t.Helper()
   224  	res, err := fn(arg)
   225  	if err != nil || res != expected {
   226  		t.Errorf("%s(\"%s\") -> expected '%d' but got '%d' with error '%v'", fn, arg, expected, res, err)
   227  	}
   228  }
   229  
   230  func assertError(t *testing.T, fn parseFn, arg string) {
   231  	t.Helper()
   232  	res, err := fn(arg)
   233  	if err == nil && res != -1 {
   234  		t.Errorf("%s(\"%s\") -> expected error but got '%d'", fn, arg, res)
   235  	}
   236  }