diff --git a/kadai1/simady/README.md b/kadai1/simady/README.md new file mode 100644 index 0000000..3e453cf --- /dev/null +++ b/kadai1/simady/README.md @@ -0,0 +1,12 @@ +## 概要 +指定ディレクトリ配下にある画像ファイルを、再帰的に走査して別の形式のファイルに変換します。png, jpeg, gifに対応しています。 + +## 実行方法 + +``` +go run main.go -in TARGET_PATH -src SOURCE_EXTENSION -dst DESTINATION_EXTENSION + +-in 走査したいディレクトリを指定します。 +-src 変換元のファイル形式を指定します。 +-dst 変換後のファイル形式を指定します。 +``` \ No newline at end of file diff --git a/kadai1/simady/converter/converter.go b/kadai1/simady/converter/converter.go new file mode 100644 index 0000000..c88b41c --- /dev/null +++ b/kadai1/simady/converter/converter.go @@ -0,0 +1,77 @@ +package converter + +import ( + "image" + "log" + "os" +) + +// IConverter コンバーターインターフェース +type IConverter interface { + convert(file *os.File, img image.Image) error + validate() bool +} + +type converter struct { + src, dst string +} + +var ( + convertibleExts = []string{"jpeg", "png", "gif"} +) + +// Validate フィールドのバリデーション処理を行う. +func (c converter) validate() bool { + return validate(c.src) && validate(c.dst) +} + +func validate(ext string) bool { + for _, e := range convertibleExts { + if ext == e { + return true + } + } + return false +} + +// Convert 画像フォーマットの変換を行う. +func Convert(path string, c IConverter, fileName string) error { + + src, err := os.Open(path) + if err != nil { + log.Fatalf("Faild to open file. err = %v\n", err) + } + defer src.Close() + + var img image.Image + img, _, err = image.Decode(src) + if err != nil { + log.Fatalf("Faild to decode file. err = %v\n", err) + } + + var dst *os.File + dst, err = os.Create(fileName) + if err != nil { + log.Fatalf("Faild to create file. err = %v\n", err) + } + defer dst.Close() + + return c.convert(dst, img) +} + +// GetConverter 拡張子に対応したコンバーターを取得する. +func GetConverter(src, dst string) IConverter { + c := converter{src: src, dst: dst} + c.validate() + switch dst { + case "png": + return pngConverter{c} + case "jpeg": + return jpegConverter{c} + case "gif": + return gifConverter{c} + default: + log.Fatalf("Unsupported extension. dst = %v\n", dst) + } + return nil +} diff --git a/kadai1/simady/converter/converter_test.go b/kadai1/simady/converter/converter_test.go new file mode 100644 index 0000000..d0cee0a --- /dev/null +++ b/kadai1/simady/converter/converter_test.go @@ -0,0 +1,67 @@ +package converter + +import ( + "testing" +) + +func TestGetConverter(t *testing.T) { + var c IConverter + c = GetConverter("jpeg", "png") + if _, ok := c.(pngConverter); !ok { + t.Fatal("c is not pngConverter.") + } + + c = GetConverter("png", "gif") + if _, ok := c.(gifConverter); !ok { + t.Fatal("c is not gifConverter.") + } + + c = GetConverter("gif", "jpeg") + if _, ok := c.(jpegConverter); !ok { + t.Fatal("c is not jpegConverter.") + } +} + +func TestValidate(t *testing.T) { + var src, dst string + + // 正常系 + src, dst = "jpeg", "png" + if !(converter{src: src, dst: dst}).validate() { + t.Fatalf("Expect src=%v dst=%v to be supported.\n", src, dst) + } + + src, dst = "png", "gif" + if !(converter{src: src, dst: dst}).validate() { + t.Fatalf("Expect src=%v dst=%v to be supported.\n", src, dst) + } + + src, dst = "gif", "jpeg" + if !(converter{src: src, dst: dst}).validate() { + t.Fatalf("Expect src=%v dst=%v to be supported.\n", src, dst) + } + + // 異常系 + src, dst = "png", "webp" + if (converter{src: src, dst: dst}).validate() { + t.Fatalf("src=%v dst=%v not supported.\n", src, dst) + } +} + +func TestConvert(t *testing.T) { + var path, fileName string + path, fileName = "../src/gopher.jpeg", "../dst/test/test.png" + if err := Convert(path, pngConverter{}, fileName); err != nil { + t.Fatal("Failed to convert.") + } + + path, fileName = "../src/gopher.png", "../dst/test/test.gif" + if err := Convert(path, gifConverter{}, fileName); err != nil { + t.Fatal("Failed to convert.") + } + + path, fileName = "../src/gopher.gif", "../dst/test/test.jpeg" + if err := Convert(path, jpegConverter{}, fileName); err != nil { + t.Fatal("Failed to convert.") + } +} diff --git a/kadai1/simady/converter/gif_conveter.go b/kadai1/simady/converter/gif_conveter.go new file mode 100644 index 0000000..ef64d04 --- /dev/null +++ b/kadai1/simady/converter/gif_conveter.go @@ -0,0 +1,16 @@ +package converter + +import ( + "image" + "image/gif" + "os" +) + +// gifConverter Gif用コンバーター +type gifConverter struct { + converter +} + +func (gc gifConverter) convert(file *os.File, img image.Image) error { + return gif.Encode(file, img, &gif.Options{NumColors: 256}) +} diff --git a/kadai1/simady/converter/jpeg_converter.go b/kadai1/simady/converter/jpeg_converter.go new file mode 100644 index 0000000..a3b405d --- /dev/null +++ b/kadai1/simady/converter/jpeg_converter.go @@ -0,0 +1,16 @@ +package converter + +import ( + "image" + "image/jpeg" + "os" +) + +// jpegConverter Jpeg用コンバーター +type jpegConverter struct { + converter +} + +func (jc jpegConverter) convert(file *os.File, img image.Image) error { + return jpeg.Encode(file, img, &jpeg.Options{Quality: 100}) +} diff --git a/kadai1/simady/converter/png_converter.go b/kadai1/simady/converter/png_converter.go new file mode 100644 index 0000000..467aec3 --- /dev/null +++ b/kadai1/simady/converter/png_converter.go @@ -0,0 +1,16 @@ +package converter + +import ( + "image" + "image/png" + "os" +) + +// pngConverter Png用コンバーター +type pngConverter struct { + converter +} + +func (pc pngConverter) convert(file *os.File, img image.Image) error { + return png.Encode(file, img) +} diff --git a/kadai1/simady/dst/gopher.gif b/kadai1/simady/dst/gopher.gif new file mode 100644 index 0000000..18a0a57 Binary files /dev/null and b/kadai1/simady/dst/gopher.gif differ diff --git a/kadai1/simady/dst/gopher.jpeg b/kadai1/simady/dst/gopher.jpeg new file mode 100644 index 0000000..92005e7 Binary files /dev/null and b/kadai1/simady/dst/gopher.jpeg differ diff --git a/kadai1/simady/dst/gopher.png b/kadai1/simady/dst/gopher.png new file mode 100644 index 0000000..094ef3c Binary files /dev/null and b/kadai1/simady/dst/gopher.png differ diff --git a/kadai1/simady/dst/test/test.gif b/kadai1/simady/dst/test/test.gif new file mode 100644 index 0000000..18a0a57 Binary files /dev/null and b/kadai1/simady/dst/test/test.gif differ diff --git a/kadai1/simady/dst/test/test.jpeg b/kadai1/simady/dst/test/test.jpeg new file mode 100644 index 0000000..92005e7 Binary files /dev/null and b/kadai1/simady/dst/test/test.jpeg differ diff --git a/kadai1/simady/dst/test/test.png b/kadai1/simady/dst/test/test.png new file mode 100644 index 0000000..3320550 Binary files /dev/null and b/kadai1/simady/dst/test/test.png differ diff --git a/kadai1/simady/go.mod b/kadai1/simady/go.mod new file mode 100644 index 0000000..c9993cd --- /dev/null +++ b/kadai1/simady/go.mod @@ -0,0 +1,3 @@ +module imgconv + +go 1.12 diff --git a/kadai1/simady/main.go b/kadai1/simady/main.go new file mode 100644 index 0000000..56a73b7 --- /dev/null +++ b/kadai1/simady/main.go @@ -0,0 +1,37 @@ +package main + +import ( + "flag" + "log" + "os" + "path/filepath" + "strings" + + "imgconv/converter" +) + +var ( + in, out, src, dst string +) + +func init() { + flag.StringVar(&in, "in", "", "target directory.") + flag.StringVar(&src, "src", "jpeg", "source extension. [jpeg,png]") + flag.StringVar(&dst, "dst", "png", "destination extension. [jpeg,png]") +} + +func main() { + flag.Parse() + c := converter.GetConverter(src, dst) + err := filepath.Walk(in, func(path string, info os.FileInfo, err error) error { + ext := filepath.Ext(path) + if ext != "."+src { + return nil + } + out = "dst/" + strings.ReplaceAll(filepath.Base(path), ext, "."+dst) + return converter.Convert(path, c, out) + }) + if err != nil { + log.Fatalf("Error occurred in convert process. err = %v\n", err) + } +} diff --git a/kadai1/simady/src/gopher.gif b/kadai1/simady/src/gopher.gif new file mode 100644 index 0000000..18a0a57 Binary files /dev/null and b/kadai1/simady/src/gopher.gif differ diff --git a/kadai1/simady/src/gopher.jpeg b/kadai1/simady/src/gopher.jpeg new file mode 100644 index 0000000..7b392e7 Binary files /dev/null and b/kadai1/simady/src/gopher.jpeg differ diff --git a/kadai1/simady/src/gopher.png b/kadai1/simady/src/gopher.png new file mode 100644 index 0000000..3320550 Binary files /dev/null and b/kadai1/simady/src/gopher.png differ diff --git a/kadai2/simady/README.md b/kadai2/simady/README.md new file mode 100644 index 0000000..95ba21a --- /dev/null +++ b/kadai2/simady/README.md @@ -0,0 +1,75 @@ +## 概要 +指定ディレクトリ配下にある画像ファイルを、再帰的に走査して別の形式のファイルに変換します。 +png, jpeg, gifに対応しています。 + +## 実行方法 + +``` +imgconv -in INPUT_PATH -out OUTPUT_PATH -src SOURCE_EXTENSION -dst DESTINATION_EXTENSION + +-in 走査したいディレクトリを指定します。 +-out 出力先のディレクトリを指定します。 +-src 変換元のファイル形式を指定します。 +-dst 変換後のファイル形式を指定します。 +``` + +## テストカバレッジ +``` +$ go test -cover imgconv/... +ok imgconv 0.434s coverage: 88.2% of statements +ok imgconv/converter 0.430s coverage: 100.0% of statements +``` + +### io.ReaderとioWriterについて +``` +type Reader interface { + Read(p []byte) (n int, err error) +} +``` +byte型のスライスを引数に取り、pに値を読み込む。 +読み込んだバイト数とエラーを返す。 + +``` +type Writer interface { + Write(p []byte) (n int, err error) +} +``` +byte型のスライスを引数に取り、pから値を書き込む。 +書き込んだバイト数とエラーを返す。 + +- 標準パッケージでどのように使われているか + - tarやzip等のアーカイブ形式 + - bzip2やlzw等の圧縮形式 + - ECDSAやtls等の暗号化形式 + - base64や16進数等のフォーマット + - gifやpng等の画像形式 + - 標準入出力や標準エラー出力 + - http通信でのリクレス等 + - MIMEマルチパートやQuoted-printable等の方式 + - ファイル + - 文字列やバイトバッファ + - ログ + +上記のように様々な箇所での読み書きに使用されていた。 +また、以下のようなerrorの戻り値を利用するような使い方も見られた。 +``` +type errorReader struct { + error +} +func (r errorReader) Read(p []byte) (n int, err error) { + return 0, r.error +} +``` + +``` +type eofReader struct{} +func (eofReader) Read([]byte) (int, error) { + return 0, EOF +} +``` + +- io.Readerとio.Writerがあることでどういう利点があるのか具体例を挙げて考えてみる + - io.Readerやio.Writerを実装したインスタンスをインターフェースを介して利用することで、使用する側は実体が何かを意識せずに扱うことができる。 + - シンプルなインターフェースなので実装が容易。何に対して読み書きを行うかは定義されていないので、入出力先に応じて適宜実装すれば良い。 + - テストやデバッグ時に、実際の処理とは別の処理に置き換えるといった差し替えが容易に行える。 + - ioパッケージのpipeやio/ioutilパッケージで定義された既存の便利メソッドを利用できる。 \ No newline at end of file diff --git a/kadai2/simady/converter/converter.go b/kadai2/simady/converter/converter.go new file mode 100644 index 0000000..359899c --- /dev/null +++ b/kadai2/simady/converter/converter.go @@ -0,0 +1,57 @@ +package converter + +import ( + "fmt" + "image" + "os" +) + +// IConverter コンバーターインターフェース +type IConverter interface { + Convert(path string, fileName string) error +} + +type converter struct { + Encoder +} + +type Encoder interface { + encode(file *os.File, img image.Image) error +} + +// NewConverter 拡張子に対応したコンバーターを生成する. +func NewConverter(dst string) (IConverter, error) { + switch dst { + case "png": + return converter{&pngEncoder{}}, nil + case "jpg": + return converter{&jpgEncoder{}}, nil + case "gif": + return converter{&gifEncoder{}}, nil + } + return nil, ImgconvError{Message: fmt.Sprintf("Unsupported extension. dst = %v\n", dst)} +} + +// Convert 画像フォーマットの変換を行う. +func (c converter) Convert(path string, fileName string) error { + src, err := os.Open(path) + if err != nil { + return err + } + defer src.Close() + + var img image.Image + img, _, err = image.Decode(src) + if err != nil { + return err + } + + var dst *os.File + dst, err = os.Create(fileName) + if err != nil { + return err + } + defer dst.Close() + + return c.encode(dst, img) +} diff --git a/kadai2/simady/converter/converter_test.go b/kadai2/simady/converter/converter_test.go new file mode 100644 index 0000000..4591185 --- /dev/null +++ b/kadai2/simady/converter/converter_test.go @@ -0,0 +1,168 @@ +package converter + +import ( + "reflect" + "testing" +) + +func TestNewConverter(t *testing.T) { + type args struct { + dst string + } + tests := []struct { + name string + args args + want IConverter + wantErr bool + }{ + { + name:"pngのコンバーターを生成", + args:args{ + dst:"png", + }, + want:converter{&pngEncoder{}}, + wantErr:false, + }, + { + name:"jpgのコンバーターを生成", + args:args{ + dst:"jpg", + }, + want:converter{&jpgEncoder{}}, + wantErr:false, + }, + { + name:"gifのコンバーターを生成", + args:args{ + dst:"gif", + }, + want:converter{&gifEncoder{}}, + wantErr:false, + }, + { + name:"サポート外のコンバーターを生成", + args:args{ + dst:"bmp", + }, + want:nil, + wantErr:true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := NewConverter(tt.args.dst) + if (err != nil) != tt.wantErr { + t.Errorf("NewConverter() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("NewConverter() = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_converter_Convert(t *testing.T) { + type fields struct { + Encoder Encoder + } + type args struct { + path string + fileName string + } + tests := []struct { + name string + fields fields + args args + wantErr bool + }{ + { + name:"pngからjpgの変換", + fields:fields{ + Encoder:&jpgEncoder{}, + }, + args:args{ + path:"../testdata/src/gopher.png", + fileName:"../testdata/dst/gopher.jpg", + }, + wantErr:false, + }, + { + name:"jpgからgifの変換", + fields:fields{ + Encoder:&gifEncoder{}, + }, + args:args{ + path:"../testdata/src/gopher.jpg", + fileName:"../testdata/dst/gopher.gif", + }, + wantErr:false, + }, + { + name:"gifからpngの変換", + fields:fields{ + Encoder:&pngEncoder{}, + }, + args:args{ + path:"../testdata/src/gopher.gif", + fileName:"../testdata/dst/gopher.png", + }, + wantErr:false, + }, + { + name:"存在しないファイルのパスを指定", + fields:fields{ + Encoder:&pngEncoder{}, + }, + args:args{ + path:"../testdata/src/gopher.bmp", + fileName:"../testdata/dst/gopher.png", + }, + wantErr:true, + }, + { + name:"画像ファイル以外を指定", + fields:fields{ + Encoder:&pngEncoder{}, + }, + args:args{ + path:"../testdata/src/dummy.txt", + fileName:"../testdata/dst/gopher.png", + }, + wantErr:true, + }, + { + name:"出力先に存在しないディレクトリを指定", + fields:fields{ + Encoder:&pngEncoder{}, + }, + args:args{ + path:"../testdata/src/gopher.gif", + fileName:"../testdata/dummy/gopher.png", + }, + wantErr:true, + }, + { + name:"出力先に存在しないディレクトリを指定", + fields:fields{ + Encoder:&pngEncoder{}, + }, + args:args{ + path:"../testdata/src/gopher.gif", + fileName:"../testdata/dst/gopher.jpg", + }, + wantErr:false, + }, + + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := converter{ + Encoder: tt.fields.Encoder, + } + if err := c.Convert(tt.args.path, tt.args.fileName); (err != nil) != tt.wantErr { + t.Errorf("converter.Convert() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/kadai2/simady/converter/error.go b/kadai2/simady/converter/error.go new file mode 100644 index 0000000..8d7f77e --- /dev/null +++ b/kadai2/simady/converter/error.go @@ -0,0 +1,11 @@ +package converter + +// 独自エラー定義 +type ImgconvError struct { + Message string +} + +// Error エラー出力 +func (e ImgconvError) Error() string { + return e.Message +} \ No newline at end of file diff --git a/kadai2/simady/converter/error_test.go b/kadai2/simady/converter/error_test.go new file mode 100644 index 0000000..b4e3c4e --- /dev/null +++ b/kadai2/simady/converter/error_test.go @@ -0,0 +1,32 @@ +package converter + +import "testing" + +func TestImgconvError_Error(t *testing.T) { + type fields struct { + message string + } + tests := []struct { + name string + fields fields + want string + }{ + { + name:"独自エラーの生成", + fields:fields{ + message:"error.", + }, + want:"error.", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + e := ImgconvError{ + Message: tt.fields.message, + } + if got := e.Error(); got != tt.want { + t.Errorf("ImgconvError.Error() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/kadai2/simady/converter/gif_encoder.go b/kadai2/simady/converter/gif_encoder.go new file mode 100644 index 0000000..773058b --- /dev/null +++ b/kadai2/simady/converter/gif_encoder.go @@ -0,0 +1,15 @@ +package converter + +import ( + "image" + "image/gif" + "os" +) + +// gifEncoder Gif用エンコーダー +type gifEncoder struct { +} + +func (*gifEncoder) encode(file *os.File, img image.Image) error { + return gif.Encode(file, img, &gif.Options{NumColors: 256}) +} diff --git a/kadai2/simady/converter/jpg_encoder.go b/kadai2/simady/converter/jpg_encoder.go new file mode 100644 index 0000000..bfec5b7 --- /dev/null +++ b/kadai2/simady/converter/jpg_encoder.go @@ -0,0 +1,15 @@ +package converter + +import ( + "image" + "image/jpeg" + "os" +) + +// jpgEncoder Jpeg用エンコーダー +type jpgEncoder struct { +} + +func (*jpgEncoder) encode(file *os.File, img image.Image) error { + return jpeg.Encode(file, img, &jpeg.Options{Quality: 100}) +} diff --git a/kadai2/simady/converter/png_encoder.go b/kadai2/simady/converter/png_encoder.go new file mode 100644 index 0000000..cb1f7bf --- /dev/null +++ b/kadai2/simady/converter/png_encoder.go @@ -0,0 +1,15 @@ +package converter + +import ( + "image" + "image/png" + "os" +) + +// pngEncoder Png用エンコーダー +type pngEncoder struct { +} + +func (*pngEncoder) encode(file *os.File, img image.Image) error { + return png.Encode(file, img) +} diff --git a/kadai2/simady/go.mod b/kadai2/simady/go.mod new file mode 100644 index 0000000..c9993cd --- /dev/null +++ b/kadai2/simady/go.mod @@ -0,0 +1,3 @@ +module imgconv + +go 1.12 diff --git a/kadai2/simady/main.go b/kadai2/simady/main.go new file mode 100644 index 0000000..ee5d094 --- /dev/null +++ b/kadai2/simady/main.go @@ -0,0 +1,77 @@ +package main + +import ( + "flag" + "log" + "os" + "path/filepath" + "strings" + + "imgconv/converter" +) + +var ( + convertibleExts = []string{"jpg", "png", "gif"} +) + +func main() { + in := flag.String("in", "./", "input directory.") + out := flag.String("out", "./", "output directory.") + src := flag.String("src", "jpg", "source extension. [jpg, png, gif]") + dst := flag.String("dst", "png", "destination extension. [jpg, png, gif]") + flag.Parse() + + if !isSupported(*src) || !isSupported(*dst) { + log.Fatalln("Unsupported extension.") + flag.PrintDefaults() + } + if err := imgConvMain(*in, *out, *src, *dst); err != nil { + log.Fatalf("Error occurred in convert process. err = %v\n", err) + } +} + +// imgConvMain メイン処理の実行. +func imgConvMain(in, out, src, dst string) error { + conversionTargetFiles, err := getConversionTargetFiles(in, src) + if err != nil { + return err + } + c, err := converter.NewConverter(dst) + if err != nil { + return err + } + + for _, file := range conversionTargetFiles { + ext := filepath.Ext(file) + out := out + "/" + strings.ReplaceAll(filepath.Base(file), ext, "."+dst) + if c.Convert(file, out) != nil { + return err + } + } + return nil +} + +// getConversionTargetFiles 変換対象のファイルを取得する. +func getConversionTargetFiles(dir, targetExt string) ([]string, error) { + var files []string + err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if filepath.Ext(path) == "."+targetExt { + files = append(files, path) + } + return nil + }) + return files, err +} + +// isSupported サポート対象の拡張子か判定する. +func isSupported(ext string) bool { + for _, e := range convertibleExts { + if ext == e { + return true + } + } + return false +} diff --git a/kadai2/simady/main_test.go b/kadai2/simady/main_test.go new file mode 100644 index 0000000..0f85081 --- /dev/null +++ b/kadai2/simady/main_test.go @@ -0,0 +1,207 @@ +package main + +import ( + "reflect" + "testing" +) + +func Test_getConversionTargetFiles(t *testing.T) { + type args struct { + dir string + targetExt string + } + tests := []struct { + name string + args args + want []string + wantErr bool + }{ + { + name: "単体ディレクトリの検索", + args: args{ + dir: "testdata/root/sub", + targetExt: "png", + }, + want: []string{ + "testdata/root/sub/sub_dummy.png", + }, + wantErr: false, + }, + { + name: "再帰的な検索", + args: args{ + dir: "testdata/root", + targetExt: "jpg", + }, + want: []string{ + "testdata/root/root_dummy.jpg", + "testdata/root/sub/sub_dummy.jpg", + }, + wantErr: false, + }, + { + name: "一致対象なしの検索", + args: args{ + dir: "testdata/root", + targetExt: "bmp", + }, + want: nil, + wantErr: false, + }, + { + name: "存在しないディレクトリの検索", + args: args{ + dir: "notexists", + targetExt: "png", + }, + want: nil, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := getConversionTargetFiles(tt.args.dir, tt.args.targetExt) + if (err != nil) != tt.wantErr { + t.Errorf("getConversionTargetFiles() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("getConversionTargetFiles() = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_isSupported(t *testing.T) { + type args struct { + ext string + } + tests := []struct { + name string + args args + want bool + }{ + { + name: "pngはサポート対象の拡張子", + args: args{ + ext: "png", + }, + want: true, + }, + { + name: "jpgはサポート対象の拡張子", + args: args{ + ext: "jpg", + }, + want: true, + }, + { + name: "gifはサポート対象の拡張子", + args: args{ + ext: "gif", + }, + want: true, + }, + { + name: "bmpはサポート対象外の拡張子", + args: args{ + ext: "bmp", + }, + want: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := isSupported(tt.args.ext); got != tt.want { + t.Errorf("isSupported() = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_main(t *testing.T) { + tests := []struct { + name string + }{ + { + name: "main関数の実行", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + main() + }) + } +} + +func Test_imgConvMain(t *testing.T) { + type args struct { + in string + out string + src string + dst string + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "pngからjpgに変換", + args: args{ + in: "./testdata/src", + out: "./testdata/dst", + src: "png", + dst: "jpg", + }, + wantErr: false, + }, + { + name: "jpgからgifに変換", + args: args{ + in: "./testdata/src", + out: "./testdata/dst", + src: "jpg", + dst: "gif", + }, + wantErr: false, + }, + { + name: "gifからpngに変換", + args: args{ + in: "./testdata/src", + out: "./testdata/dst", + src: "gif", + dst: "png", + }, + wantErr: false, + }, + { + name: "変換元がサポート対象外", + args: args{ + in: "./testdata/src", + out: "./testdata/dst", + src: "bmp", + dst: "png", + }, + wantErr: false, + }, + { + name: "変換先がサポート対象外", + args: args{ + in: "./testdata/src", + out: "./testdata/dst", + src: "png", + dst: "bmp", + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := imgConvMain(tt.args.in, tt.args.out, tt.args.src, tt.args.dst); (err != nil) != tt.wantErr { + t.Errorf("imgConvMain() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/kadai2/simady/testdata/dst/gopher.gif b/kadai2/simady/testdata/dst/gopher.gif new file mode 100644 index 0000000..18a0a57 Binary files /dev/null and b/kadai2/simady/testdata/dst/gopher.gif differ diff --git a/kadai2/simady/testdata/dst/gopher.jpg b/kadai2/simady/testdata/dst/gopher.jpg new file mode 100644 index 0000000..094ef3c Binary files /dev/null and b/kadai2/simady/testdata/dst/gopher.jpg differ diff --git a/kadai2/simady/testdata/dst/gopher.png b/kadai2/simady/testdata/dst/gopher.png new file mode 100644 index 0000000..094ef3c Binary files /dev/null and b/kadai2/simady/testdata/dst/gopher.png differ diff --git a/kadai2/simady/testdata/root/root_dummy.gif b/kadai2/simady/testdata/root/root_dummy.gif new file mode 100644 index 0000000..c804031 --- /dev/null +++ b/kadai2/simady/testdata/root/root_dummy.gif @@ -0,0 +1 @@ +package root diff --git a/kadai1/.gitkeep b/kadai2/simady/testdata/root/root_dummy.jpg similarity index 100% rename from kadai1/.gitkeep rename to kadai2/simady/testdata/root/root_dummy.jpg diff --git a/kadai2/simady/testdata/root/root_dummy.png b/kadai2/simady/testdata/root/root_dummy.png new file mode 100644 index 0000000..e69de29 diff --git a/kadai2/simady/testdata/root/sub/sub_dummy.gif b/kadai2/simady/testdata/root/sub/sub_dummy.gif new file mode 100644 index 0000000..c804031 --- /dev/null +++ b/kadai2/simady/testdata/root/sub/sub_dummy.gif @@ -0,0 +1 @@ +package root diff --git a/kadai2/simady/testdata/root/sub/sub_dummy.jpg b/kadai2/simady/testdata/root/sub/sub_dummy.jpg new file mode 100644 index 0000000..e69de29 diff --git a/kadai2/simady/testdata/root/sub/sub_dummy.png b/kadai2/simady/testdata/root/sub/sub_dummy.png new file mode 100644 index 0000000..e69de29 diff --git a/kadai2/simady/testdata/src/dummy.txt b/kadai2/simady/testdata/src/dummy.txt new file mode 100644 index 0000000..e69de29 diff --git a/kadai2/simady/testdata/src/gopher.gif b/kadai2/simady/testdata/src/gopher.gif new file mode 100644 index 0000000..18a0a57 Binary files /dev/null and b/kadai2/simady/testdata/src/gopher.gif differ diff --git a/kadai2/simady/testdata/src/gopher.jpg b/kadai2/simady/testdata/src/gopher.jpg new file mode 100644 index 0000000..7b392e7 Binary files /dev/null and b/kadai2/simady/testdata/src/gopher.jpg differ diff --git a/kadai2/simady/testdata/src/gopher.png b/kadai2/simady/testdata/src/gopher.png new file mode 100644 index 0000000..3320550 Binary files /dev/null and b/kadai2/simady/testdata/src/gopher.png differ