return f.length - f.bytesLeft()
}
-func (f *File) bytesLeft() (left int64) {
- pieceSize := int64(f.t.usualPieceSize())
- firstPieceIndex := f.firstPieceIndex()
- endPieceIndex := f.endPieceIndex() - 1
- bitmap.Flip(f.t._completedPieces, firstPieceIndex+1, endPieceIndex).IterTyped(func(piece int) bool {
+func fileBytesLeft(pieceSize int64, firstPieceIndex int, endPieceIndex int, fileOffset int64, fileLength int64, completedPieces bitmap.Bitmap) (left int64) {
+ endPieceIndex--
+ bitmap.Flip(completedPieces, firstPieceIndex+1, endPieceIndex).IterTyped(func(piece int) bool {
if piece >= endPieceIndex {
return false
}
}
return true
})
- if !f.t.pieceComplete(firstPieceIndex) {
- left += pieceSize - (f.offset % pieceSize)
+ if !completedPieces.Get(firstPieceIndex) {
+ left += pieceSize - (fileOffset % pieceSize)
}
- if !f.t.pieceComplete(endPieceIndex) {
- left += (f.offset + f.length) % pieceSize
+ if !completedPieces.Get(endPieceIndex) {
+ left += (fileOffset + fileLength) % pieceSize
}
return
}
+func (f *File) bytesLeft() (left int64) {
+ return fileBytesLeft(int64(f.t.usualPieceSize()), f.firstPieceIndex(), f.endPieceIndex(), f.offset, f.length, f.t._completedPieces)
+}
+
// The relative file path for a multi-file torrent, and the torrent name for a
// single-file torrent.
func (f *File) DisplayPath() string {
import (
"testing"
+ "github.com/anacrolix/missinggo/v2/bitmap"
"github.com/stretchr/testify/assert"
)
assert.EqualValues(t, _case.end, end)
}
}
+
+type testFileBytesLeft struct {
+ usualPieceSize int64
+ firstPieceIndex int
+ endPieceIndex int
+ fileOffset int64
+ fileLength int64
+ completedPieces bitmap.Bitmap
+ expected int64
+ name string
+}
+
+func (me testFileBytesLeft) Run(t *testing.T) {
+ t.Run(me.name, func(t *testing.T) {
+ assert.EqualValues(t, me.expected, fileBytesLeft(me.usualPieceSize, me.firstPieceIndex, me.endPieceIndex, me.fileOffset, me.fileLength, me.completedPieces))
+ })
+}
+
+func TestFileBytesLeft(t *testing.T) {
+ testFileBytesLeft{
+ usualPieceSize: 2,
+ firstPieceIndex: 1,
+ endPieceIndex: 1,
+ fileOffset: 1,
+ fileLength: 1,
+ expected: 1,
+ }.Run(t)
+
+ testFileBytesLeft{
+ usualPieceSize: 3,
+ firstPieceIndex: 0,
+ endPieceIndex: 0,
+ fileOffset: 1,
+ fileLength: 1,
+ expected: 1,
+ name: "FileInFirstPiece",
+ }.Run(t)
+
+ testFileBytesLeft{
+ usualPieceSize: 3,
+ firstPieceIndex: 0,
+ endPieceIndex: 0,
+ fileOffset: 1,
+ fileLength: 1,
+ expected: 1,
+ name: "LandLocked",
+ }.Run(t)
+}