first commit

This commit is contained in:
CalvinLiu123 2025-11-10 12:27:02 +07:00
commit bec02173b8
7 changed files with 171 additions and 0 deletions

19
README.md Normal file
View File

@ -0,0 +1,19 @@
# Week_12 - Operator dan Validasi (Golang)
Project sederhana berisi dua paket:
- `operator` : kalkulator aritmatika sederhana (Add, Sub, Mul, Div).
- `validasi` : validasi usia produktif (18-60 tahun).
Cara menjalankan test:
```powershell
cd "D:\Semester 3\Pratikum Back End\Week_12"
go test ./...
```
Contoh menjalankan program demo:
```powershell
go run .
```

3
go.mod Normal file
View File

@ -0,0 +1,3 @@
module example.com/week12
go 1.20

25
main.go Normal file
View File

@ -0,0 +1,25 @@
package main
import (
"fmt"
"example.com/week12/operator"
"example.com/week12/validasi"
)
func main() {
fmt.Println("Contoh penggunaan paket operator:")
a, b := 10, 3
fmt.Printf("%d + %d = %d\n", a, b, operator.Add(a,b))
fmt.Printf("%d - %d = %d\n", a, b, operator.Sub(a,b))
fmt.Printf("%d * %d = %d\n", a, b, operator.Mul(a,b))
if v, err := operator.Div(a,b); err == nil {
fmt.Printf("%d / %d = %v\n", a, b, v)
}
fmt.Println("\nContoh penggunaan paket validasi:")
ages := []int{17, 18, 30, 61}
for _, age := range ages {
fmt.Printf("Usia %d: produktif=%v\n", age, validasi.IsUsiaProduktif(age))
}
}

26
operator/operator.go Normal file
View File

@ -0,0 +1,26 @@
package operator
import "fmt"
// Add returns the sum of a and b.
func Add(a, b int) int {
return a + b
}
// Sub returns the difference a - b.
func Sub(a, b int) int {
return a - b
}
// Mul returns the product of a and b.
func Mul(a, b int) int {
return a * b
}
// Div returns the division a / b as float64. Returns an error on division by zero.
func Div(a, b int) (float64, error) {
if b == 0 {
return 0, fmt.Errorf("divide by zero")
}
return float64(a) / float64(b), nil
}

41
operator/operator_test.go Normal file
View File

@ -0,0 +1,41 @@
package operator
import "testing"
func TestAdd(t *testing.T) {
got := Add(2, 3)
if got != 5 {
t.Fatalf("Add(2,3) = %d; want 5", got)
}
}
func TestSub(t *testing.T) {
got := Sub(5, 3)
if got != 2 {
t.Fatalf("Sub(5,3) = %d; want 2", got)
}
}
func TestMul(t *testing.T) {
got := Mul(4, 3)
if got != 12 {
t.Fatalf("Mul(4,3) = %d; want 12", got)
}
}
func TestDiv(t *testing.T) {
got, err := Div(7, 2)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if got != 3.5 {
t.Fatalf("Div(7,2) = %v; want 3.5", got)
}
}
func TestDivByZero(t *testing.T) {
_, err := Div(1, 0)
if err == nil {
t.Fatalf("expected error when dividing by zero")
}
}

19
validasi/validasi.go Normal file
View File

@ -0,0 +1,19 @@
package validasi
import "fmt"
// IsUsiaProduktif returns true if age is between 18 and 60 inclusive.
func IsUsiaProduktif(age int) bool {
return age >= 18 && age <= 60
}
// ValidateUsia returns nil when usia produktif, otherwise an error explaining why.
func ValidateUsia(age int) error {
if age < 0 {
return fmt.Errorf("umur tidak boleh negatif")
}
if IsUsiaProduktif(age) {
return nil
}
return fmt.Errorf("umur %d bukan usia produktif (18-60)", age)
}

38
validasi/validasi_test.go Normal file
View File

@ -0,0 +1,38 @@
package validasi
import "testing"
func TestIsUsiaProduktif(t *testing.T) {
cases := []struct{
age int
want bool
}{
{17, false},
{18, true},
{30, true},
{60, true},
{61, false},
}
for _, c := range cases {
got := IsUsiaProduktif(c.age)
if got != c.want {
t.Fatalf("IsUsiaProduktif(%d) = %v; want %v", c.age, got, c.want)
}
}
}
func TestValidateUsia(t *testing.T) {
if err := ValidateUsia(-1); err == nil {
t.Fatalf("expected error for negative age")
}
if err := ValidateUsia(18); err != nil {
t.Fatalf("unexpected error for age 18: %v", err)
}
if err := ValidateUsia(60); err != nil {
t.Fatalf("unexpected error for age 60: %v", err)
}
if err := ValidateUsia(61); err == nil {
t.Fatalf("expected error for age 61")
}
}