From dcfeb2df90d7d486d8948b8e6b6482de1c3f6352 Mon Sep 17 00:00:00 2001 From: arfy slowy Date: Tue, 5 Dec 2023 19:36:02 +0700 Subject: [PATCH] feat: menambahkan algoritma gcd (#8) - 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 --- .github/workflows/zig.yml | 22 +++++++++++++++++- build.zig | 49 +++++++++++++++++++++++++++++++++++++++ math/gcd.zig | 48 ++++++++++++++++++++++++++++++++++++++ runtest.cmd | 20 ++++++++++++++++ runtest.sh | 21 +++++++++++++++++ 5 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 build.zig create mode 100644 math/gcd.zig create mode 100644 runtest.cmd create mode 100644 runtest.sh diff --git a/.github/workflows/zig.yml b/.github/workflows/zig.yml index 510985a..b4c0c02 100644 --- a/.github/workflows/zig.yml +++ b/.github/workflows/zig.yml @@ -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 . \ No newline at end of file + 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 . \ No newline at end of file diff --git a/build.zig b/build.zig new file mode 100644 index 0000000..8b12d3b --- /dev/null +++ b/build.zig @@ -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, +}; diff --git a/math/gcd.zig b/math/gcd.zig new file mode 100644 index 0000000..2497013 --- /dev/null +++ b/math/gcd.zig @@ -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); +} diff --git a/runtest.cmd b/runtest.cmd new file mode 100644 index 0000000..60366cf --- /dev/null +++ b/runtest.cmd @@ -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% \ No newline at end of file diff --git a/runtest.sh b/runtest.sh new file mode 100644 index 0000000..e316e03 --- /dev/null +++ b/runtest.sh @@ -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 +