diff --git a/kadai2/happylifetaka/README.md b/kadai2/happylifetaka/README.md
new file mode 100644
index 0000000..c72f2f5
--- /dev/null
+++ b/kadai2/happylifetaka/README.md
@@ -0,0 +1,17 @@
+# 画像変換器
+
+指定したディレクトリ配下全ての画像ファイルを別の画像形式に変換するツールです。
+画像形式は入力ファイル、出力ファイルともに、「jpg,png,gif」に対応しています。
+
+## 使い方
+usage:imgconv [option -f] [option -t] targetFilePath
+-f 入力(対象)ファイルの画像形式「jpg,png,gif」が指定できます。省略時はjpgが使用されます。
+-t 出力ファイルの画像形式「jpg,png,gif」が指定できます。省略時はpngが使用されます。
+入力ファイルの画像形式と出力ファイルの画像形式が同じ場合はエラーとなります。
+
+## 実行例
+```
+$ go run imgconv.go target/file/path
+$ go run imgconv.go -f png -t gif target/file/path
+$ go run imgconv.go -f jpg -t png target/file/path
+```
diff --git a/kadai2/happylifetaka/cover/cover.html b/kadai2/happylifetaka/cover/cover.html
new file mode 100644
index 0000000..7724988
--- /dev/null
+++ b/kadai2/happylifetaka/cover/cover.html
@@ -0,0 +1,246 @@
+
+
+
+
+
+
+
package imgconv
+
+import (
+ "errors"
+ "image"
+ "image/gif"
+ "image/jpeg"
+ "image/png"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+// ImgConverter 画像変換器。「SetConvertFormat」メソッドでフォーマットを指定して、「Convert」メソッドで変換処理を行います。
+// Image converter. Specify the format with the "SetConvertFormat" method and convert it with the "Convert" method.
+type ImgConverter struct {
+ fromFormat string
+ toFormat string
+ setFormat bool
+}
+
+type singleImgConverter struct {
+ fromFilePath string
+ toFilePath string
+ toFormat string
+}
+
+// Result 「Msg」には変換元ファイルパスと変換先ファイルパスを記すメッセージが格納されています。
+// 「Err」には変換時エラーがあった場合、エラーメッセージが格納されています。
+// "Msg" contains messages describing the conversion source file path and conversion destination file path.
+// "Err" contains an error message if there is an error at conversion.
+type Result struct {
+ Msg string
+ Err error
+}
+
+// SetConvertFormat 変換元画像フォーマットと変換後画像フォーマットを指定します。
+// Specify the source image format and the converted image format.
+func (ic *ImgConverter) SetConvertFormat(fromFormat string, toFormat string) error {
+ ic.setFormat = false
+ if fromFormat == toFormat {
+ return errors.New("The same value must not be specified for fromFormat and toFormat")
+ }
+ if fromFormat != "jpg" && fromFormat != "png" && fromFormat != "gif" {
+ return errors.New("fromFormat value of A is incorrect.allow value jpg png gif")
+ }
+ if toFormat != "jpg" && toFormat != "png" && toFormat != "gif" {
+ return errors.New("toFormat value of A is incorrect.allow value jpg png gif")
+ }
+ ic.fromFormat = fromFormat
+ ic.toFormat = toFormat
+ ic.setFormat = true
+ return nil
+
+}
+
+// Convert 「dir」で指定したディレクトリ配下全ての「fromFormat」の画像形式に一致する画像ファイルを「toFormat」の画像形式に変換します。
+// Convert all images under the specified directory.
+// Target the file with the argument "fromFormat".
+// Convert to "toFormat" image format.
+func (ic *ImgConverter) Convert(dir string) ([]Result, error) {
+ rs := []Result{}
+ if ic.setFormat != true {
+ return rs, errors.New("not set format")
+ }
+ if _, err := os.Stat(dir); err != nil {
+ return rs, errors.New("target file path is not exist")
+ }
+
+ err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ return err
+ }
+ if !info.IsDir() {
+ fileExt := filepath.Ext(info.Name())
+ newFileName := strings.TrimSuffix(path, fileExt)
+ if isTargetFile(ic.fromFormat, fileExt) {
+ var sic singleImgConverter
+ sic.fromFilePath = path
+ sic.toFilePath = newFileName + "." + ic.toFormat
+ sic.toFormat = ic.toFormat
+ errConv := sic.convertTo()
+ if errConv != nil {
+ rs = append(rs, Result{Msg: path + " -> " + newFileName + "." + ic.toFormat, Err: errConv})
+ } else {
+ rs = append(rs, Result{Msg: path + " -> " + newFileName + "." + ic.toFormat, Err: nil})
+ }
+ }
+ }
+ return nil
+ })
+ return rs, err
+}
+
+// isTargetFile 「fileExt」が指定した画像形式「fromFormat」に一致する拡張子か調べます。
+// Determines whether "fileExt" matches the specified image format "fromFormat" extension.
+func isTargetFile(fromFormat string, fileExt string) bool {
+ if fromFormat == "jpg" && (fileExt == ".jpg" || fileExt == ".jpeg") {
+ return true
+ }
+ if fromFormat == "gif" && fileExt == ".gif" {
+ return true
+ }
+ if fromFormat == "png" && fileExt == ".png" {
+ return true
+ }
+ return false
+}
+
+// convertTo 「fromFilePath」のファイルを「toFormat」の画像形式に変換し、「toFilePath」のファイルとして保存します。
+// Convert "fromFilePath" file to "toFormat" image format and save it as "toFilePath" file.
+func (sic *singleImgConverter) convertTo() error {
+ file, err := os.Open(sic.fromFilePath)
+ if err != nil {
+ return errors.New("input file open error")
+ }
+ defer file.Close()
+
+ img, _, err := image.Decode(file)
+ if err != nil {
+ return errors.New("input file decode error")
+ }
+
+ out, err := os.Create(sic.toFilePath)
+ if err != nil {
+ return errors.New("output file create error")
+ }
+ defer out.Close()
+
+ var errEnc error
+ if sic.toFormat == "jpg" {
+ opts := &jpeg.Options{Quality: 80}
+ errEnc = jpeg.Encode(out, img, opts)
+ } else if sic.toFormat == "png" {
+ errEnc = png.Encode(out, img)
+ } else if sic.toFormat == "gif" {
+ opts := &gif.Options{NumColors: 256}
+ errEnc = gif.Encode(out, img, opts)
+ }
+ if errEnc != nil {
+ return errors.New("input file encode error")
+ }
+ return nil
+}
+
+
+
+
+
+
diff --git a/kadai2/happylifetaka/cover/cover.out b/kadai2/happylifetaka/cover/cover.out
new file mode 100644
index 0000000..0d77d9a
--- /dev/null
+++ b/kadai2/happylifetaka/cover/cover.out
@@ -0,0 +1,44 @@
+mode: set
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:39.84,41.28 2 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:44.2,44.71 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:47.2,47.65 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:50.2,53.12 4 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:41.28,43.3 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:44.71,46.3 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:47.65,49.3 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:61.63,63.26 2 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:66.2,66.40 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:70.2,70.81 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:92.2,92.16 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:63.26,65.3 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:66.40,68.3 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:70.81,71.17 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:74.3,74.20 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:90.3,90.13 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:71.17,73.4 1 0
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:74.20,77.44 3 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:77.44,83.23 6 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:83.23,85.6 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:85.11,87.6 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:97.59,98.70 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:101.2,101.46 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:104.2,104.46 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:107.2,107.14 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:98.70,100.3 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:101.46,103.3 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:104.46,106.3 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:112.50,114.16 2 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:117.2,120.16 3 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:124.2,125.16 2 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:128.2,131.27 3 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:140.2,140.19 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:143.2,143.12 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:114.16,116.3 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:120.16,122.3 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:125.16,127.3 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:131.27,134.3 2 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:134.8,134.34 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:134.34,136.3 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:136.8,136.34 1 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:136.34,139.3 2 1
+github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv/imgconv.go:140.19,142.3 1 0
diff --git a/kadai2/happylifetaka/imgconv.go b/kadai2/happylifetaka/imgconv.go
new file mode 100644
index 0000000..8a8df6a
--- /dev/null
+++ b/kadai2/happylifetaka/imgconv.go
@@ -0,0 +1,53 @@
+package main
+
+import (
+ "flag"
+ "fmt"
+ "os"
+
+ "github.com/happylifetaka/dojo4/kadai2/happylifetaka/imgconv"
+)
+
+func main() {
+ fromFormat := flag.String("f", "jpg", "from image type.[jpg,gif,png]")
+ toFormat := flag.String("t", "png", "to image type.[jpg,gif,png]")
+ usageMsg := "usage:imgconv [option -f] [option -t] targetFilePath"
+ flag.Usage = func() {
+ fmt.Println(usageMsg)
+ flag.PrintDefaults()
+ os.Exit(0)
+ }
+ flag.Parse()
+
+ args := flag.Args()
+
+ if len(args) != 1 {
+ fmt.Println("parameter error.")
+ fmt.Println(usageMsg)
+ flag.PrintDefaults()
+ os.Exit(1)
+ }
+
+ var ic imgconv.ImgConverter
+
+ e := ic.SetConvertFormat(*fromFormat, *toFormat)
+
+ if e != nil {
+ fmt.Println(e)
+ fmt.Println(usageMsg)
+ flag.PrintDefaults()
+ os.Exit(1)
+ }
+
+ rs, err := ic.Convert(args[0])
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ for _, d := range rs {
+ fmt.Println(d.Msg)
+ if d.Err != nil {
+ fmt.Println(d.Err)
+ }
+ }
+}
diff --git a/kadai2/happylifetaka/imgconv/imgconv.go b/kadai2/happylifetaka/imgconv/imgconv.go
new file mode 100644
index 0000000..a5b72a5
--- /dev/null
+++ b/kadai2/happylifetaka/imgconv/imgconv.go
@@ -0,0 +1,144 @@
+package imgconv
+
+import (
+ "errors"
+ "image"
+ "image/gif"
+ "image/jpeg"
+ "image/png"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+// ImgConverter 画像変換器。「SetConvertFormat」メソッドでフォーマットを指定して、「Convert」メソッドで変換処理を行います。
+// Image converter. Specify the format with the "SetConvertFormat" method and convert it with the "Convert" method.
+type ImgConverter struct {
+ fromFormat string
+ toFormat string
+ setFormat bool
+}
+
+type singleImgConverter struct {
+ fromFilePath string
+ toFilePath string
+ toFormat string
+}
+
+// Result 「Msg」には変換元ファイルパスと変換先ファイルパスを記すメッセージが格納されています。
+// 「Err」には変換時エラーがあった場合、エラーメッセージが格納されています。
+// "Msg" contains messages describing the conversion source file path and conversion destination file path.
+// "Err" contains an error message if there is an error at conversion.
+type Result struct {
+ Msg string
+ Err error
+}
+
+// SetConvertFormat 変換元画像フォーマットと変換後画像フォーマットを指定します。
+// Specify the source image format and the converted image format.
+func (ic *ImgConverter) SetConvertFormat(fromFormat string, toFormat string) error {
+ ic.setFormat = false
+ if fromFormat == toFormat {
+ return errors.New("The same value must not be specified for fromFormat and toFormat")
+ }
+ if fromFormat != "jpg" && fromFormat != "png" && fromFormat != "gif" {
+ return errors.New("fromFormat value of A is incorrect.allow value jpg png gif")
+ }
+ if toFormat != "jpg" && toFormat != "png" && toFormat != "gif" {
+ return errors.New("toFormat value of A is incorrect.allow value jpg png gif")
+ }
+ ic.fromFormat = fromFormat
+ ic.toFormat = toFormat
+ ic.setFormat = true
+ return nil
+
+}
+
+// Convert 「dir」で指定したディレクトリ配下全ての「fromFormat」の画像形式に一致する画像ファイルを「toFormat」の画像形式に変換します。
+// Convert all images under the specified directory.
+// Target the file with the argument "fromFormat".
+// Convert to "toFormat" image format.
+func (ic *ImgConverter) Convert(dir string) ([]Result, error) {
+ rs := []Result{}
+ if ic.setFormat != true {
+ return rs, errors.New("not set format")
+ }
+ if _, err := os.Stat(dir); err != nil {
+ return rs, errors.New("target file path is not exist")
+ }
+
+ err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ return err
+ }
+ if !info.IsDir() {
+ fileExt := filepath.Ext(info.Name())
+ newFileName := strings.TrimSuffix(path, fileExt)
+ if isTargetFile(ic.fromFormat, fileExt) {
+ var sic singleImgConverter
+ sic.fromFilePath = path
+ sic.toFilePath = newFileName + "." + ic.toFormat
+ sic.toFormat = ic.toFormat
+ errConv := sic.convertTo()
+ if errConv != nil {
+ rs = append(rs, Result{Msg: path + " -> " + newFileName + "." + ic.toFormat, Err: errConv})
+ } else {
+ rs = append(rs, Result{Msg: path + " -> " + newFileName + "." + ic.toFormat, Err: nil})
+ }
+ }
+ }
+ return nil
+ })
+ return rs, err
+}
+
+// isTargetFile 「fileExt」が指定した画像形式「fromFormat」に一致する拡張子か調べます。
+// Determines whether "fileExt" matches the specified image format "fromFormat" extension.
+func isTargetFile(fromFormat string, fileExt string) bool {
+ if fromFormat == "jpg" && (fileExt == ".jpg" || fileExt == ".jpeg") {
+ return true
+ }
+ if fromFormat == "gif" && fileExt == ".gif" {
+ return true
+ }
+ if fromFormat == "png" && fileExt == ".png" {
+ return true
+ }
+ return false
+}
+
+// convertTo 「fromFilePath」のファイルを「toFormat」の画像形式に変換し、「toFilePath」のファイルとして保存します。
+// Convert "fromFilePath" file to "toFormat" image format and save it as "toFilePath" file.
+func (sic *singleImgConverter) convertTo() error {
+ file, err := os.Open(sic.fromFilePath)
+ if err != nil {
+ return errors.New("input file open error")
+ }
+ defer file.Close()
+
+ img, _, err := image.Decode(file)
+ if err != nil {
+ return errors.New("input file decode error")
+ }
+
+ out, err := os.Create(sic.toFilePath)
+ if err != nil {
+ return errors.New("output file create error")
+ }
+ defer out.Close()
+
+ var errEnc error
+ if sic.toFormat == "jpg" {
+ opts := &jpeg.Options{Quality: 80}
+ errEnc = jpeg.Encode(out, img, opts)
+ } else if sic.toFormat == "png" {
+ errEnc = png.Encode(out, img)
+ } else if sic.toFormat == "gif" {
+ opts := &gif.Options{NumColors: 256}
+ errEnc = gif.Encode(out, img, opts)
+ }
+ if errEnc != nil {
+ return errors.New("input file encode error")
+ }
+ return nil
+}
diff --git a/kadai2/happylifetaka/imgconv/imgconv_test.go b/kadai2/happylifetaka/imgconv/imgconv_test.go
new file mode 100644
index 0000000..9463817
--- /dev/null
+++ b/kadai2/happylifetaka/imgconv/imgconv_test.go
@@ -0,0 +1,174 @@
+package imgconv
+
+import (
+ "errors"
+ "fmt"
+ "testing"
+)
+
+func TestSetConvertFormat(t *testing.T) {
+ var ic ImgConverter
+
+ testCases := []struct {
+ fromFormat string
+ toFormat string
+ resutlErr bool
+ resultFromFormat string
+ resultToFormat string
+ resultSetFormat bool
+ }{
+ {fromFormat: "jpg", toFormat: "jpg", resutlErr: true, resultFromFormat: "", resultToFormat: "", resultSetFormat: false},
+ {fromFormat: "jpg", toFormat: "png", resutlErr: false, resultFromFormat: "jpg", resultToFormat: "png", resultSetFormat: true},
+ {fromFormat: "jpg", toFormat: "gif", resutlErr: false, resultFromFormat: "jpg", resultToFormat: "gif", resultSetFormat: true},
+
+ {fromFormat: "png", toFormat: "png", resutlErr: true, resultFromFormat: "", resultToFormat: "", resultSetFormat: false},
+ {fromFormat: "png", toFormat: "jpg", resutlErr: false, resultFromFormat: "png", resultToFormat: "jpg", resultSetFormat: true},
+ {fromFormat: "png", toFormat: "gif", resutlErr: false, resultFromFormat: "png", resultToFormat: "gif", resultSetFormat: true},
+
+ {fromFormat: "gif", toFormat: "gif", resutlErr: true, resultFromFormat: "", resultToFormat: "", resultSetFormat: false},
+ {fromFormat: "gif", toFormat: "png", resutlErr: false, resultFromFormat: "gif", resultToFormat: "png", resultSetFormat: true},
+ {fromFormat: "gif", toFormat: "jpg", resutlErr: false, resultFromFormat: "gif", resultToFormat: "jpg", resultSetFormat: true},
+
+ {fromFormat: "hoge", toFormat: "jpg", resutlErr: true, resultFromFormat: "gif", resultToFormat: "jpg", resultSetFormat: false},
+ {fromFormat: "gif", toFormat: "fuga", resutlErr: true, resultFromFormat: "gif", resultToFormat: "jpg", resultSetFormat: false},
+ }
+ for _, c := range testCases {
+ err := ic.SetConvertFormat(c.fromFormat, c.toFormat)
+
+ if err == nil {
+ if c.resutlErr {
+ t.Fatal("fromFormat:" + c.fromFormat + " toFormat:" + c.toFormat + " err")
+ }
+ if c.fromFormat != c.resultFromFormat {
+ t.Fatal("fromFormat:" + c.fromFormat + " toFormat:" + c.toFormat + " resultFromFormat err")
+ }
+ if c.toFormat != c.resultToFormat {
+ t.Fatal("fromFormat:" + c.fromFormat + " toFormat:" + c.toFormat + " resultToFormat err")
+ }
+ if c.resultSetFormat == false {
+ t.Fatal("fromFormat:" + c.fromFormat + " toFormat:" + c.toFormat + " resultSetFormat err")
+ }
+ } else {
+ if c.resutlErr == false {
+ t.Fatal("fromFormat:" + c.fromFormat + " toFormat:" + c.toFormat + " err")
+ }
+ if c.resultSetFormat == true {
+ t.Fatal("fromFormat:" + c.fromFormat + " toFormat:" + c.toFormat + " resultSetFormat err")
+ }
+ }
+
+ }
+}
+
+func TestConvert(t *testing.T) {
+ var ic ImgConverter
+
+ testCases := []struct {
+ fromFormat string
+ toFormat string
+ path string
+ err error
+ result []Result
+ }{
+ {fromFormat: "jpg", toFormat: "png", path: "../test_data/jpg/dir1", err: nil,
+ result: []Result{{Msg: "../test_data/jpg/dir1/dir_test1.jpg -> ../test_data/jpg/dir1/dir_test1.png", Err: nil}}},
+ {fromFormat: "jpg", toFormat: "gif", path: "../test_data/jpg/dir1", err: nil,
+ result: []Result{{Msg: "../test_data/jpg/dir1/dir_test1.jpg -> ../test_data/jpg/dir1/dir_test1.gif", Err: nil}}},
+
+ {fromFormat: "png", toFormat: "jpg", path: "../test_data/png/dir1", err: nil,
+ result: []Result{{Msg: "../test_data/png/dir1/dir_test1.png -> ../test_data/png/dir1/dir_test1.jpg", Err: nil}}},
+ {fromFormat: "png", toFormat: "gif", path: "../test_data/png/dir1", err: nil,
+ result: []Result{{Msg: "../test_data/png/dir1/dir_test1.png -> ../test_data/png/dir1/dir_test1.gif", Err: nil}}},
+
+ {fromFormat: "gif", toFormat: "png", path: "../test_data/gif/dir1", err: nil,
+ result: []Result{{Msg: "../test_data/gif/dir1/dir_test1.gif -> ../test_data/gif/dir1/dir_test1.png", Err: nil}}},
+ {fromFormat: "gif", toFormat: "jpg", path: "../test_data/gif/dir1", err: nil,
+ result: []Result{{Msg: "../test_data/gif/dir1/dir_test1.gif -> ../test_data/gif/dir1/dir_test1.jpg", Err: nil}}},
+
+ {fromFormat: "gif", toFormat: "gif", path: "../test_data/gif/dir1", err: errors.New("not set format"),
+ result: []Result{{Msg: "../test_data/gif/dir1/dir_test1.gif -> ../test_data/gif/dir1/dir_test1.jpg", Err: nil}}},
+
+ {fromFormat: "jpg", toFormat: "png", path: "hoge", err: errors.New("target file path is not exist"),
+ result: []Result{{Msg: "../test_data/jpg/dir1/dir_test1.jpg -> ../test_data/jpg/dir1/dir_test1.png", Err: nil}}},
+
+ {fromFormat: "jpg", toFormat: "png", path: "../test_data/jpg/dir3", err: nil,
+ result: []Result{{Msg: "../test_data/jpg/dir3/dummy.jpg -> ../test_data/jpg/dir3/dummy.png", Err: errors.New("input file decode error")}}},
+ }
+
+ for _, c := range testCases {
+ ic.SetConvertFormat(c.fromFormat, c.toFormat)
+ rs, err := ic.Convert(c.path)
+
+ if err != nil && fmt.Sprintf("%s", err) != fmt.Sprintf("%s", c.err) {
+ fmt.Println(err)
+ t.Fatal("fromFormat:" + c.fromFormat + " toFormat:" + c.toFormat + " path:" + c.path + "err")
+ }
+
+ i := 0
+ for _, d := range rs {
+ if c.result[i].Msg != d.Msg {
+ t.Fatal("fromFormat:" + c.fromFormat + " toFormat:" + c.toFormat + " path:" + c.path + " result Msg err")
+ }
+ if d.Err != nil && fmt.Sprintf("%s", c.result[i].Err) != fmt.Sprintf("%s", d.Err) {
+ t.Fatal("fromFormat:" + c.fromFormat + " toFormat:" + c.toFormat + " path:" + c.path + " result err")
+ }
+ i++
+ }
+ }
+
+}
+func TestIsTargetFile(t *testing.T) {
+ testCases := []struct {
+ fromFormat string
+ fileExt string
+ result bool
+ }{
+ {fromFormat: "jpg", fileExt: ".jpg", result: true},
+ {fromFormat: "jpg", fileExt: ".jpeg", result: true},
+ {fromFormat: "jpg", fileExt: ".png", result: false},
+
+ {fromFormat: "gif", fileExt: ".gif", result: true},
+ {fromFormat: "gif", fileExt: ".jpg", result: false},
+ {fromFormat: "gif", fileExt: ".png", result: false},
+
+ {fromFormat: "png", fileExt: ".png", result: true},
+ {fromFormat: "png", fileExt: ".jpg", result: false},
+ {fromFormat: "png", fileExt: ".gif", result: false},
+ }
+
+ for _, c := range testCases {
+ if isTargetFile(c.fromFormat, c.fileExt) != c.result {
+ t.Fatal("fromFormat:" + c.fromFormat + " fileExt:" + c.fileExt + " failed test")
+ }
+ }
+}
+
+func TestConvertTo(t *testing.T) {
+ var sic singleImgConverter
+ testCases := []struct {
+ fromFilePath string
+ toFilePath string
+ toFormat string
+ err error
+ }{
+ {fromFilePath: "../test_data/jpg/dir1/dir_test1.jpg", toFilePath: "../test_data/jpg/dir1/dir_test1.png", toFormat: "png", err: nil},
+ {fromFilePath: "../test_data/jpg/dir1/dir_test1.jpg", toFilePath: "../test_data/jpg/dir1/dir_test1.gif", toFormat: "gif", err: nil},
+ {fromFilePath: "../test_data/jpg/dir1/dir_test1.png", toFilePath: "../test_data/jpg/dir1/dir_test1.jpg", toFormat: "jpg", err: nil},
+ {fromFilePath: "../test_data/jpg/dir1/dir_test1.png", toFilePath: "../test_data/jpg/dir1/dir_test1.gif", toFormat: "gif", err: nil},
+ {fromFilePath: "../test_data/jpg/dir1/dir_test1.gif", toFilePath: "../test_data/jpg/dir1/dir_test1.png", toFormat: "png", err: nil},
+ {fromFilePath: "../test_data/jpg/dir1/dir_test1.gif", toFilePath: "../test_data/jpg/dir1/dir_test1.jpg", toFormat: "jpg", err: nil},
+ {fromFilePath: "hoge.gif", toFilePath: "hoge.jpg", toFormat: "jpg", err: errors.New("input file open error")},
+ {fromFilePath: "../test_data/jpg/dummy.txt", toFilePath: "../test_data/jpg/dir1/dir_test1.png", toFormat: "png", err: errors.New("input file decode error")},
+ {fromFilePath: "../test_data/jpg/dir1/dir_test1.jpg", toFilePath: "", toFormat: "png", err: errors.New("output file create error")},
+ }
+
+ for _, c := range testCases {
+ sic.fromFilePath = c.fromFilePath
+ sic.toFilePath = c.toFilePath
+ sic.toFormat = c.toFormat
+ err := sic.convertTo()
+ if err != nil && fmt.Sprintf("%s", err) != fmt.Sprintf("%s", c.err) {
+ t.Fatal("fromFilePath: " + c.fromFilePath + " toFilePath: " + c.toFilePath + "err")
+ }
+ }
+}
diff --git a/kadai2/happylifetaka/test_data/gif/dir1/dir_test1.gif b/kadai2/happylifetaka/test_data/gif/dir1/dir_test1.gif
new file mode 100644
index 0000000..18a0a57
Binary files /dev/null and b/kadai2/happylifetaka/test_data/gif/dir1/dir_test1.gif differ
diff --git a/kadai2/happylifetaka/test_data/gif/dir2/dir_test2.gif b/kadai2/happylifetaka/test_data/gif/dir2/dir_test2.gif
new file mode 100644
index 0000000..18a0a57
Binary files /dev/null and b/kadai2/happylifetaka/test_data/gif/dir2/dir_test2.gif differ
diff --git a/kadai2/happylifetaka/test_data/gif/dummy.txt b/kadai2/happylifetaka/test_data/gif/dummy.txt
new file mode 100644
index 0000000..2995a4d
--- /dev/null
+++ b/kadai2/happylifetaka/test_data/gif/dummy.txt
@@ -0,0 +1 @@
+dummy
\ No newline at end of file
diff --git a/kadai2/happylifetaka/test_data/gif/not_image.gif b/kadai2/happylifetaka/test_data/gif/not_image.gif
new file mode 100644
index 0000000..2995a4d
--- /dev/null
+++ b/kadai2/happylifetaka/test_data/gif/not_image.gif
@@ -0,0 +1 @@
+dummy
\ No newline at end of file
diff --git a/kadai2/happylifetaka/test_data/gif/test.gif b/kadai2/happylifetaka/test_data/gif/test.gif
new file mode 100644
index 0000000..18a0a57
Binary files /dev/null and b/kadai2/happylifetaka/test_data/gif/test.gif differ
diff --git a/kadai2/happylifetaka/test_data/jpg/dir1/dir_test1.jpg b/kadai2/happylifetaka/test_data/jpg/dir1/dir_test1.jpg
new file mode 100644
index 0000000..a62a296
Binary files /dev/null and b/kadai2/happylifetaka/test_data/jpg/dir1/dir_test1.jpg differ
diff --git a/kadai2/happylifetaka/test_data/jpg/dir1/dir_test1.png b/kadai2/happylifetaka/test_data/jpg/dir1/dir_test1.png
new file mode 100644
index 0000000..f2bec94
Binary files /dev/null and b/kadai2/happylifetaka/test_data/jpg/dir1/dir_test1.png differ
diff --git a/kadai2/happylifetaka/test_data/jpg/dir2/dir_test2.jpg b/kadai2/happylifetaka/test_data/jpg/dir2/dir_test2.jpg
new file mode 100644
index 0000000..7b392e7
Binary files /dev/null and b/kadai2/happylifetaka/test_data/jpg/dir2/dir_test2.jpg differ
diff --git a/kadai2/happylifetaka/test_data/jpg/dir2/dir_test2.png b/kadai2/happylifetaka/test_data/jpg/dir2/dir_test2.png
new file mode 100644
index 0000000..3320550
Binary files /dev/null and b/kadai2/happylifetaka/test_data/jpg/dir2/dir_test2.png differ
diff --git a/kadai2/happylifetaka/test_data/jpg/dir3/dummy.jpg b/kadai2/happylifetaka/test_data/jpg/dir3/dummy.jpg
new file mode 100644
index 0000000..2995a4d
--- /dev/null
+++ b/kadai2/happylifetaka/test_data/jpg/dir3/dummy.jpg
@@ -0,0 +1 @@
+dummy
\ No newline at end of file
diff --git a/kadai2/happylifetaka/test_data/jpg/dummy.txt b/kadai2/happylifetaka/test_data/jpg/dummy.txt
new file mode 100644
index 0000000..2995a4d
--- /dev/null
+++ b/kadai2/happylifetaka/test_data/jpg/dummy.txt
@@ -0,0 +1 @@
+dummy
\ No newline at end of file
diff --git a/kadai2/happylifetaka/test_data/jpg/not_image.jpg b/kadai2/happylifetaka/test_data/jpg/not_image.jpg
new file mode 100644
index 0000000..2995a4d
--- /dev/null
+++ b/kadai2/happylifetaka/test_data/jpg/not_image.jpg
@@ -0,0 +1 @@
+dummy
\ No newline at end of file
diff --git a/kadai2/happylifetaka/test_data/jpg/test.jpg b/kadai2/happylifetaka/test_data/jpg/test.jpg
new file mode 100644
index 0000000..7b392e7
Binary files /dev/null and b/kadai2/happylifetaka/test_data/jpg/test.jpg differ
diff --git a/kadai2/happylifetaka/test_data/jpg/test.png b/kadai2/happylifetaka/test_data/jpg/test.png
new file mode 100644
index 0000000..3320550
Binary files /dev/null and b/kadai2/happylifetaka/test_data/jpg/test.png differ
diff --git a/kadai2/happylifetaka/test_data/png/dir1/dir_test1.png b/kadai2/happylifetaka/test_data/png/dir1/dir_test1.png
new file mode 100644
index 0000000..3320550
Binary files /dev/null and b/kadai2/happylifetaka/test_data/png/dir1/dir_test1.png differ
diff --git a/kadai2/happylifetaka/test_data/png/dir2/dir_test2.png b/kadai2/happylifetaka/test_data/png/dir2/dir_test2.png
new file mode 100644
index 0000000..3320550
Binary files /dev/null and b/kadai2/happylifetaka/test_data/png/dir2/dir_test2.png differ
diff --git a/kadai2/happylifetaka/test_data/png/dummy.txt b/kadai2/happylifetaka/test_data/png/dummy.txt
new file mode 100644
index 0000000..2995a4d
--- /dev/null
+++ b/kadai2/happylifetaka/test_data/png/dummy.txt
@@ -0,0 +1 @@
+dummy
\ No newline at end of file
diff --git a/kadai2/happylifetaka/test_data/png/not_image.png b/kadai2/happylifetaka/test_data/png/not_image.png
new file mode 100644
index 0000000..2995a4d
--- /dev/null
+++ b/kadai2/happylifetaka/test_data/png/not_image.png
@@ -0,0 +1 @@
+dummy
\ No newline at end of file
diff --git a/kadai2/happylifetaka/test_data/png/test.png b/kadai2/happylifetaka/test_data/png/test.png
new file mode 100644
index 0000000..3320550
Binary files /dev/null and b/kadai2/happylifetaka/test_data/png/test.png differ