diff --git a/kadai1/en-ken/.gitignore b/kadai1/en-ken/.gitignore new file mode 100644 index 0000000..0a49fe5 --- /dev/null +++ b/kadai1/en-ken/.gitignore @@ -0,0 +1,17 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +out/ \ No newline at end of file diff --git a/kadai1/en-ken/README.md b/kadai1/en-ken/README.md new file mode 100644 index 0000000..5b86ede --- /dev/null +++ b/kadai1/en-ken/README.md @@ -0,0 +1,44 @@ +# 課題1 + +## 次の仕様を満たすコマンドを作って下さい + +- [x] ディレクトリを指定する +- [x] 指定したディレクトリ以下のJPGファイルをPNGに変換 (デフォルト) +- [x] ディレクトリ以下は再帰的に処理する +- [ ] 変換前と変換後の画像形式を指定できる (オプション) + +## 以下を満たすように開発してください + +- [x] mainパッケージと分離する +- [x] 自作パッケージと標準パッケージと準標準パッケージのみ使う +- [x] 準標準パッケージ:golang.org/x以下のパッケージ +- [x] ユーザ定義型を作ってみる +- [ ] GoDocを生成してみる + +## 使い方 + +```:go +go build -o kadai1 +./kadai1 INPUT_DIR -input-ext [input extension(.jpg/.png)] -output-dir [output directory] -output-ext [output extension(.jpg/.png)] +``` + +- `-output-dir`は指定されない場合、`INPUT_DIR`に出力される。 +- 出力ディレクトリには、`INPUT_DIR`の各処理ファイルと同じディレクトリ構造を保った形で出力される。 + +## ハマったところ + +- os.FileInfoをスライスにappendして返したらヌルポになった。 + - ポインタで渡そうにもinterfaceだし、どうやって渡す? + - ひとまずファイルパスだけ返してごまかした。 +- go testが最初うまく走らなかった。 + - modファイルができてから動くようになった? +- `INPUT_DIRECTORY`を`-output-dir`のデフォルト値に取りたかった関係で、`INPUT_DIRECTORY`を第一引数に取る形にした。 + - よく考えると`-help`などするとき変なことになる... +- cliのテストをするために結構無駄な構造を作る羽目になってしまった。 + - テストはgolang.org/x以下じゃなくてもセーフという解釈で、gomock使っている。 + - コンストラクタでmockに入れ替える以外でスタブを差し込む方法がわからなかった。 + - DIコンテナとか、あまり一般的ではない? + - 上から差し込むためにFactoryクラスを作ったが、実装上あまり意味がない構造をテストのために作ってしまい、ちょっと気持ち悪い。 + - package自体のinterfaceってないのだろうか。 +- GoDocの生成というのがよくわからなかった。masterにマージされればできる? +- go.modとかgo.sumとかなんとなくバージョン管理のためのものなのだと思うがよくわかっていない。 diff --git a/kadai1/en-ken/cli.go b/kadai1/en-ken/cli.go new file mode 100644 index 0000000..ceae3d7 --- /dev/null +++ b/kadai1/en-ken/cli.go @@ -0,0 +1,68 @@ +package main + +import ( + "flag" + "path/filepath" + "strings" + + "github.com/gopherdojo/dojo6/kadai1/en-ken/imgcnv" +) + +// CLI is for DI +type CLI struct { + dirPath imgcnv.DirPath + imageFactory imgcnv.ImageFileFactory +} + +// Execute executes this app according to options +// arg[0] application name +// arg[1] input directory +// arg[2:] options +func (cli *CLI) Execute(args []string) error { + + flags := flag.NewFlagSet(args[0], flag.ExitOnError) + var ( + inputExt = flags.String("input-ext", ".jpg", "input extension (.jpg/.png)") + outputExt = flags.String("output-ext", ".png", "output extension (.jpg/.png)") + output = flags.String("output-dir", args[1], "output directory") + inputDir string + outputDir string + ) + + inputDir, err := filepath.Abs(args[1]) + if err != nil { + return err + } + + if err := flags.Parse(args[2:]); err != nil { + return err + } + + outputDir = *output + if outputDir == "" { + outputDir = inputDir + } + + paths, err := cli.dirPath.AllFilePaths(inputDir, *inputExt) + if err != nil { + return err + } + + for _, path := range paths { + img, err := cli.imageFactory.Create(path) + if err != nil { + return err + } + + // Copy the hierarchy of the input dir to that of the output dir. + outputPath := strings.Replace(img.AbsPath(), inputDir, outputDir, -1) + outputPath = strings.Replace(outputPath, *inputExt, *outputExt, 1) + + err = img.SaveAs(outputPath) + if err != nil { + return err + } + } + + return nil +} diff --git a/kadai1/en-ken/cli_test.go b/kadai1/en-ken/cli_test.go new file mode 100644 index 0000000..ef43708 --- /dev/null +++ b/kadai1/en-ken/cli_test.go @@ -0,0 +1,98 @@ +package main + +import ( + "path/filepath" + "strings" + "testing" + + "github.com/golang/mock/gomock" + "github.com/gopherdojo/dojo6/kadai1/en-ken/mock_imgcnv" +) + +func TestExecuteSuccess(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + tests := []struct { + argString string + inputDir string + inputExt string + outputDir string + outputExt string + }{ + { + argString: "./kadai1 ./testdata", + inputDir: "./testdata", inputExt: ".jpg", + outputDir: "./testdata", outputExt: ".png", + }, + { + argString: "./kadai1 ./testdata -input-ext .png", + inputDir: "./testdata", inputExt: ".png", + outputDir: "./testdata", outputExt: ".png", + }, + { + argString: "./kadai1 ./testdata -input-ext .png -output-ext .jpg", + inputDir: "./testdata", inputExt: ".png", + outputDir: "./testdata", outputExt: ".jpg", + }, + { + argString: "./kadai1 ./testdata -output-dir ./out", + inputDir: "./testdata", inputExt: ".jpg", + outputDir: "./out", outputExt: ".png", + }, + } + + for _, test := range tests { + testName := "input: " + test.argString + t.Run(testName, func(t *testing.T) { + + mockDirPath := mock_imgcnv.NewMockDirPath(ctrl) + + inputAbsDir, _ := filepath.Abs(test.inputDir) + inputPath1 := inputAbsDir + "/test1" + test.inputExt + inputPath2 := inputAbsDir + "/test2" + test.inputExt + + mockDirPath. + EXPECT(). + AllFilePaths(gomock.Eq(inputAbsDir), gomock.Eq(test.inputExt)). + Return([]string{inputPath1, inputPath2}, nil) + + mockImg := mock_imgcnv.NewMockImageFile(ctrl) + gomock.InOrder( + mockImg. + EXPECT(). + AbsPath(). + Return(inputPath1), + mockImg. + EXPECT(). + AbsPath(). + Return(inputPath2), + ) + + outputPath1 := test.outputDir + "/test1" + test.outputExt + outputPath2 := test.outputDir + "/test2" + test.outputExt + gomock.InOrder( + mockImg. + EXPECT(). + SaveAs(gomock.Eq(outputPath1)), + mockImg. + EXPECT(). + SaveAs(gomock.Eq(outputPath2)), + ) + + mockImgFactory := mock_imgcnv.NewMockImageFileFactory(ctrl) + mockImgFactory. + EXPECT(). + Create(gomock.Any()). + Return(mockImg, nil). + AnyTimes() + + cli := &CLI{ + dirPath: mockDirPath, + imageFactory: mockImgFactory, + } + cli.Execute(strings.Split(test.argString, " ")) + + }) + } +} diff --git a/kadai1/en-ken/go.mod b/kadai1/en-ken/go.mod new file mode 100644 index 0000000..a9ec0c4 --- /dev/null +++ b/kadai1/en-ken/go.mod @@ -0,0 +1,5 @@ +module github.com/gopherdojo/dojo6/kadai1/en-ken + +go 1.12 + +require github.com/golang/mock v1.3.1 diff --git a/kadai1/en-ken/go.sum b/kadai1/en-ken/go.sum new file mode 100644 index 0000000..c0c57cd --- /dev/null +++ b/kadai1/en-ken/go.sum @@ -0,0 +1,10 @@ +github.com/golang/image v0.0.0-20190703141733-d6a02ce849c9 h1:ijbHThKv+QPsGeQnJ0/DiSrRLBR2QlQtRVcl1u2JhR8= +github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262 h1:qsl9y/CJx34tuA7QCPNp86JNJe4spst6Ff8MjvPUdPg= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= diff --git a/kadai1/en-ken/imgcnv/dirpath.go b/kadai1/en-ken/imgcnv/dirpath.go new file mode 100644 index 0000000..38feda1 --- /dev/null +++ b/kadai1/en-ken/imgcnv/dirpath.go @@ -0,0 +1,56 @@ +package imgcnv + +import ( + "io/ioutil" + "path/filepath" +) + +// DirPath expresses I/F to DirPathStruct +type DirPath interface { + AllFilePaths(path string, ext string) ([]string, error) +} + +// DirPathStruct expresses searching dir +type DirPathStruct struct { +} + +// NewDirPath is a constructor of DirPath +func NewDirPath() DirPath { + return &DirPathStruct{} +} + +// AllFilePaths returns +// the paths of the files in the specified directory +// filtered by the specified extension. +func (dirPath *DirPathStruct) AllFilePaths(path string, ext string) ([]string, error) { + absPath, err := filepath.Abs(path) + if err != nil { + return nil, err + } + + return searchFiles(absPath, ext) +} + +func searchFiles(dirPath string, ext string) ([]string, error) { + + files, err := ioutil.ReadDir(dirPath) + if err != nil { + return nil, err + } + + result := make([]string, 0) // allocate 0 items to merge 2 slices + for _, file := range files { + path := filepath.Join(dirPath, file.Name()) + if file.IsDir() { + paths, _ := searchFiles(path, ext) + result = append(result, paths...) + } else { + // ignore error + isMatch, _ := filepath.Match("*"+ext, file.Name()) + if isMatch { + result = append(result, path) + } + } + } + return result, nil +} diff --git a/kadai1/en-ken/imgcnv/dirpath_test.go b/kadai1/en-ken/imgcnv/dirpath_test.go new file mode 100644 index 0000000..399a857 --- /dev/null +++ b/kadai1/en-ken/imgcnv/dirpath_test.go @@ -0,0 +1,52 @@ +package imgcnv + +import ( + "path/filepath" + "sort" + "testing" +) + +func TestAllFilePathsSuccess(t *testing.T) { + dirPath := NewDirPath() + actual, _ := dirPath.AllFilePaths("../testdata/", "jpg") + expected := []string{ + "../testdata/lenna_color.jpg", + "../testdata/lenna_gray.jpg", + "../testdata/layer1/girl_color.jpg", + "../testdata/layer1/girl_gray.jpg", + "../testdata/layer1/layer2/Mandrill.jpg", + } + for i := 0; i < len(expected); i++ { + expected[i], _ = filepath.Abs(expected[i]) + } + + if isEqualArray(actual, expected) == false { + t.Errorf("\nactual:%v\nexpected:%v", actual, expected) + } +} + +func TestAllFilePathsFailure(t *testing.T) { + dirPath := NewDirPath() + _, err := dirPath.AllFilePaths("../foo/", "jpg") + + if err == nil { + t.Errorf("directory does not exist") + } +} + +func compare(x string, y string) bool { + return x < y +} +func isEqualArray(array1 []string, array2 []string) bool { + sort.Slice(array1, func(i, j int) bool { return array1[i] > array1[j] }) + sort.Slice(array2, func(i, j int) bool { return array2[i] > array2[j] }) + if len(array1) != len(array2) { + return false + } + for i := 0; i < len(array1); i++ { + if array1[i] != array2[i] { + return false + } + } + return true +} diff --git a/kadai1/en-ken/imgcnv/imgfile.go b/kadai1/en-ken/imgcnv/imgfile.go new file mode 100644 index 0000000..676541f --- /dev/null +++ b/kadai1/en-ken/imgcnv/imgfile.go @@ -0,0 +1,101 @@ +package imgcnv + +import ( + "fmt" + "image" + "image/jpeg" + "image/png" + "os" + "path/filepath" +) + +// ImageFile expresses I/F to ImageFileStruct +type ImageFile interface { + AbsPath() string + SaveAs(path string) error +} + +// ImageFileStruct expresses the converting image +type ImageFileStruct struct { + image *image.Image + path string + ImageFile +} + +// ImageFileFactory is I/F of ImageFileFactoryStruct +type ImageFileFactory interface { + Create(path string) (ImageFile, error) +} + +// ImageFileFactoryStruct is for DI +type ImageFileFactoryStruct struct { +} + +// NewImageFileFactory is a constructor of NewImageFileFactory +func NewImageFileFactory() ImageFileFactory { + return &ImageFileFactoryStruct{} +} + +// Create generates ImageFile +func (factory *ImageFileFactoryStruct) Create(path string) (ImageFile, error) { + return NewImageFile(path) +} + +// NewImageFile is a constructor of ImageFile +func NewImageFile(path string) (ImageFile, error) { + absPath, err := filepath.Abs(path) + if err != nil { + return nil, err + } + + file, err := os.Open(path) + if err != nil { + return nil, err + } + defer file.Close() + + var image image.Image + switch filepath.Ext(path) { + case ".jpg", ".jpeg": + image, err = jpeg.Decode(file) + case ".png": + image, err = png.Decode(file) + default: + // try to decode as jpeg + image, err = jpeg.Decode(file) + } + if err != nil { + return nil, err + } + + return &ImageFileStruct{ + image: &image, + path: absPath, + }, nil +} + +// AbsPath returns the absolute path of the input file +func (img *ImageFileStruct) AbsPath() string { + return img.path +} + +// SaveAs oututs a file to the specified path after convering to the specified exteinsion. +func (img *ImageFileStruct) SaveAs(path string) error { + err := os.MkdirAll(filepath.Dir(path), 0777) + if err != nil { + return err + } + file, err := os.Create(path) + if err != nil { + return err + } + ext := filepath.Ext(path) + switch ext { + case ".jpg", ".jpeg": + return jpeg.Encode(file, *img.image, nil) + case ".png": + return png.Encode(file, *img.image) + default: + return fmt.Errorf("Unexpected extension") + } +} diff --git a/kadai1/en-ken/imgcnv/imgfile_test.go b/kadai1/en-ken/imgcnv/imgfile_test.go new file mode 100644 index 0000000..549d116 --- /dev/null +++ b/kadai1/en-ken/imgcnv/imgfile_test.go @@ -0,0 +1,108 @@ +package imgcnv + +import ( + "fmt" + "os" + "path/filepath" + "strings" + "testing" +) + +const inputDir = "../testdata/" +const outputDir = "../out/" + +func TestMain(m *testing.M) { + + os.RemoveAll(outputDir) + m.Run() + os.RemoveAll(outputDir) +} + +func TestConstructImageFileSuccess(t *testing.T) { + paths := []string{"layer1/layer2/Mandrill.jpg", "layer1/layer2/Mandrill.png"} + + for _, path := range paths { + inputPath := filepath.Join(inputDir, path) + _, err := NewImageFile(inputPath) + if err != nil { + t.Error(err) + } + } +} + +func TestConstructImageFileFailureWithInvalidPath(t *testing.T) { + inputPath := filepath.Join(inputDir, "layer1/layer2/layer3/foo.jpg") + _, err := NewImageFile(inputPath) + if err == nil { + t.Error(err) + } +} + +func TestConstructImageFileFailureWithOtherFormatFile(t *testing.T) { + inputPath := filepath.Join(inputDir, "lenna_color.gif") + _, err := NewImageFile(inputPath) + if err == nil { + t.Error(err) + } +} + +func TestAbsPathSuccess(t *testing.T) { + filePath := "layer1/layer2/Mandrill.jpg" + inputPath := filepath.Join(inputDir, filePath) + image, _ := NewImageFile(inputPath) + + absPath := image.AbsPath() + + if !strings.Contains(absPath, filePath) { + t.Error("Unexpected path", absPath) + } + if !exists(absPath) { + t.Error("Path does not exist", absPath) + } +} + +func TestSaveAsSuccess(t *testing.T) { + tests := []struct { + fileName string + ext string + expectedExt string + }{ + {fileName: "lenna_color", ext: ".png", expectedExt: ".jpg"}, + {fileName: "lenna_gray", ext: ".png", expectedExt: ".jpg"}, + {fileName: "lenna_color", ext: ".jpg", expectedExt: ".png"}, + {fileName: "lenna_gray", ext: ".jpg", expectedExt: ".png"}, + {fileName: "layer1/girl_color", ext: ".png", expectedExt: ".jpg"}, + {fileName: "layer1/girl_gray", ext: ".png", expectedExt: ".jpg"}, + {fileName: "layer1/girl_color", ext: ".jpg", expectedExt: ".png"}, + {fileName: "layer1/girl_gray", ext: ".jpg", expectedExt: ".png"}, + {fileName: "layer1/layer2/Mandrill", ext: ".png", expectedExt: ".jpg"}, + {fileName: "layer1/layer2/Mandrill", ext: ".jpg", expectedExt: ".png"}, + } + + for _, test := range tests { + testName := fmt.Sprintf("Test data: %v %v %v", test.fileName, test.ext, test.expectedExt) + t.Run(testName, func(t *testing.T) { + + inputPath := filepath.Join(inputDir, test.fileName+test.ext) + outputPath := filepath.Join(outputDir, test.fileName+test.expectedExt) + + imageFile, err := NewImageFile(inputPath) + if err != nil { + t.Error(err) + } + err = imageFile.SaveAs(outputPath) + if err != nil { + t.Error(err) + } + if !exists(outputPath) { + t.Error("No output files") + } + }) + } + +} + +func exists(filename string) bool { + _, err := os.Stat(filename) + return err == nil +} diff --git a/kadai1/en-ken/main.go b/kadai1/en-ken/main.go new file mode 100644 index 0000000..12c9b6d --- /dev/null +++ b/kadai1/en-ken/main.go @@ -0,0 +1,18 @@ +package main + +import ( + "os" + + "github.com/gopherdojo/dojo6/kadai1/en-ken/imgcnv" +) + +func main() { + dirPath := imgcnv.NewDirPath() + factory := imgcnv.NewImageFileFactory() + cli := &CLI{ + dirPath: dirPath, + imageFactory: factory, + } + + cli.Execute(os.Args) +} diff --git a/kadai1/en-ken/main_test.go b/kadai1/en-ken/main_test.go new file mode 100644 index 0000000..d90b91e --- /dev/null +++ b/kadai1/en-ken/main_test.go @@ -0,0 +1,32 @@ +package main + +import ( + "os/exec" + "strings" + "testing" +) + +func TestMain(m *testing.M) { + exec.Command("go", "build", "-o", "kadai1").Run() + m.Run() +} + +func TestMainSuccess(t *testing.T) { + + cmdString := "./kadai1 ./testdata -input-ext .jpg -output-dir ./out -output-ext .png" + cmd := strings.Split(cmdString, " ") + err := exec.Command(cmd[0], cmd[1:]...).Run() + if err != nil { + t.Fatal(err) + } +} + +func TestMainFailure(t *testing.T) { + + cmdString := "./kadai1" + cmd := strings.Split(cmdString, " ") + err := exec.Command(cmd[0], cmd[1:]...).Run() + if err == nil { + t.Fatal(err) + } +} diff --git a/kadai1/en-ken/mock_imgcnv/dirpath.go b/kadai1/en-ken/mock_imgcnv/dirpath.go new file mode 100644 index 0000000..38b308b --- /dev/null +++ b/kadai1/en-ken/mock_imgcnv/dirpath.go @@ -0,0 +1,48 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: ./imgcnv/dirpath.go + +// Package mock_imgcnv is a generated GoMock package. +package mock_imgcnv + +import ( + gomock "github.com/golang/mock/gomock" + reflect "reflect" +) + +// MockDirPath is a mock of DirPath interface +type MockDirPath struct { + ctrl *gomock.Controller + recorder *MockDirPathMockRecorder +} + +// MockDirPathMockRecorder is the mock recorder for MockDirPath +type MockDirPathMockRecorder struct { + mock *MockDirPath +} + +// NewMockDirPath creates a new mock instance +func NewMockDirPath(ctrl *gomock.Controller) *MockDirPath { + mock := &MockDirPath{ctrl: ctrl} + mock.recorder = &MockDirPathMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockDirPath) EXPECT() *MockDirPathMockRecorder { + return m.recorder +} + +// AllFilePaths mocks base method +func (m *MockDirPath) AllFilePaths(path, ext string) ([]string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AllFilePaths", path, ext) + ret0, _ := ret[0].([]string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AllFilePaths indicates an expected call of AllFilePaths +func (mr *MockDirPathMockRecorder) AllFilePaths(path, ext interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllFilePaths", reflect.TypeOf((*MockDirPath)(nil).AllFilePaths), path, ext) +} diff --git a/kadai1/en-ken/mock_imgcnv/imgfile.go b/kadai1/en-ken/mock_imgcnv/imgfile.go new file mode 100644 index 0000000..d7c3a3f --- /dev/null +++ b/kadai1/en-ken/mock_imgcnv/imgfile.go @@ -0,0 +1,100 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: ./imgcnv/imgfile.go + +// Package mock_imgcnv is a generated GoMock package. +package mock_imgcnv + +import ( + gomock "github.com/golang/mock/gomock" + imgcnv "github.com/gopherdojo/dojo6/kadai1/en-ken/imgcnv" + reflect "reflect" +) + +// MockImageFile is a mock of ImageFile interface +type MockImageFile struct { + ctrl *gomock.Controller + recorder *MockImageFileMockRecorder +} + +// MockImageFileMockRecorder is the mock recorder for MockImageFile +type MockImageFileMockRecorder struct { + mock *MockImageFile +} + +// NewMockImageFile creates a new mock instance +func NewMockImageFile(ctrl *gomock.Controller) *MockImageFile { + mock := &MockImageFile{ctrl: ctrl} + mock.recorder = &MockImageFileMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockImageFile) EXPECT() *MockImageFileMockRecorder { + return m.recorder +} + +// AbsPath mocks base method +func (m *MockImageFile) AbsPath() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AbsPath") + ret0, _ := ret[0].(string) + return ret0 +} + +// AbsPath indicates an expected call of AbsPath +func (mr *MockImageFileMockRecorder) AbsPath() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AbsPath", reflect.TypeOf((*MockImageFile)(nil).AbsPath)) +} + +// SaveAs mocks base method +func (m *MockImageFile) SaveAs(path string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SaveAs", path) + ret0, _ := ret[0].(error) + return ret0 +} + +// SaveAs indicates an expected call of SaveAs +func (mr *MockImageFileMockRecorder) SaveAs(path interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SaveAs", reflect.TypeOf((*MockImageFile)(nil).SaveAs), path) +} + +// MockImageFileFactory is a mock of ImageFileFactory interface +type MockImageFileFactory struct { + ctrl *gomock.Controller + recorder *MockImageFileFactoryMockRecorder +} + +// MockImageFileFactoryMockRecorder is the mock recorder for MockImageFileFactory +type MockImageFileFactoryMockRecorder struct { + mock *MockImageFileFactory +} + +// NewMockImageFileFactory creates a new mock instance +func NewMockImageFileFactory(ctrl *gomock.Controller) *MockImageFileFactory { + mock := &MockImageFileFactory{ctrl: ctrl} + mock.recorder = &MockImageFileFactoryMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockImageFileFactory) EXPECT() *MockImageFileFactoryMockRecorder { + return m.recorder +} + +// Create mocks base method +func (m *MockImageFileFactory) Create(path string) (imgcnv.ImageFile, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Create", path) + ret0, _ := ret[0].(imgcnv.ImageFile) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Create indicates an expected call of Create +func (mr *MockImageFileFactoryMockRecorder) Create(path interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockImageFileFactory)(nil).Create), path) +} diff --git a/kadai1/en-ken/testdata/layer1/girl_color.jpg b/kadai1/en-ken/testdata/layer1/girl_color.jpg new file mode 100644 index 0000000..d3482da Binary files /dev/null and b/kadai1/en-ken/testdata/layer1/girl_color.jpg differ diff --git a/kadai1/en-ken/testdata/layer1/girl_color.png b/kadai1/en-ken/testdata/layer1/girl_color.png new file mode 100644 index 0000000..18bc3fb Binary files /dev/null and b/kadai1/en-ken/testdata/layer1/girl_color.png differ diff --git a/kadai1/en-ken/testdata/layer1/girl_gray.jpg b/kadai1/en-ken/testdata/layer1/girl_gray.jpg new file mode 100644 index 0000000..24125a4 Binary files /dev/null and b/kadai1/en-ken/testdata/layer1/girl_gray.jpg differ diff --git a/kadai1/en-ken/testdata/layer1/girl_gray.png b/kadai1/en-ken/testdata/layer1/girl_gray.png new file mode 100644 index 0000000..85e8a4b Binary files /dev/null and b/kadai1/en-ken/testdata/layer1/girl_gray.png differ diff --git a/kadai1/en-ken/testdata/layer1/layer2/Mandrill.jpg b/kadai1/en-ken/testdata/layer1/layer2/Mandrill.jpg new file mode 100644 index 0000000..82b9981 Binary files /dev/null and b/kadai1/en-ken/testdata/layer1/layer2/Mandrill.jpg differ diff --git a/kadai1/en-ken/testdata/layer1/layer2/Mandrill.png b/kadai1/en-ken/testdata/layer1/layer2/Mandrill.png new file mode 100644 index 0000000..465eee3 Binary files /dev/null and b/kadai1/en-ken/testdata/layer1/layer2/Mandrill.png differ diff --git a/kadai1/en-ken/testdata/lena_color.gif b/kadai1/en-ken/testdata/lena_color.gif new file mode 100644 index 0000000..8103712 Binary files /dev/null and b/kadai1/en-ken/testdata/lena_color.gif differ diff --git a/kadai1/en-ken/testdata/lena_gray.gif b/kadai1/en-ken/testdata/lena_gray.gif new file mode 100644 index 0000000..045d327 Binary files /dev/null and b/kadai1/en-ken/testdata/lena_gray.gif differ diff --git a/kadai1/en-ken/testdata/lenna_color.jpg b/kadai1/en-ken/testdata/lenna_color.jpg new file mode 100644 index 0000000..2a4266d Binary files /dev/null and b/kadai1/en-ken/testdata/lenna_color.jpg differ diff --git a/kadai1/en-ken/testdata/lenna_color.png b/kadai1/en-ken/testdata/lenna_color.png new file mode 100644 index 0000000..4cea39a Binary files /dev/null and b/kadai1/en-ken/testdata/lenna_color.png differ diff --git a/kadai1/en-ken/testdata/lenna_gray.jpg b/kadai1/en-ken/testdata/lenna_gray.jpg new file mode 100644 index 0000000..6bd004a Binary files /dev/null and b/kadai1/en-ken/testdata/lenna_gray.jpg differ diff --git a/kadai1/en-ken/testdata/lenna_gray.png b/kadai1/en-ken/testdata/lenna_gray.png new file mode 100644 index 0000000..55efc7e Binary files /dev/null and b/kadai1/en-ken/testdata/lenna_gray.png differ