go で algorithm : FizzBuzz

はじめに

諸事情で暇になったので atcoder でも始めようかと思いましたが、まずは有名アルゴリズムを身につけていこうかと思います。
アルゴリズムかどうかはわかりませんが、まずは go で FizzBuzz とテストを書きます。

github.com

go で FizzBuzz

0~100 の int をもらってFizzBuzzを返します。

package main

import (
    "fmt"
)

// FizzBuzz is return usual FizzBuzz and error
func FizzBuzz(n int) (string, error) {
    if n < 1 || n > 100 {
        return "", fmt.Errorf("Invalid number: %v", n)
    }
    switch {
    case n%15 == 0:
        return "FizzBuzz", nil
    case n%3 == 0:
        return "Fizz", nil
    case n%5 == 0:
        return "Buzz", nil
    default:
        return fmt.Sprint(n), nil
    }
}

FizzBuzz のテストです。
Table Driven Tests で書いていこうと思います。

package main

import "testing"

func TestFizzBuzz(t *testing.T) {
    tests := []struct {
        input int
        want  string
        err   bool
    }{
        {input: -1, want: "", err: true},
        {input: 0, want: "", err: true},
        {input: 1, want: "1", err: false},
        {input: 2, want: "2", err: false},
        {input: 3, want: "Fizz", err: false},
        {input: 5, want: "Buzz", err: false},
        {input: 15, want: "FizzBuzz", err: false},
        {input: 101, want: "", err: true},
    }

    for _, test := range tests {
        got, err := FizzBuzz(test.input)
        if !test.err && err != nil {
            t.Fatalf("should not be error for %v but: %v", test.input, err)
        }
        if test.err && err == nil {
            t.Fatalf("should be error for %v but not:", test.input)
        }
        if got != test.want {
            t.Fatalf("want %q, but %q:", test.want, got)
        }
    }
}

まとめ

特にまとめる必要のない内容ですが、次回以降のフォーマットになればと FizzBuzz をまとめました。
安心安全の mattn さんの記事を参考にさせていただきました。

mattn.kaoriya.net