PPysolate SpineREAD THE CODE · UNDERSTAND THE SYSTEM
课程与章节
源码索引 / CURRENT IMPLEMENTATION

learning/go-patterns/patterns/cancellation/cancellation_test.go

72 行 · 点击行号可定位;函数链接随声明位置更新,不手填行号。

跳到函数 / 声明
package cancellation

import (
	"context"
	"errors"
	"reflect"
	"testing"
)

func TestProcessStopsBeforeDoingWorkWhenCancelled(t *testing.T) {
	ctx, cancel := context.WithCancel(context.Background())
	cancel()

	called := false
	jobs := make(chan int, 1)
	jobs <- 1
	got, err := Process(ctx, jobs, func(value int) int {
		called = true
		return value
	})

	if !errors.Is(err, context.Canceled) {
		t.Fatalf("error = %v, want context.Canceled", err)
	}
	if called {
		t.Fatal("Process() called fn after cancellation")
	}
	if got != nil {
		t.Fatalf("results = %#v, want nil", got)
	}
}

func TestProcessReturnsCompletedResultsOnCancellation(t *testing.T) {
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	jobs := make(chan int, 3)
	jobs <- 1
	jobs <- 2
	jobs <- 3
	close(jobs)

	got, err := Process(ctx, jobs, func(value int) int {
		if value == 2 {
			cancel()
		}
		return value * 10
	})

	if !errors.Is(err, context.Canceled) {
		t.Fatalf("error = %v, want context.Canceled", err)
	}
	if want := []int{10, 20}; !reflect.DeepEqual(got, want) {
		t.Fatalf("results = %#v, want %#v", got, want)
	}
}

func TestProcessConsumesAllJobsWhenChannelCloses(t *testing.T) {
	jobs := make(chan int, 3)
	jobs <- 2
	jobs <- 4
	jobs <- 6
	close(jobs)

	got, err := Process(context.Background(), jobs, func(value int) int { return value / 2 })
	if err != nil {
		t.Fatalf("Process() error = %v", err)
	}
	if want := []int{1, 2, 3}; !reflect.DeepEqual(got, want) {
		t.Fatalf("results = %#v, want %#v", got, want)
	}
}