You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
naza/pkg/nazaatomic/atomic_test.go

143 lines
3.7 KiB
Go

// Copyright 2019, Chef. All rights reserved.
// https://github.com/q191201771/naza
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package nazaatomic
import (
"testing"
"github.com/q191201771/naza/pkg/assert"
)
func TestBool(t *testing.T) {
var v Bool
assert.Equal(t, false, v.Load())
v.Store(true)
assert.Equal(t, true, v.Load())
assert.Equal(t, false, v.CompareAndSwap(false, true))
assert.Equal(t, true, v.Load())
assert.Equal(t, true, v.CompareAndSwap(true, false))
assert.Equal(t, false, v.Load())
assert.Equal(t, false, v.Swap(true))
assert.Equal(t, true, v.Load())
}
func TestInt32(t *testing.T) {
var v Int32
assert.Equal(t, int32(0), v.Load())
v.Store(123)
assert.Equal(t, int32(123), v.Load())
v.Add(100)
assert.Equal(t, int32(223), v.Load())
v.Sub(200)
assert.Equal(t, int32(23), v.Load())
v.Increment()
assert.Equal(t, int32(24), v.Load())
v.Decrement()
assert.Equal(t, int32(23), v.Load())
assert.Equal(t, false, v.CompareAndSwap(0, 100))
assert.Equal(t, int32(23), v.Load())
assert.Equal(t, true, v.CompareAndSwap(23, 100))
assert.Equal(t, int32(100), v.Load())
assert.Equal(t, int32(100), v.Swap(200))
assert.Equal(t, int32(200), v.Load())
// 非常规操作
v.Add(-50)
assert.Equal(t, int32(150), v.Load())
v.Sub(-60)
assert.Equal(t, int32(210), v.Load())
// 越界
v.Store(0)
v.Add(2147483647)
assert.Equal(t, int32(2147483647), v.Load())
v.Add(1)
assert.Equal(t, int32(-2147483648), v.Load())
v.Add(1)
assert.Equal(t, int32(-2147483647), v.Load())
}
func TestUint32(t *testing.T) {
var v Uint32
assert.Equal(t, uint32(0), v.Load())
v.Store(123)
assert.Equal(t, uint32(123), v.Load())
v.Add(100)
assert.Equal(t, uint32(223), v.Load())
v.Sub(200)
assert.Equal(t, uint32(23), v.Load())
v.Increment()
assert.Equal(t, uint32(24), v.Load())
v.Decrement()
assert.Equal(t, uint32(23), v.Load())
assert.Equal(t, false, v.CompareAndSwap(0, 100))
assert.Equal(t, uint32(23), v.Load())
assert.Equal(t, true, v.CompareAndSwap(23, 100))
assert.Equal(t, uint32(100), v.Load())
assert.Equal(t, uint32(100), v.Swap(200))
assert.Equal(t, uint32(200), v.Load())
// 越界
v.Store(0)
v.Add(4294967295)
assert.Equal(t, uint32(4294967295), v.Load())
v.Add(1)
assert.Equal(t, uint32(0), v.Load())
v.Add(1)
assert.Equal(t, uint32(1), v.Load())
}
func TestInt64(t *testing.T) {
var v Int64
assert.Equal(t, int64(0), v.Load())
v.Store(123)
assert.Equal(t, int64(123), v.Load())
v.Add(100)
assert.Equal(t, int64(223), v.Load())
v.Sub(200)
assert.Equal(t, int64(23), v.Load())
v.Increment()
assert.Equal(t, int64(24), v.Load())
v.Decrement()
assert.Equal(t, int64(23), v.Load())
assert.Equal(t, false, v.CompareAndSwap(0, 100))
assert.Equal(t, int64(23), v.Load())
assert.Equal(t, true, v.CompareAndSwap(23, 100))
assert.Equal(t, int64(100), v.Load())
assert.Equal(t, int64(100), v.Swap(200))
assert.Equal(t, int64(200), v.Load())
// 非常规操作
v.Add(-50)
assert.Equal(t, int64(150), v.Load())
v.Sub(-60)
assert.Equal(t, int64(210), v.Load())
}
func TestUint64(t *testing.T) {
var v Uint64
assert.Equal(t, uint64(0), v.Load())
v.Store(123)
assert.Equal(t, uint64(123), v.Load())
v.Add(100)
assert.Equal(t, uint64(223), v.Load())
v.Sub(200)
assert.Equal(t, uint64(23), v.Load())
v.Increment()
assert.Equal(t, uint64(24), v.Load())
v.Decrement()
assert.Equal(t, uint64(23), v.Load())
assert.Equal(t, false, v.CompareAndSwap(0, 100))
assert.Equal(t, uint64(23), v.Load())
assert.Equal(t, true, v.CompareAndSwap(23, 100))
assert.Equal(t, uint64(100), v.Load())
assert.Equal(t, uint64(100), v.Swap(200))
assert.Equal(t, uint64(200), v.Load())
}