sync_test.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package mapping
  2. import (
  3. "sync"
  4. "testing"
  5. )
  6. // TestLoadStore validates basic read/write operations
  7. func TestLoadStore(t *testing.T) {
  8. t.Parallel()
  9. m := Map[string, int]{}
  10. // Test initial state
  11. if val, ok := m.Load("missing"); ok {
  12. t.Fatalf("Unexpected value for missing key: %v", val)
  13. }
  14. // Test basic store
  15. m.Store("answer", 42)
  16. if val, ok := m.Load("answer"); !ok || val != 42 {
  17. t.Errorf("Load after Store failed, got (%v, %v)", val, ok)
  18. }
  19. // Test overwrite
  20. prevLen := m.Len()
  21. m.Store("answer", 100)
  22. if m.Len() != prevLen {
  23. t.Error("Overwriting existing key should not change length")
  24. }
  25. }
  26. // TestDelete validates deletion behavior
  27. func TestDelete(t *testing.T) {
  28. t.Parallel()
  29. m := Map[string, string]{}
  30. // Delete non-existent key
  31. m.Delete("ghost")
  32. if m.Len() != 0 {
  33. t.Error("Deleting non-existent key should not affect length")
  34. }
  35. // Delete existing key
  36. m.Store("name", "gopher")
  37. m.Delete("name")
  38. if _, ok := m.Load("name"); ok || m.Len() != 0 {
  39. t.Error("Delete failed to remove item")
  40. }
  41. }
  42. // TestConcurrentAccess verifies thread safety
  43. func TestConcurrentAccess(t *testing.T) {
  44. t.Parallel()
  45. m := Map[int, float64]{}
  46. const workers = 100
  47. var wg sync.WaitGroup
  48. wg.Add(workers)
  49. for i := 0; i < workers; i++ {
  50. go func(i int) {
  51. defer wg.Done()
  52. m.Store(i, float64(i)*1.5)
  53. m.Load(i)
  54. m.Delete(i)
  55. }(i)
  56. }
  57. wg.Wait()
  58. if m.Len() != 0 {
  59. t.Errorf("Expected empty map after concurrent ops, got len %d", m.Len())
  60. }
  61. }
  62. // TestLoadOrStore verifies conditional storage
  63. func TestLoadOrStore(t *testing.T) {
  64. t.Parallel()
  65. m := Map[string, interface{}]{}
  66. // First store
  67. val, loaded := m.LoadOrStore("data", []byte{1,2,3})
  68. if loaded || val.([]byte)[0] != 1 {
  69. t.Error("Initial LoadOrStore failed")
  70. }
  71. // Existing key
  72. val, loaded = m.LoadOrStore("data", "new value")
  73. if !loaded || len(val.([]byte)) != 3 {
  74. t.Error("Existing key LoadOrStore failed")
  75. }
  76. }
  77. // TestEdgeCases covers special scenarios
  78. func TestEdgeCases(t *testing.T) {
  79. t.Parallel()
  80. m := Map[bool, bool]{}
  81. // Zero value storage
  82. m.Store(true, false)
  83. if val, _ := m.Load(true); val != false {
  84. t.Error("Zero value storage failed")
  85. }
  86. // Clear operation
  87. m.Clear()
  88. if m.Len() != 0 {
  89. t.Error("Clear failed to reset map")
  90. }
  91. }