diff --git a/golang-basic/latihan/01-casperwein.go b/golang-basic/latihan/01-casperwein.go new file mode 100644 index 0000000..b16b166 --- /dev/null +++ b/golang-basic/latihan/01-casperwein.go @@ -0,0 +1,21 @@ +package main + +import "fmt" + +func main() { + pol1 := "madam" + pol2 := "kuda" + + fmt.Println(Polindrom(pol1)) // true + fmt.Println(Polindrom(pol2)) // false +} + +func Polindrom(pol string) bool { + len := len(pol) + for i := 0; i < len/2; i++ { + if pol[i] != pol[len-i-1] { + return false + } + } + return true +} diff --git a/golang-basic/latihan/02-casperwein.go b/golang-basic/latihan/02-casperwein.go new file mode 100644 index 0000000..78ebe12 --- /dev/null +++ b/golang-basic/latihan/02-casperwein.go @@ -0,0 +1,16 @@ +package main + +import "fmt" + +func main() { + fmt.Println(isKonsonan("a")) + fmt.Println(isKonsonan("h")) +} + +func isKonsonan(h string) string { + if h == "a" || h == "i" || h == "u" || h == "e" || h == "o" { + return "vokal" + } else { + return "konsonan" + } +} diff --git a/golang-basic/latihan/test.go b/golang-basic/latihan/test.go deleted file mode 100644 index 06ab7d0..0000000 --- a/golang-basic/latihan/test.go +++ /dev/null @@ -1 +0,0 @@ -package main diff --git a/gomodule-unit-test/latihan/latihan-moq/go.mod b/gomodule-unit-test/latihan/latihan-moq/go.mod index 3aec68f..193af7b 100644 --- a/gomodule-unit-test/latihan/latihan-moq/go.mod +++ b/gomodule-unit-test/latihan/latihan-moq/go.mod @@ -1,3 +1,10 @@ module github.com/santekno/latihanmoq go 1.17 + +require ( + github.com/matryer/moq v0.3.0 // indirect + golang.org/x/mod v0.7.0 // indirect + golang.org/x/sys v0.2.0 // indirect + golang.org/x/tools v0.3.0 // indirect +) diff --git a/gomodule-unit-test/latihan/latihan-moq/go.sum b/gomodule-unit-test/latihan/latihan-moq/go.sum new file mode 100644 index 0000000..66dd48c --- /dev/null +++ b/gomodule-unit-test/latihan/latihan-moq/go.sum @@ -0,0 +1,8 @@ +github.com/matryer/moq v0.3.0 h1:4j0goF/XK3pMTc7fJB3fveuTJoQNdavRX/78vlK3Xb4= +github.com/matryer/moq v0.3.0/go.mod h1:RJ75ZZZD71hejp39j4crZLsEDszGk6iH4v4YsWFKH4s= +golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/tools v0.3.0 h1:SrNbZl6ECOS1qFzgTdQfWXZM9XBkiA6tkFrH9YSTPHM= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= diff --git a/gomodule-unit-test/latihan/latihan-moq/konsonan_test.go b/gomodule-unit-test/latihan/latihan-moq/konsonan_test.go new file mode 100644 index 0000000..bdd6e03 --- /dev/null +++ b/gomodule-unit-test/latihan/latihan-moq/konsonan_test.go @@ -0,0 +1,65 @@ +package main + +import ( + "strings" + "testing" +) + +func isKonsonan(h string) string { + kons := "bcdfghjklmnpqrstvwxyz" + vokal := "aiueo" + if strings.ContainsAny(h, vokal) { + return "vokal" + } else if strings.ContainsAny(h, kons) { + return "konsonan" + } else { + return "masukan huruf konsonan atau vokal" + } +} + +func Test_isKonsonan(t *testing.T) { + type args struct { + h string + } + tests := []struct { + name string + args args + want string + }{ + { + name: "must_vokal", + args: args{ + h: "a", + }, + want: string("vokal"), + }, + { + name: "must_konsonan", + args: args{ + h: "b", + }, + want: string("konsonan"), + }, + { + name: "must_vokal_or_konsonan", + args: args{ + h: "1", + }, + want: string("masukan huruf konsonan atau vokal"), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := isKonsonan(tt.args.h); got != tt.want { + t.Errorf("isKonsonan() = %v, want %v", got, tt.want) + } + }) + } +} + +func BenchmarkIsKonsonan(b *testing.B) { + huruf := "a" + for i := 0; i < b.N; i++ { + isKonsonan(huruf) + } +} diff --git a/gomodule-unit-test/latihan/latihan-moq/main.go b/gomodule-unit-test/latihan/latihan-moq/main.go index 0cbd3d4..587ca5f 100644 --- a/gomodule-unit-test/latihan/latihan-moq/main.go +++ b/gomodule-unit-test/latihan/latihan-moq/main.go @@ -8,6 +8,7 @@ type Student struct { Class int `json:"class"` } +//go:generate moq -out main_mock_test.go . StudentRepositoryInterface type StudentRepositoryInterface interface { GetAllStudents() ([]Student, error) } @@ -16,15 +17,6 @@ type StudentService struct { StudentRepositoryInterface } -func (s StudentService) GetStudent() ([]Student, error) { - Students, err := s.StudentRepositoryInterface.GetAllStudents() - if err != nil { - return nil, err - } - - return Students, nil -} - type StudentRepository struct{} func (r StudentRepository) GetAllStudents() ([]Student, error) { @@ -36,6 +28,15 @@ func (r StudentRepository) GetAllStudents() ([]Student, error) { return Students, nil } +func (s StudentService) GetStudent() ([]Student, error) { + Students, err := s.StudentRepositoryInterface.GetAllStudents() + if err != nil { + return nil, err + } + + return Students, nil +} + func main() { repository := StudentRepository{} service := StudentService{repository} diff --git a/gomodule-unit-test/latihan/latihan-moq/main_mock_test.go b/gomodule-unit-test/latihan/latihan-moq/main_mock_test.go new file mode 100644 index 0000000..0e3811d --- /dev/null +++ b/gomodule-unit-test/latihan/latihan-moq/main_mock_test.go @@ -0,0 +1,67 @@ +// Code generated by moq; DO NOT EDIT. +// github.com/matryer/moq + +package main + +import ( + "sync" +) + +// Ensure, that StudentRepositoryInterfaceMock does implement StudentRepositoryInterface. +// If this is not the case, regenerate this file with moq. +var _ StudentRepositoryInterface = &StudentRepositoryInterfaceMock{} + +// StudentRepositoryInterfaceMock is a mock implementation of StudentRepositoryInterface. +// +// func TestSomethingThatUsesStudentRepositoryInterface(t *testing.T) { +// +// // make and configure a mocked StudentRepositoryInterface +// mockedStudentRepositoryInterface := &StudentRepositoryInterfaceMock{ +// GetAllStudentsFunc: func() ([]Student, error) { +// panic("mock out the GetAllStudents method") +// }, +// } +// +// // use mockedStudentRepositoryInterface in code that requires StudentRepositoryInterface +// // and then make assertions. +// +// } +type StudentRepositoryInterfaceMock struct { + // GetAllStudentsFunc mocks the GetAllStudents method. + GetAllStudentsFunc func() ([]Student, error) + + // calls tracks calls to the methods. + calls struct { + // GetAllStudents holds details about calls to the GetAllStudents method. + GetAllStudents []struct { + } + } + lockGetAllStudents sync.RWMutex +} + +// GetAllStudents calls GetAllStudentsFunc. +func (mock *StudentRepositoryInterfaceMock) GetAllStudents() ([]Student, error) { + if mock.GetAllStudentsFunc == nil { + panic("StudentRepositoryInterfaceMock.GetAllStudentsFunc: method is nil but StudentRepositoryInterface.GetAllStudents was just called") + } + callInfo := struct { + }{} + mock.lockGetAllStudents.Lock() + mock.calls.GetAllStudents = append(mock.calls.GetAllStudents, callInfo) + mock.lockGetAllStudents.Unlock() + return mock.GetAllStudentsFunc() +} + +// GetAllStudentsCalls gets all the calls that were made to GetAllStudents. +// Check the length with: +// +// len(mockedStudentRepositoryInterface.GetAllStudentsCalls()) +func (mock *StudentRepositoryInterfaceMock) GetAllStudentsCalls() []struct { +} { + var calls []struct { + } + mock.lockGetAllStudents.RLock() + calls = mock.calls.GetAllStudents + mock.lockGetAllStudents.RUnlock() + return calls +} diff --git a/gomodule-unit-test/latihan/latihan-moq/main_test.go b/gomodule-unit-test/latihan/latihan-moq/main_test.go new file mode 100644 index 0000000..b27ee2f --- /dev/null +++ b/gomodule-unit-test/latihan/latihan-moq/main_test.go @@ -0,0 +1,48 @@ +package main + +import ( + "reflect" + "testing" +) + +func TestStudentService_GetStudent(t *testing.T) { + tests := []struct { + name string + s StudentService + want []Student + wantErr bool + }{ + { + name: "get student success", + s: StudentService{ + StudentRepositoryInterface: &StudentRepositoryInterfaceMock{ + GetAllStudentsFunc: func() ([]Student, error) { + return []Student{ + {FullName: "Ihsan Arif", Grade: "B", Class: 1}, + {FullName: "Tono", Grade: "A", Class: 2}, + {FullName: "Andi", Grade: "C", Class: 3}, + }, nil + }, + }, + }, + wantErr: false, + want: []Student{ + {FullName: "Ihsan Arif", Grade: "B", Class: 1}, + {FullName: "Tono", Grade: "A", Class: 2}, + {FullName: "Andi", Grade: "C", Class: 3}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := tt.s.GetStudent() + if (err != nil) != tt.wantErr { + t.Errorf("StudentService.GetStudent() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("StudentService.GetStudent() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/gomodule-unit-test/latihan/latihan-moq/polindrom_test.go b/gomodule-unit-test/latihan/latihan-moq/polindrom_test.go new file mode 100644 index 0000000..e3c4ffa --- /dev/null +++ b/gomodule-unit-test/latihan/latihan-moq/polindrom_test.go @@ -0,0 +1,57 @@ +package main + +import "testing" + +func Polindrom(pol string) bool { + len := len(pol) + for i := 0; i < len/2; i++ { + if pol[i] != pol[len-i-1] { + return false + } + } + return true +} + +func TestPolindrom(t *testing.T) { + type args struct { + pol string + } + tests := []struct { + name string + args args + want bool + }{ + { + name: "must_be_true", + args: args{ + pol: "madam", + }, + want: bool(true), + }, + { + name: "must_be_false", + args: args{ + pol: "cicak", + }, + want: bool(false), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := Polindrom(tt.args.pol); got != tt.want { + t.Errorf("Polindrom() = %v, want %v", got, tt.want) + } + }) + } +} + +func BenchmarkPolindrom(b *testing.B) { + kata := "madam" + kata1 := "cicak" + for i := 0; i < b.N; i++ { + Polindrom(kata) + } + for i := 0; i < b.N; i++ { + Polindrom(kata1) + } +}