package dataext import ( "context" "testing" "time" ) func TestMultiMutex_LockDifferentKeys(t *testing.T) { mm := NewMultiMutex[string]() mm.Lock("a") mm.Lock("b") mm.Unlock("a") mm.Unlock("b") } func TestMultiMutex_TryLockSameKey(t *testing.T) { mm := NewMultiMutex[string]() if !mm.TryLock("k") { t.Fatal("TryLock should succeed first time") } if mm.TryLock("k") { t.Fatal("TryLock should fail second time") } mm.Unlock("k") if !mm.TryLock("k") { t.Fatal("TryLock should succeed after unlock") } mm.Unlock("k") } func TestMultiMutex_TryLockDifferentKeys(t *testing.T) { mm := NewMultiMutex[int]() if !mm.TryLock(1) { t.Fatal("TryLock(1) failed") } if !mm.TryLock(2) { t.Fatal("TryLock(2) failed - different keys should be independent") } mm.Unlock(1) mm.Unlock(2) } func TestMultiMutex_RLockMultiple(t *testing.T) { mm := NewMultiMutex[string]() if !mm.RTryLock("k") { t.Fatal("first RTryLock failed") } if !mm.RTryLock("k") { t.Fatal("second RTryLock failed") } mm.RUnlock("k") mm.RUnlock("k") } func TestMultiMutex_TryLockWithTimeout(t *testing.T) { mm := NewMultiMutex[string]() mm.Lock("k") if mm.TryLockWithTimeout("k", 10*time.Millisecond) { t.Fatal("expected timeout failure") } mm.Unlock("k") } func TestMultiMutex_TryLockWithContext(t *testing.T) { mm := NewMultiMutex[string]() ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond) defer cancel() if !mm.TryLockWithContext(ctx, "k") { t.Fatal("TryLockWithContext should succeed on free key") } mm.Unlock("k") } func TestMultiMutex_GetAndGetCAS(t *testing.T) { mm := NewMultiMutex[string]() l := mm.Get("a") if l == nil { t.Fatal("Get returned nil") } cas := mm.GetCAS("a") if cas == nil { t.Fatal("GetCAS returned nil") } rl := mm.RLocker("a") if rl == nil { t.Fatal("RLocker returned nil") } }