@@ -66,6 +66,28 @@ func trackSomething(pw Writer, tracker *Tracker) {
66
66
}
67
67
}
68
68
69
+ func trackSomethingDeferred (pw Writer , tracker * Tracker ) {
70
+ incrementPerCycle := tracker .Total / 3
71
+ tracker .DeferStart = true
72
+
73
+ pw .AppendTracker (tracker )
74
+ skip := true
75
+
76
+ c := time .Tick (trackerIncrementInterval )
77
+ for ! tracker .IsDone () {
78
+ select {
79
+ case <- c :
80
+ if skip {
81
+ skip = false
82
+ } else if tracker .value + incrementPerCycle > tracker .Total {
83
+ tracker .Increment (tracker .Total - tracker .value )
84
+ } else {
85
+ tracker .Increment (incrementPerCycle )
86
+ }
87
+ }
88
+ }
89
+ }
90
+
69
91
func trackSomethingErrored (pw Writer , tracker * Tracker ) {
70
92
incrementPerCycle := tracker .Total / 3
71
93
total := tracker .Total
@@ -279,118 +301,37 @@ func TestProgress_generateTrackerStr_Indeterminate(t *testing.T) {
279
301
}
280
302
281
303
expectedTrackerStrMap := map [int64 ]string {
282
- 0 : "<=>......." ,
283
- 1 : ".<=>......" ,
284
- 2 : "..<=>....." ,
285
- 3 : "...<=>...." ,
286
- 4 : "....<=>..." ,
287
- 5 : ".....<=>.." ,
288
- 6 : "......<=>." ,
289
- 7 : ".......<=>" ,
290
- 8 : "......<=>." ,
291
- 9 : ".....<=>.." ,
292
- 10 : "....<=>..." ,
293
- 11 : "...<=>...." ,
294
- 12 : "..<=>....." ,
295
- 13 : ".<=>......" ,
296
- 14 : "<=>......." ,
297
- 15 : ".<=>......" ,
298
- 16 : "..<=>....." ,
299
- 17 : "...<=>...." ,
300
- 18 : "....<=>..." ,
301
- 19 : ".....<=>.." ,
302
- 20 : "......<=>." ,
303
- 21 : ".......<=>" ,
304
- 22 : "......<=>." ,
305
- 23 : ".....<=>.." ,
306
- 24 : "....<=>..." ,
307
- 25 : "...<=>...." ,
308
- 26 : "..<=>....." ,
309
- 27 : ".<=>......" ,
310
- 28 : "<=>......." ,
311
- 29 : ".<=>......" ,
312
- 30 : "..<=>....." ,
313
- 31 : "...<=>...." ,
314
- 32 : "....<=>..." ,
315
- 33 : ".....<=>.." ,
316
- 34 : "......<=>." ,
317
- 35 : ".......<=>" ,
318
- 36 : "......<=>." ,
319
- 37 : ".....<=>.." ,
320
- 38 : "....<=>..." ,
321
- 39 : "...<=>...." ,
322
- 40 : "..<=>....." ,
323
- 41 : ".<=>......" ,
324
- 42 : "<=>......." ,
325
- 43 : ".<=>......" ,
326
- 44 : "..<=>....." ,
327
- 45 : "...<=>...." ,
328
- 46 : "....<=>..." ,
329
- 47 : ".....<=>.." ,
330
- 48 : "......<=>." ,
331
- 49 : ".......<=>" ,
332
- 50 : "......<=>." ,
333
- 51 : ".....<=>.." ,
334
- 52 : "....<=>..." ,
335
- 53 : "...<=>...." ,
336
- 54 : "..<=>....." ,
337
- 55 : ".<=>......" ,
338
- 56 : "<=>......." ,
339
- 57 : ".<=>......" ,
340
- 58 : "..<=>....." ,
341
- 59 : "...<=>...." ,
342
- 60 : "....<=>..." ,
343
- 61 : ".....<=>.." ,
344
- 62 : "......<=>." ,
345
- 63 : ".......<=>" ,
346
- 64 : "......<=>." ,
347
- 65 : ".....<=>.." ,
348
- 66 : "....<=>..." ,
349
- 67 : "...<=>...." ,
350
- 68 : "..<=>....." ,
351
- 69 : ".<=>......" ,
352
- 70 : "<=>......." ,
353
- 71 : ".<=>......" ,
354
- 72 : "..<=>....." ,
355
- 73 : "...<=>...." ,
356
- 74 : "....<=>..." ,
357
- 75 : ".....<=>.." ,
358
- 76 : "......<=>." ,
359
- 77 : ".......<=>" ,
360
- 78 : "......<=>." ,
361
- 79 : ".....<=>.." ,
362
- 80 : "....<=>..." ,
363
- 81 : "...<=>...." ,
364
- 82 : "..<=>....." ,
365
- 83 : ".<=>......" ,
366
- 84 : "<=>......." ,
367
- 85 : ".<=>......" ,
368
- 86 : "..<=>....." ,
369
- 87 : "...<=>...." ,
370
- 88 : "....<=>..." ,
371
- 89 : ".....<=>.." ,
372
- 90 : "......<=>." ,
373
- 91 : ".......<=>" ,
374
- 92 : "......<=>." ,
375
- 93 : ".....<=>.." ,
376
- 94 : "....<=>..." ,
377
- 95 : "...<=>...." ,
378
- 96 : "..<=>....." ,
379
- 97 : ".<=>......" ,
380
- 98 : "<=>......." ,
381
- 99 : ".<=>......" ,
382
- 100 : "..<=>....." ,
304
+ - 1 : ".........." ,
305
+ 0 : "<=>......." ,
306
+ 1 : ".<=>......" ,
307
+ 2 : "..<=>....." ,
308
+ 3 : "...<=>...." ,
309
+ 4 : "....<=>..." ,
310
+ 5 : ".....<=>.." ,
311
+ 6 : "......<=>." ,
312
+ 7 : ".......<=>" ,
313
+ 8 : "......<=>." ,
314
+ 9 : ".....<=>.." ,
315
+ 10 : "....<=>..." ,
316
+ 11 : "...<=>...." ,
317
+ 12 : "..<=>....." ,
318
+ 13 : ".<=>......" ,
383
319
}
384
320
385
321
finalOutput := strings.Builder {}
386
322
tr := Tracker {Total : 0 }
387
- for value := int64 (0 ); value <= 100 ; value ++ {
388
- tr .value = value
323
+ for value := int64 (- 1 ); value <= 100 ; value ++ {
324
+ if value >= 0 {
325
+ tr .value = value
326
+ }
389
327
actualStr := pw .generateTrackerStr (& tr , 10 , renderHint {})
390
- if expectedStr , ok := expectedTrackerStrMap [value ]; ok {
328
+ if expectedStr , ok := expectedTrackerStrMap [value % 14 ]; ok {
391
329
assert .Equal (t , expectedStr , actualStr , "value=%d" , value )
392
330
}
393
331
finalOutput .WriteString (fmt .Sprintf (" %d: \" %s\" ,\n " , value , actualStr ))
332
+ if value < 0 {
333
+ tr .timeStart = time .Now ()
334
+ }
394
335
}
395
336
if t .Failed () {
396
337
fmt .Println (finalOutput .String ())
@@ -496,6 +437,35 @@ func TestProgress_RenderSomeTrackers_WithAutoStop(t *testing.T) {
496
437
showOutputOnFailure (t , out )
497
438
}
498
439
440
+ func TestProgress_RenderSomeTrackers_DeferStart (t * testing.T ) {
441
+ renderOutput := outputWriter {}
442
+
443
+ pw := generateWriter ()
444
+ pw .Style ().Visibility .Speed = true
445
+ pw .SetOutputWriter (& renderOutput )
446
+ go trackSomething (pw , & Tracker {Message : "Calculating Total # 1\r " , Total : 1000 , Units : UnitsDefault })
447
+ go trackSomething (pw , & Tracker {Message : "Downloading File\t # 2" , Total : 1000 , Units : UnitsBytes })
448
+ go trackSomethingDeferred (pw , & Tracker {Message : "Transferring Amount # 3" , Total : 1000 , Units : UnitsCurrencyDollar })
449
+ renderAndWait (pw , false )
450
+
451
+ expectedOutPatterns := []* regexp.Regexp {
452
+ regexp .MustCompile (`Transferring Amount # 3 \.\.\. +0.00% \[\.{23}] \[\$0 in 0s]` ),
453
+ regexp .MustCompile (`Calculating Total # 1 \.\.\. \d+\.\d+% \[[#.]{23}] \[\d+ in [\d.]+ms; \d+\.\d+\w+/s]` ),
454
+ regexp .MustCompile (`Downloading File # 2 \.\.\. \d+\.\d+% \[[#.]{23}] \[\d+B in [\d.]+ms; \d+\.\d+\w+/s]` ),
455
+ regexp .MustCompile (`Transferring Amount # 3 \.\.\. \d+\.\d+% \[[<#>.]{23}] \[\$\d+ in [\d.]+ms; \$\d+\.\d+\w+/s]` ),
456
+ regexp .MustCompile (`Calculating Total # 1 \.\.\. done! \[\d+\.\d+K in [\d.]+ms; \d+\.\d+\w+/s]` ),
457
+ regexp .MustCompile (`Downloading File # 2 \.\.\. done! \[\d+\.\d+KB in [\d.]+ms; \d+\.\d+\w+/s]` ),
458
+ regexp .MustCompile (`Transferring Amount # 3 \.\.\. done! \[\$\d+\.\d+K in [\d.]+ms; \$\d+\.\d+\w+/s]` ),
459
+ }
460
+ out := renderOutput .String ()
461
+ for _ , expectedOutPattern := range expectedOutPatterns {
462
+ if ! expectedOutPattern .MatchString (out ) {
463
+ assert .Fail (t , "Failed to find a pattern in the Output." , expectedOutPattern .String ())
464
+ }
465
+ }
466
+ showOutputOnFailure (t , out )
467
+ }
468
+
499
469
func TestProgress_RenderSomeTrackers_WithError (t * testing.T ) {
500
470
renderOutput := outputWriter {}
501
471
0 commit comments