From c309a55d60fbcca4a11ffe71283d3dba1f39ebc2 Mon Sep 17 00:00:00 2001 From: isuzuki Date: Tue, 13 Aug 2019 22:20:46 +0900 Subject: [PATCH 1/5] wip: added main (test failed) --- kadai4/main.go | 65 +++++++++++++++++++++++++++++++++++++++++++++ kadai4/main_test.go | 31 +++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 kadai4/main.go create mode 100644 kadai4/main_test.go diff --git a/kadai4/main.go b/kadai4/main.go new file mode 100644 index 0000000..33062c7 --- /dev/null +++ b/kadai4/main.go @@ -0,0 +1,65 @@ +package main + +import ( + "encoding/json" + "log" + "net/http" +) + +func main() { + http.HandleFunc("/", handler) + http.ListenAndServe(":8080", nil) +} + +type Response struct { + Msg string `json:"msg"` +} + +func handler(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + res := Response{Msg: "json response"} + + if err := json.NewEncoder(w).Encode(res); err != nil { + log.Println("Error:", err) + } +} + +/* +package main + +import ( + "encoding/json" + "log" + "net/http" + "time" + + "github.com/isuzuki/omikuji/omikuji" +) + +func main() { + http.HandleFunc("/", handler) + http.ListenAndServe(":8080", nil) +} + +type Lottery struct { + Msg string `json:"msg"` +} + +func handler(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + _, m, d := time.Now().Date() + ret, ok := omikuji.Lottery(int(m), d) + var res Lottery + if ok { + res = Lottery{Msg: ret} + } else { + res = Lottery{Msg: "エラーが発生しました。"} + } + + if err := json.NewEncoder(w).Encode(res); err != nil { + log.Println("Error:", err) + } +} +*/ diff --git a/kadai4/main_test.go b/kadai4/main_test.go new file mode 100644 index 0000000..9fc3921 --- /dev/null +++ b/kadai4/main_test.go @@ -0,0 +1,31 @@ +package main + +import ( + "io/ioutil" + "net/http" + "net/http/httptest" + "testing" +) + +func TestHandler(t *testing.T) { + w := httptest.NewRecorder() + r := httptest.NewRequest("GET", "/", nil) + handler(w, r) + rw := w.Result() + + defer rw.Body.Close() + + if rw.StatusCode != http.StatusOK { + t.Fatalf("unexpected status code: %d", rw.StatusCode) + } + + b, err := ioutil.ReadAll(rw.Body) + if err != nil { + t.Fatal("unexpected error") + } + + const expected = `{"msg":"json response"}` + if s := string(b); s != expected { + t.Fatalf("unexpected response: %s", s) + } +} From 1c9c2973ff720934a7c894e48c7854df30309a5a Mon Sep 17 00:00:00 2001 From: isuzuki Date: Tue, 13 Aug 2019 23:21:53 +0900 Subject: [PATCH 2/5] added omikuji --- kadai4/main.go | 45 ++++++---------------------------- kadai4/main_test.go | 2 +- kadai4/omikuji/omikuji.go | 31 +++++++++++++++++++++++ kadai4/omikuji/omikuji_test.go | 26 ++++++++++++++++++++ 4 files changed, 65 insertions(+), 39 deletions(-) create mode 100644 kadai4/omikuji/omikuji.go create mode 100644 kadai4/omikuji/omikuji_test.go diff --git a/kadai4/main.go b/kadai4/main.go index 33062c7..99b3867 100644 --- a/kadai4/main.go +++ b/kadai4/main.go @@ -3,46 +3,21 @@ package main import ( "encoding/json" "log" - "net/http" -) - -func main() { - http.HandleFunc("/", handler) - http.ListenAndServe(":8080", nil) -} - -type Response struct { - Msg string `json:"msg"` -} - -func handler(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=utf-8") - - res := Response{Msg: "json response"} - - if err := json.NewEncoder(w).Encode(res); err != nil { - log.Println("Error:", err) - } -} - -/* -package main - -import ( - "encoding/json" - "log" + "math/rand" "net/http" "time" - "github.com/isuzuki/omikuji/omikuji" + "github.com/gopherdojo/dojo6/kadai4/omikuji" ) func main() { + rand.Seed(time.Now().UnixNano()) + http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) } -type Lottery struct { +type Response struct { Msg string `json:"msg"` } @@ -50,16 +25,10 @@ func handler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=utf-8") _, m, d := time.Now().Date() - ret, ok := omikuji.Lottery(int(m), d) - var res Lottery - if ok { - res = Lottery{Msg: ret} - } else { - res = Lottery{Msg: "エラーが発生しました。"} - } + ret := omikuji.Do(int(m), d) + res := Response{Msg: ret} if err := json.NewEncoder(w).Encode(res); err != nil { log.Println("Error:", err) } } -*/ diff --git a/kadai4/main_test.go b/kadai4/main_test.go index 9fc3921..3392aed 100644 --- a/kadai4/main_test.go +++ b/kadai4/main_test.go @@ -24,7 +24,7 @@ func TestHandler(t *testing.T) { t.Fatal("unexpected error") } - const expected = `{"msg":"json response"}` + const expected = `{"msg":"大吉"}` if s := string(b); s != expected { t.Fatalf("unexpected response: %s", s) } diff --git a/kadai4/omikuji/omikuji.go b/kadai4/omikuji/omikuji.go new file mode 100644 index 0000000..799117c --- /dev/null +++ b/kadai4/omikuji/omikuji.go @@ -0,0 +1,31 @@ +package omikuji + +import ( + "math/rand" +) + +var omikuji = map[int]string{ + 0: "凶", + 1: "末吉", + 2: "小吉", + 3: "中吉", + 4: "吉", + 5: "大吉", +} + +func Do(month, day int) string { + var i int + // 1/1 ~ 1/3のみ大吉を出す + if month == 1 && day >= 1 && day <= 3 { + i = 5 + } else { + i = rand.Intn(len(omikuji)) + } + + s, ok := omikuji[i] + if !ok { + panic("omikuji panic.") + } + + return s +} diff --git a/kadai4/omikuji/omikuji_test.go b/kadai4/omikuji/omikuji_test.go new file mode 100644 index 0000000..d03bd91 --- /dev/null +++ b/kadai4/omikuji/omikuji_test.go @@ -0,0 +1,26 @@ +package omikuji_test + +import ( + "testing" + + "github.com/gopherdojo/dojo6/kadai4/omikuji" +) + +func Test_SpecificPeriodLottery(t *testing.T) { + periods := map[int][]int{ + 1: {1, 2, 3}, + } + + expect := "大吉" + + for m, days := range periods { + for _, d := range days { + for i := 0; i < 20; i++ { + actual := omikuji.Do(m, d) + if expect != actual { + t.Errorf(`Omikuji error: expect="%s" actual="%s"`, expect, actual) + } + } + } + } +} From 446a029ca3e7d25a88a24cea719f30f62114a7af Mon Sep 17 00:00:00 2001 From: isuzuki Date: Tue, 13 Aug 2019 23:57:15 +0900 Subject: [PATCH 3/5] fixed handler test --- kadai4/main_test.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/kadai4/main_test.go b/kadai4/main_test.go index 3392aed..9861531 100644 --- a/kadai4/main_test.go +++ b/kadai4/main_test.go @@ -1,6 +1,7 @@ package main import ( + "encoding/json" "io/ioutil" "net/http" "net/http/httptest" @@ -24,8 +25,14 @@ func TestHandler(t *testing.T) { t.Fatal("unexpected error") } - const expected = `{"msg":"大吉"}` - if s := string(b); s != expected { - t.Fatalf("unexpected response: %s", s) + res := &Response{} + // TODO: 実行時のseeder設定により、大吉しか返ってないので、テストが通る + const expected = "大吉" + if err := json.Unmarshal(b, res); err != nil { + t.Fatalf("JSON unmarshall error: %v", err) + } + + if res.Msg != string(expected) { + t.Fatalf("unexpected response: %s", res.Msg) } } From bc3d9ddab3cfbaf08663ee0392ef1969b5f7f25e Mon Sep 17 00:00:00 2001 From: isuzuki Date: Fri, 16 Aug 2019 17:48:41 +0900 Subject: [PATCH 4/5] refactor --- kadai4/main.go | 16 ++++++++++------ kadai4/main_test.go | 1 - kadai4/omikuji/omikuji.go | 28 ++++++++++++++++++++++++---- kadai4/omikuji/omikuji_test.go | 23 +++++++++++++++++------ 4 files changed, 51 insertions(+), 17 deletions(-) diff --git a/kadai4/main.go b/kadai4/main.go index 99b3867..c92b3eb 100644 --- a/kadai4/main.go +++ b/kadai4/main.go @@ -3,7 +3,6 @@ package main import ( "encoding/json" "log" - "math/rand" "net/http" "time" @@ -11,8 +10,6 @@ import ( ) func main() { - rand.Seed(time.Now().UnixNano()) - http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) } @@ -24,9 +21,16 @@ type Response struct { func handler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=utf-8") - _, m, d := time.Now().Date() - ret := omikuji.Do(int(m), d) - res := Response{Msg: ret} + omikuji := omikuji.Omikuji{time.Now()} + ret, err := omikuji.Do() + res := Response{} + + if err != nil { + res.Msg = err.Error() + log.Println("Error:", err) + } else { + res.Msg = ret + } if err := json.NewEncoder(w).Encode(res); err != nil { log.Println("Error:", err) diff --git a/kadai4/main_test.go b/kadai4/main_test.go index 9861531..6d03145 100644 --- a/kadai4/main_test.go +++ b/kadai4/main_test.go @@ -26,7 +26,6 @@ func TestHandler(t *testing.T) { } res := &Response{} - // TODO: 実行時のseeder設定により、大吉しか返ってないので、テストが通る const expected = "大吉" if err := json.Unmarshal(b, res); err != nil { t.Fatalf("JSON unmarshall error: %v", err) diff --git a/kadai4/omikuji/omikuji.go b/kadai4/omikuji/omikuji.go index 799117c..a6ee6fd 100644 --- a/kadai4/omikuji/omikuji.go +++ b/kadai4/omikuji/omikuji.go @@ -1,7 +1,9 @@ package omikuji import ( + "fmt" "math/rand" + "time" ) var omikuji = map[int]string{ @@ -13,10 +15,28 @@ var omikuji = map[int]string{ 5: "大吉", } -func Do(month, day int) string { +type Omikuji struct { + Time time.Time +} + +func (o *Omikuji) SetSeed(seed int64) { + rand.Seed(seed) +} + +type OmikujiError struct { + Msg string +} + +func (err *OmikujiError) Error() string { + return fmt.Sprintf(err.Msg) +} + +func (o *Omikuji) Do() (string, error) { var i int + + _, m, d := o.Time.Date() // 1/1 ~ 1/3のみ大吉を出す - if month == 1 && day >= 1 && day <= 3 { + if int(m) == 1 && d >= 1 && d <= 3 { i = 5 } else { i = rand.Intn(len(omikuji)) @@ -24,8 +44,8 @@ func Do(month, day int) string { s, ok := omikuji[i] if !ok { - panic("omikuji panic.") + return "", &OmikujiError{"おみくじが引けませんでした。"} } - return s + return s, nil } diff --git a/kadai4/omikuji/omikuji_test.go b/kadai4/omikuji/omikuji_test.go index d03bd91..9d9c95e 100644 --- a/kadai4/omikuji/omikuji_test.go +++ b/kadai4/omikuji/omikuji_test.go @@ -2,11 +2,22 @@ package omikuji_test import ( "testing" + "time" "github.com/gopherdojo/dojo6/kadai4/omikuji" ) -func Test_SpecificPeriodLottery(t *testing.T) { +func Test_NormalTime(t *testing.T) { + time := time.Date(2019, time.Month(8), 16, 0, 0, 0, 0, time.Local) + omikuji := omikuji.Omikuji{time} + expect := "大吉" + actual, _ := omikuji.Do() + if expect != actual { + t.Errorf(`Omikuji error: expect="%s" actual="%s"`, expect, actual) + } +} + +func Test_SpecificPeriod(t *testing.T) { periods := map[int][]int{ 1: {1, 2, 3}, } @@ -15,11 +26,11 @@ func Test_SpecificPeriodLottery(t *testing.T) { for m, days := range periods { for _, d := range days { - for i := 0; i < 20; i++ { - actual := omikuji.Do(m, d) - if expect != actual { - t.Errorf(`Omikuji error: expect="%s" actual="%s"`, expect, actual) - } + time := time.Date(2019, time.Month(m), d, 0, 0, 0, 0, time.Local) + omikuji := omikuji.Omikuji{time} + actual, _ := omikuji.Do() + if expect != actual { + t.Errorf(`Omikuji error: expect="%s" actual="%s"`, expect, actual) } } } From 3b71ebb04ccb221b84344201610c96473d0ee851 Mon Sep 17 00:00:00 2001 From: isuzuki Date: Fri, 16 Aug 2019 17:59:54 +0900 Subject: [PATCH 5/5] modified omikuji map to slice --- kadai4/main.go | 10 +-------- kadai4/omikuji/omikuji.go | 37 ++++++++++------------------------ kadai4/omikuji/omikuji_test.go | 4 ++-- 3 files changed, 14 insertions(+), 37 deletions(-) diff --git a/kadai4/main.go b/kadai4/main.go index c92b3eb..8158735 100644 --- a/kadai4/main.go +++ b/kadai4/main.go @@ -22,15 +22,7 @@ func handler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=utf-8") omikuji := omikuji.Omikuji{time.Now()} - ret, err := omikuji.Do() - res := Response{} - - if err != nil { - res.Msg = err.Error() - log.Println("Error:", err) - } else { - res.Msg = ret - } + res := Response{omikuji.Do()} if err := json.NewEncoder(w).Encode(res); err != nil { log.Println("Error:", err) diff --git a/kadai4/omikuji/omikuji.go b/kadai4/omikuji/omikuji.go index a6ee6fd..902892c 100644 --- a/kadai4/omikuji/omikuji.go +++ b/kadai4/omikuji/omikuji.go @@ -1,18 +1,17 @@ package omikuji import ( - "fmt" "math/rand" "time" ) -var omikuji = map[int]string{ - 0: "凶", - 1: "末吉", - 2: "小吉", - 3: "中吉", - 4: "吉", - 5: "大吉", +var omikuji = []string{ + "凶", + "末吉", + "小吉", + "中吉", + "吉", + "大吉", } type Omikuji struct { @@ -23,29 +22,15 @@ func (o *Omikuji) SetSeed(seed int64) { rand.Seed(seed) } -type OmikujiError struct { - Msg string -} - -func (err *OmikujiError) Error() string { - return fmt.Sprintf(err.Msg) -} - -func (o *Omikuji) Do() (string, error) { +func (o *Omikuji) Do() string { var i int _, m, d := o.Time.Date() // 1/1 ~ 1/3のみ大吉を出す if int(m) == 1 && d >= 1 && d <= 3 { - i = 5 - } else { - i = rand.Intn(len(omikuji)) - } - - s, ok := omikuji[i] - if !ok { - return "", &OmikujiError{"おみくじが引けませんでした。"} + return "大吉" } - return s, nil + i = rand.Intn(len(omikuji)) + return omikuji[i] } diff --git a/kadai4/omikuji/omikuji_test.go b/kadai4/omikuji/omikuji_test.go index 9d9c95e..b16262c 100644 --- a/kadai4/omikuji/omikuji_test.go +++ b/kadai4/omikuji/omikuji_test.go @@ -11,7 +11,7 @@ func Test_NormalTime(t *testing.T) { time := time.Date(2019, time.Month(8), 16, 0, 0, 0, 0, time.Local) omikuji := omikuji.Omikuji{time} expect := "大吉" - actual, _ := omikuji.Do() + actual := omikuji.Do() if expect != actual { t.Errorf(`Omikuji error: expect="%s" actual="%s"`, expect, actual) } @@ -28,7 +28,7 @@ func Test_SpecificPeriod(t *testing.T) { for _, d := range days { time := time.Date(2019, time.Month(m), d, 0, 0, 0, 0, time.Local) omikuji := omikuji.Omikuji{time} - actual, _ := omikuji.Do() + actual := omikuji.Do() if expect != actual { t.Errorf(`Omikuji error: expect="%s" actual="%s"`, expect, actual) }