import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class ContohProperti {

    static long jumlahPemeriksaan = 0;
    static long jumlahPelanggaran = 0;

    static void cek(String namaProperti, boolean terpenuhi, String detail) {
        jumlahPemeriksaan++;
        if (!terpenuhi) {
            jumlahPelanggaran++;
            System.out.println("GAGAL  " + namaProperti + " -> " + detail);
        }
    }

    public static void main(String[] args) {
        Random acak = new Random(42); // seed tetap: urutan angka deterministik

        // properti 1: penjumlahan bersifat komutatif
        for (int i = 0; i < 1_000; i++) {
            long a = acak.nextInt(1_000_000) - 500_000;
            long b = acak.nextInt(1_000_000) - 500_000;
            cek("a + b == b + a", a + b == b + a, a + " + " + b);
        }

        // properti 2-4: pengurutan menjaga sifat daftar
        for (int i = 0; i < 200; i++) {
            int panjang = acak.nextInt(50);
            List<Integer> daftar = new ArrayList<>();
            for (int j = 0; j < panjang; j++) {
                daftar.add(acak.nextInt(1000));
            }
            List<Integer> hasil = new ArrayList<>(daftar);
            Collections.sort(hasil);

            boolean menaik = true;
            for (int j = 1; j < hasil.size(); j++) {
                if (hasil.get(j - 1) > hasil.get(j)) {
                    menaik = false;
                    break;
                }
            }
            cek("hasil terurut menaik", menaik, daftar.toString());
            cek("ukuran daftar tetap", hasil.size() == daftar.size(), daftar.toString());

            long totalAwal = 0;
            for (int nilai : daftar) {
                totalAwal += nilai;
            }
            long totalHasil = 0;
            for (int nilai : hasil) {
                totalHasil += nilai;
            }
            cek("total nilai tetap", totalAwal == totalHasil, daftar.toString());
        }

        System.out.println("pemeriksaan : " + jumlahPemeriksaan);
        System.out.println("pelanggaran : " + jumlahPelanggaran);
    }
}
