github.com/hslam/atomic@v1.0.0/string_test.go (about) 1 // Copyright (c) 2020 Meng Huang (mhboy@outlook.com) 2 // This package is licensed under a MIT license that can be found in the LICENSE file. 3 4 package atomic 5 6 import ( 7 "sync" 8 "testing" 9 ) 10 11 func TestString(t *testing.T) { 12 var val = "Hello World" 13 addr := NewString(val) 14 if addr.Load() != val { 15 t.Error(addr.Load()) 16 } 17 addr.Store(val[:5]) 18 if addr.Load() != val[:5] { 19 t.Error(addr.Load()) 20 } 21 var delta = val[5:] 22 if addr.Add(delta) != val { 23 t.Error(addr.Load()) 24 } 25 if addr.Load() != val { 26 t.Error(addr.Load()) 27 } 28 var new = "Foo" 29 if addr.Swap(new) != val { 30 t.Error(addr.Load()) 31 } 32 var old = new 33 new = "Bar" 34 if !addr.CompareAndSwap(old, new) { 35 t.Error(addr.Load()) 36 } 37 if addr.CompareAndSwap(old, new) { 38 t.Error(addr.Load()) 39 } 40 41 addr = &String{} 42 if addr.Load() != "" { 43 t.Error(addr.Load()) 44 } 45 } 46 47 func TestAddString(t *testing.T) { 48 addr := NewString("") 49 var wg sync.WaitGroup 50 for i := 0; i < 8192; i++ { 51 wg.Add(1) 52 go func() { 53 defer wg.Done() 54 addr.Add("") 55 }() 56 } 57 wg.Wait() 58 } 59 60 func TestCompareAndSwapString(t *testing.T) { 61 addr := NewString("") 62 var wg sync.WaitGroup 63 for i := 0; i < 8192; i++ { 64 wg.Add(1) 65 go func() { 66 defer wg.Done() 67 addr.CompareAndSwap("", "") 68 }() 69 } 70 wg.Wait() 71 } 72 73 func TestSwapString(t *testing.T) { 74 addr := NewString("") 75 var wg sync.WaitGroup 76 for i := 0; i < 8192; i++ { 77 wg.Add(1) 78 go func() { 79 defer wg.Done() 80 addr.Swap("") 81 }() 82 } 83 wg.Wait() 84 } 85 86 func BenchmarkSwapString(b *testing.B) { 87 addr := NewString("") 88 for i := 0; i < b.N; i++ { 89 addr.Swap("") 90 } 91 } 92 93 func BenchmarkCompareAndSwapString(b *testing.B) { 94 addr := NewString("") 95 for i := 0; i < b.N; i++ { 96 addr.CompareAndSwap("", "") 97 } 98 } 99 100 func BenchmarkAddString(b *testing.B) { 101 addr := NewString("") 102 for i := 0; i < b.N; i++ { 103 addr.Add("") 104 } 105 } 106 107 func BenchmarkStoreString(b *testing.B) { 108 addr := NewString("") 109 for i := 0; i < b.N; i++ { 110 addr.Store("") 111 } 112 } 113 114 func BenchmarkLoadString(b *testing.B) { 115 addr := NewString("") 116 for i := 0; i < b.N; i++ { 117 addr.Load() 118 } 119 }