Codebase list golang-github-vbauerster-mpb / 3ded00b decorators_test.go
3ded00b

Tree @3ded00b (Download .tar.gz)

decorators_test.go @3ded00braw · history · blame

package mpb_test

import (
	"sync"
	"testing"
	"time"

	. "github.com/vbauerster/mpb"
	"github.com/vbauerster/mpb/decor"
)

func TestStaticName(t *testing.T) {
	tests := []struct {
		fn   decor.DecoratorFunc
		want string
	}{
		{
			fn:   decor.StaticName("Test", 0, 0),
			want: "Test",
		},
		{
			fn:   decor.StaticName("Test", len("Test"), 0),
			want: "Test",
		},
		{
			fn:   decor.StaticName("Test", 10, 0),
			want: "      Test",
		},
		{
			fn:   decor.StaticName("Test", 10, decor.DidentRight),
			want: "Test      ",
		},
	}

	for _, test := range tests {
		got := test.fn(nil, nil, nil)
		if got != test.want {
			t.Errorf("Want: %q, Got: %q\n", test.want, got)
		}
	}
}

type step struct {
	stat *decor.Statistics
	want string
}

func TestPercentageDwidthSync(t *testing.T) {

	testCases := [][]step{
		[]step{
			{&decor.Statistics{Total: 100, Current: 8}, "8 %"},
			{&decor.Statistics{Total: 100, Current: 9}, "9 %"},
		},
		[]step{
			{&decor.Statistics{Total: 100, Current: 9}, " 9 %"},
			{&decor.Statistics{Total: 100, Current: 10}, "10 %"},
		},
		[]step{
			{&decor.Statistics{Total: 100, Current: 9}, "  9 %"},
			{&decor.Statistics{Total: 100, Current: 100}, "100 %"},
		},
	}

	dfn := decor.Percentage(3, decor.DwidthSync)
	testDecoratorConcurrently(t, dfn, testCases)
}

func TestPercentageDwidthSyncDidentRight(t *testing.T) {

	testCases := [][]step{
		[]step{
			{&decor.Statistics{Total: 100, Current: 8}, "8 %"},
			{&decor.Statistics{Total: 100, Current: 9}, "9 %"},
		},
		[]step{
			{&decor.Statistics{Total: 100, Current: 9}, "9 % "},
			{&decor.Statistics{Total: 100, Current: 10}, "10 %"},
		},
		[]step{
			{&decor.Statistics{Total: 100, Current: 9}, "9 %  "},
			{&decor.Statistics{Total: 100, Current: 100}, "100 %"},
		},
	}

	dfn := decor.Percentage(3, decor.DwidthSync|decor.DidentRight)
	testDecoratorConcurrently(t, dfn, testCases)
}

func TestPercentageDSyncSpace(t *testing.T) {

	testCases := [][]step{
		[]step{
			{&decor.Statistics{Total: 100, Current: 8}, " 8 %"},
			{&decor.Statistics{Total: 100, Current: 9}, " 9 %"},
		},
		[]step{
			{&decor.Statistics{Total: 100, Current: 9}, "  9 %"},
			{&decor.Statistics{Total: 100, Current: 10}, " 10 %"},
		},
		[]step{
			{&decor.Statistics{Total: 100, Current: 9}, "   9 %"},
			{&decor.Statistics{Total: 100, Current: 100}, " 100 %"},
		},
	}

	dfn := decor.Percentage(3, decor.DSyncSpace)
	testDecoratorConcurrently(t, dfn, testCases)
}

func testDecoratorConcurrently(t *testing.T, dfn decor.DecoratorFunc, testCases [][]step) {
	if len(testCases) == 0 {
		t.Fail()
	}

	numBars := len(testCases[0])
	var wg sync.WaitGroup
	for _, columnCase := range testCases {
		wg.Add(numBars)
		timeout := make(chan struct{})
		time.AfterFunc(100*time.Millisecond, func() {
			close(timeout)
		})
		ws := NewWidthSync(timeout, numBars, 1)
		res := make([]chan string, numBars)
		for i := 0; i < numBars; i++ {
			res[i] = make(chan string, 1)
			go func(s step, ch chan string) {
				defer wg.Done()
				ch <- dfn(s.stat, ws.Accumulator[0], ws.Distributor[0])
			}(columnCase[i], res[i])
		}
		wg.Wait()

		var i int
		for got := range fanIn(res...) {
			want := columnCase[i].want
			if got != want {
				t.Errorf("Want: %q, Got: %q\n", want, got)
			}
			i++
		}
	}
}

func fanIn(in ...chan string) <-chan string {
	ch := make(chan string)
	go func() {
		defer close(ch)
		for _, ich := range in {
			ch <- <-ich
		}
	}()
	return ch
}