package main

import (
	"sync"
	"testing"
)

func TestRekapTanpaLock(t *testing.T) {
	r := &RekapTanpaLock{}
	var wg sync.WaitGroup
	for range 2 {
		wg.Add(1)
		go func() {
			defer wg.Done()
			for range 1000 {
				r.Tambah(1)
			}
		}()
	}
	wg.Wait()
	// Tanpa sinkronisasi, nilai pasti total tidak bisa diprediksi,
	// sehingga test tanpa -race hanya memeriksa rentang wajarnya.
	if got := r.Total(); got < 1 || got > 2000 {
		t.Errorf("total = %d, di luar rentang wajar 1..2000", got)
	}
}

func TestRekapAmanMutex(t *testing.T) {
	r := &RekapAmanMutex{}
	var wg sync.WaitGroup
	for range 2 {
		wg.Add(1)
		go func() {
			defer wg.Done()
			for range 1000 {
				r.Tambah(1)
			}
		}()
	}
	wg.Wait()
	if got := r.Total(); got != 2000 {
		t.Errorf("total = %d, diharapkan 2000", got)
	}
}

func TestRekapAmanAtomic(t *testing.T) {
	r := &RekapAmanAtomic{}
	var wg sync.WaitGroup
	for range 2 {
		wg.Add(1)
		go func() {
			defer wg.Done()
			for range 1000 {
				r.Tambah(1)
			}
		}()
	}
	wg.Wait()
	if got := r.Total(); got != 2000 {
		t.Errorf("total = %d, diharapkan 2000", got)
	}
}
