diff --git a/countdown/countdown.go b/countdown/countdown.go index 4cd054b..89bc546 100644 --- a/countdown/countdown.go +++ b/countdown/countdown.go @@ -11,11 +11,22 @@ const ( countdownStart = 3 ) -func Countdown(out io.Writer) { +type Sleeper interface { + Sleep() +} + +type DefaultSleeper struct{} + +func (d *DefaultSleeper) Sleep() { + time.Sleep(1 * time.Second) +} + +func Countdown(out io.Writer, sleeper Sleeper) { + // XXX: The sequence is not tested for i := countdownStart; i > 0; i-- { fmt.Fprintf(out, "%d\n", i) // This is difficult to test! - time.Sleep(1 * time.Second) + sleeper.Sleep() } fmt.Fprint(out, finalWord) } diff --git a/countdown/countdown_test.go b/countdown/countdown_test.go index 524b01c..c55330e 100644 --- a/countdown/countdown_test.go +++ b/countdown/countdown_test.go @@ -5,10 +5,19 @@ import ( "testing" ) +type SpySleeper struct { + Calls int +} + +func (s *SpySleeper) Sleep() { + s.Calls++ +} + func TestCountdown(t *testing.T) { buffer := &bytes.Buffer{} + sleeper := &SpySleeper{} - Countdown(buffer) + Countdown(buffer, sleeper) got := buffer.String() want := `3 @@ -19,4 +28,8 @@ Go!` if got != want { t.Errorf("got %q want %q", got, want) } + + if sleeper.Calls != 3 { + t.Errorf("not enough calls to sleeper, want 3 got %d", sleeper.Calls) + } } diff --git a/main.go b/main.go index f97a750..2841216 100644 --- a/main.go +++ b/main.go @@ -8,5 +8,5 @@ import ( func main() { // greet.Greet(os.Stdout, "Elodie") - countdown.Countdown(os.Stdout) + countdown.Countdown(os.Stdout, &countdown.DefaultSleeper{}) }