public class ContohIsolasi {

    private static int lulus = 0;
    private static int gagal = 0;

    private static void periksa(String namaUji, boolean kondisi, String pesan) {
        if (kondisi) {
            lulus++;
            System.out.println("LULUS  " + namaUji);
        } else {
            gagal++;
            System.out.println("GAGAL  " + namaUji + " -> " + pesan);
        }
    }

    public static void main(String[] args) {
        // test 1: pendaftaran valid mengirim email sambutan
        StubNotifikasi stub = new StubNotifikasi();
        LayananPendaftaran layanan = new LayananPendaftaran(stub);
        String id = layanan.daftar("Budi", "budi@example.com");

        periksa("id pendaftaran benar", "REG-BUDI".equals(id), "id aktual " + id);
        periksa("notifikasi terkirim sekali",
            stub.jumlahPanggilan() == 1, "jumlah " + stub.jumlahPanggilan());
        periksa("tujuan email benar",
            "budi@example.com".equals(stub.emailTerakhir()),
            "tujuan " + stub.emailTerakhir());

        // test 2: email tidak valid ditolak tanpa notifikasi
        StubNotifikasi stubDua = new StubNotifikasi();
        LayananPendaftaran layananDua = new LayananPendaftaran(stubDua);
        boolean ditolak = false;
        try {
            layananDua.daftar("Siti", "siti-example.com");
        } catch (IllegalArgumentException e) {
            ditolak = true;
        }
        periksa("email tanpa @ ditolak", ditolak, "tidak ada exception");
        periksa("tidak ada notifikasi terkirim",
            stubDua.jumlahPanggilan() == 0, "jumlah " + stubDua.jumlahPanggilan());

        System.out.println("ringkasan: " + lulus + " lulus, " + gagal + " gagal");
    }
}
