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") }