Edited at

paiza/atCoder で使うGoコードをテスト環境から実行する

More than 1 year has passed since last update.

paizaやAtCoderで使うような、標準入力から入力を受けとり、標準出力に結果を出力するようなコードを簡単にテストする環境を作ります。

次のようなヘルパ関数を作ります


package main_test

import (
"bytes"
"fmt"
"io"
"strings"
"testing"
)

func checker(input string, f func(io.Reader, io.Writer)) string {
reader := strings.NewReader(input)
writer := bytes.NewBufferString("")
f(reader, writer)
return writer.String()
}

標準入力と標準出力の代わりにstringを使うようにします。

func(io.Reader, io.Writer) に実際にpaiza/atCoderで使うコードを書くことになります。

以下にコード全体を載せます。

package main_test

import (
"bytes"
"fmt"
"io"
"strings"
"testing"
)

func checker(input string, f func(io.Reader, io.Writer)) string {
reader := strings.NewReader(input)
writer := bytes.NewBufferString("")
f(reader, writer)
return writer.String()
}

func sampleCode(reader io.Reader, writer io.Writer) {
var a, b, c, d int
fmt.Fscanf(reader, "%d %d %d %d\n", &a, &b, &c, &d)
fmt.Fprintf(writer, "%d\n%d\n%d\n%d\n", a, b, c, d)
fmt.Fscanf(reader, "%d %d %d\n", &a, &b, &c)
fmt.Fprintf(writer, "%d\n%d\n%d", a, b, c)
}

func TestSample(t *testing.T) {
inputString :=
`1 2 3 4
5 6 7`

expect := `1
2
3
4
5
6
7`

output := checker(inputString, sampleCode)
if output != expect {
t.Errorf("expcet %v,but%v", expect, output)
}
}

実際にpaiza/atCoderに投稿するときは以下のようにします

package main

import (
"fmt"
"os"
)
func sampleCode(reader io.Reader, writer io.Writer) {
var a, b, c, d int
fmt.Fscanf(reader, "%d %d %d %d\n", &a, &b, &c, &d)
fmt.Fprintf(writer, "%d\n%d\n%d\n%d\n", a, b, c, d)
fmt.Fscanf(reader, "%d %d %d\n", &a, &b, &c)
fmt.Fprintf(writer, "%d\n%d\n%d", a, b, c)
}

func main() {
sampleCode(os.Stdin,os.Stdout)
}