先人の知恵
知恵お借りします。ありがとうございます。
競プロのテストを「go test」でやりたかったので作った
いきさつ
Go習得に向けてPaizaでもやろうと思ったが、元記事と同じように標準入出力のテストを簡単にやりたかった。
Paizaの場合、複数行の入力と複数行の出力の問題があるので、それに対応するように自分向けに修正をしてみた。
というお話。
リポジトリ
下記修正したのもの
GolangSkeletonForSpeedrun
イメージ
修正点
複数行対応
テストケース用の構造体のプロパティ型が入力、出力想定ともに 一行だけ受け取る想定になっていたので、 複数行受け取れるように string
から []strings
に変更しました。
それに伴い getLine
も修正。複数引数の場合、getLine
にて、 os.Args[1]
で一番最初の引数を受け取って、受け取った分は引数から消すという処理にすることで複数引数を受け取れるようにしました。
何故最後なのかというと、go testの後に続くフラグの数がわからないから。入力が一行だけなのであれば、コレで十分です。(つまり複数行には非対応)
後ろのフラグ消しちゃって大丈夫かな?という懸念はあったものの、特に問題なさそうだったので、毎回テストケース毎に os.Args = nil
で初期化&テストケース毎の想定結果(複数行)を突っ込むことにしました。
os.Args[0]
には引数の長さを突っ込んでますが、これは引数から入力を取得するのか、標準入力から取得するのかが分岐できなくなってしまうので、便宜上突っ込んでるだけで別にあんまり意味はないです。
os.Args = append(os.Args,strconv.Itoa(len(tc.args)))
for _, arg := range tc.args {
os.Args = append(os.Args, arg)
}
出力結果に改行コードを含むか否か
paizaの場合、解答の出力に改行を含むことが前提になっているので、flagパッケージを利用して、フラグ newline
がある場合は出力結果に改行を含むのが正解となるようにしました。
終わり
そんな感じで入出力の複数行対応、正解の改行対応を行って、paizaがちょっと捗るようになりましたとさ。
以上、お目通しどうもありがとうございました。