From b4edee4292ab88c89a509de80bb1d1a3bf81940b Mon Sep 17 00:00:00 2001 From: William Dillon Date: Thu, 26 Feb 2026 16:28:19 -0500 Subject: [PATCH] fixing bugs - no longer panics when iteration < 0 or MaxIteration >= len(TheFibonacciSequence)-1 --- cli/main.go | 8 ++++++++ fibonacci/fibonacci.go | 4 ++-- fibonacci/fibonacci_test.go | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/cli/main.go b/cli/main.go index c59fa9a..3858bb6 100644 --- a/cli/main.go +++ b/cli/main.go @@ -71,6 +71,14 @@ func main() { fmt.Fprintf(os.Stderr, "iteration %d would overflow int64 - using %d\n", iteration, maxIteration) iteration = maxIteration } + } else if iteration < 0 { + switch doPanic { + case true: + panic(fmt.Sprintf("error: input %d would cause index out of range exception\n", iteration)) + default: + fmt.Fprintf(os.Stderr, "error: input %d would cause index out of range exception - using 0\n", iteration) + iteration = 0 + } } backoff := &fibonacci.FibonacciBackoff{ diff --git a/fibonacci/fibonacci.go b/fibonacci/fibonacci.go index e7179f0..d94c0fe 100644 --- a/fibonacci/fibonacci.go +++ b/fibonacci/fibonacci.go @@ -50,8 +50,8 @@ func (f *FibonacciBackoff) Next() time.Duration { } // increment f.Iteration if appropriate - maxIteration := int64(len(TheFibonacciSequence) + 1) - if f.MaxIteration > 0 { + maxIteration := int64(len(TheFibonacciSequence) - 1) + if f.MaxIteration > 0 && f.MaxIteration <= maxIteration { maxIteration = f.MaxIteration } if f.foundMax == 0 { diff --git a/fibonacci/fibonacci_test.go b/fibonacci/fibonacci_test.go index 5d4ac3c..6b731f5 100644 --- a/fibonacci/fibonacci_test.go +++ b/fibonacci/fibonacci_test.go @@ -77,6 +77,20 @@ func TestFibonacciBackoffNextDoesNotOverflow(t *testing.T) { } previous = got } + backoff.Reset() + backoff.PauseMultiplier = time.Nanosecond + for i := range len(TheFibonacciSequence) + 100 { + var want time.Duration + if i >= len(TheFibonacciSequence) { + want = time.Duration(TheFibonacciSequence[len(TheFibonacciSequence)-1]) + } else { + want = time.Duration(TheFibonacciSequence[i]) + } + got := backoff.Next() + if want != got { + t.Fatalf("error: wanted %v; got %v\n", want, got) + } + } } func TestFibonacciBackoffIterationLimit(t *testing.T) {