diff --git a/kadai3-1/pei/Makefile b/kadai3-1/pei/Makefile new file mode 100644 index 0000000..dfd5492 --- /dev/null +++ b/kadai3-1/pei/Makefile @@ -0,0 +1,17 @@ +ROOT=github.com/gopherdojo/dojo6/kadai3-1/pei +BIN=typing +MAIN=main.go +TEST=... + +.PHONY: build +build: ${MAIN} + go build -o ${BIN} ${GOPATH}/src/${ROOT}/$? + +.PHONY: test +test: + go test -v -cover ${ROOT}/${TEST} + +.PHONY: clean +clean: + rm ${BIN} + go clean diff --git a/kadai3-1/pei/README.md b/kadai3-1/pei/README.md new file mode 100644 index 0000000..7d5f11d --- /dev/null +++ b/kadai3-1/pei/README.md @@ -0,0 +1,33 @@ +# typing + +## Build + +``` +$ make build +``` + +## Usage + +``` +$ ./typing +``` + +## Development + +### Build + +``` +$ make build +``` + +### Test + +``` +$ make test +``` + +### Clean + +``` +$ make clean +``` diff --git a/kadai3-1/pei/main.go b/kadai3-1/pei/main.go new file mode 100644 index 0000000..bb1531e --- /dev/null +++ b/kadai3-1/pei/main.go @@ -0,0 +1,52 @@ +package main + +import ( + "fmt" + "os" + "time" + + "github.com/gopherdojo/dojo6/kadai3-1/pei/pkg/typing" + "github.com/gopherdojo/dojo6/kadai3-1/pei/pkg/wordsreader" +) + +const ( + ExitCodeOK = 0 + ExitCodeError = 1 +) + +func main() { + os.Exit(execute()) +} + +func execute() int { + fmt.Println("Start Typing Game!") + + wr := &wordsreader.WordsReader{FileName: "./textdata/words.txt"} + words, err := wr.Read() + if err != nil { + fmt.Errorf("%v", err) + return ExitCodeError + } + + typingCh := typing.Question(words) + timerCh := time.After(5 * time.Second) + + var ( + counter int + correctCounter int + ) + + for { + counter++ + select { + case isCorrect := <-typingCh: + if isCorrect { + correctCounter++ + } + case <-timerCh: + fmt.Printf("\nScore: %d/%d \n", correctCounter, counter) + fmt.Println("End Typing Game!") + return ExitCodeOK + } + } +} diff --git a/kadai3-1/pei/pkg/typing/typing.go b/kadai3-1/pei/pkg/typing/typing.go new file mode 100644 index 0000000..fc2451f --- /dev/null +++ b/kadai3-1/pei/pkg/typing/typing.go @@ -0,0 +1,41 @@ +package typing + +import ( + "bufio" + "fmt" + "math/rand" + "os" + "time" +) + +// Question receives words and returns isCorrectCh +func Question(words []string) <-chan bool { + isCorrectCh := make(chan bool) + + go func() { + stdin := bufio.NewScanner(os.Stdin) + rand.Seed(time.Now().UnixNano()) + + defer close(isCorrectCh) + for { + word := words[rand.Intn(len(words))] + fmt.Println(word) + + stdin.Scan() + answer := stdin.Text() + + if err := stdin.Err(); err != nil { + fmt.Fprintln(os.Stderr, err) + isCorrectCh <- false + } + + if word == answer { + isCorrectCh <- true + } else { + isCorrectCh <- false + } + } + }() + + return isCorrectCh +} diff --git a/kadai3-1/pei/pkg/wordsreader/testdata/test1.txt b/kadai3-1/pei/pkg/wordsreader/testdata/test1.txt new file mode 100644 index 0000000..de98044 --- /dev/null +++ b/kadai3-1/pei/pkg/wordsreader/testdata/test1.txt @@ -0,0 +1,3 @@ +a +b +c diff --git a/kadai3-1/pei/pkg/wordsreader/testdata/test2.txt b/kadai3-1/pei/pkg/wordsreader/testdata/test2.txt new file mode 100644 index 0000000..7898192 --- /dev/null +++ b/kadai3-1/pei/pkg/wordsreader/testdata/test2.txt @@ -0,0 +1 @@ +a diff --git a/kadai3-1/pei/pkg/wordsreader/wordsreader.go b/kadai3-1/pei/pkg/wordsreader/wordsreader.go new file mode 100644 index 0000000..a5d8124 --- /dev/null +++ b/kadai3-1/pei/pkg/wordsreader/wordsreader.go @@ -0,0 +1,33 @@ +package wordsreader + +import ( + "bufio" + "os" +) + +// WordsReader has FileName +type WordsReader struct { + FileName string +} + +// Read file +func (wr WordsReader) Read() ([]string, error) { + var words []string + + fp, err := os.Open(wr.FileName) + if err != nil { + return nil, err + } + defer fp.Close() + + scanner := bufio.NewScanner(fp) + for scanner.Scan() { + words = append(words, scanner.Text()) + } + + if err := scanner.Err(); err != nil { + return nil, err + } + + return words, nil +} diff --git a/kadai3-1/pei/pkg/wordsreader/wordsreader_test.go b/kadai3-1/pei/pkg/wordsreader/wordsreader_test.go new file mode 100644 index 0000000..15463fd --- /dev/null +++ b/kadai3-1/pei/pkg/wordsreader/wordsreader_test.go @@ -0,0 +1,32 @@ +package wordsreader + +import ( + "reflect" + "testing" +) + +func TestWordsReader_Read(t *testing.T) { + cases := []struct { + fileName string + expected []string + }{ + {fileName: "./testdata/test1.txt", expected: []string{"a", "b", "c"}}, + {fileName: "./testdata/test2.txt", expected: []string{"a"}}, + } + + for _, c := range cases { + c := c + t.Run(c.fileName, func(t *testing.T) { + t.Parallel() + + actual, err := WordsReader{FileName: c.fileName}.Read() + if err != nil { + t.Errorf("failed to open file") + } + + if !reflect.DeepEqual(c.expected, actual) { + t.Errorf("want %v, got %v", c.expected, actual) + } + }) + } +} diff --git a/kadai3-1/pei/textdata/words.txt b/kadai3-1/pei/textdata/words.txt new file mode 100644 index 0000000..59efafc --- /dev/null +++ b/kadai3-1/pei/textdata/words.txt @@ -0,0 +1,40 @@ +fix +add +remove +use +update +support +merge +make +move +don't +check +change +allow +clean +set +convert +rename +do +revert +avoid +new +unused +static +empty +old +small +initial +local +wrong +common +other +dead +rid +possible +unneeded +same +global +invalid +specific +extra