diff --git a/client/cache/calc_utils_test.go b/client/cache/calc_utils_test.go new file mode 100644 index 00000000..b98e71de --- /dev/null +++ b/client/cache/calc_utils_test.go @@ -0,0 +1,241 @@ +package cache + +import ( + "math" + "strconv" + "testing" +) + +func TestIncr(t *testing.T) { + // int + var originVal interface{} = int(1) + var updateVal interface{} = int(2) + val, err := incr(originVal) + if err != nil { + t.Errorf("incr failed, err: %s", err.Error()) + return + } + if val != updateVal { + t.Errorf("incr failed, expect %v, but %v actually", updateVal, val) + return + } + _, err = incr(int(1 << (strconv.IntSize - 1) - 1)) + if err == nil { + t.Error("incr failed") + return + } + + // int32 + originVal = int32(1) + updateVal = int32(2) + val, err = incr(originVal) + if err != nil { + t.Errorf("incr failed, err: %s", err.Error()) + return + } + if val != updateVal { + t.Errorf("incr failed, expect %v, but %v actually", updateVal, val) + return + } + _, err = incr(int32(math.MaxInt32)) + if err == nil { + t.Error("incr failed") + return + } + + // int64 + originVal = int64(1) + updateVal = int64(2) + val, err = incr(originVal) + if err != nil { + t.Errorf("incr failed, err: %s", err.Error()) + return + } + if val != updateVal { + t.Errorf("incr failed, expect %v, but %v actually", updateVal, val) + return + } + _, err = incr(int64(math.MaxInt64)) + if err == nil { + t.Error("incr failed") + return + } + + // uint + originVal = uint(1) + updateVal = uint(2) + val, err = incr(originVal) + if err != nil { + t.Errorf("incr failed, err: %s", err.Error()) + return + } + if val != updateVal { + t.Errorf("incr failed, expect %v, but %v actually", updateVal, val) + return + } + _, err = incr(uint(1 << (strconv.IntSize) - 1)) + if err == nil { + t.Error("incr failed") + return + } + + // uint32 + originVal = uint32(1) + updateVal = uint32(2) + val, err = incr(originVal) + if err != nil { + t.Errorf("incr failed, err: %s", err.Error()) + return + } + if val != updateVal { + t.Errorf("incr failed, expect %v, but %v actually", updateVal, val) + return + } + _, err = incr(uint32(math.MaxUint32)) + if err == nil { + t.Error("incr failed") + return + } + + // uint64 + originVal = uint64(1) + updateVal = uint64(2) + val, err = incr(originVal) + if err != nil { + t.Errorf("incr failed, err: %s", err.Error()) + return + } + if val != updateVal { + t.Errorf("incr failed, expect %v, but %v actually", updateVal, val) + return + } + _, err = incr(uint64(math.MaxUint64)) + if err == nil { + t.Error("incr failed") + return + } + + // other type + _, err = incr("string") + if err == nil { + t.Error("incr failed") + return + } +} + +func TestDecr(t *testing.T) { + // int + var originVal interface{} = int(2) + var updateVal interface{} = int(1) + val, err := decr(originVal) + if err != nil { + t.Errorf("decr failed, err: %s", err.Error()) + return + } + if val != updateVal { + t.Errorf("decr failed, expect %v, but %v actually", updateVal, val) + return + } + _, err = decr(int(-1 << (strconv.IntSize - 1))) + if err == nil { + t.Error("decr failed") + return + } + + // int32 + originVal = int32(2) + updateVal = int32(1) + val, err = decr(originVal) + if err != nil { + t.Errorf("decr failed, err: %s", err.Error()) + return + } + if val != updateVal { + t.Errorf("decr failed, expect %v, but %v actually", updateVal, val) + return + } + _, err = decr(int32(math.MinInt32)) + if err == nil { + t.Error("decr failed") + return + } + + // int64 + originVal = int64(2) + updateVal = int64(1) + val, err = decr(originVal) + if err != nil { + t.Errorf("decr failed, err: %s", err.Error()) + return + } + if val != updateVal { + t.Errorf("decr failed, expect %v, but %v actually", updateVal, val) + return + } + _, err = decr(int64(math.MinInt64)) + if err == nil { + t.Error("decr failed") + return + } + + // uint + originVal = uint(2) + updateVal = uint(1) + val, err = decr(originVal) + if err != nil { + t.Errorf("decr failed, err: %s", err.Error()) + return + } + if val != updateVal { + t.Errorf("decr failed, expect %v, but %v actually", updateVal, val) + return + } + _, err = decr(uint(0)) + if err == nil { + t.Error("decr failed") + return + } + + // uint32 + originVal = uint32(2) + updateVal = uint32(1) + val, err = decr(originVal) + if err != nil { + t.Errorf("decr failed, err: %s", err.Error()) + return + } + if val != updateVal { + t.Errorf("decr failed, expect %v, but %v actually", updateVal, val) + return + } + _, err = decr(uint32(0)) + if err == nil { + t.Error("decr failed") + return + } + + // uint64 + originVal = uint64(2) + updateVal = uint64(1) + val, err = decr(originVal) + if err != nil { + t.Errorf("decr failed, err: %s", err.Error()) + return + } + if val != updateVal { + t.Errorf("decr failed, expect %v, but %v actually", updateVal, val) + return + } + _, err = decr(uint64(0)) + if err == nil { + t.Error("decr failed") + return + } + + // other type + _, err = decr("string") + if err == nil { + t.Error("decr failed") + return + } +} \ No newline at end of file