| 101 | 101 |
cancel := make(chan struct{})
|
| 102 | 102 |
shutdown := make(chan struct{})
|
| 103 | 103 |
p := mpb.New().WithCancel(cancel).ShutdownNotify(shutdown)
|
|
104 |
|
|
105 |
var wg sync.WaitGroup
|
|
106 |
total := 100
|
| 104 | 107 |
numBars := 3
|
|
108 |
wg.Add(numBars)
|
| 105 | 109 |
|
| 106 | 110 |
for i := 0; i < numBars; i++ {
|
| 107 | 111 |
name := fmt.Sprintf("Bar#%d:", i)
|
| 108 | |
bar := p.AddBar(100).PrependName(name, len(name), 0)
|
|
112 |
bar := p.AddBarWithID(i, int64(total)).PrependName(name, len(name), 0)
|
| 109 | 113 |
|
| 110 | 114 |
go func() {
|
| 111 | |
for i := 0; i < 10000; i++ {
|
|
115 |
defer func() {
|
|
116 |
// fmt.Printf("%s done\n", name)
|
|
117 |
wg.Done()
|
|
118 |
}()
|
|
119 |
for i := 0; i < total; i++ {
|
|
120 |
select {
|
|
121 |
case <-cancel:
|
|
122 |
return
|
|
123 |
default:
|
|
124 |
}
|
|
125 |
time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond)
|
| 112 | 126 |
bar.Incr(1)
|
| 113 | |
time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond)
|
| 114 | 127 |
}
|
| 115 | 128 |
}()
|
| 116 | 129 |
}
|
| 117 | 130 |
|
| 118 | |
close(cancel)
|
|
131 |
time.AfterFunc(300*time.Millisecond, func() {
|
|
132 |
close(cancel)
|
|
133 |
})
|
|
134 |
|
|
135 |
wg.Wait()
|
|
136 |
p.Stop()
|
| 119 | 137 |
|
| 120 | 138 |
select {
|
| 121 | 139 |
case <-shutdown:
|
|
| 123 | 141 |
t.Error("ProgressBar didn't stop")
|
| 124 | 142 |
}
|
| 125 | 143 |
}
|
|
144 |
|
|
145 |
func TestWithNilCancel(t *testing.T) {
|
|
146 |
defer func() {
|
|
147 |
if p := recover(); p != nil {
|
|
148 |
if msg, ok := p.(string); ok && msg == "nil cancel channel" {
|
|
149 |
return
|
|
150 |
}
|
|
151 |
t.Errorf("Expected nil channel panic, got: %+v", p)
|
|
152 |
}
|
|
153 |
}()
|
|
154 |
_ = mpb.New().WithCancel(nil)
|
|
155 |
}
|
|
156 |
|
|
157 |
func TestFormat(t *testing.T) {
|
|
158 |
var buf bytes.Buffer
|
|
159 |
cancel := make(chan struct{})
|
|
160 |
shutdown := make(chan struct{})
|
|
161 |
customFormat := "╢▌▌░╟"
|
|
162 |
p := mpb.New().Format(customFormat)
|
|
163 |
p.WithCancel(cancel)
|
|
164 |
p.ShutdownNotify(shutdown)
|
|
165 |
p.SetOut(&buf)
|
|
166 |
bar := p.AddBar(100).TrimLeftSpace().TrimRightSpace()
|
|
167 |
|
|
168 |
go func() {
|
|
169 |
for i := 0; i < 100; i++ {
|
|
170 |
bar.Incr(1)
|
|
171 |
time.Sleep(10 * time.Millisecond)
|
|
172 |
if i == 42 {
|
|
173 |
close(cancel)
|
|
174 |
}
|
|
175 |
}
|
|
176 |
}()
|
|
177 |
|
|
178 |
// p.Stop()
|
|
179 |
// time.Sleep(300 * time.Millisecond)
|
|
180 |
|
|
181 |
// gotBar := strings.TrimSpace(buf.String())
|
|
182 |
gotBar := buf.String()
|
|
183 |
seen := make(map[rune]bool)
|
|
184 |
for _, r := range gotBar {
|
|
185 |
if !seen[r] {
|
|
186 |
seen[r] = true
|
|
187 |
}
|
|
188 |
}
|
|
189 |
fmt.Println(gotBar)
|
|
190 |
for r, _ := range seen {
|
|
191 |
fmt.Printf("%#U\n", r)
|
|
192 |
}
|
|
193 |
// expectBar := "╢▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌╟"
|
|
194 |
// if gotBar != expectBar {
|
|
195 |
// t.Errorf("Expected for")
|
|
196 |
// }
|
|
197 |
}
|