package main

import (
	"context"
	"errors"
	"testing"
	"time"
)

func TestCancelDoesNotReachParent(t *testing.T) {
	parent, cancel := context.WithCancel(context.Background())
	defer cancel()
	child, stop := context.WithCancel(parent)
	stop()
	if !errors.Is(child.Err(), context.Canceled) {
		t.Fatal(child.Err())
	}
	if parent.Err() != nil {
		t.Fatal("child canceled parent")
	}
}
func TestEarlierDeadlineWins(t *testing.T) {
	parent, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Hour))
	defer cancel()
	child, stop := context.WithTimeout(parent, 2*time.Hour)
	defer stop()
	a, _ := parent.Deadline()
	b, _ := child.Deadline()
	if !a.Equal(b) {
		t.Fatalf("%s != %s", a, b)
	}
}
func TestCauseAndValue(t *testing.T) {
	want := errors.New("owner stopped")
	ctx, cancel := context.WithCancelCause(WithRequestID(context.Background(), "r1"))
	cancel(want)
	if !errors.Is(context.Cause(ctx), want) {
		t.Fatal(context.Cause(ctx))
	}
	if id, ok := RequestID(ctx); !ok || id != "r1" {
		t.Fatal(id, ok)
	}
}

func TestSendCanceled(t *testing.T) {
	ctx, cancel := context.WithCancel(context.Background())
	cancel()
	if err := Send(ctx, make(chan int), 7); !errors.Is(err, context.Canceled) {
		t.Fatal(err)
	}
}
