From 2572f398c67002243265be21ff49b50ab027442f Mon Sep 17 00:00:00 2001 From: en-ken Date: Wed, 7 Aug 2019 00:56:21 +0900 Subject: [PATCH 1/8] feat: add typing core module. --- kadai3/en-ken/typing/typing.go | 33 +++++++++++++++++++++ kadai3/en-ken/typing/typing_test.go | 46 +++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 kadai3/en-ken/typing/typing.go create mode 100644 kadai3/en-ken/typing/typing_test.go diff --git a/kadai3/en-ken/typing/typing.go b/kadai3/en-ken/typing/typing.go new file mode 100644 index 0000000..d1286ae --- /dev/null +++ b/kadai3/en-ken/typing/typing.go @@ -0,0 +1,33 @@ +package typing + +import ( + "math/rand" + "time" +) + +// Typing is the class to judge input +type Typing struct { + dict []string + nextText string +} + +// NewTyping is a constructor +func NewTyping(textDict []string) *Typing { + rand.Seed(time.Now().UnixNano()) + + return &Typing{ + dict: textDict, + } +} + +// GetNextText returns next text +func (t *Typing) GetNextText() string { + i := rand.Int() % len(t.dict) + t.nextText = t.dict[i] + return t.nextText +} + +// IsCorrect judges if input is correct or not. +func (t *Typing) IsCorrect(inputText string) bool { + return t.nextText == inputText +} diff --git a/kadai3/en-ken/typing/typing_test.go b/kadai3/en-ken/typing/typing_test.go new file mode 100644 index 0000000..74ba928 --- /dev/null +++ b/kadai3/en-ken/typing/typing_test.go @@ -0,0 +1,46 @@ +package typing_test + +import ( + "testing" + + "github.com/gopherdojo/dojo6/kadai3/en-ken/typing" +) + +var dict = []string{"ABC", "DEF", "GHI", "JKL", "MNO", "PQR", "STU", "VWX", "YZ"} + +func contains(s string) bool { + for _, v := range dict { + if v == s { + return true + } + } + return false +} + +func TestTypingCanGetNextText(t *testing.T) { + typ := typing.NewTyping(dict) + for i := 0; i < 100; i++ { + txt := typ.GetNextText() + if !contains(txt) { + t.Errorf("actual: %v\n", txt) + } + } +} + +func TestTypingIsCorrect(t *testing.T) { + typ := typing.NewTyping(dict) + txt := typ.GetNextText() + + if !typ.IsCorrect(txt) { + t.Errorf("IsCorrect() must be true") + } +} + +func TestTypingIsCorrectFailed(t *testing.T) { + typ := typing.NewTyping(dict) + typ.GetNextText() + + if typ.IsCorrect("YZZ") { + t.Errorf("IsCorrect() must be false") + } +} From 1268fb52f569ceae18a2df85ccad117029835a3d Mon Sep 17 00:00:00 2001 From: en-ken Date: Wed, 7 Aug 2019 00:56:56 +0900 Subject: [PATCH 2/8] feat: add typing game controller. --- kadai3/en-ken/kadai3/main.go | 63 ++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 kadai3/en-ken/kadai3/main.go diff --git a/kadai3/en-ken/kadai3/main.go b/kadai3/en-ken/kadai3/main.go new file mode 100644 index 0000000..e6af27d --- /dev/null +++ b/kadai3/en-ken/kadai3/main.go @@ -0,0 +1,63 @@ +package main + +import ( + "bufio" + "fmt" + "io" + "os" + "time" + + "github.com/gopherdojo/dojo6/kadai3/en-ken/typing" +) + +func main() { + const timeoutSec = 10 + textDict := []string{"foo", "bar", "baz", "qux"} + t := typing.NewTyping(textDict) + + chInput := inputRoutine(os.Stdin) + chFinish := time.After(time.Duration(timeoutSec) * time.Second) + + execute(chInput, chFinish, os.Stdout, t) +} + +// Typing is interface to typing.Typing +type Typing interface { + GetNextText() string + IsCorrect(input string) bool +} + +func execute(chInput <-chan string, chFinish <-chan time.Time, stdout *os.File, t Typing) { + + score := 0 + for i := 1; ; i++ { + fmt.Fprintf(stdout, "[%03d]: %v\n", i, t.GetNextText()) + fmt.Fprint(stdout, "type>>") + select { + case text := <-chInput: + if t.IsCorrect(text) { + score++ + fmt.Fprintln(stdout, "Correct!") + } else { + fmt.Fprintln(stdout, "Correct!") + } + case <-chFinish: + fmt.Fprintln(stdout, "\nTime's up!!") + fmt.Fprintf(stdout, "You Scored: %v\n", score) + return + } + } +} + +func inputRoutine(r io.Reader) <-chan string { + ch := make(chan string) + + go func() { + s := bufio.NewScanner(r) + for s.Scan() { + ch <- s.Text() + } + }() + + return ch +} From 74735d5c1ba8246a7c8e3bcc07789e04d4f21c90 Mon Sep 17 00:00:00 2001 From: en-ken Date: Wed, 7 Aug 2019 00:58:12 +0900 Subject: [PATCH 3/8] docs: add readme --- kadai3/en-ken/readme.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 kadai3/en-ken/readme.md diff --git a/kadai3/en-ken/readme.md b/kadai3/en-ken/readme.md new file mode 100644 index 0000000..4b498da --- /dev/null +++ b/kadai3/en-ken/readme.md @@ -0,0 +1,14 @@ +# 課題3 + +## タイピングゲームを作ろう + +- [x] 標準出力に英単語を出す(出すものは自由) +- [x] 標準入力から1行受け取る +- [x] 制限時間内に何問解けたか表示する + +## 使い方 + +```go +go get github.com/gopherdojo/dojo6/kadai3/en-ken/kadai3 +kadai3 +``` From 8be4d7d4c7cfd61927a869b3b77b09a26c36361e Mon Sep 17 00:00:00 2001 From: en-ken Date: Wed, 7 Aug 2019 00:58:48 +0900 Subject: [PATCH 4/8] chore: add go.mod --- go.mod | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 go.mod diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..43a600d --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/gopherdojo/dojo6 + +go 1.12 From 8a63697234856f1ae4511ecbd35100e1008dbead Mon Sep 17 00:00:00 2001 From: en-ken Date: Wed, 7 Aug 2019 11:07:14 +0900 Subject: [PATCH 5/8] fix: fixed displayed message. --- kadai3/en-ken/kadai3/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kadai3/en-ken/kadai3/main.go b/kadai3/en-ken/kadai3/main.go index e6af27d..2552278 100644 --- a/kadai3/en-ken/kadai3/main.go +++ b/kadai3/en-ken/kadai3/main.go @@ -27,7 +27,7 @@ type Typing interface { IsCorrect(input string) bool } -func execute(chInput <-chan string, chFinish <-chan time.Time, stdout *os.File, t Typing) { +func execute(chInput <-chan string, chFinish <-chan time.Time, stdout io.Writer, t Typing) { score := 0 for i := 1; ; i++ { @@ -39,7 +39,7 @@ func execute(chInput <-chan string, chFinish <-chan time.Time, stdout *os.File, score++ fmt.Fprintln(stdout, "Correct!") } else { - fmt.Fprintln(stdout, "Correct!") + fmt.Fprintln(stdout, "Miss!") } case <-chFinish: fmt.Fprintln(stdout, "\nTime's up!!") From beb5c4f58001da29b64241e03709612066ef79b9 Mon Sep 17 00:00:00 2001 From: en-ken Date: Wed, 7 Aug 2019 11:07:58 +0900 Subject: [PATCH 6/8] test: add test for main module. --- kadai3/en-ken/kadai3/export_test.go | 5 ++ kadai3/en-ken/kadai3/main_mock_test.go | 44 +++++++++++++++ kadai3/en-ken/kadai3/main_test.go | 77 ++++++++++++++++++++++++++ 3 files changed, 126 insertions(+) create mode 100644 kadai3/en-ken/kadai3/export_test.go create mode 100644 kadai3/en-ken/kadai3/main_mock_test.go create mode 100644 kadai3/en-ken/kadai3/main_test.go diff --git a/kadai3/en-ken/kadai3/export_test.go b/kadai3/en-ken/kadai3/export_test.go new file mode 100644 index 0000000..45d8f27 --- /dev/null +++ b/kadai3/en-ken/kadai3/export_test.go @@ -0,0 +1,5 @@ +package main + +var Execute = execute + +var InputRoutine = inputRoutine diff --git a/kadai3/en-ken/kadai3/main_mock_test.go b/kadai3/en-ken/kadai3/main_mock_test.go new file mode 100644 index 0000000..c515828 --- /dev/null +++ b/kadai3/en-ken/kadai3/main_mock_test.go @@ -0,0 +1,44 @@ +package main_test + +import ( + "io" +) + +//Stdin +type StdinMock struct { + i int + input []string +} + +func (stdin *StdinMock) Read(p []byte) (n int, err error) { + if stdin.i >= len(stdin.input) { + return 0, io.EOF + } + b := []byte(stdin.input[stdin.i] + "\n") //Scanが回るようにLF追加 + copy(p, b) + stdin.i++ + return len(b), nil +} + +//Stdout +type StdoutMock struct { + output []string +} + +func (stdout *StdoutMock) Write(p []byte) (n int, err error) { + str := string(p) + stdout.output = append(stdout.output, str) + return len(str), nil +} + +//Typing +type TypingMock struct { +} + +func (typ *TypingMock) GetNextText() string { + return "FOO" +} + +func (typ *TypingMock) IsCorrect(input string) bool { + return "FOO" == input +} diff --git a/kadai3/en-ken/kadai3/main_test.go b/kadai3/en-ken/kadai3/main_test.go new file mode 100644 index 0000000..6d7efab --- /dev/null +++ b/kadai3/en-ken/kadai3/main_test.go @@ -0,0 +1,77 @@ +package main_test + +import ( + "bytes" + "testing" + "time" + + main "github.com/gopherdojo/dojo6/kadai3/en-ken/kadai3" +) + +func TestInputRoutine(t *testing.T) { + input := []string{"foo", "bar", "baz", "qux"} + stdin := &StdinMock{ + i: 0, + input: input, + } + + ch := main.InputRoutine(stdin) + + for _, expected := range input { + actual := <-ch + if actual != expected { + t.Errorf("expected:%v, actual:%v", expected, actual) + } + } +} + +func TestExecute(t *testing.T) { + chInput := make(chan string, 3) + chFinish := make(chan time.Time, 1) + + scenario := []struct { + inputText string + time time.Time + }{ + { + inputText: "FOO", + }, + { + inputText: "BAR", + }, + { + inputText: "FOO", + }, + { + time: time.Now(), + }, + } + + buf := bytes.NewBufferString("") + typ := &TypingMock{} + + go func() { + for _, s := range scenario { + time.Sleep(100 * time.Millisecond) //DASAI + if s.inputText != "" { + chInput <- s.inputText + } + if !s.time.IsZero() { + chFinish <- s.time + } + } + }() + main.Execute(chInput, chFinish, buf, typ) + + expected := []byte("" + + "[001]: FOO\n" + "type>>" + "Correct!\n" + + "[002]: FOO\n" + "type>>" + "Miss!\n" + + "[003]: FOO\n" + "type>>" + "Correct!\n" + + "[004]: FOO\n" + "type>>" + + "\nTime's up!!\n" + + "You Scored: 2\n") + + if bytes.Compare(buf.Bytes(), expected) != 0 { + t.Errorf("[expected]:\n%s\n[actual]:\n%s", expected, buf.Bytes()) + } +} From 9bcf1de24a63d876c9e4ad66509100acc0eac0db Mon Sep 17 00:00:00 2001 From: en-ken Date: Wed, 7 Aug 2019 11:10:30 +0900 Subject: [PATCH 7/8] refactor: restructured packages. --- kadai3/en-ken/kadai3/main.go | 2 +- kadai3/en-ken/{typing => }/typing.go | 0 kadai3/en-ken/{typing => }/typing_test.go | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename kadai3/en-ken/{typing => }/typing.go (100%) rename kadai3/en-ken/{typing => }/typing_test.go (93%) diff --git a/kadai3/en-ken/kadai3/main.go b/kadai3/en-ken/kadai3/main.go index 2552278..29865b2 100644 --- a/kadai3/en-ken/kadai3/main.go +++ b/kadai3/en-ken/kadai3/main.go @@ -7,7 +7,7 @@ import ( "os" "time" - "github.com/gopherdojo/dojo6/kadai3/en-ken/typing" + typing "github.com/gopherdojo/dojo6/kadai3/en-ken" ) func main() { diff --git a/kadai3/en-ken/typing/typing.go b/kadai3/en-ken/typing.go similarity index 100% rename from kadai3/en-ken/typing/typing.go rename to kadai3/en-ken/typing.go diff --git a/kadai3/en-ken/typing/typing_test.go b/kadai3/en-ken/typing_test.go similarity index 93% rename from kadai3/en-ken/typing/typing_test.go rename to kadai3/en-ken/typing_test.go index 74ba928..39237a6 100644 --- a/kadai3/en-ken/typing/typing_test.go +++ b/kadai3/en-ken/typing_test.go @@ -3,7 +3,7 @@ package typing_test import ( "testing" - "github.com/gopherdojo/dojo6/kadai3/en-ken/typing" + typing "github.com/gopherdojo/dojo6/kadai3/en-ken" ) var dict = []string{"ABC", "DEF", "GHI", "JKL", "MNO", "PQR", "STU", "VWX", "YZ"} From 91875ba96dbe97082cbef06da5874016c35f36f9 Mon Sep 17 00:00:00 2001 From: en-ken Date: Wed, 7 Aug 2019 11:20:56 +0900 Subject: [PATCH 8/8] chore: deleted extra go.mod --- go.mod | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 go.mod diff --git a/go.mod b/go.mod deleted file mode 100644 index 43a600d..0000000 --- a/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/gopherdojo/dojo6 - -go 1.12