diff --git a/.idea/dojo5.iml b/.idea/dojo5.iml
new file mode 100644
index 0000000..25ed3f6
--- /dev/null
+++ b/.idea/dojo5.iml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..15a15b2
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..28a804d
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..338ef9a
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000..7e052ff
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,452 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1559607753469
+
+
+ 1559607753469
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..42da8f2
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,3 @@
+module github.com/takafk9/dojo5
+
+go 1.12
diff --git a/kadai1/.idea/encodings.xml b/kadai1/.idea/encodings.xml
new file mode 100644
index 0000000..15a15b2
--- /dev/null
+++ b/kadai1/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/kadai1/.idea/kadai1.iml b/kadai1/.idea/kadai1.iml
new file mode 100644
index 0000000..25ed3f6
--- /dev/null
+++ b/kadai1/.idea/kadai1.iml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kadai1/.idea/misc.xml b/kadai1/.idea/misc.xml
new file mode 100644
index 0000000..28a804d
--- /dev/null
+++ b/kadai1/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kadai1/.idea/modules.xml b/kadai1/.idea/modules.xml
new file mode 100644
index 0000000..5652c5f
--- /dev/null
+++ b/kadai1/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kadai1/.idea/vcs.xml b/kadai1/.idea/vcs.xml
new file mode 100644
index 0000000..6c0b863
--- /dev/null
+++ b/kadai1/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kadai1/.idea/workspace.xml b/kadai1/.idea/workspace.xml
new file mode 100644
index 0000000..b36e5c1
--- /dev/null
+++ b/kadai1/.idea/workspace.xml
@@ -0,0 +1,330 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1559719680252
+
+
+ 1559719680252
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ direct
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kadai1/takafk9/.go-version b/kadai1/takafk9/.go-version
new file mode 100644
index 0000000..89c881b
--- /dev/null
+++ b/kadai1/takafk9/.go-version
@@ -0,0 +1 @@
+1.12.4
diff --git a/kadai1/takafk9/.idea/encodings.xml b/kadai1/takafk9/.idea/encodings.xml
new file mode 100644
index 0000000..15a15b2
--- /dev/null
+++ b/kadai1/takafk9/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/kadai1/takafk9/.idea/misc.xml b/kadai1/takafk9/.idea/misc.xml
new file mode 100644
index 0000000..28a804d
--- /dev/null
+++ b/kadai1/takafk9/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kadai1/takafk9/.idea/modules.xml b/kadai1/takafk9/.idea/modules.xml
new file mode 100644
index 0000000..c888e02
--- /dev/null
+++ b/kadai1/takafk9/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kadai1/takafk9/.idea/takafk9.iml b/kadai1/takafk9/.idea/takafk9.iml
new file mode 100644
index 0000000..d6ebd48
--- /dev/null
+++ b/kadai1/takafk9/.idea/takafk9.iml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kadai1/takafk9/.idea/vcs.xml b/kadai1/takafk9/.idea/vcs.xml
new file mode 100644
index 0000000..b2bdec2
--- /dev/null
+++ b/kadai1/takafk9/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kadai1/takafk9/.idea/workspace.xml b/kadai1/takafk9/.idea/workspace.xml
new file mode 100644
index 0000000..d7ac86b
--- /dev/null
+++ b/kadai1/takafk9/.idea/workspace.xml
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1559607176225
+
+
+ 1559607176225
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kadai1/takafk9/cmd/convert-img-cli/.go-version b/kadai1/takafk9/cmd/convert-img-cli/.go-version
new file mode 100644
index 0000000..89c881b
--- /dev/null
+++ b/kadai1/takafk9/cmd/convert-img-cli/.go-version
@@ -0,0 +1 @@
+1.12.4
diff --git a/kadai1/takafk9/cmd/convert-img-cli/cli.go b/kadai1/takafk9/cmd/convert-img-cli/cli.go
new file mode 100644
index 0000000..1856647
--- /dev/null
+++ b/kadai1/takafk9/cmd/convert-img-cli/cli.go
@@ -0,0 +1,107 @@
+package main
+
+import (
+ "flag"
+ "fmt"
+ "github.com/takafk9/dojo5/kadai1/takafk9/converter"
+ "io"
+)
+
+const (
+ ExitCodeOK = iota
+ ExitCodeExpectedError
+ ExitCodeUnexpectedError
+ ExitCodeInvalidArgsError
+ ExitCodeParseFlagsError
+ ExitCodeInvalidFlagError
+)
+
+var usage = `Usage: convert-img-cli [options...] PATH
+
+converter-cli is a command line tool to convert image extension
+
+OPTIONS:
+ --from value, -f value specifies a image extension converted from (default: .jpg)
+ --to value, -t value specifies a image extension converted to (default: .png)
+ --help, -h prints out help
+`
+
+const Name = "convert-img-cli"
+
+var exts = [4]string{".gif", ".jpeg", ".jpg", ".png"}
+
+type CLI struct {
+ outStream, errStream io.Writer
+}
+
+func (cli *CLI) Run(args []string) int {
+ var from string
+ var to string
+
+ flags := flag.NewFlagSet(Name, flag.ContinueOnError)
+ flags.Usage = func() {
+ fmt.Fprint(cli.outStream, usage)
+ }
+
+ flags.StringVar(&from, "from", ".jpg", "")
+ flags.StringVar(&from, "f", ".jpg", "")
+
+ flags.StringVar(&to, "to", ".png", "")
+ flags.StringVar(&to, "t", ".png", "")
+
+ if err := flags.Parse(args[1:]); err != nil {
+ return ExitCodeParseFlagsError
+ }
+
+ if !validateExt(from) {
+ fmt.Fprintf(cli.errStream, "Failed to set up convert-img-cli: invalid extension `%s` is given for --from flag\n"+
+ "Please choose an extension from one of those: %v\n\n", from, exts)
+ return ExitCodeInvalidFlagError
+ }
+
+ if !validateExt(to) {
+ fmt.Fprintf(cli.errStream, "Failed to set up convert-img-cli: invalid extension `%s` is given for --to flag\n"+
+ "Please choose an extension from one of those: %v\n\n", to, exts)
+ return ExitCodeInvalidFlagError
+ }
+
+ path := flags.Args()
+ if len(path) != 1 {
+ fmt.Fprintf(cli.errStream, "Failed to set up convert-img-cli: invalid argument\n"+
+ "Please specify the exact one path to a directly or a file\n\n")
+ return ExitCodeInvalidArgsError
+ }
+
+ files, err := converter.Convert(from, to, path[0])
+ if err != nil {
+ if _, ok := err.(converter.Managed); ok {
+ fmt.Fprintf(cli.errStream, "Failed to execute convert-img-cli\n"+
+ "%s\n\n", err)
+ return ExitCodeExpectedError
+ }
+ fmt.Fprintf(cli.errStream, `conver-img-cli failed because of the following error.
+
+%s
+
+You might encounter a bug with converter-cli, so please report it to https://github.com/xxx/xxxx
+
+`, err)
+
+ return ExitCodeUnexpectedError
+ }
+
+ fmt.Fprintf(cli.outStream, "convert-img-cli successfully converted following files to `%s`.\n", to)
+ fmt.Fprintf(cli.outStream, "%s\n\n", files)
+ return ExitCodeOK
+
+}
+
+func validateExt(ext string) bool {
+ for _, e := range exts {
+ if ext == e {
+ return true
+ }
+
+ }
+ return false
+}
diff --git a/kadai1/takafk9/cmd/convert-img-cli/cli_test.go b/kadai1/takafk9/cmd/convert-img-cli/cli_test.go
new file mode 100644
index 0000000..1498ad4
--- /dev/null
+++ b/kadai1/takafk9/cmd/convert-img-cli/cli_test.go
@@ -0,0 +1,102 @@
+package main
+
+import (
+ "bytes"
+ "os"
+ "path/filepath"
+ "strings"
+ "testing"
+)
+
+func TestCLI(t *testing.T) {
+ cases := []struct {
+ command string
+ expectedOutStream string
+ expectedErrStream string
+ expectedExitCode int
+ }{
+ {
+ command: "convert-img-cli",
+ expectedOutStream: "",
+ expectedErrStream: "Failed to set up convert-img-cli: invalid argument\nPlease specify the exact one path to a directly or a file\n\n",
+ expectedExitCode: ExitCodeInvalidArgsError,
+ },
+ {
+ command: "convert-img-cli testdata testdata2",
+ expectedOutStream: "",
+ expectedErrStream: "Failed to set up convert-img-cli: invalid argument\nPlease specify the exact one path to a directly or a file\n\n",
+ expectedExitCode: ExitCodeInvalidArgsError,
+ },
+ {
+ command: "convert-img-cli --from .svg",
+ expectedOutStream: "",
+ expectedErrStream: "Failed to set up convert-img-cli: invalid extension `.svg` is given for --from flag\nPlease choose an extension from one of those: [.gif .jpeg .jpg .png]\n\n",
+ expectedExitCode: ExitCodeInvalidFlagError,
+ },
+ {
+ command: "convert-img-cli --to .svg",
+ expectedOutStream: "",
+ expectedErrStream: "Failed to set up convert-img-cli: invalid extension `.svg` is given for --to flag\nPlease choose an extension from one of those: [.gif .jpeg .jpg .png]\n\n",
+ expectedExitCode: ExitCodeInvalidFlagError,
+ },
+ {
+ command: "convert-img-cli testdata",
+ expectedOutStream: "",
+ expectedErrStream: "Failed to execute convert-img-cli\ncould not find files with the specified extension. path: testdata, extension: .jpg\n\n",
+ expectedExitCode: ExitCodeExpectedError,
+ },
+ {
+ command: "convert-img-cli testdata/unknown.jpg",
+ expectedOutStream: "",
+ expectedErrStream: "Failed to execute convert-img-cli\nlstat testdata/unknown.jpg: no such file or directory\n\n",
+ expectedExitCode: ExitCodeExpectedError,
+ },
+ {
+ command: "convert-img-cli --from .jpeg testdata",
+ expectedOutStream: "convert-img-cli successfully converted following files to `.png`.\n[testdata/jpeg-image.jpeg]\n\n",
+ expectedErrStream: "",
+ expectedExitCode: ExitCodeOK,
+ },
+ }
+
+ for i, ca := range cases {
+ outStream := &bytes.Buffer{}
+ errStream := &bytes.Buffer{}
+
+ cli := CLI{outStream: outStream, errStream: errStream}
+ args := strings.Split(ca.command, " ")
+
+ if got := cli.Run(args); got != ca.expectedExitCode {
+ t.Errorf("#%d %q exits with %d, want %d", i, ca.command, got, ca.expectedExitCode)
+ }
+
+ if got := outStream.String(); got != ca.expectedOutStream {
+ t.Errorf("#%d Unexpected outStream has returned: want: %s, got: %s", i, ca.expectedOutStream, got)
+ }
+
+ if got := errStream.String(); got != ca.expectedErrStream {
+ t.Errorf("#%d Unexpected errStream has returned: want: %s, got: %s", i, ca.expectedErrStream, got)
+ }
+
+ remove(t)
+ }
+
+}
+
+func remove(t *testing.T) {
+ t.Helper()
+
+ err := filepath.Walk("testdata", func(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ return err
+ }
+ if path != "testdata/jpeg-image.jpeg" && path != "testdata" {
+ return os.Remove(path)
+ }
+ return nil
+ })
+
+ if err != nil {
+ t.Errorf("failed to cleanup testdata: %s", err)
+ }
+}
diff --git a/kadai1/takafk9/cmd/convert-img-cli/main.go b/kadai1/takafk9/cmd/convert-img-cli/main.go
new file mode 100644
index 0000000..e3b9d88
--- /dev/null
+++ b/kadai1/takafk9/cmd/convert-img-cli/main.go
@@ -0,0 +1,10 @@
+package main
+
+import "os"
+
+func main() {
+ cli := &CLI{
+ outStream: os.Stdout, errStream: os.Stderr,
+ }
+ os.Exit(cli.Run(os.Args))
+}
diff --git a/kadai1/takafk9/cmd/convert-img-cli/testdata/jpeg-image.jpeg b/kadai1/takafk9/cmd/convert-img-cli/testdata/jpeg-image.jpeg
new file mode 100644
index 0000000..2da5e0d
Binary files /dev/null and b/kadai1/takafk9/cmd/convert-img-cli/testdata/jpeg-image.jpeg differ
diff --git a/kadai1/takafk9/converter/converter.go b/kadai1/takafk9/converter/converter.go
new file mode 100644
index 0000000..bf8e481
--- /dev/null
+++ b/kadai1/takafk9/converter/converter.go
@@ -0,0 +1,117 @@
+package converter
+
+import (
+ "fmt"
+ "image"
+ "image/gif"
+ "image/jpeg"
+ "image/png"
+ "os"
+ "path/filepath"
+)
+
+// Managed interface represents the error is properly managed and expected
+type Managed interface {
+ Managed() bool
+}
+
+type ManagedError struct {
+ Message string
+}
+
+func (m *ManagedError) Error() string {
+ return m.Message
+}
+
+func (m *ManagedError) Managed()bool{
+ return true
+}
+
+func new()Managed{
+ return &ManagedError{
+ "hoge",
+ }
+}
+
+func Convert(from, to, path string) ([]string, error) {
+ filePaths, err := findFilePaths(from, path)
+ if err != nil {
+ return nil, err
+ }
+
+ for _, filePath := range filePaths {
+ if err := convertImg(to, filePath); err != nil {
+ return nil, err
+ }
+ }
+
+ return filePaths, nil
+}
+
+func findFilePaths(from, path string) ([]string, error) {
+ var filePaths []string
+
+ err := filepath.Walk(path, func(path string, info os.FileInfo, err error) error {
+ if _, ok := err.(*os.PathError); ok {
+ return &ManagedError{err.Error()}
+ }
+
+ if err != nil {
+ return err
+ }
+
+ if filepath.Ext(path) == from {
+ filePaths = append(filePaths, path)
+ }
+
+ return nil
+ })
+
+ if err != nil {
+ return nil, err
+ }
+
+ if len(filePaths) == 0 {
+ return nil, &ManagedError{fmt.Sprintf("could not find files with the specified extension. path: %s, extension: %s", path, from)}
+ }
+
+ return filePaths, nil
+
+}
+
+func convertImg(to, filePath string) error {
+ file, err := os.Open(filePath)
+ defer file.Close()
+
+ if err != nil {
+ return err
+ }
+
+ img, _, err := image.Decode(file)
+
+ if err != nil {
+ return err
+ }
+
+ out, err := os.Create(makeFilePath(to, filePath))
+
+ if err != nil {
+ return err
+ }
+
+ switch to {
+ case ".gif":
+ return gif.Encode(out, img, nil)
+ case ".jpeg", ".jpg":
+ return jpeg.Encode(out, img, nil)
+ case ".png":
+ return png.Encode(out, img)
+ default:
+ return fmt.Errorf("unsupported extension is specified: %s", to)
+ }
+}
+
+func makeFilePath(to, filePath string) string {
+ ext := filepath.Ext(filePath)
+ return filePath[:len(filePath)-len(ext)] + to
+}
diff --git a/kadai1/takafk9/converter/converter_test.go b/kadai1/takafk9/converter/converter_test.go
new file mode 100644
index 0000000..c681a87
--- /dev/null
+++ b/kadai1/takafk9/converter/converter_test.go
@@ -0,0 +1,149 @@
+package converter
+
+import (
+ "os"
+ "path/filepath"
+ "testing"
+)
+
+var defaultFile = []string{
+ "testdata",
+ "testdata/empty",
+ "testdata/gif-image.gif",
+ "testdata/gif-image1.gif",
+ "testdata/jpeg-image.jpeg",
+ "testdata/jpeg-image1.jpeg",
+ "testdata/jpg-image.jpg",
+ "testdata/jpg-image1.jpg",
+ "testdata/png-image.png",
+ "testdata/png-image1.png",
+}
+
+func TestConvertImg(t *testing.T) {
+ t.Run("normal", func(t *testing.T) {
+ cases := []struct {
+ from string
+ to string
+ path string
+ expectedFiles []string
+ expectedOutputs []string
+ }{
+ {
+ from: ".jpeg",
+ to: ".png",
+ path: "./testdata",
+ expectedFiles: []string{"testdata/jpeg-image.jpeg", "testdata/jpeg-image1.jpeg"},
+ expectedOutputs: []string{"testdata/jpeg-image.png", "testdata/jpeg-image1.png"},
+ },
+ {
+ from: ".jpeg",
+ to: ".gif",
+ path: "./testdata",
+ expectedFiles: []string{"testdata/jpeg-image.jpeg", "testdata/jpeg-image1.jpeg"},
+ expectedOutputs: []string{"testdata/jpeg-image.gif", "testdata/jpeg-image1.gif"},
+ },
+ {
+ from: ".png",
+ to: ".jpeg",
+ path: "./testdata",
+ expectedFiles: []string{"testdata/png-image.png", "testdata/png-image1.png"},
+ expectedOutputs: []string{"testdata/png-image.jpeg", "testdata/png-image1.jpeg"},
+ },
+ {
+ from: ".gif",
+ to: ".jpeg",
+ path: "./testdata",
+ expectedFiles: []string{"testdata/gif-image.gif", "testdata/gif-image1.gif"},
+ expectedOutputs: []string{"testdata/gif-image.jpeg", "testdata/gif-image1.jpeg"},
+ },
+ }
+
+ for i, tc := range cases {
+ files, err := Convert(tc.from, tc.to, tc.path)
+
+ if err != nil {
+ t.Fatalf("#%d converter.Convert returned enexpected error: %s", i, err)
+ }
+
+ if got, want := len(files), len(tc.expectedFiles); got != want {
+ t.Errorf("#%d converter.Convert returnede unexpected number of files: want: %d, got: %d", i, want, got)
+ }
+
+ for _, file := range files {
+
+ ok := false
+ for _, expected := range tc.expectedFiles {
+ if file == expected {
+ ok = true
+ }
+ }
+
+ if !ok {
+ t.Errorf("#%d converter.Convert returned unexpected file: %s", i, file)
+ }
+ }
+
+ for _, expected := range tc.expectedOutputs {
+ if _, err := os.Stat(expected); err != nil {
+ t.Errorf("#%d converter.Convert did not output expected file: %s", i, expected)
+ }
+ }
+
+ remove(t)
+ }
+ })
+
+ t.Run("abnormal", func(t *testing.T) {
+ cases := []struct {
+ from string
+ to string
+ path string
+ managed bool
+ }{
+ {from: ".jpeg", to: ".png", path: "./unknown", managed: true},
+ {from: ".jpeg", to: ".png", path: "./testdata/empty", managed: true},
+ {from: ".svg", to: ".png", path: "./testdata", managed: true},
+ {from: ".jpeg", to: ".png", path: "./unknown.jpeg", managed: true},
+ }
+
+ for i, ca := range cases {
+ _, err := Convert(ca.from, ca.to, ca.path)
+
+ if err == nil {
+ t.Fatalf("#%d error is not supposed to be nil", i)
+ }
+
+ if _, ok := err.(Managed); ok != ca.managed {
+ t.Fatalf("#%d managed is suppoed to be %v. error: %s", i, ca.managed, err)
+ }
+ }
+
+ })
+}
+
+func remove(t *testing.T) {
+ t.Helper()
+
+ err := filepath.Walk("testdata", func(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ return err
+ }
+
+ deletable := true
+ for _, file := range defaultFile {
+ if path == file {
+ deletable = false
+ }
+ }
+
+ if deletable {
+ return os.Remove(path)
+ }
+
+ return nil
+ })
+
+ if err != nil {
+ t.Errorf("failed to cleanup testdata")
+ }
+}
diff --git a/kadai1/takafk9/converter/testdata/gif-image.gif b/kadai1/takafk9/converter/testdata/gif-image.gif
new file mode 100644
index 0000000..98a696e
Binary files /dev/null and b/kadai1/takafk9/converter/testdata/gif-image.gif differ
diff --git a/kadai1/takafk9/converter/testdata/gif-image1.gif b/kadai1/takafk9/converter/testdata/gif-image1.gif
new file mode 100644
index 0000000..98a696e
Binary files /dev/null and b/kadai1/takafk9/converter/testdata/gif-image1.gif differ
diff --git a/kadai1/takafk9/converter/testdata/jpeg-image.jpeg b/kadai1/takafk9/converter/testdata/jpeg-image.jpeg
new file mode 100644
index 0000000..2da5e0d
Binary files /dev/null and b/kadai1/takafk9/converter/testdata/jpeg-image.jpeg differ
diff --git a/kadai1/takafk9/converter/testdata/jpeg-image1.jpeg b/kadai1/takafk9/converter/testdata/jpeg-image1.jpeg
new file mode 100644
index 0000000..2da5e0d
Binary files /dev/null and b/kadai1/takafk9/converter/testdata/jpeg-image1.jpeg differ
diff --git a/kadai1/takafk9/converter/testdata/jpg-image.jpg b/kadai1/takafk9/converter/testdata/jpg-image.jpg
new file mode 100644
index 0000000..2da5e0d
Binary files /dev/null and b/kadai1/takafk9/converter/testdata/jpg-image.jpg differ
diff --git a/kadai1/takafk9/converter/testdata/jpg-image1.jpg b/kadai1/takafk9/converter/testdata/jpg-image1.jpg
new file mode 100644
index 0000000..2da5e0d
Binary files /dev/null and b/kadai1/takafk9/converter/testdata/jpg-image1.jpg differ
diff --git a/kadai1/takafk9/converter/testdata/png-image.png b/kadai1/takafk9/converter/testdata/png-image.png
new file mode 100644
index 0000000..5dc5b32
Binary files /dev/null and b/kadai1/takafk9/converter/testdata/png-image.png differ
diff --git a/kadai1/takafk9/converter/testdata/png-image1.png b/kadai1/takafk9/converter/testdata/png-image1.png
new file mode 100644
index 0000000..5dc5b32
Binary files /dev/null and b/kadai1/takafk9/converter/testdata/png-image1.png differ
diff --git a/kadai1/takafk9/go.mod b/kadai1/takafk9/go.mod
new file mode 100644
index 0000000..db791b9
--- /dev/null
+++ b/kadai1/takafk9/go.mod
@@ -0,0 +1,3 @@
+module github.com/takafk9/dojo5/kadai1/takafk9
+
+go 1.12