import java.util.List;
import java.util.function.Consumer;

public class ContohSiklusUji {

    private static int jumlahInstance = 0;

    private final int nomorInstance;

    ContohSiklusUji() {
        jumlahInstance++;
        nomorInstance = jumlahInstance;
    }

    // ---- padanan @BeforeAll dan @AfterAll: sekali untuk seluruh class ----

    static void sebelumSemua() {
        System.out.println("@BeforeAll  : membuka sambungan ke basis data uji");
    }

    static void sesudahSemua() {
        System.out.println("@AfterAll   : menutup sambungan ke basis data uji");
    }

    // ---- padanan @BeforeEach dan @AfterEach: sekali untuk tiap test ----

    void sebelumTiap() {
        System.out.println("@BeforeEach : siapkan instance uji ke-" + nomorInstance);
    }

    void sesudahTiap() {
        System.out.println("@AfterEach  : bersihkan instance uji ke-" + nomorInstance);
    }

    // ---- dua method uji ----

    void ujiTambahSatuItem() {
        System.out.println("@Test       : ujiTambahSatuItem");
    }

    void ujiKeranjangKosong() {
        System.out.println("@Test       : ujiKeranjangKosong");
    }

    public static void main(String[] args) {
        sebelumSemua();

        List<Consumer<ContohSiklusUji>> semuaUji = List.of(
            uji -> uji.ujiTambahSatuItem(),
            uji -> uji.ujiKeranjangKosong()
        );

        for (Consumer<ContohSiklusUji> uji : semuaUji) {
            ContohSiklusUji instance = new ContohSiklusUji(); // instance segar per test
            instance.sebelumTiap();
            uji.accept(instance);
            instance.sesudahTiap();
        }

        sesudahSemua();
    }
}
