Codebase list golang-github-vbauerster-mpb / 8538df5
Add speed formatters and tests for it Vladimir Stolyarov authored 8 years ago Vladimir Bauer committed 8 years ago
2 changed file(s) with 252 addition(s) and 0 deletion(s). Raw diff Collapse all Expand all
0 package decor
1
2 import (
3 "fmt"
4 "io"
5 "strconv"
6 "strings"
7 )
8
9 type SpeedKiB float64
10
11 func (s SpeedKiB) Format(st fmt.State, verb rune) {
12 prec, ok := st.Precision()
13
14 if verb == 'd' || !ok {
15 prec = 0
16 }
17 if verb == 'f' && !ok {
18 prec = 6
19 }
20 // retain old beahavior if s verb used
21 if verb == 's' {
22 prec = 1
23 }
24
25 var res, unit string
26 switch {
27 case s >= TiB:
28 unit = "TiB/s"
29 res = strconv.FormatFloat(float64(s)/TiB, 'f', prec, 64)
30 case s >= GiB:
31 unit = "GiB/s"
32 res = strconv.FormatFloat(float64(s)/GiB, 'f', prec, 64)
33 case s >= MiB:
34 unit = "MiB/s"
35 res = strconv.FormatFloat(float64(s)/MiB, 'f', prec, 64)
36 case s >= KiB:
37 unit = "KiB/s"
38 res = strconv.FormatFloat(float64(s)/KiB, 'f', prec, 64)
39 default:
40 unit = "b/s"
41 res = strconv.FormatInt(int64(s), 10)
42 }
43
44 if st.Flag(' ') {
45 res += " "
46 }
47 res += unit
48
49 if w, ok := st.Width(); ok {
50 if len(res) < w {
51 pad := strings.Repeat(" ", w-len(res))
52 if st.Flag(int('-')) {
53 res += pad
54 } else {
55 res = pad + res
56 }
57 }
58 }
59
60 io.WriteString(st, res)
61 }
62
63 type SpeedKB float64
64
65 func (s SpeedKB) Format(st fmt.State, verb rune) {
66 prec, ok := st.Precision()
67
68 if verb == 'd' || !ok {
69 prec = 0
70 }
71 if verb == 'f' && !ok {
72 prec = 6
73 }
74 // retain old beahavior if s verb used
75 if verb == 's' {
76 prec = 1
77 }
78
79 var res, unit string
80 switch {
81 case s >= TB:
82 unit = "TB/s"
83 res = strconv.FormatFloat(float64(s)/TB, 'f', prec, 64)
84 case s >= GB:
85 unit = "GB/s"
86 res = strconv.FormatFloat(float64(s)/GB, 'f', prec, 64)
87 case s >= MB:
88 unit = "MB/s"
89 res = strconv.FormatFloat(float64(s)/MB, 'f', prec, 64)
90 case s >= KB:
91 unit = "kB/s"
92 res = strconv.FormatFloat(float64(s)/KB, 'f', prec, 64)
93 default:
94 unit = "b/s"
95 res = strconv.FormatInt(int64(s), 10)
96 }
97
98 if st.Flag(' ') {
99 res += " "
100 }
101 res += unit
102
103 if w, ok := st.Width(); ok {
104 if len(res) < w {
105 pad := strings.Repeat(" ", w-len(res))
106 if st.Flag(int('-')) {
107 res += pad
108 } else {
109 res = pad + res
110 }
111 }
112 }
113
114 io.WriteString(st, res)
115 }
0 package decor
1
2 import (
3 "fmt"
4 "testing"
5 )
6
7 func TestSpeedKiB(t *testing.T) {
8 cases := map[string]struct {
9 value int64
10 verb, expected string
11 }{
12 "verb %f": {12345678, "%f", "11.773756MiB/s"},
13 "verb %.0f": {12345678, "%.0f", "12MiB/s"},
14 "verb %.1f": {12345678, "%.1f", "11.8MiB/s"},
15 "verb %.2f": {12345678, "%.2f", "11.77MiB/s"},
16 "verb %.3f": {12345678, "%.3f", "11.774MiB/s"},
17
18 "verb % f": {12345678, "% f", "11.773756 MiB/s"},
19 "verb % .0f": {12345678, "% .0f", "12 MiB/s"},
20 "verb % .1f": {12345678, "% .1f", "11.8 MiB/s"},
21 "verb % .2f": {12345678, "% .2f", "11.77 MiB/s"},
22 "verb % .3f": {12345678, "% .3f", "11.774 MiB/s"},
23
24 "verb %10.f": {12345678, "%10.f", " 12MiB/s"},
25 "verb %10.0f": {12345678, "%10.0f", " 12MiB/s"},
26 "verb %10.1f": {12345678, "%10.1f", " 11.8MiB/s"},
27 "verb %10.2f": {12345678, "%10.2f", "11.77MiB/s"},
28 "verb %10.3f": {12345678, "%10.3f", "11.774MiB/s"},
29
30 "verb % 10.f": {12345678, "% 10.f", " 12 MiB/s"},
31 "verb % 10.0f": {12345678, "% 10.0f", " 12 MiB/s"},
32 "verb % 10.1f": {12345678, "% 10.1f", "11.8 MiB/s"},
33
34 "verb %-10.f": {12345678, "%-10.f", "12MiB/s "},
35 "verb %-10.0f": {12345678, "%-10.0f", "12MiB/s "},
36 "verb %-10.1f": {12345678, "%-10.1f", "11.8MiB/s "},
37 "verb %-10.2f": {12345678, "%10.2f", "11.77MiB/s"},
38 "verb %-10.3f": {12345678, "%10.3f", "11.774MiB/s"},
39
40 "verb % -10.f": {12345678, "% -10.f", "12 MiB/s "},
41 "verb % -10.0f": {12345678, "% -10.0f", "12 MiB/s "},
42 "verb % -10.1f": {12345678, "% -10.1f", "11.8 MiB/s"},
43
44 "1000 %f": {1000, "%f", "1000b/s"},
45 "1000 %d": {1000, "%d", "1000b/s"},
46 "1000 %s": {1000, "%s", "1000b/s"},
47 "1024 %f": {1024, "%f", "1.000000KiB/s"},
48 "1024 %d": {1024, "%d", "1KiB/s"},
49 "1024 %.1f": {1024, "%.1f", "1.0KiB/s"},
50 "1024 %s": {1024, "%s", "1.0KiB/s"},
51 "3*MiB/s+140KiB/s %f": {3*MiB + 140*KiB, "%f", "3.136719MiB/s"},
52 "3*MiB/s+140KiB/s %d": {3*MiB + 140*KiB, "%d", "3MiB/s"},
53 "3*MiB/s+140KiB/s %.1f": {3*MiB + 140*KiB, "%.1f", "3.1MiB/s"},
54 "3*MiB/s+140KiB/s %s": {3*MiB + 140*KiB, "%s", "3.1MiB/s"},
55 "2*GiB/s %f": {2 * GiB, "%f", "2.000000GiB/s"},
56 "2*GiB/s %d": {2 * GiB, "%d", "2GiB/s"},
57 "2*GiB/s %.1f": {2 * GiB, "%.1f", "2.0GiB/s"},
58 "2*GiB/s %s": {2 * GiB, "%s", "2.0GiB/s"},
59 "4*TiB/s %f": {4 * TiB, "%f", "4.000000TiB/s"},
60 "4*TiB/s %d": {4 * TiB, "%d", "4TiB/s"},
61 "4*TiB/s %.1f": {4 * TiB, "%.1f", "4.0TiB/s"},
62 "4*TiB/s %s": {4 * TiB, "%s", "4.0TiB/s"},
63 }
64 for k, tc := range cases {
65 got := fmt.Sprintf(tc.verb, SpeedKiB(tc.value))
66 if got != tc.expected {
67 t.Errorf("%s: Expected: %q, got: %q\n", k, tc.expected, got)
68 }
69 }
70 }
71
72 func TestSpeedKB(t *testing.T) {
73 cases := map[string]struct {
74 value int64
75 verb, expected string
76 }{
77 "verb %f": {12345678, "%f", "12.345678MB/s"},
78 "verb %.0f": {12345678, "%.0f", "12MB/s"},
79 "verb %.1f": {12345678, "%.1f", "12.3MB/s"},
80 "verb %.2f": {12345678, "%.2f", "12.35MB/s"},
81 "verb %.3f": {12345678, "%.3f", "12.346MB/s"},
82
83 "verb % f": {12345678, "% f", "12.345678 MB/s"},
84 "verb % .0f": {12345678, "% .0f", "12 MB/s"},
85 "verb % .1f": {12345678, "% .1f", "12.3 MB/s"},
86 "verb % .2f": {12345678, "% .2f", "12.35 MB/s"},
87 "verb % .3f": {12345678, "% .3f", "12.346 MB/s"},
88
89 "verb %10.f": {12345678, "%10.f", " 12MB/s"},
90 "verb %10.0f": {12345678, "%10.0f", " 12MB/s"},
91 "verb %10.1f": {12345678, "%10.1f", " 12.3MB/s"},
92 "verb %10.2f": {12345678, "%10.2f", " 12.35MB/s"},
93 "verb %10.3f": {12345678, "%10.3f", "12.346MB/s"},
94
95 "verb % 10.f": {12345678, "% 10.f", " 12 MB/s"},
96 "verb % 10.0f": {12345678, "% 10.0f", " 12 MB/s"},
97 "verb % 10.1f": {12345678, "% 10.1f", " 12.3 MB/s"},
98
99 "verb %-10.f": {12345678, "%-10.f", "12MB/s "},
100 "verb %-10.0f": {12345678, "%-10.0f", "12MB/s "},
101 "verb %-10.1f": {12345678, "%-10.1f", "12.3MB/s "},
102 "verb %-10.2f": {12345678, "%10.2f", " 12.35MB/s"},
103 "verb %-10.3f": {12345678, "%10.3f", "12.346MB/s"},
104
105 "verb % -10.f": {12345678, "% -10.f", "12 MB/s "},
106 "verb % -10.0f": {12345678, "% -10.0f", "12 MB/s "},
107 "verb % -10.1f": {12345678, "% -10.1f", "12.3 MB/s "},
108
109 "1000 %f": {1000, "%f", "1.000000kB/s"},
110 "1000 %d": {1000, "%d", "1kB/s"},
111 "1000 %s": {1000, "%s", "1.0kB/s"},
112 "1024 %f": {1024, "%f", "1.024000kB/s"},
113 "1024 %d": {1024, "%d", "1kB/s"},
114 "1024 %.1f": {1024, "%.1f", "1.0kB/s"},
115 "1024 %s": {1024, "%s", "1.0kB/s"},
116 "3*MB/s+140*KB/s %f": {3*MB + 140*KB, "%f", "3.140000MB/s"},
117 "3*MB/s+140*KB/s %d": {3*MB + 140*KB, "%d", "3MB/s"},
118 "3*MB/s+140*KB/s %.1f": {3*MB + 140*KB, "%.1f", "3.1MB/s"},
119 "3*MB/s+140*KB/s %s": {3*MB + 140*KB, "%s", "3.1MB/s"},
120 "2*GB/s %f": {2 * GB, "%f", "2.000000GB/s"},
121 "2*GB/s %d": {2 * GB, "%d", "2GB/s"},
122 "2*GB/s %.1f": {2 * GB, "%.1f", "2.0GB/s"},
123 "2*GB/s %s": {2 * GB, "%s", "2.0GB/s"},
124 "4*TB/s %f": {4 * TB, "%f", "4.000000TB/s"},
125 "4*TB/s %d": {4 * TB, "%d", "4TB/s"},
126 "4*TB/s %.1f": {4 * TB, "%.1f", "4.0TB/s"},
127 "4*TB/s %s": {4 * TB, "%s", "4.0TB/s"},
128 }
129 for k, tc := range cases {
130 got := fmt.Sprintf(tc.verb, SpeedKB(tc.value))
131 if got != tc.expected {
132 t.Errorf("%s: Expected: %q, got: %q\n", k, tc.expected, got)
133 }
134 }
135 }