// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package poller

import (
	"context"
	"strconv"
	"sync"
	"testing"
	"time"
)

type numError struct {
	num int
}

func (e numError) Error() string { return strconv.Itoa(e.num) }

func Test(t *testing.T) {
	var (
		mu          sync.Mutex
		goods, bads []int
	)

	cur := -1
	getter := func(context.Context) (any, error) {
		// Even: success; odd: failure.
		cur++
		if cur%2 == 0 {
			return cur, nil
		}
		return nil, numError{cur}
	}

	onError := func(err error) {
		mu.Lock()
		bads = append(bads, err.(numError).num)
		mu.Unlock()
	}

	p := New(cur, getter, onError)
	if got, want := p.Current(), cur; got != want {
		t.Fatalf("got %v, want %v", got, want)
	}
	ctx, cancel := context.WithCancel(context.Background())
	p.Start(ctx, 50*time.Millisecond)
	time.Sleep(100 * time.Millisecond) // wait for first poll
	for i := 0; i < 10; i++ {
		goods = append(goods, p.Current().(int))
		time.Sleep(60 * time.Millisecond)
	}
	cancel()
	// Expect goods to be all even and non-decreasing.
	for i, g := range goods {
		if g%2 != 0 || (i > 0 && goods[i-1] > g) {
			t.Errorf("incorrect 'good' value %d", g)
		}
	}
	// Expect bads to be consecutive odd numbers.
	mu.Lock()
	bs := bads
	mu.Unlock()
	for i, b := range bs {
		if b%2 == 0 || (i > 0 && bs[i-1]+2 != b) {
			t.Errorf("incorrect 'bad' value %d", b)
		}
	}
}
