From a4c005f5d7cf8f73fea0620066c7824fd1243216 Mon Sep 17 00:00:00 2001 From: annkara Date: Mon, 12 Aug 2019 10:04:24 +0900 Subject: [PATCH 1/6] =?UTF-8?q?README.md=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai4/annkara/README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 kadai4/annkara/README.md diff --git a/kadai4/annkara/README.md b/kadai4/annkara/README.md new file mode 100644 index 0000000..9ebc042 --- /dev/null +++ b/kadai4/annkara/README.md @@ -0,0 +1,22 @@ +# 課題4 + +## おみくじプログラム + +* サイコロを転がし、出た目によって運勢を占うプログラム + * 6 : 大吉 + * 5,4 : 中吉 + * 3,2 : 吉 + * 1 : 凶 + +## Webアプリ化してみよう + +* HTTPサーバを作成する +* リクエストが来たらおみくじの結果を返す +* 乱数の種は1回だけ初期化する + * HTTPサーバを起動する前に初期化する + +## おみくじAPIを作ってみよう + +* JSON形式でおみくじの結果を返す +* 正月(1/1-1/3)だけ大吉にする +* ハンドラのテストを書いてみる From 0b25b8d77a958def0665eaa900009d69e4646667 Mon Sep 17 00:00:00 2001 From: annkara Date: Mon, 12 Aug 2019 10:55:12 +0900 Subject: [PATCH 2/6] =?UTF-8?q?=E3=81=8A=E3=81=BF=E3=81=8F=E3=81=98?= =?UTF-8?q?=E3=81=AE=E5=88=9D=E6=9C=9F=E5=AE=9F=E8=A3=85=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai4/annkara/omikuji_test/omikuij_test.go | 69 +++++++++++++++++++++ kadai4/annkara/pkg/omikuji/omikuji.go | 23 +++++++ 2 files changed, 92 insertions(+) create mode 100644 kadai4/annkara/omikuji_test/omikuij_test.go create mode 100644 kadai4/annkara/pkg/omikuji/omikuji.go diff --git a/kadai4/annkara/omikuji_test/omikuij_test.go b/kadai4/annkara/omikuji_test/omikuij_test.go new file mode 100644 index 0000000..fae8777 --- /dev/null +++ b/kadai4/annkara/omikuji_test/omikuij_test.go @@ -0,0 +1,69 @@ +package omikuji_test + +import ( + "math/rand" + "testing" + "time" + + "github.com/dojo6/kadai4/annkara/pkg/omikuji" +) + +type result struct { + r1 bool + r2 bool + r3 bool + r4 bool + r5 bool + r6 bool +} + +func (r *result) finished() bool { + return r.r1 && r.r2 && r.r3 && r.r4 && r.r5 && r.r6 +} + +func TestOmikuji(t *testing.T) { + n := time.Now().UnixNano() + rand.Seed(n) + + r := result{} + for { + + if r.finished() { + return + } + + me, unsei := omikuji.Draw() + switch me { + case 6: + r.r6 = true + if unsei != "大吉" { + t.Errorf("me: %d, expected: %v, actual: %v", me, "大吉", unsei) + } + case 5, 4: + if me == 5 { + r.r5 = true + } else { + r.r4 = true + } + if unsei != "中吉" { + t.Errorf("me: %d, expected: %v, actual: %v", me, "中吉", unsei) + } + case 3, 2: + if me == 3 { + r.r3 = true + } else { + r.r2 = true + } + if unsei != "小吉" { + t.Errorf("me: %d, expected: %v, actual: %v", me, "小吉", unsei) + } + case 1: + r.r1 = true + if unsei != "凶" { + t.Errorf("me: %d, expected: %v, actual: %v", me, "凶", unsei) + } + default: + t.Fatalf("Invalid value %d", me) + } + } +} diff --git a/kadai4/annkara/pkg/omikuji/omikuji.go b/kadai4/annkara/pkg/omikuji/omikuji.go new file mode 100644 index 0000000..9c35e45 --- /dev/null +++ b/kadai4/annkara/pkg/omikuji/omikuji.go @@ -0,0 +1,23 @@ +package omikuji + +import "math/rand" + +// Draw a omikuji +func Draw() (int, string) { + + me := rand.Intn(7) + var unsei string + switch me { + case 6: + unsei = "大吉" + case 5, 4: + unsei = "中吉" + case 3, 2: + unsei = "小吉" + case 1: + unsei = "凶" + default: + return Draw() + } + return me, unsei +} From 589a233e0e9f8ab91853c3fe8ef2ce70cbebbb54 Mon Sep 17 00:00:00 2001 From: annkara Date: Mon, 12 Aug 2019 11:20:06 +0900 Subject: [PATCH 3/6] =?UTF-8?q?HTTP=E3=82=B5=E3=83=BC=E3=83=90=E3=81=AE?= =?UTF-8?q?=E4=BD=9C=E6=88=90=E3=81=A8=E3=83=8F=E3=83=B3=E3=83=89=E3=83=A9?= =?UTF-8?q?=E5=AE=9A=E7=BE=A9=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai4/annkara/cmd/omikuji/main.go | 17 +++++++++++++++++ kadai4/annkara/pkg/omikuji/omikuji.go | 12 +++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 kadai4/annkara/cmd/omikuji/main.go diff --git a/kadai4/annkara/cmd/omikuji/main.go b/kadai4/annkara/cmd/omikuji/main.go new file mode 100644 index 0000000..859c668 --- /dev/null +++ b/kadai4/annkara/cmd/omikuji/main.go @@ -0,0 +1,17 @@ +package main + +import ( + "net/http" + "math/rand" + "time" + + "github.com/dojo6/kadai4/annkara/pkg/omikuji" +) + +func main() { + n := time.Now().UnixNano() + rand.Seed(n) + + http.HandleFunc("/", omikuji.Handler) + http.ListenAndServe(":8080", nil) +} diff --git a/kadai4/annkara/pkg/omikuji/omikuji.go b/kadai4/annkara/pkg/omikuji/omikuji.go index 9c35e45..e4e5083 100644 --- a/kadai4/annkara/pkg/omikuji/omikuji.go +++ b/kadai4/annkara/pkg/omikuji/omikuji.go @@ -1,6 +1,10 @@ package omikuji -import "math/rand" +import ( + "fmt" + "math/rand" + "net/http" +) // Draw a omikuji func Draw() (int, string) { @@ -21,3 +25,9 @@ func Draw() (int, string) { } return me, unsei } + +// Omikuji HTTP Handler +func Handler(w http.ResponseWriter, r *http.Request) { + _, unsei := Draw() + fmt.Fprint(w, unsei) +} From 15c7eb0745532e75385a54cbf81d7a20cf6b2db9 Mon Sep 17 00:00:00 2001 From: annkara Date: Mon, 12 Aug 2019 12:23:27 +0900 Subject: [PATCH 4/6] =?UTF-8?q?JSON=E5=BD=A2=E5=BC=8F=E3=81=A7=E3=81=AE?= =?UTF-8?q?=E7=B5=90=E6=9E=9C=E3=81=AE=E8=BF=94=E5=8D=B4=E3=81=A8Handler?= =?UTF-8?q?=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai4/annkara/omikuji_test/omikuij_test.go | 19 +++++++++++++++++++ kadai4/annkara/pkg/omikuji/omikuji.go | 20 ++++++++++++++++---- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/kadai4/annkara/omikuji_test/omikuij_test.go b/kadai4/annkara/omikuji_test/omikuij_test.go index fae8777..b57837e 100644 --- a/kadai4/annkara/omikuji_test/omikuij_test.go +++ b/kadai4/annkara/omikuji_test/omikuij_test.go @@ -1,7 +1,10 @@ package omikuji_test import ( + "io/ioutil" "math/rand" + "net/http" + "net/http/httptest" "testing" "time" @@ -67,3 +70,19 @@ func TestOmikuji(t *testing.T) { } } } + +func TestHandler(t *testing.T) { + w := httptest.NewRecorder() + r := httptest.NewRequest("GET", "/", nil) + omikuji.Handler(w, r) + wr := w.Result() + defer wr.Body.Close() + + if wr.StatusCode != http.StatusOK { + t.Fatal("unexpecete status code") + } + _, err := ioutil.ReadAll(wr.Body) + if err != nil { + t.Fatalf("unexpected error") + } +} diff --git a/kadai4/annkara/pkg/omikuji/omikuji.go b/kadai4/annkara/pkg/omikuji/omikuji.go index e4e5083..822f161 100644 --- a/kadai4/annkara/pkg/omikuji/omikuji.go +++ b/kadai4/annkara/pkg/omikuji/omikuji.go @@ -1,11 +1,18 @@ package omikuji import ( - "fmt" + "encoding/json" + "log" "math/rand" "net/http" ) +// Omikuji Result +type Omikuji struct { + Me int `json:"me"` + Unsei string `json:"unsei"` +} + // Draw a omikuji func Draw() (int, string) { @@ -26,8 +33,13 @@ func Draw() (int, string) { return me, unsei } -// Omikuji HTTP Handler +// Handler provides Omikuji Handler func Handler(w http.ResponseWriter, r *http.Request) { - _, unsei := Draw() - fmt.Fprint(w, unsei) + me, unsei := Draw() + o := &Omikuji{Me: me, Unsei: unsei} + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + if err := json.NewEncoder(w).Encode(o); err != nil { + log.Println("Error: ", err) + } } From 2feb6ac83c5d4d187590db7a9f067a92082a3804 Mon Sep 17 00:00:00 2001 From: annkara Date: Mon, 12 Aug 2019 13:22:50 +0900 Subject: [PATCH 5/6] =?UTF-8?q?=E6=AD=A3=E6=9C=88=E3=81=AE=E6=99=82?= =?UTF-8?q?=E3=81=AB=E3=81=AF=E5=A4=A7=E5=90=89=E3=82=92=E8=BF=94=E3=81=99?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai4/annkara/omikuji_test/omikuij_test.go | 32 ++++++++++++++++++++- kadai4/annkara/pkg/omikuji/omikuji.go | 25 ++++++++++++---- 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/kadai4/annkara/omikuji_test/omikuij_test.go b/kadai4/annkara/omikuji_test/omikuij_test.go index b57837e..83666e7 100644 --- a/kadai4/annkara/omikuji_test/omikuij_test.go +++ b/kadai4/annkara/omikuji_test/omikuij_test.go @@ -35,7 +35,7 @@ func TestOmikuji(t *testing.T) { return } - me, unsei := omikuji.Draw() + me, unsei := omikuji.Draw(time.Now()) switch me { case 6: r.r6 = true @@ -71,6 +71,36 @@ func TestOmikuji(t *testing.T) { } } +func TestOmikujiInShogatsu(t *testing.T) { + + tests := []struct { + desc string + date time.Time + expected string + }{ + { + desc: "1月1日", + date: time.Date(2019, time.January, 1, 0, 0, 0, 0, time.Local), + expected: "大吉", + }, { + desc: "1月2日", + date: time.Date(2019, time.January, 2, 0, 0, 0, 0, time.Local), + expected: "大吉", + }, { + desc: "1月3日", + date: time.Date(2019, time.January, 3, 0, 0, 0, 0, time.Local), + expected: "大吉", + }, + } + + for _, test := range tests { + _, unsei := omikuji.Draw(test.date) + if unsei != test.expected { + t.Errorf("Unexpected Unsei: expected %s, actual %s", test.expected, unsei) + } + } +} + func TestHandler(t *testing.T) { w := httptest.NewRecorder() r := httptest.NewRequest("GET", "/", nil) diff --git a/kadai4/annkara/pkg/omikuji/omikuji.go b/kadai4/annkara/pkg/omikuji/omikuji.go index 822f161..f86e8e0 100644 --- a/kadai4/annkara/pkg/omikuji/omikuji.go +++ b/kadai4/annkara/pkg/omikuji/omikuji.go @@ -2,9 +2,9 @@ package omikuji import ( "encoding/json" - "log" "math/rand" "net/http" + "time" ) // Omikuji Result @@ -14,7 +14,11 @@ type Omikuji struct { } // Draw a omikuji -func Draw() (int, string) { +func Draw(t time.Time) (int, string) { + + if shogatsu(t) { + return 0, "大吉" + } me := rand.Intn(7) var unsei string @@ -28,18 +32,29 @@ func Draw() (int, string) { case 1: unsei = "凶" default: - return Draw() + return Draw(t) } return me, unsei } +func shogatsu(t time.Time) bool { + + if t.Month() == time.January { + if (t.Day() == 1) || (t.Day() == 2) || (t.Day() == 3) { + return true + } + } + + return false +} + // Handler provides Omikuji Handler func Handler(w http.ResponseWriter, r *http.Request) { - me, unsei := Draw() + me, unsei := Draw(time.Now()) o := &Omikuji{Me: me, Unsei: unsei} w.Header().Set("Content-Type", "application/json; charset=utf-8") if err := json.NewEncoder(w).Encode(o); err != nil { - log.Println("Error: ", err) + http.Error(w, "Omikuji Error", http.StatusInternalServerError) } } From 89ff4a2f80157afd113bf238e47518316b862232 Mon Sep 17 00:00:00 2001 From: annkara Date: Mon, 12 Aug 2019 13:27:52 +0900 Subject: [PATCH 6/6] =?UTF-8?q?=E9=96=A2=E6=95=B0=E5=90=8D=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai4/annkara/omikuji_test/omikuij_test.go | 4 ++-- kadai4/annkara/pkg/omikuji/omikuji.go | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/kadai4/annkara/omikuji_test/omikuij_test.go b/kadai4/annkara/omikuji_test/omikuij_test.go index 83666e7..dea22d7 100644 --- a/kadai4/annkara/omikuji_test/omikuij_test.go +++ b/kadai4/annkara/omikuji_test/omikuij_test.go @@ -35,7 +35,7 @@ func TestOmikuji(t *testing.T) { return } - me, unsei := omikuji.Draw(time.Now()) + me, unsei := omikuji.Hiku(time.Now()) switch me { case 6: r.r6 = true @@ -94,7 +94,7 @@ func TestOmikujiInShogatsu(t *testing.T) { } for _, test := range tests { - _, unsei := omikuji.Draw(test.date) + _, unsei := omikuji.Hiku(test.date) if unsei != test.expected { t.Errorf("Unexpected Unsei: expected %s, actual %s", test.expected, unsei) } diff --git a/kadai4/annkara/pkg/omikuji/omikuji.go b/kadai4/annkara/pkg/omikuji/omikuji.go index f86e8e0..a16ddd3 100644 --- a/kadai4/annkara/pkg/omikuji/omikuji.go +++ b/kadai4/annkara/pkg/omikuji/omikuji.go @@ -13,8 +13,8 @@ type Omikuji struct { Unsei string `json:"unsei"` } -// Draw a omikuji -func Draw(t time.Time) (int, string) { +// Hiku a omikuji +func Hiku(t time.Time) (int, string) { if shogatsu(t) { return 0, "大吉" @@ -32,7 +32,7 @@ func Draw(t time.Time) (int, string) { case 1: unsei = "凶" default: - return Draw(t) + return Hiku(t) } return me, unsei } @@ -50,7 +50,7 @@ func shogatsu(t time.Time) bool { // Handler provides Omikuji Handler func Handler(w http.ResponseWriter, r *http.Request) { - me, unsei := Draw(time.Now()) + me, unsei := Hiku(time.Now()) o := &Omikuji{Me: me, Unsei: unsei} w.Header().Set("Content-Type", "application/json; charset=utf-8")