package cql

import "testing"

func TestStreamLeaseLifecycle(t *testing.T) {
	conn := &Conn{}
	if err := conn.beginStream(7); err != nil {
		t.Fatalf("beginStream failed: %v", err)
	}
	released := 0
	lease := &streamLease{
		release: func() {
			released++
		},
	}
	if !conn.attachStreamLease(7, lease) {
		t.Fatalf("attachStreamLease failed")
	}

	conn.releaseStream(7)
	if released != 1 {
		t.Fatalf("release count = %d, want 1", released)
	}

	conn.releaseStream(7)
	if released != 1 {
		t.Fatalf("release count after second release = %d, want 1", released)
	}

	if err := conn.beginStream(7); err != nil {
		t.Fatalf("beginStream after release failed: %v", err)
	}
}

func TestStreamLeaseReuseRejected(t *testing.T) {
	conn := &Conn{}
	if err := conn.beginStream(3); err != nil {
		t.Fatalf("beginStream failed: %v", err)
	}
	if err := conn.beginStream(3); err == nil {
		t.Fatalf("expected stream reuse error")
	}
}

func TestReleaseAllStreamLeases(t *testing.T) {
	conn := &Conn{}
	if err := conn.beginStream(1); err != nil {
		t.Fatalf("beginStream failed: %v", err)
	}
	if err := conn.beginStream(2); err != nil {
		t.Fatalf("beginStream failed: %v", err)
	}
	released := 0
	conn.attachStreamLease(1, &streamLease{release: func() { released++ }})
	conn.attachStreamLease(2, &streamLease{release: func() { released++ }})

	conn.releaseAllStreamLeases()
	if released != 2 {
		t.Fatalf("release count = %d, want 2", released)
	}

	if err := conn.beginStream(1); err != nil {
		t.Fatalf("beginStream after releaseAll failed: %v", err)
	}
}
