Skip to content

Commit

Permalink
feat: menambahkan algoritma gcd
Browse files Browse the repository at this point in the history
- menambahkan beberapa testing
- membuat build zig untuk mengetest semua folder
- membuat command prompt file and shell script untuk running semua test

Signed-off-by: slowy07 <slowy.arfy@gmail.com>
  • Loading branch information
slowy07 committed Dec 5, 2023
1 parent 94d5bd4 commit a8640ec
Show file tree
Hide file tree
Showing 5 changed files with 159 additions and 1 deletion.
22 changes: 21 additions & 1 deletion .github/workflows/zig.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,27 @@ jobs:
- name: setup zig
uses: goto-bus-stop/setup-zig@v2
with:
version: 0.11.0
cache: false


- name: format kode zig
run: zig fmt .
run: zig fmt .

- name: testing kode zig
if: (startsWith(matrix.runs-on, 'ubuntu')) || (startsWith(matrix.runs-on, 'macos'))
run: sh runtest.sh

- name: testing kode zig di windows
if: (startsWith(matrix.runs-on, 'windows')
run: ./runtest.cmd

linting-kode-zig:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: goto-bus-stop/setup-zig@v2
with:
version: 0.11.0
cache: false
- run: zig fmt --check --ast-check .
49 changes: 49 additions & 0 deletions build.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
const std = @import("std");

// fungsi build menangani proses kompilasi dan build berdasarkan opsi target
pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});

// memeriksa opsi 'algoritma' yang digunakan untuk memilih algoritma yang akan di build
const op = b.option([]const u8, "algoritma", "pilih algoritma yang akan di build") orelse return;

// memilih folder berdasarkan opsi algoritma
// jika opsi adalah 'math/gcd' maka fungsi buat_algo dipanggil untuk membuat algoritma gcd
if (std.mem.eql(u8, op, "math/gcd"))
buat_algo(b, .{
.optimize = optimize,
.target = target,
.name = "gcd.zig",
.category = "math",
});
}

// fungsi untuk membangun algoritma berdasarkan informasi yang diberikan
fn buat_algo(b: *std.Build, info: BInfo) void {
// menggabungkan path dari kategori dan nama file untuk mendapatkan path lengkap sumber kode
const src = std.mem.concat(b.allocator, u8, &.{ info.category, "/", info.name }) catch @panic("concat error");
const exe_test = b.addTest(.{
.name = info.name,
.target = info.target,
.optimize = info.optimize,
.root_source_file = .{
.path = src,
},
});
// menyusun deskripsi untuk langkah testing
var deskripsi = b.fmt("test folder: {s}", .{info.name});

// menambah langkah (step) untuk menjalankan testing
const jalankan_testing = b.addRunArtifact(exe_test);
const testing_step = b.step("test", deskripsi);
testing_step.dependOn(&jalankan_testing.step);
}

// struktur untuk menyimpan informasi build yang diperlukan untuk membangun algoritma
const BInfo = struct {
optimize: std.builtin.OptimizeMode,
target: std.zig.CrossTarget,
name: []const u8,
category: []const u8,
};
48 changes: 48 additions & 0 deletions math/gcd.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
const std = @import("std");

// fungsi untuk mencari faktor persekutuan terbesar dari dua bilangan
// biasa disebut greatest common divisor (GCD)
// fungsi ini dapat menggunakan berbagai tipe data
pub fn gcd(a: anytype, b: anytype) @TypeOf(a, b) {
// mengecek tipe data yang sesuai
comptime switch (@typeInfo(@TypeOf(a, b))) {
.Int => |int| std.debug.assert(int.signedess == .unsigned),
.ComptimeInt => {
std.debug.assert(a >= 0);
std.debug.assert(b >= 0);
},
else => unreachable,
};
std.debug.assert(a != 0 or b != 0);

// jika salah satunya 0
if (a == 0) return b;
if (b == 0) return a;

// buat variabel untuk iterasi algoritma euclidean
// informasi tentang algoritma
// https://en.wikipedia.org/wiki/Euclidean_algorithm
var x: @TypeOf(a, b) = a;
var y: @TypeOf(a, b) = b;
var m: @TypeOf(a, b) = a;

// membuat algoritma euclidean untuk
// mencari gcd
while (y != 0) {
m = x % y;
x = y;
y = m;
}
return x;
}

// membuat unitesting untuk mengetest fungsi gcd
test "gcd" {
const expectEqual = std.testing.expectEqual;

// mengetest jika salah satu nilainya 0
try expectEqual(gcd(0, 5), 5);

// mengetest nilai a dan b
try expectEqual(gcd(33, 77), 11);
}
20 changes: 20 additions & 0 deletions runtest.cmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
@echo off

rem file ini berisi scripting command prompt yang digynakan untuk membuat beberapa
rem perintah build test zig yang terdapat di folder selain dari folder
rem `basic`. jika ada salah satu folder terdapat beberapa file,
rem maka perintah ini sangat berguna untuk mengetest semua file zig
rem yang terdapat pada folder tersebut

rem membuat parameter zig build test
set ZIG_TEST_COMMAND='zig build test'

rem membuat argumen tambahan untuk informasi lebih lanjut dari
rem hasil compile dan test
rem perintah;
rem `-freference-trace yaitu mengecek trace referencsi per kompile yang error`
set argumen=--summary all -freference-trace

rem lakukan testing salah satu folder dengan menggunakan perintah
rem yang sudah dibuat
%ZIG_TEST_COMMAND% -Dalgoritma=math/gcd %argumen%
21 changes: 21 additions & 0 deletions runtest.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#!/usr/bin/env bash

# file ini berisi scripting shell yang digynakan untuk membuat beberapa
# perintah build test zig yang terdapat di folder selain dari folder
# `basic`. jika ada salah satu folder terdapat beberapa file,
# maka perintah ini sangat berguna untuk mengetest semua file zig
# yang terdapat pada folder tersebut

# membuat parameter zig build test
ZIG_TEST_COMMAND='zig build test'

# membuat argumen tambahan untuk informasi lebih lanjut dari
# hasil compile dan test
# perintah;
# `-freference-trace yaitu mengecek trace referencsi per kompile yang error`
argumen='--summary all -freference-trace'

# lakukan testing salah satu folder dengan menggunakan perintah
# yang sudah dibuat
$ZIG_TEST_COMMAND -Dalgoritma=math/gcd $argumen

0 comments on commit a8640ec

Please sign in to comment.