lotus/lib/strle/human_test.go
2022-08-24 11:25:37 -04:00

58 lines
1.4 KiB
Go

package strle
import (
"testing"
"github.com/stretchr/testify/require"
"github.com/filecoin-project/go-bitfield"
)
func TestHumanBitfield(t *testing.T) {
check := func(ints []uint64, out string) {
bf := bitfield.NewFromSet(ints)
h, err := BitfieldToHumanRanges(bf)
require.NoError(t, err)
require.Equal(t, out, h)
}
check([]uint64{2, 3, 4}, "2-4")
check([]uint64{2, 3, 4, 8, 9, 10, 11}, "2-4,8-11")
check([]uint64{2}, "2")
check([]uint64{0}, "0")
check([]uint64{0, 1, 2}, "0-2")
check([]uint64{0, 1, 5, 9, 11, 13, 14, 19}, "0-1,5,9,11,13-14,19")
}
func TestHumanBitfieldRoundtrip(t *testing.T) {
check := func(ints []uint64, out string) {
parsed, err := HumanRangesToBitField(out)
require.NoError(t, err)
h, err := BitfieldToHumanRanges(parsed)
require.NoError(t, err)
require.Equal(t, out, h)
bf := bitfield.NewFromSet(ints)
ins, err := bitfield.IntersectBitField(bf, parsed)
require.NoError(t, err)
// if intersected bitfield has the same length as both bitfields they are the same
ic, err := ins.Count()
require.NoError(t, err)
pc, err := parsed.Count()
require.NoError(t, err)
require.Equal(t, uint64(len(ints)), ic)
require.Equal(t, ic, pc)
}
check([]uint64{2, 3, 4}, "2-4")
check([]uint64{2, 3, 4, 8, 9, 10, 11}, "2-4,8-11")
check([]uint64{2}, "2")
check([]uint64{0}, "0")
check([]uint64{0, 1, 2}, "0-2")
check([]uint64{0, 1, 5, 9, 11, 13, 14, 19}, "0-1,5,9,11,13-14,19")
}