package mongo

import "testing"

func TestResolveExpectedCommitDeltas(t *testing.T) {
	tests := []struct {
		name             string
		expectedCommits  int
		pinnedDeltas     int
		completedCount   int64
		deltaCount       int64
		want             int64
	}{
		{
			name:            "pinned target",
			expectedCommits: 581,
			pinnedDeltas:    568,
			completedCount:  580,
			deltaCount:      568,
			want:            568,
		},
		{
			name:            "fan-in complete",
			expectedCommits: 581,
			completedCount:  581,
			deltaCount:      568,
			want:            568,
		},
		{
			name:            "skipped tail heuristic",
			expectedCommits: 581,
			completedCount:  580,
			deltaCount:      568,
			want:            568,
		},
		{
			name:            "in-flight uses expected commits",
			expectedCommits: 581,
			completedCount:  200,
			deltaCount:      190,
			want:            581,
		},
		{
			name:            "zero expected commits",
			expectedCommits: 0,
			completedCount:  0,
			deltaCount:      0,
			want:            0,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got := ResolveExpectedCommitDeltas(tt.expectedCommits, tt.pinnedDeltas, tt.completedCount, tt.deltaCount)
			if got != tt.want {
				t.Fatalf("ResolveExpectedCommitDeltas() = %d, want %d", got, tt.want)
			}
		})
	}
}

func TestCommitFanInComplete(t *testing.T) {
	if !CommitFanInComplete(581, 0, 580, 568) {
		t.Fatal("expected fan-in complete for skipped tail heuristic")
	}
	if CommitFanInComplete(581, 0, 200, 190) {
		t.Fatal("expected fan-in incomplete while commits are still processing")
	}
	if !CommitFanInComplete(581, 568, 100, 50) {
		t.Fatal("expected fan-in complete when target is pinned")
	}
}
