From 20418204ea30a213a844972bc07b28a48c269617 Mon Sep 17 00:00:00 2001 From: GoSagawa Date: Thu, 13 Sep 2018 18:31:32 +0900 Subject: [PATCH 01/15] initial commit --- kadai4/gosagawa/.gitignore | 2 ++ kadai4/gosagawa/README.md | 7 +++++++ kadai4/gosagawa/main.go | 7 +++++++ 3 files changed, 16 insertions(+) create mode 100644 kadai4/gosagawa/.gitignore create mode 100644 kadai4/gosagawa/README.md create mode 100644 kadai4/gosagawa/main.go diff --git a/kadai4/gosagawa/.gitignore b/kadai4/gosagawa/.gitignore new file mode 100644 index 0000000..9e04648 --- /dev/null +++ b/kadai4/gosagawa/.gitignore @@ -0,0 +1,2 @@ +!.gitkeep +bin/ diff --git a/kadai4/gosagawa/README.md b/kadai4/gosagawa/README.md new file mode 100644 index 0000000..47cb486 --- /dev/null +++ b/kadai4/gosagawa/README.md @@ -0,0 +1,7 @@ +# kadai4 + +- おみくじAPIを作ってみよう + - JSON形式でおみくじの結果を返す + - 正月(1/1-1/3)だけ大吉にする + - ハンドラのテストを書いてみる + diff --git a/kadai4/gosagawa/main.go b/kadai4/gosagawa/main.go new file mode 100644 index 0000000..50e8d8d --- /dev/null +++ b/kadai4/gosagawa/main.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("vim-go") +} From 70cbb20477d0d583f5f553c6f9906a0f74aa1467 Mon Sep 17 00:00:00 2001 From: GoSagawa Date: Thu, 13 Sep 2018 20:43:31 +0900 Subject: [PATCH 02/15] basic omikuzi logic --- kadai4/gosagawa/README.md | 7 +++++++ kadai4/gosagawa/main.go | 4 ++-- kadai4/gosagawa/omikuzi/omikuzi.go | 28 ++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 kadai4/gosagawa/omikuzi/omikuzi.go diff --git a/kadai4/gosagawa/README.md b/kadai4/gosagawa/README.md index 47cb486..e065387 100644 --- a/kadai4/gosagawa/README.md +++ b/kadai4/gosagawa/README.md @@ -5,3 +5,10 @@ - 正月(1/1-1/3)だけ大吉にする - ハンドラのテストを書いてみる +- おみくじプログラム + - サイコロを転がし、出た目によって運勢を占うプログラム + - 6:大吉 + - 5,4:中吉 + - 3,2:吉 + - 1:凶 + diff --git a/kadai4/gosagawa/main.go b/kadai4/gosagawa/main.go index 50e8d8d..4436bce 100644 --- a/kadai4/gosagawa/main.go +++ b/kadai4/gosagawa/main.go @@ -1,7 +1,7 @@ package main -import "fmt" +import "github.com/gopherdojo/dojo3/kadai4/gosagawa/omikuzi" func main() { - fmt.Println("vim-go") + omikuzi.Draw() } diff --git a/kadai4/gosagawa/omikuzi/omikuzi.go b/kadai4/gosagawa/omikuzi/omikuzi.go new file mode 100644 index 0000000..aa0b1be --- /dev/null +++ b/kadai4/gosagawa/omikuzi/omikuzi.go @@ -0,0 +1,28 @@ +package omikuzi + +import ( + "math/rand" + "time" +) + +type Fortune string + +var OmikuziPattern []Fortune + +const ( + Daikichi Fortune = "大吉" + Chukichi Fortune = "中吉" + Kichi Fortune = "吉" + Kyo Fortune = "凶" +) + +func init() { + OmikuziPattern = []Fortune{Kyo, Kichi, Kichi, Chukichi, Chukichi, Daikichi} +} + +func Draw() { + t := time.Now().UnixNano() + rand.Seed(t) + s := rand.Intn(len(OmikuziPattern)) + println(OmikuziPattern[s]) +} From 4f6b937dd733e73bb0cb8c1ee254f1beab5fbd89 Mon Sep 17 00:00:00 2001 From: GoSagawa Date: Fri, 14 Sep 2018 00:39:06 +0900 Subject: [PATCH 03/15] add test --- kadai4/gosagawa/Makefile | 17 ++++++++++ kadai4/gosagawa/omikuzi/omikuzi.go | 24 +++++++++++++-- kadai4/gosagawa/omikuzi/omikuzi_test.go | 41 +++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 kadai4/gosagawa/Makefile create mode 100644 kadai4/gosagawa/omikuzi/omikuzi_test.go diff --git a/kadai4/gosagawa/Makefile b/kadai4/gosagawa/Makefile new file mode 100644 index 0000000..b4dd4d9 --- /dev/null +++ b/kadai4/gosagawa/Makefile @@ -0,0 +1,17 @@ +VERSION=1.0.0 +TARGETS_NOVENDOR=$(shell go list ./... | grep -v /vendor/) + +all: bin/main + +bin/main: main.go + go build -o bin/main main.go + +fmt: + @echo ./... | xargs go fmt + +check: + go test -v -cover ./... + +clean: + rm -rf bin/* + diff --git a/kadai4/gosagawa/omikuzi/omikuzi.go b/kadai4/gosagawa/omikuzi/omikuzi.go index aa0b1be..3bcf5b0 100644 --- a/kadai4/gosagawa/omikuzi/omikuzi.go +++ b/kadai4/gosagawa/omikuzi/omikuzi.go @@ -6,6 +6,9 @@ import ( ) type Fortune string +type RandomGenerater interface { + Get() int +} var OmikuziPattern []Fortune @@ -16,13 +19,30 @@ const ( Kyo Fortune = "凶" ) +type Omikuzi struct { + RandomGenerater RandomGenerater + OmikuziPattern []Fortune +} + +func (o *Omikuzi) Draw() Fortune { + return o.OmikuziPattern[o.RandomGenerater.Get()] +} + func init() { OmikuziPattern = []Fortune{Kyo, Kichi, Kichi, Chukichi, Chukichi, Daikichi} } func Draw() { + + o := Omikuzi{RandomGenerater: &Random{}, OmikuziPattern: OmikuziPattern} + s := o.Draw() + println(s) +} + +type Random struct{} + +func (r *Random) Get() int { t := time.Now().UnixNano() rand.Seed(t) - s := rand.Intn(len(OmikuziPattern)) - println(OmikuziPattern[s]) + return rand.Intn(len(OmikuziPattern)) } diff --git a/kadai4/gosagawa/omikuzi/omikuzi_test.go b/kadai4/gosagawa/omikuzi/omikuzi_test.go new file mode 100644 index 0000000..7579460 --- /dev/null +++ b/kadai4/gosagawa/omikuzi/omikuzi_test.go @@ -0,0 +1,41 @@ +package omikuzi + +import ( + "testing" +) + +func TestDraw(t *testing.T) { + cases := []struct { + name string + index int + result Fortune + }{ + {name: "normal_0", index: 0, result: Kyo}, + {name: "normal_1", index: 1, result: Kichi}, + {name: "normal_2", index: 2, result: Kichi}, + {name: "normal_3", index: 3, result: Chukichi}, + {name: "normal_4", index: 4, result: Chukichi}, + {name: "normal_5", index: 5, result: Daikichi}, + } + for _, v := range cases { + t.Run(v.name, func(t *testing.T) { + o := Omikuzi{RandomGenerater: &TestRandom{index: v.index}, OmikuziPattern: OmikuziPattern} + result := o.Draw() + if result != v.result { + t.Errorf("expected %v but %v ", v.result, result) + } + }) + } +} + +func getTestRandomGenerater(index int) { + +} + +type TestRandom struct { + index int +} + +func (r *TestRandom) Get() int { + return r.index +} From 30d9add2eeab521f6bb55df550a4814a6bd464c5 Mon Sep 17 00:00:00 2001 From: GoSagawa Date: Fri, 14 Sep 2018 00:45:39 +0900 Subject: [PATCH 04/15] go lint --- kadai4/gosagawa/omikuzi/omikuzi.go | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/kadai4/gosagawa/omikuzi/omikuzi.go b/kadai4/gosagawa/omikuzi/omikuzi.go index 3bcf5b0..b004743 100644 --- a/kadai4/gosagawa/omikuzi/omikuzi.go +++ b/kadai4/gosagawa/omikuzi/omikuzi.go @@ -5,25 +5,38 @@ import ( "time" ) +//Fortune おみくじ結果 type Fortune string + +//RandomGenerater ランダム生成器 type RandomGenerater interface { Get() int } +//OmikuziPattern おみくじ結果配列 var OmikuziPattern []Fortune const ( + //Daikichi 大吉 Daikichi Fortune = "大吉" + + //Chukichi 中吉 Chukichi Fortune = "中吉" - Kichi Fortune = "吉" - Kyo Fortune = "凶" + + //Kichi 吉 + Kichi Fortune = "吉" + + //Kyo 凶 + Kyo Fortune = "凶" ) +//Omikuzi おみくじ構造体 type Omikuzi struct { RandomGenerater RandomGenerater OmikuziPattern []Fortune } +//Draw おみくじを引く func (o *Omikuzi) Draw() Fortune { return o.OmikuziPattern[o.RandomGenerater.Get()] } @@ -32,16 +45,17 @@ func init() { OmikuziPattern = []Fortune{Kyo, Kichi, Kichi, Chukichi, Chukichi, Daikichi} } +//Draw おみくじを引く func Draw() { - o := Omikuzi{RandomGenerater: &Random{}, OmikuziPattern: OmikuziPattern} + o := Omikuzi{RandomGenerater: &random{}, OmikuziPattern: OmikuziPattern} s := o.Draw() println(s) } -type Random struct{} +type random struct{} -func (r *Random) Get() int { +func (r *random) Get() int { t := time.Now().UnixNano() rand.Seed(t) return rand.Intn(len(OmikuziPattern)) From 9c5655f93629fbc95dd43179330c16b232a10e73 Mon Sep 17 00:00:00 2001 From: GoSagawa Date: Fri, 14 Sep 2018 01:21:59 +0900 Subject: [PATCH 05/15] newyear exception --- kadai4/gosagawa/omikuzi/omikuzi.go | 35 ++++++++++++++++++++++--- kadai4/gosagawa/omikuzi/omikuzi_test.go | 31 +++++++++++++++++----- 2 files changed, 56 insertions(+), 10 deletions(-) diff --git a/kadai4/gosagawa/omikuzi/omikuzi.go b/kadai4/gosagawa/omikuzi/omikuzi.go index b004743..44c510b 100644 --- a/kadai4/gosagawa/omikuzi/omikuzi.go +++ b/kadai4/gosagawa/omikuzi/omikuzi.go @@ -33,22 +33,51 @@ const ( //Omikuzi おみくじ構造体 type Omikuzi struct { RandomGenerater RandomGenerater + Time time.Time OmikuziPattern []Fortune } //Draw おみくじを引く func (o *Omikuzi) Draw() Fortune { - return o.OmikuziPattern[o.RandomGenerater.Get()] + m := int(o.Time.Month()) + d := o.Time.Day() + + var r Fortune + if isShogatsu(m, d) { + r = Daikichi + } else { + r = o.OmikuziPattern[o.RandomGenerater.Get()] + } + return r +} + +func isShogatsu(m int, d int) bool { + if m == 1 && d >= 1 && d <= 3 { + return true + } else { + return false + } } func init() { - OmikuziPattern = []Fortune{Kyo, Kichi, Kichi, Chukichi, Chukichi, Daikichi} + OmikuziPattern = []Fortune{ + Kyo, + Kichi, + Kichi, + Chukichi, + Chukichi, + Daikichi, + } } //Draw おみくじを引く func Draw() { - o := Omikuzi{RandomGenerater: &random{}, OmikuziPattern: OmikuziPattern} + o := Omikuzi{ + RandomGenerater: &random{}, + Time: time.Now(), + OmikuziPattern: OmikuziPattern, + } s := o.Draw() println(s) } diff --git a/kadai4/gosagawa/omikuzi/omikuzi_test.go b/kadai4/gosagawa/omikuzi/omikuzi_test.go index 7579460..d3d24c8 100644 --- a/kadai4/gosagawa/omikuzi/omikuzi_test.go +++ b/kadai4/gosagawa/omikuzi/omikuzi_test.go @@ -1,25 +1,42 @@ package omikuzi import ( + "log" "testing" + "time" ) func TestDraw(t *testing.T) { cases := []struct { name string + date string index int result Fortune }{ - {name: "normal_0", index: 0, result: Kyo}, - {name: "normal_1", index: 1, result: Kichi}, - {name: "normal_2", index: 2, result: Kichi}, - {name: "normal_3", index: 3, result: Chukichi}, - {name: "normal_4", index: 4, result: Chukichi}, - {name: "normal_5", index: 5, result: Daikichi}, + {name: "normal_0", date: "2018-09-01", index: 0, result: Kyo}, + {name: "normal_1", date: "2018-09-01", index: 1, result: Kichi}, + {name: "normal_2", date: "2018-09-01", index: 2, result: Kichi}, + {name: "normal_3", date: "2018-09-01", index: 3, result: Chukichi}, + {name: "normal_4", date: "2018-09-01", index: 4, result: Chukichi}, + {name: "normal_5", date: "2018-09-01", index: 5, result: Daikichi}, + {name: "shogatsu_12/31", date: "2018-12-31", index: 0, result: Kyo}, + {name: "shogatsu_1/1", date: "2019-01-01", index: 0, result: Daikichi}, + {name: "shogatsu_1/2", date: "2019-01-02", index: 0, result: Daikichi}, + {name: "shogatsu_1/3", date: "2019-01-03", index: 0, result: Daikichi}, + {name: "shogatsu_1/4", date: "2019-01-04", index: 0, result: Kyo}, } + layout := "2006-01-02" for _, v := range cases { t.Run(v.name, func(t *testing.T) { - o := Omikuzi{RandomGenerater: &TestRandom{index: v.index}, OmikuziPattern: OmikuziPattern} + time, err := time.Parse(layout, v.date) + if err != nil { + log.Fatal(err) + } + o := Omikuzi{ + RandomGenerater: &TestRandom{index: v.index}, + Time: time, + OmikuziPattern: OmikuziPattern, + } result := o.Draw() if result != v.result { t.Errorf("expected %v but %v ", v.result, result) From 502f2ec9ccb62f01eaf16cdebac34438988792d7 Mon Sep 17 00:00:00 2001 From: GoSagawa Date: Fri, 14 Sep 2018 01:40:14 +0900 Subject: [PATCH 06/15] run http,back json --- kadai4/gosagawa/main.go | 25 +++++++++++++++++++++++-- kadai4/gosagawa/omikuzi/omikuzi.go | 5 ++--- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/kadai4/gosagawa/main.go b/kadai4/gosagawa/main.go index 4436bce..3fee7c7 100644 --- a/kadai4/gosagawa/main.go +++ b/kadai4/gosagawa/main.go @@ -1,7 +1,28 @@ package main -import "github.com/gopherdojo/dojo3/kadai4/gosagawa/omikuzi" +import ( + "encoding/json" + "log" + "net/http" + + "github.com/gopherdojo/dojo3/kadai4/gosagawa/omikuzi" +) + +type OmikuziResult struct { + Result string `json:"result"` +} func main() { - omikuzi.Draw() + http.HandleFunc("/", handler) + http.ListenAndServe(":8080", nil) + +} + +func handler(w http.ResponseWriter, r *http.Request) { + data := &OmikuziResult{Result: omikuzi.Draw()} + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + if err := json.NewEncoder(w).Encode(data); err != nil { + log.Println("Error:", err) + } } diff --git a/kadai4/gosagawa/omikuzi/omikuzi.go b/kadai4/gosagawa/omikuzi/omikuzi.go index 44c510b..d512bdb 100644 --- a/kadai4/gosagawa/omikuzi/omikuzi.go +++ b/kadai4/gosagawa/omikuzi/omikuzi.go @@ -71,15 +71,14 @@ func init() { } //Draw おみくじを引く -func Draw() { +func Draw() string { o := Omikuzi{ RandomGenerater: &random{}, Time: time.Now(), OmikuziPattern: OmikuziPattern, } - s := o.Draw() - println(s) + return string(o.Draw()) } type random struct{} From 5a014d8d8b88ec7dde60dc8599428d9677b30436 Mon Sep 17 00:00:00 2001 From: GoSagawa Date: Fri, 14 Sep 2018 02:04:40 +0900 Subject: [PATCH 07/15] fix one result per day --- kadai4/gosagawa/omikuzi/omikuzi.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/kadai4/gosagawa/omikuzi/omikuzi.go b/kadai4/gosagawa/omikuzi/omikuzi.go index d512bdb..0bd69f3 100644 --- a/kadai4/gosagawa/omikuzi/omikuzi.go +++ b/kadai4/gosagawa/omikuzi/omikuzi.go @@ -1,6 +1,7 @@ package omikuzi import ( + "log" "math/rand" "time" ) @@ -84,7 +85,16 @@ func Draw() string { type random struct{} func (r *random) Get() int { - t := time.Now().UnixNano() - rand.Seed(t) + + //XXX 同じ日であれば同じ結果を出すため、当日の00:00のUNIXタイムを取得する。 + //もっといいやり方があるかも + day := time.Now() + layout := "2006-01-02" + dayformated := day.Format(layout) + t, err := time.Parse(layout, dayformated) + if err != nil { + log.Println("Error:", err) + } + rand.Seed(t.Unix()) return rand.Intn(len(OmikuziPattern)) } From fddc27d53deeb12f94179c182463a92df0d3e8a4 Mon Sep 17 00:00:00 2001 From: GoSagawa Date: Fri, 14 Sep 2018 02:20:13 +0900 Subject: [PATCH 08/15] add http handler test --- kadai4/gosagawa/main.go | 6 ++++++ kadai4/gosagawa/main_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 kadai4/gosagawa/main_test.go diff --git a/kadai4/gosagawa/main.go b/kadai4/gosagawa/main.go index 3fee7c7..097fa92 100644 --- a/kadai4/gosagawa/main.go +++ b/kadai4/gosagawa/main.go @@ -2,6 +2,7 @@ package main import ( "encoding/json" + "fmt" "log" "net/http" @@ -14,6 +15,7 @@ type OmikuziResult struct { func main() { http.HandleFunc("/", handler) + http.HandleFunc("/hoge", handlerHoge) http.ListenAndServe(":8080", nil) } @@ -26,3 +28,7 @@ func handler(w http.ResponseWriter, r *http.Request) { log.Println("Error:", err) } } + +func handlerHoge(w http.ResponseWriter, r *http.Request) { + fmt.Fprint(w, "Hello, net/http!") +} diff --git a/kadai4/gosagawa/main_test.go b/kadai4/gosagawa/main_test.go new file mode 100644 index 0000000..32d66b7 --- /dev/null +++ b/kadai4/gosagawa/main_test.go @@ -0,0 +1,27 @@ +package main + +import ( + "io/ioutil" + "net/http" + "net/http/httptest" + "testing" +) + +func TestHandler(t *testing.T) { + w := httptest.NewRecorder() + r := httptest.NewRequest("GET", "/hoge", nil) + handlerHoge(w, r) + rw := w.Result() + defer rw.Body.Close() + if rw.StatusCode != http.StatusOK { + t.Fatal("unexpected status code") + } + b, err := ioutil.ReadAll(rw.Body) + if err != nil { + t.Fatal("unexpected error") + } + const expected = "Hello, net/http!" + if s := string(b); s != expected { + t.Fatalf("unexpected response: %s", s) + } +} From 3cfa7755f66cd1138c720b22845c9f8c313ecdb3 Mon Sep 17 00:00:00 2001 From: GoSagawa Date: Fri, 14 Sep 2018 02:42:49 +0900 Subject: [PATCH 09/15] add http handler test --- kadai4/gosagawa/main.go | 10 +++++-- kadai4/gosagawa/omikuzi/omikuzi.go | 47 +++++++++++++++++++++--------- 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/kadai4/gosagawa/main.go b/kadai4/gosagawa/main.go index 097fa92..d0321bc 100644 --- a/kadai4/gosagawa/main.go +++ b/kadai4/gosagawa/main.go @@ -15,13 +15,19 @@ type OmikuziResult struct { func main() { http.HandleFunc("/", handler) - http.HandleFunc("/hoge", handlerHoge) http.ListenAndServe(":8080", nil) } func handler(w http.ResponseWriter, r *http.Request) { - data := &OmikuziResult{Result: omikuzi.Draw()} + + date := r.FormValue("date") + var data OmikuziResult + if date != "" { + data = &OmikuziResult{Result: omikuzi.Draw()} + } else { + data = &OmikuziResult{Result: omikuzi.DrawByDate(date)} + } w.Header().Set("Content-Type", "application/json; charset=utf-8") if err := json.NewEncoder(w).Encode(data); err != nil { diff --git a/kadai4/gosagawa/omikuzi/omikuzi.go b/kadai4/gosagawa/omikuzi/omikuzi.go index 0bd69f3..0e063dc 100644 --- a/kadai4/gosagawa/omikuzi/omikuzi.go +++ b/kadai4/gosagawa/omikuzi/omikuzi.go @@ -31,6 +31,8 @@ const ( Kyo Fortune = "凶" ) +const TimeLayout = "2006-01-02" + //Omikuzi おみくじ構造体 type Omikuzi struct { RandomGenerater RandomGenerater @@ -74,27 +76,44 @@ func init() { //Draw おみくじを引く func Draw() string { + now := time.Now() + + //XXX 1日で結果を固定するように当日の00:00を取得するためフォーマット化し、 + //またtime.Timeに戻してている。 + //別のいいやり方がないか検討していた。 + timeFormated := now.Format(TimeLayout) + targetTime, err := time.Parse(TimeLayout, timeFormated) + if err != nil { + log.Println("error:", err) + } + o := Omikuzi{ - RandomGenerater: &random{}, - Time: time.Now(), + RandomGenerater: &random{TargetTime: targetTime}, + Time: targetTime, OmikuziPattern: OmikuziPattern, } return string(o.Draw()) } +func DrawByDate(targetDate string) string { -type random struct{} - -func (r *random) Get() int { - - //XXX 同じ日であれば同じ結果を出すため、当日の00:00のUNIXタイムを取得する。 - //もっといいやり方があるかも - day := time.Now() - layout := "2006-01-02" - dayformated := day.Format(layout) - t, err := time.Parse(layout, dayformated) + targetTime, err := time.Parse(TimeLayout, targetDate) if err != nil { - log.Println("Error:", err) + log.Println("error:", err) + } + + o := Omikuzi{ + RandomGenerater: &random{TargetTime: targetTime}, + Time: targetTime, + OmikuziPattern: OmikuziPattern, } - rand.Seed(t.Unix()) + return string(o.Draw()) +} + +type random struct { + TargetTime time.Time +} + +func (r *random) Get() int { + rand.Seed(r.TargetTime.Unix()) return rand.Intn(len(OmikuziPattern)) } From a3cec9e7b0023583ef81d0487765d5112a3b7715 Mon Sep 17 00:00:00 2001 From: GoSagawa Date: Fri, 14 Sep 2018 03:17:13 +0900 Subject: [PATCH 10/15] handler test --- kadai4/gosagawa/main.go | 9 ++----- kadai4/gosagawa/main_test.go | 50 +++++++++++++++++++++++++----------- 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/kadai4/gosagawa/main.go b/kadai4/gosagawa/main.go index d0321bc..81a45cc 100644 --- a/kadai4/gosagawa/main.go +++ b/kadai4/gosagawa/main.go @@ -2,7 +2,6 @@ package main import ( "encoding/json" - "fmt" "log" "net/http" @@ -22,8 +21,8 @@ func main() { func handler(w http.ResponseWriter, r *http.Request) { date := r.FormValue("date") - var data OmikuziResult - if date != "" { + var data *OmikuziResult + if date == "" { data = &OmikuziResult{Result: omikuzi.Draw()} } else { data = &OmikuziResult{Result: omikuzi.DrawByDate(date)} @@ -34,7 +33,3 @@ func handler(w http.ResponseWriter, r *http.Request) { log.Println("Error:", err) } } - -func handlerHoge(w http.ResponseWriter, r *http.Request) { - fmt.Fprint(w, "Hello, net/http!") -} diff --git a/kadai4/gosagawa/main_test.go b/kadai4/gosagawa/main_test.go index 32d66b7..38229ae 100644 --- a/kadai4/gosagawa/main_test.go +++ b/kadai4/gosagawa/main_test.go @@ -1,27 +1,47 @@ package main import ( - "io/ioutil" + "encoding/json" "net/http" "net/http/httptest" "testing" ) func TestHandler(t *testing.T) { - w := httptest.NewRecorder() - r := httptest.NewRequest("GET", "/hoge", nil) - handlerHoge(w, r) - rw := w.Result() - defer rw.Body.Close() - if rw.StatusCode != http.StatusOK { - t.Fatal("unexpected status code") - } - b, err := ioutil.ReadAll(rw.Body) - if err != nil { - t.Fatal("unexpected error") + + cases := []struct { + name string + date string + isResultFixed bool + result string + }{ + {name: "normal", date: ""}, + {name: "shogatsu_12/31", date: "2018-12-31"}, + {name: "shogatsu_1/1", date: "2019-01-01", isResultFixed: true, result: "大吉"}, + {name: "shogatsu_1/2", date: "2019-01-02", isResultFixed: true, result: "大吉"}, + {name: "shogatsu_1/3", date: "2019-01-03", isResultFixed: true, result: "大吉"}, + {name: "shogatsu_1/4", date: "2019-01-04"}, } - const expected = "Hello, net/http!" - if s := string(b); s != expected { - t.Fatalf("unexpected response: %s", s) + + for _, v := range cases { + t.Run(v.name, func(t *testing.T) { + w := httptest.NewRecorder() + r := httptest.NewRequest("GET", "/?date="+v.date, nil) + handler(w, r) + rw := w.Result() + defer rw.Body.Close() + if rw.StatusCode != http.StatusOK { + t.Fatal("unexpected status code") + } + var or OmikuziResult + dec := json.NewDecoder(rw.Body) + if err := dec.Decode(&or); err != nil { + t.Fatal(err) + } + + if v.isResultFixed && or.Result != v.result { + t.Errorf("expected %v but %v ", v.result, or.Result) + } + }) } } From 58ad99a4b8960a88b8b0b84d7153d1b70dc7a4d9 Mon Sep 17 00:00:00 2001 From: GoSagawa Date: Fri, 14 Sep 2018 03:19:35 +0900 Subject: [PATCH 11/15] golint --- kadai4/gosagawa/main.go | 1 + kadai4/gosagawa/omikuzi/omikuzi.go | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/kadai4/gosagawa/main.go b/kadai4/gosagawa/main.go index 81a45cc..abec37a 100644 --- a/kadai4/gosagawa/main.go +++ b/kadai4/gosagawa/main.go @@ -8,6 +8,7 @@ import ( "github.com/gopherdojo/dojo3/kadai4/gosagawa/omikuzi" ) +//OmikuziResult おみくじの実行結果 type OmikuziResult struct { Result string `json:"result"` } diff --git a/kadai4/gosagawa/omikuzi/omikuzi.go b/kadai4/gosagawa/omikuzi/omikuzi.go index 0e063dc..bb592ad 100644 --- a/kadai4/gosagawa/omikuzi/omikuzi.go +++ b/kadai4/gosagawa/omikuzi/omikuzi.go @@ -31,6 +31,7 @@ const ( Kyo Fortune = "凶" ) +//TimeLayout 日付レイアウト const TimeLayout = "2006-01-02" //Omikuzi おみくじ構造体 @@ -57,9 +58,8 @@ func (o *Omikuzi) Draw() Fortune { func isShogatsu(m int, d int) bool { if m == 1 && d >= 1 && d <= 3 { return true - } else { - return false } + return false } func init() { @@ -94,6 +94,8 @@ func Draw() string { } return string(o.Draw()) } + +//DrawByDate 日付でおみくじを引く func DrawByDate(targetDate string) string { targetTime, err := time.Parse(TimeLayout, targetDate) From b296b1e230b8a33f835633c873c037600bb89647 Mon Sep 17 00:00:00 2001 From: GoSagawa Date: Fri, 14 Sep 2018 03:26:51 +0900 Subject: [PATCH 12/15] mod readme --- kadai4/gosagawa/README.md | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/kadai4/gosagawa/README.md b/kadai4/gosagawa/README.md index e065387..86f25d0 100644 --- a/kadai4/gosagawa/README.md +++ b/kadai4/gosagawa/README.md @@ -5,10 +5,22 @@ - 正月(1/1-1/3)だけ大吉にする - ハンドラのテストを書いてみる -- おみくじプログラム - - サイコロを転がし、出た目によって運勢を占うプログラム - - 6:大吉 - - 5,4:中吉 - - 3,2:吉 - - 1:凶 +#usage + +- 実行するとポート8080でサーバが起動されます。 +```shell +$ go run main.go +``` + +- アクセスすると、その日のおみくじ結果を返します。 +```shell +curl "http://127.0.0.1:8080/" +{"result":"吉"} +``` + +- パラメータでdateを指定すると、その日のおみくじ結果を確認できます。 +```shell +curl "http://127.0.0.1:8080/?date=2019-01-02" +{"result":"大吉"} +``` From 7e31666db1819355a4f2e9cfa291a2b2a77464ee Mon Sep 17 00:00:00 2001 From: GoSagawa Date: Fri, 14 Sep 2018 03:29:40 +0900 Subject: [PATCH 13/15] add bin dir --- kadai4/gosagawa/.gitignore | 3 ++- kadai4/gosagawa/bin/.gitkeep | 0 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 kadai4/gosagawa/bin/.gitkeep diff --git a/kadai4/gosagawa/.gitignore b/kadai4/gosagawa/.gitignore index 9e04648..aca9fba 100644 --- a/kadai4/gosagawa/.gitignore +++ b/kadai4/gosagawa/.gitignore @@ -1,2 +1,3 @@ +bin/* !.gitkeep -bin/ + diff --git a/kadai4/gosagawa/bin/.gitkeep b/kadai4/gosagawa/bin/.gitkeep new file mode 100644 index 0000000..e69de29 From 6f91e7b1312c3729e7892329ddaf5c96b6d1e76b Mon Sep 17 00:00:00 2001 From: GoSagawa Date: Fri, 14 Sep 2018 03:34:40 +0900 Subject: [PATCH 14/15] errcheck --- kadai4/gosagawa/main.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/kadai4/gosagawa/main.go b/kadai4/gosagawa/main.go index abec37a..2e2b0ea 100644 --- a/kadai4/gosagawa/main.go +++ b/kadai4/gosagawa/main.go @@ -15,8 +15,10 @@ type OmikuziResult struct { func main() { http.HandleFunc("/", handler) - http.ListenAndServe(":8080", nil) - + err := http.ListenAndServe(":8080", nil) + if err != nil { + log.Println("Error:", err) + } } func handler(w http.ResponseWriter, r *http.Request) { From 7f665fa9e5cf2a41d06e063758b49820ff51d10d Mon Sep 17 00:00:00 2001 From: GoSagawa Date: Fri, 14 Sep 2018 03:34:47 +0900 Subject: [PATCH 15/15] mod readme --- kadai4/gosagawa/README.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/kadai4/gosagawa/README.md b/kadai4/gosagawa/README.md index 86f25d0..d760fe9 100644 --- a/kadai4/gosagawa/README.md +++ b/kadai4/gosagawa/README.md @@ -5,22 +5,34 @@ - 正月(1/1-1/3)だけ大吉にする - ハンドラのテストを書いてみる +#install + +```shell +$ make +``` + #usage - 実行するとポート8080でサーバが起動されます。 ```shell -$ go run main.go +$ bin/main ``` - アクセスすると、その日のおみくじ結果を返します。 ```shell -curl "http://127.0.0.1:8080/" +$ curl "http://127.0.0.1:8080/" {"result":"吉"} ``` - パラメータでdateを指定すると、その日のおみくじ結果を確認できます。 ```shell -curl "http://127.0.0.1:8080/?date=2019-01-02" +$ curl "http://127.0.0.1:8080/?date=2019-01-02" {"result":"大吉"} ``` +#test + +```shell +$ make check +``` +