github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/man/si_test.go (about) 1 package man 2 3 import ( 4 "math" 5 "testing" 6 ) 7 8 func TestSI(t *testing.T) { 9 tests := []struct { 10 name string 11 num float64 12 formatted string 13 }{ 14 {"e-24", 1e-24, "1 yF"}, 15 {"e-21", 1e-21, "1 zF"}, 16 {"e-18", 1e-18, "1 aF"}, 17 {"e-15", 1e-15, "1 fF"}, 18 {"e-12", 1e-12, "1 pF"}, 19 {"e-12", 2.2345e-12, "2.2345 pF"}, 20 {"e-12", 2.23e-12, "2.23 pF"}, 21 {"e-11", 2.23e-11, "22.3 pF"}, 22 {"e-10", 2.2e-10, "220 pF"}, 23 {"e-9", 2.2e-9, "2.2 nF"}, 24 {"e-8", 2.2e-8, "22 nF"}, 25 {"e-7", 2.2e-7, "220 nF"}, 26 {"e-6", 2.2e-6, "2.2 µF"}, 27 {"e-6", 1e-6, "1 µF"}, 28 {"e-5", 2.2e-5, "22 µF"}, 29 {"e-4", 2.2e-4, "220 µF"}, 30 {"e-3", 2.2e-3, "2.2 mF"}, 31 {"e-2", 2.2e-2, "22 mF"}, 32 {"e-1", 2.2e-1, "220 mF"}, 33 {"e+0", 2.2e-0, "2.2 F"}, 34 {"e+0", 2.2, "2.2 F"}, 35 {"e+1", 2.2e+1, "22 F"}, 36 {"0", 0, "0 F"}, 37 {"e+1", 22, "22 F"}, 38 {"e+2", 2.2e+2, "220 F"}, 39 {"e+2", 220, "220 F"}, 40 {"e+3", 2.2e+3, "2.2 kF"}, 41 {"e+3", 2200, "2.2 kF"}, 42 {"e+4", 2.2e+4, "22 kF"}, 43 {"e+4", 22000, "22 kF"}, 44 {"e+5", 2.2e+5, "220 kF"}, 45 {"e+6", 2.2e+6, "2.2 MF"}, 46 {"e+6", 1e+6, "1 MF"}, 47 {"e+7", 2.2e+7, "22 MF"}, 48 {"e+8", 2.2e+8, "220 MF"}, 49 {"e+9", 2.2e+9, "2.2 GF"}, 50 {"e+10", 2.2e+10, "22 GF"}, 51 {"e+11", 2.2e+11, "220 GF"}, 52 {"e+12", 2.2e+12, "2.2 TF"}, 53 {"e+15", 2.2e+15, "2.2 PF"}, 54 {"e+18", 2.2e+18, "2.2 EF"}, 55 {"e+21", 2.2e+21, "2.2 ZF"}, 56 {"e+24", 2.2e+24, "2.2 YF"}, 57 58 // special case 59 {"1F", 1000 * 1000, "1 MF"}, 60 {"1F", 1e6, "1 MF"}, 61 62 // negative number 63 {"-100 F", -100, "-100 F"}, 64 } 65 66 for _, test := range tests { 67 got := SI(test.num, "F") 68 if got != test.formatted { 69 t.Errorf("On %v (%v), got %v, wanted %v", 70 test.name, test.num, got, test.formatted) 71 } 72 73 gotf, gotu, err := ParseSI(test.formatted) 74 if err != nil { 75 t.Errorf("Error parsing %v (%v): %v", test.name, test.formatted, err) 76 continue 77 } 78 79 if math.Abs(1-(gotf/test.num)) > 0.01 { 80 t.Errorf("On %v (%v), got %v, wanted %v (±%v)", 81 test.name, test.formatted, gotf, test.num, 82 math.Abs(1-(gotf/test.num))) 83 } 84 if gotu != "F" { 85 t.Errorf("On %v (%v), expected unit F, got %v", 86 test.name, test.formatted, gotu) 87 } 88 } 89 90 // Parse error 91 gotf, gotu, err := ParseSI("x1.21JW") // 1.21 jigga whats 92 if err == nil { 93 t.Errorf("Expected error on x1.21JW, got %v %v", gotf, gotu) 94 } 95 } 96 97 func TestSIWithDigits(t *testing.T) { 98 tests := []struct { 99 name string 100 num float64 101 digits int 102 formatted string 103 }{ 104 {"e-12", 2.234e-12, 0, "2 pF"}, 105 {"e-12", 2.234e-12, 1, "2.2 pF"}, 106 {"e-12", 2.234e-12, 2, "2.23 pF"}, 107 {"e-12", 2.234e-12, 3, "2.234 pF"}, 108 {"e-12", 2.234e-12, 4, "2.234 pF"}, 109 } 110 111 for _, test := range tests { 112 got := SIWithDigits(test.num, test.digits, "F") 113 if got != test.formatted { 114 t.Errorf("On %v (%v), got %v, wanted %v", 115 test.name, test.num, got, test.formatted) 116 } 117 } 118 } 119 120 func BenchmarkParseSI(b *testing.B) { 121 for i := 0; i < b.N; i++ { 122 ParseSI("2.2346ZB") 123 } 124 }