goProject/trunk/goutil/redisUtil/redisPool_list_test.go
皮蛋13361098506 1b77f62820 初始化项目
2025-01-06 16:01:02 +08:00

1889 lines
39 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package redisUtil
import (
"testing"
"time"
)
var (
redisPoolObj_list *RedisPool
)
func init() {
redisPoolObj_list = NewRedisPool("testPool", "10.1.0.21:6379", "redis_pwd", 5, 500, 200, 10*time.Second, 5*time.Second)
}
func TestLPush(t *testing.T) {
deleteKeys := make([]string, 0, 8)
defer func() {
// Delete the test keys
distinctKeyList := getDistinctKeyList(deleteKeys)
count, err := redisPoolObj_list.Del(distinctKeyList...)
if err != nil {
t.Fail()
}
if count != len(distinctKeyList) {
t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
return
}
}()
/*
# 加入单个元素
redis> LPUSH languages python
(integer) 1
*/
key := "languages"
value := "python"
expected := 1
got, err := redisPoolObj_list.LPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected length %d, but got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
# 加入重复元素
redis> LPUSH languages python
(integer) 2
*/
value = "python"
expected = 2
got, err = redisPoolObj_list.LPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected length %d, but got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> LRANGE languages 0 -1 # 列表允许重复元素
1) "python"
2) "python"
*/
expected2 := []string{"python", "python"}
got2_interface, err := redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got2, err := redisPoolObj_list.Strings(got2_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected2, got2) == false {
t.Errorf("Expected to get %v, but got %v\n", expected2, got2)
return
}
/*
# 加入多个元素
redis> LPUSH mylist a b c
(integer) 3
*/
key3 := "mylist"
expected3 := 3
got3, err := redisPoolObj_list.LPush(key3, "a", "b", "c")
if err != nil {
t.Fail()
}
if got3 != expected3 {
t.Errorf("Expected length %d, but got %d", expected3, got3)
return
}
deleteKeys = append(deleteKeys, key3)
/*
redis> LRANGE mylist 0 -1
1) "c"
2) "b"
3) "a"
*/
expected4 := []string{"c", "b", "a"}
got4_interface, err := redisPoolObj_list.LRange(key3, 0, -1)
if err != nil {
t.Fail()
}
got4, err := redisPoolObj_list.Strings(got4_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected4, got4) == false {
t.Errorf("Expected to get %v, but got %v\n", expected4, got4)
return
}
}
func TestLPushX(t *testing.T) {
deleteKeys := make([]string, 0, 8)
defer func() {
// Delete the test keys
distinctKeyList := getDistinctKeyList(deleteKeys)
count, err := redisPoolObj_list.Del(distinctKeyList...)
if err != nil {
t.Fail()
}
if count != len(distinctKeyList) {
t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
return
}
}()
/*
# 对空列表执行 LPUSHX
redis> LLEN greet # greet 是一个空列表
(integer) 0
*/
key := "greet"
expected := 0
got, err := redisPoolObj_list.LLen(key)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
redis> LPUSHX greet "hello" # 尝试 LPUSHX失败因为列表为空
(integer) 0
*/
value := "hello"
expected = 0
got, err = redisPoolObj_list.LPushX(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
# 对非空列表执行 LPUSHX
redis> LPUSH greet "hello" # 先用 LPUSH 创建一个有一个元素的列表
(integer) 1
*/
expected = 1
got, err = redisPoolObj_list.LPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> LPUSHX greet "good morning" # 这次 LPUSHX 执行成功
(integer) 2
*/
value = "good morning"
expected = 2
got, err = redisPoolObj_list.LPushX(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
redis> LRANGE greet 0 -1
1) "good morning"
2) "hello"
*/
expected2 := []string{"good morning", "hello"}
got2_interface, err := redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got2, err := redisPoolObj_list.Strings(got2_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected2, got2) == false {
t.Errorf("Expected to get %v, but got %v\n", expected2, got2)
return
}
}
func TestRPush(t *testing.T) {
deleteKeys := make([]string, 0, 8)
defer func() {
// Delete the test keys
distinctKeyList := getDistinctKeyList(deleteKeys)
count, err := redisPoolObj_list.Del(distinctKeyList...)
if err != nil {
t.Fail()
}
if count != len(distinctKeyList) {
t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
return
}
}()
/*
# 添加单个元素
redis> RPUSH languages c
(integer) 1
*/
key := "languages"
value := "c"
expected := 1
got, err := redisPoolObj_list.RPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
# 添加重复元素
redis> RPUSH languages c
(integer) 2
*/
key = "languages"
value = "c"
expected = 2
got, err = redisPoolObj_list.RPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> LRANGE languages 0 -1 # 列表允许重复元素
1) "c"
2) "c"
*/
expected2 := []string{"c", "c"}
got2_interface, err := redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got2, err := redisPoolObj_list.Strings(got2_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected2, got2) == false {
t.Errorf("Expected to get %v, but got %v\n", expected2, got2)
return
}
/*
# 添加多个元素
redis> RPUSH mylist a b c
(integer) 3
*/
key3 := "mylist"
expected3 := 3
got3, err := redisPoolObj_list.RPush(key3, "a", "b", "c")
if err != nil {
t.Fail()
}
if got3 != expected3 {
t.Errorf("Expected length %d, but got %d", expected3, got3)
return
}
deleteKeys = append(deleteKeys, key3)
/*
redis> LRANGE mylist 0 -1
1) "a"
2) "b"
3) "c"
*/
expected4 := []string{"a", "b", "c"}
got4_interface, err := redisPoolObj_list.LRange(key3, 0, -1)
if err != nil {
t.Fail()
}
got4, err := redisPoolObj_list.Strings(got4_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected4, got4) == false {
t.Errorf("Expected to get %v, but got %v\n", expected4, got4)
return
}
}
func TestRPushX(t *testing.T) {
deleteKeys := make([]string, 0, 8)
defer func() {
// Delete the test keys
distinctKeyList := getDistinctKeyList(deleteKeys)
count, err := redisPoolObj_list.Del(distinctKeyList...)
if err != nil {
t.Fail()
}
if count != len(distinctKeyList) {
t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
return
}
}()
/*
# key不存在
redis> LLEN greet
(integer) 0
*/
key := "greet"
expected := 0
got, err := redisPoolObj_list.LLen(key)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
redis> RPUSHX greet "hello" # 对不存在的 key 进行 RPUSHXPUSH 失败。
(integer) 0
*/
value := "hello"
expected = 0
got, err = redisPoolObj_list.RPushX(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
# key 存在且是一个非空列表
redis> RPUSH greet "hi" # 先用 RPUSH 插入一个元素
(integer) 1
*/
value = "hi"
expected = 1
got, err = redisPoolObj_list.RPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> RPUSHX greet "hello" # greet 现在是一个列表类型RPUSHX 操作成功。
(integer) 2
*/
value = "hello"
expected = 2
got, err = redisPoolObj_list.RPushX(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
redis> LRANGE greet 0 -1
1) "hi"
2) "hello"
*/
expected2 := []string{"hi", "hello"}
got2_interface, err := redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got2, err := redisPoolObj_list.Strings(got2_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected2, got2) == false {
t.Errorf("Expected to get %v, but got %v\n", expected2, got2)
return
}
}
func TestLPop(t *testing.T) {
deleteKeys := make([]string, 0, 8)
defer func() {
// Delete the test keys
distinctKeyList := getDistinctKeyList(deleteKeys)
count, err := redisPoolObj_list.Del(distinctKeyList...)
if err != nil {
t.Fail()
}
if count != len(distinctKeyList) {
t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
return
}
}()
/*
redis> LLEN course
(integer) 0
*/
key := "course"
expected := 0
got, err := redisPoolObj_list.LLen(key)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
redis> RPUSH course algorithm001
(integer) 1
*/
value := "algorithm001"
expected = 1
got, err = redisPoolObj_list.RPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> RPUSH course c++101
(integer) 2
*/
value = "c++101"
expected = 2
got, err = redisPoolObj_list.RPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
redis> LPOP course # 移除头元素
"algorithm001"
*/
expected2 := "algorithm001"
got2_interface, exist, err := redisPoolObj_list.LPop(key)
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("The key:%s should have item, but now it doesn't.", key)
return
}
got2, err := redisPoolObj_list.String(got2_interface)
if err != nil {
t.Fail()
}
if got2 != expected2 {
t.Errorf("Expected to get %s, but now got %s", expected2, got2)
return
}
}
func TestRPop(t *testing.T) {
deleteKeys := make([]string, 0, 8)
defer func() {
// Delete the test keys
distinctKeyList := getDistinctKeyList(deleteKeys)
count, err := redisPoolObj_list.Del(distinctKeyList...)
if err != nil {
t.Fail()
}
if count != len(distinctKeyList) {
t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
return
}
}()
/*
redis> RPUSH mylist "one"
(integer) 1
*/
key := "mylist"
value := "one"
expected := 1
got, err := redisPoolObj_list.RPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> RPUSH mylist "two"
(integer) 2
*/
value = "two"
expected = 2
got, err = redisPoolObj_list.RPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
redis> RPUSH mylist "three"
(integer) 3
*/
value = "three"
expected = 3
got, err = redisPoolObj_list.RPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
redis> RPOP mylist # 返回被弹出的元素
"three"
*/
expected2 := "three"
got2_interface, exist, err := redisPoolObj_list.RPop(key)
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("The key:%s should have item, but now it doesn't.", key)
return
}
got2, err := redisPoolObj_list.String(got2_interface)
if err != nil {
t.Fail()
}
if got2 != expected2 {
t.Errorf("Expected to get %s, but now got %s", expected2, got2)
return
}
/*
redis> LRANGE mylist 0 -1 # 列表剩下的元素
1) "one"
2) "two"
*/
expected3 := []string{"one", "two"}
got3_interface, err := redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got3, err := redisPoolObj_list.Strings(got3_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected3, got3) == false {
t.Errorf("Expected to get %v, but got %v\n", expected3, got3)
return
}
}
func TestRPopLPush(t *testing.T) {
deleteKeys := make([]string, 0, 8)
defer func() {
// Delete the test keys
distinctKeyList := getDistinctKeyList(deleteKeys)
count, err := redisPoolObj_list.Del(distinctKeyList...)
if err != nil {
t.Fail()
}
if count != len(distinctKeyList) {
t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
return
}
}()
/*
# source 和 destination 不同
redis> LRANGE alpha 0 -1 # 查看所有元素
1) "a"
2) "b"
3) "c"
4) "d"
*/
key := "alpha"
redisPoolObj_list.RPush(key, "a")
redisPoolObj_list.RPush(key, "b")
redisPoolObj_list.RPush(key, "c")
redisPoolObj_list.RPush(key, "d")
deleteKeys = append(deleteKeys, key)
expected := []string{"a", "b", "c", "d"}
got_interface, err := redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got, err := redisPoolObj_list.Strings(got_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected, got) == false {
t.Errorf("Expected to get %v, but got %v\n", expected, got)
return
}
/*
redis> RPOPLPUSH alpha reciver # 执行一次 RPOPLPUSH 看看
"d"
*/
source := "alpha"
destination := "receiver"
expected2 := "d"
got2_interface, err := redisPoolObj_list.RPopLPush(source, destination)
if err != nil {
t.Fail()
}
got2, err := redisPoolObj_list.String(got2_interface)
if err != nil {
t.Fail()
}
if got2 != expected2 {
t.Errorf("Expected to get %s, but now got %s", expected2, got2)
return
}
deleteKeys = append(deleteKeys, source)
deleteKeys = append(deleteKeys, destination)
/*
redis> LRANGE alpha 0 -1
1) "a"
2) "b"
3) "c"
*/
expected3 := []string{"a", "b", "c"}
got3_interface, err := redisPoolObj_list.LRange(source, 0, -1)
if err != nil {
t.Fail()
}
got3, err := redisPoolObj_list.Strings(got3_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected3, got3) == false {
t.Errorf("Expected to get %v, but got %v\n", expected3, got3)
return
}
/*
redis> LRANGE reciver 0 -1
1) "d"
*/
expected4 := []string{"d"}
got4_interface, err := redisPoolObj_list.LRange(destination, 0, -1)
if err != nil {
t.Fail()
}
got4, err := redisPoolObj_list.Strings(got4_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected4, got4) == false {
t.Errorf("Expected to get %v, but got %v\n", expected4, got)
return
}
/*
redis> RPOPLPUSH alpha reciver # 再执行一次,证实 RPOP 和 LPUSH 的位置正确
"c"
*/
expected5 := "c"
got5_interface, err := redisPoolObj_list.RPopLPush(source, destination)
if err != nil {
t.Fail()
}
got5, err := redisPoolObj_list.String(got5_interface)
if err != nil {
t.Fail()
}
if got5 != expected5 {
t.Errorf("Expected to get %s, but now got %s", expected5, got5)
return
}
/*
redis> LRANGE alpha 0 -1
1) "a"
2) "b"
*/
expected6 := []string{"a", "b"}
got6_interface, err := redisPoolObj_list.LRange(source, 0, -1)
if err != nil {
t.Fail()
}
got6, err := redisPoolObj_list.Strings(got6_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected6, got6) == false {
t.Errorf("Expected to get %v, but got %v\n", expected6, got6)
return
}
/*
redis> LRANGE reciver 0 -1
1) "c"
2) "d"
*/
expected7 := []string{"c", "d"}
got7_interface, err := redisPoolObj_list.LRange(destination, 0, -1)
if err != nil {
t.Fail()
}
got7, err := redisPoolObj_list.Strings(got7_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected7, got7) == false {
t.Errorf("Expected to get %v, but got %v\n", expected7, got7)
return
}
/*
# source 和 destination 相同
redis> LRANGE number 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
*/
source = "number"
destination = "number"
redisPoolObj_list.RPush(source, "1")
redisPoolObj_list.RPush(source, "2")
redisPoolObj_list.RPush(source, "3")
redisPoolObj_list.RPush(source, "4")
deleteKeys = append(deleteKeys, source)
deleteKeys = append(deleteKeys, destination)
expected8 := []string{"1", "2", "3", "4"}
got8_interface, err := redisPoolObj_list.LRange(source, 0, -1)
if err != nil {
t.Fail()
}
got8, err := redisPoolObj_list.Strings(got8_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected8, got8) == false {
t.Errorf("Expected to get %v, but got %v\n", expected8, got8)
return
}
/*
redis> RPOPLPUSH number number
"4"
*/
expected9 := 4
got9_interface, err := redisPoolObj_list.RPopLPush(source, destination)
if err != nil {
t.Fail()
}
got9, err := redisPoolObj_list.Int(got9_interface)
if err != nil {
t.Fail()
}
if got9 != expected9 {
t.Errorf("Expected to get %d, but now got %d", expected9, got9)
return
}
/*
redis> LRANGE number 0 -1 # 4 被旋转到了表头
1) "4"
2) "1"
3) "2"
4) "3"
*/
expected10 := []string{"4", "1", "2", "3"}
got10_interface, err := redisPoolObj_list.LRange(source, 0, -1)
if err != nil {
t.Fail()
}
got10, err := redisPoolObj_list.Strings(got10_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected10, got10) == false {
t.Errorf("Expected to get %v, but got %v\n", expected10, got10)
return
}
/*
redis> RPOPLPUSH number number
"3"
*/
expected11 := 3
got11_interface, err := redisPoolObj_list.RPopLPush(source, destination)
if err != nil {
t.Fail()
}
got11, err := redisPoolObj_list.Int(got11_interface)
if err != nil {
t.Fail()
}
if got11 != expected11 {
t.Errorf("Expected to get %d, but now got %d", expected11, got11)
return
}
/*
redis> LRANGE number 0 -1 # 这次是 3 被旋转到了表头
1) "3"
2) "4"
3) "1"
4) "2"
*/
expected12 := []string{"3", "4", "1", "2"}
got12_interface, err := redisPoolObj_list.LRange(source, 0, -1)
if err != nil {
t.Fail()
}
got12, err := redisPoolObj_list.Strings(got12_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected12, got12) == false {
t.Errorf("Expected to get %v, but got %v\n", expected12, got12)
return
}
}
func TestLRem(t *testing.T) {
deleteKeys := make([]string, 0, 8)
// defer func() {
// // Delete the test keys
// distinctKeyList := getDistinctKeyList(deleteKeys)
// count, err := redisPoolObj_list.Del(distinctKeyList...)
// if err != nil {
// t.Fail()
// }
// if count != len(distinctKeyList) {
// t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
// return
// }
// }()
/*
# 先创建一个表,内容排列是
# morning hello morning helllo morning
redis> LPUSH greet "morning"
(integer) 1
redis> LPUSH greet "hello"
(integer) 2
redis> LPUSH greet "morning"
(integer) 3
redis> LPUSH greet "hello"
(integer) 4
redis> LPUSH greet "morning"
(integer) 5
*/
key := "greet"
value := "morning"
expected := 1
got, err := redisPoolObj_list.LPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
value = "hello"
expected = 2
got, err = redisPoolObj_list.LPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
value = "morning"
expected = 3
got, err = redisPoolObj_list.LPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
value = "hello"
expected = 4
got, err = redisPoolObj_list.LPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
value = "morning"
expected = 5
got, err = redisPoolObj_list.LPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> LRANGE greet 0 4 # 查看所有元素
1) "morning"
2) "hello"
3) "morning"
4) "hello"
5) "morning"
*/
expected2 := []string{"morning", "hello", "morning", "hello", "morning"}
got2_interface, err := redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got2, err := redisPoolObj_list.Strings(got2_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected2, got2) == false {
t.Errorf("Expected to get %v, but got %v\n", expected2, got2)
return
}
/*
redis> LREM greet 2 morning # 移除从表头到表尾,最先发现的两个 morning
(integer) 2 # 两个元素被移除
*/
value3 := "morning"
expected3 := 2
got3, err := redisPoolObj_list.LRem(key, 2, value3)
if err != nil {
t.Fail()
}
if got3 != expected3 {
t.Errorf("Expected to get %d, but now got %d", expected3, got3)
return
}
/*
redis> LLEN greet # 还剩 3 个元素
(integer) 3
*/
expected4 := 3
got4, err := redisPoolObj_list.LLen(key)
if err != nil {
t.Fail()
}
if got4 != expected4 {
t.Errorf("Expected to get %d, but now got %d", expected4, got4)
return
}
/*
redis> LRANGE greet 0 2
1) "hello"
2) "hello"
3) "morning"
*/
expected5 := []string{"hello", "hello", "morning"}
got5_interface, err := redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got5, err := redisPoolObj_list.Strings(got5_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected5, got5) == false {
t.Errorf("Expected to get %v, but got %v\n", expected5, got5)
return
}
/*
redis> LREM greet -1 morning # 移除从表尾到表头,第一个 morning
(integer) 1
*/
value6 := "morning"
expected6 := 1
got6, err := redisPoolObj_list.LRem(key, -1, value6)
if err != nil {
t.Fail()
}
if got6 != expected6 {
t.Errorf("Expected to get %d, but now got %d", expected6, got6)
return
}
/*
redis> LLEN greet # 剩下两个元素
(integer) 2
*/
expected7 := 2
got7, err := redisPoolObj_list.LLen(key)
if err != nil {
t.Fail()
}
if got7 != expected7 {
t.Errorf("Expected to get %d, but now got %d", expected7, got7)
return
}
/*
redis> LRANGE greet 0 1
1) "hello"
2) "hello"
*/
expected8 := []string{"hello", "hello"}
got8_interface, err := redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got8, err := redisPoolObj_list.Strings(got8_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected8, got8) == false {
t.Errorf("Expected to get %v, but got %v\n", expected8, got8)
return
}
/*
redis> LREM greet 0 hello # 移除表中所有 hello
(integer) 2 # 两个 hello 被移除
*/
value9 := "hello"
expected9 := 2
got9, err := redisPoolObj_list.LRem(key, 0, value9)
if err != nil {
t.Fail()
}
if got9 != expected9 {
t.Errorf("Expected to get %d, but now got %d", expected9, got9)
return
}
/*
redis> LLEN greet
(integer) 0
*/
expected10 := 0
got10, err := redisPoolObj_list.LLen(key)
if err != nil {
t.Fail()
}
if got10 != expected10 {
t.Errorf("Expected to get %d, but now got %d", expected10, got10)
return
}
expected11 := false
got11, err := redisPoolObj_list.Exists(key)
if err != nil {
t.Fail()
}
if got11 != expected11 {
t.Errorf("Expected to get %t, but now got %t", expected11, got11)
return
}
}
func TestLLen(t *testing.T) {
deleteKeys := make([]string, 0, 8)
defer func() {
// Delete the test keys
distinctKeyList := getDistinctKeyList(deleteKeys)
count, err := redisPoolObj_list.Del(distinctKeyList...)
if err != nil {
t.Fail()
}
if count != len(distinctKeyList) {
t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
return
}
}()
/*
# 空列表
redis> LLEN job
(integer) 0
*/
key := "job"
expected := 0
got, err := redisPoolObj_list.LLen(key)
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
# 非空列表
redis> LPUSH job "cook food"
(integer) 1
*/
value := "cook food"
expected = 1
got, err = redisPoolObj_list.LPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected length %d, but got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> LPUSH job "have lunch"
(integer) 2
*/
value = "have lunch"
expected = 2
got, err = redisPoolObj_list.LPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected length %d, but got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> LLEN job
(integer) 2
*/
expected = 2
got, err = redisPoolObj_list.LLen(key)
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
}
func TestLIndex(t *testing.T) {
deleteKeys := make([]string, 0, 8)
defer func() {
// Delete the test keys
distinctKeyList := getDistinctKeyList(deleteKeys)
count, err := redisPoolObj_list.Del(distinctKeyList...)
if err != nil {
t.Fail()
}
if count != len(distinctKeyList) {
t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
return
}
}()
/*
redis> LPUSH mylist "World"
(integer) 1
*/
key := "mylist"
value := "World"
expected := 1
got, err := redisPoolObj_list.LPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected length %d, but got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> LPUSH mylist "Hello"
(integer) 2
*/
value = "Hello"
expected = 2
got, err = redisPoolObj_list.LPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected length %d, but got %d", expected, got)
return
}
/*
redis> LINDEX mylist 0
"Hello"
*/
expected2 := "Hello"
index := 0
got2_interface, exist, err := redisPoolObj_list.LIndex(key, index)
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("The key:%s, index:%d should exist, but now it doesn't.", key, index)
return
}
got2, err := redisPoolObj_list.String(got2_interface)
if err != nil {
t.Fail()
}
if got2 != expected2 {
t.Errorf("Expected length %s, but got %s", expected2, got2)
return
}
/*
redis> LINDEX mylist -1
"World"
*/
expected3 := "World"
index = -1
got3_interface, exist, err := redisPoolObj_list.LIndex(key, index)
if err != nil {
t.Fail()
}
if !exist {
t.Errorf("The key:%s, index:%d should exist, but now it doesn't.", key, index)
return
}
got3, err := redisPoolObj_list.String(got3_interface)
if err != nil {
t.Fail()
}
if got3 != expected3 {
t.Errorf("Expected length %s, but got %s", expected3, got3)
return
}
/*
redis> LINDEX mylist 3 # index不在 mylist 的区间范围内
(nil)
*/
index = 3
_, exist, err = redisPoolObj_list.LIndex(key, index)
if err != nil {
t.Fail()
}
if exist {
t.Errorf("The key:%s, index:%d should not exist, but now it does.", key, index)
return
}
}
func TestLInsert(t *testing.T) {
deleteKeys := make([]string, 0, 8)
defer func() {
// Delete the test keys
distinctKeyList := getDistinctKeyList(deleteKeys)
count, err := redisPoolObj_list.Del(distinctKeyList...)
if err != nil {
t.Fail()
}
if count != len(distinctKeyList) {
t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
return
}
}()
/*
redis> RPUSH mylist "Hello"
(integer) 1
redis> RPUSH mylist "World"
(integer) 2
*/
key := "mylist"
value := "Hello"
expected := 1
got, err := redisPoolObj_list.RPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected length %d, but got %d", expected, got)
return
}
value = "World"
expected = 2
got, err = redisPoolObj_list.RPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected length %d, but got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> LINSERT mylist BEFORE "World" "There"
(integer) 3
*/
pivot := "World"
value = "There"
expected = 3
got, err = redisPoolObj_list.LInsert(key, "BEFORE", pivot, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected length %d, but got %d", expected, got)
return
}
/*
redis> LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"
*/
expected2 := []string{"Hello", "There", "World"}
got2_interface, err := redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got2, err := redisPoolObj_list.Strings(got2_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected2, got2) == false {
t.Errorf("Expected to get %v, but got %v\n", expected2, got2)
return
}
/*
# 对一个非空列表插入,查找一个不存在的 pivot
redis> LINSERT mylist BEFORE "go" "let's"
(integer) -1 # 失败
*/
pivot = "go"
value = "let's"
expected = -1
got, err = redisPoolObj_list.LInsert(key, "BEFORE", pivot, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected length %d, but got %d", expected, got)
return
}
/*
# 对一个空列表执行 LINSERT 命令
redis> EXISTS fake_list
(integer) 0
*/
key3 := "fake_list"
expected3 := false
got3, err := redisPoolObj_list.Exists(key3)
if err != nil {
t.Fail()
}
if got3 != expected3 {
t.Errorf("Expected length %t, but got %t", expected3, got3)
return
}
/*
redis> LINSERT fake_list BEFORE "nono" "gogogog"
(integer) 0 # 失败
*/
pivot = "nono"
value = "gogogog"
expected4 := 0
got4, err := redisPoolObj_list.LInsert(key3, "BEFORE", pivot, value)
if err != nil {
t.Fail()
}
if got4 != expected4 {
t.Errorf("Expected to get %d, but got %d", expected4, got4)
return
}
}
func TestLSet(t *testing.T) {
deleteKeys := make([]string, 0, 8)
defer func() {
// Delete the test keys
distinctKeyList := getDistinctKeyList(deleteKeys)
count, err := redisPoolObj_list.Del(distinctKeyList...)
if err != nil {
t.Fail()
}
if count != len(distinctKeyList) {
t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
return
}
}()
/*
# 对空列表(key 不存在)进行 LSET
redis> EXISTS list
(integer) 0
*/
key := "list"
expected := false
got, err := redisPoolObj_list.Exists(key)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected length %t, but got %t", expected, got)
return
}
/*
redis> LSET list 0 item
(error) ERR no such key
*/
index := 0
value := "item"
err = redisPoolObj_list.LSet(key, index, value)
if err == nil {
t.Errorf("There should be an error, but now there isn't.")
return
}
/*
# 对非空列表进行 LSET
redis> LPUSH job "cook food"
(integer) 1
*/
key = "job"
value = "cook food"
expected2 := 1
got2, err := redisPoolObj_list.LPush(key, value)
if err != nil {
t.Fail()
}
if got2 != expected2 {
t.Errorf("Expected length %d, but got %d", expected2, got2)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> LRANGE job 0 0
1) "cook food"
*/
expected3 := []string{"cook food"}
got3_interface, err := redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got3, err := redisPoolObj_list.Strings(got3_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected3, got3) == false {
t.Errorf("Expected to get %v, but got %v\n", expected3, got3)
return
}
/*
redis> LSET job 0 "play game"
OK
*/
index = 0
value = "play game"
err = redisPoolObj_list.LSet(key, index, value)
if err != nil {
t.Fail()
}
/*
redis> LRANGE job 0 0
1) "play game"
*/
expected4 := []string{"play game"}
got4_interface, err := redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got4, err := redisPoolObj_list.Strings(got4_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected4, got4) == false {
t.Errorf("Expected to get %v, but got %v\n", expected4, got4)
return
}
/*
# index 超出范围
redis> LLEN list # 列表长度为 1
(integer) 1
*/
key = "list"
redisPoolObj_list.RPush(key, "init")
expected5 := 1
got5, err := redisPoolObj_list.LLen(key)
if err != nil {
t.Fail()
}
if got5 != expected5 {
t.Errorf("Expected length %d, but got %d", expected5, got5)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> LSET list 3 'out of range'
(error) ERR index out of range
*/
index = 3
value = "out of range"
err = redisPoolObj_list.LSet(key, index, value)
if err == nil {
t.Errorf("There should be an error, but now there isn't.")
return
}
}
func TestLRange(t *testing.T) {
deleteKeys := make([]string, 0, 8)
defer func() {
// Delete the test keys
distinctKeyList := getDistinctKeyList(deleteKeys)
count, err := redisPoolObj_list.Del(distinctKeyList...)
if err != nil {
t.Fail()
}
if count != len(distinctKeyList) {
t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
return
}
}()
/*
redis> RPUSH fp-language lisp
(integer) 1
*/
key := "fp-language"
value := "lisp"
expected := 1
got, err := redisPoolObj_list.RPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
deleteKeys = append(deleteKeys, key)
/*
redis> LRANGE fp-language 0 0
1) "lisp"
*/
expected2 := []string{"lisp"}
got2_interface, err := redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got2, err := redisPoolObj_list.Strings(got2_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected2, got2) == false {
t.Errorf("Expected to get %v, but got %v\n", expected2, got2)
return
}
/*
redis> RPUSH fp-language scheme
(integer) 2
*/
value = "scheme"
expected = 2
got, err = redisPoolObj_list.RPush(key, value)
if err != nil {
t.Fail()
}
if got != expected {
t.Errorf("Expected to get %d, but now got %d", expected, got)
return
}
/*
redis> LRANGE fp-language 0 1
1) "lisp"
2) "scheme"
*/
expected3 := []string{"lisp", "scheme"}
got3_interface, err := redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got3, err := redisPoolObj_list.Strings(got3_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected3, got3) == false {
t.Errorf("Expected to get %v, but got %v\n", expected3, got3)
return
}
}
func TestLTrim(t *testing.T) {
// deleteKeys := make([]string, 0, 8)
// defer func() {
// // Delete the test keys
// distinctKeyList := getDistinctKeyList(deleteKeys)
// count, err := redisPoolObj_list.Del(distinctKeyList...)
// if err != nil {
// t.Fail()
// }
// if count != len(distinctKeyList) {
// t.Errorf("Expected to get %d, but now got %d", len(distinctKeyList), count)
// return
// }
// }()
/*
# 情况 1 常见情况, start 和 stop 都在列表的索引范围之内
*/
key := "alpha"
redisPoolObj_list.RPush(key, "h", "e", "l", "l", "o")
/*
redis> LRANGE alpha 0 -1 # alpha 是一个包含 5 个字符串的列表
1) "h"
2) "e"
3) "l"
4) "l"
5) "o"
*/
expected := []string{"h", "e", "l", "l", "o"}
got_interface, err := redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got, err := redisPoolObj_list.Strings(got_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected, got) == false {
t.Errorf("Expected to get %v, but got %v\n", expected, got)
return
}
/*
redis> LTRIM alpha 1 -1 # 删除 alpha 列表索引为 0 的元素
OK
redis> LRANGE alpha 0 -1 # "h" 被删除了
1) "e"
2) "l"
3) "l"
4) "o"
*/
start := 1
stop := -1
err = redisPoolObj_list.LTrim(key, start, stop)
if err != nil {
t.Fail()
}
expected = []string{"e", "l", "l", "o"}
got_interface, err = redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got, err = redisPoolObj_list.Strings(got_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected, got) == false {
t.Errorf("Expected to get %v, but got %v\n", expected, got)
return
}
/*
# 情况 2 stop 比列表的最大下标还要大
redis> LTRIM alpha 1 10086 # 保留 alpha 列表索引 1 至索引 10086 上的元素
OK
redis> LRANGE alpha 0 -1 # 只有索引 0 上的元素 "e" 被删除了,其他元素还在
1) "l"
2) "l"
3) "o"
*/
start = 1
stop = 10086
err = redisPoolObj_list.LTrim(key, start, stop)
if err != nil {
t.Fail()
}
expected = []string{"l", "l", "o"}
got_interface, err = redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got, err = redisPoolObj_list.Strings(got_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected, got) == false {
t.Errorf("Expected to get %v, but got %v\n", expected, got)
return
}
/*
# 情况 3 start 和 stop 都比列表的最大下标要大,并且 start < stop
redis> LTRIM alpha 10086 123321
OK
redis> LRANGE alpha 0 -1 # 列表被清空
(empty list or set)
*/
start = 10086
stop = 123321
err = redisPoolObj_list.LTrim(key, start, stop)
if err != nil {
t.Fail()
}
expected = []string{}
got_interface, err = redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got, err = redisPoolObj_list.Strings(got_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected, got) == false {
t.Errorf("Expected to get %v, but got %v\n", expected, got)
return
}
/*
# 情况 4 start 和 stop 都比列表的最大下标要大,并且 start > stop
redis> RPUSH new-alpha "h" "e" "l" "l" "o" # 重新建立一个新列表
(integer) 5
redis> LRANGE new-alpha 0 -1
1) "h"
2) "e"
3) "l"
4) "l"
5) "o"
redis> LTRIM new-alpha 123321 10086 # 执行 LTRIM
OK
redis> LRANGE new-alpha 0 -1 # 同样被清空
(empty list or set)
*/
key = "new-alpha"
redisPoolObj_list.RPush(key, "h", "e", "l", "l", "o")
expected = []string{"h", "e", "l", "l", "o"}
got_interface, err = redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got, err = redisPoolObj_list.Strings(got_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected, got) == false {
t.Errorf("Expected to get %v, but got %v\n", expected, got)
return
}
start = 123321
stop = 10086
err = redisPoolObj_list.LTrim(key, start, stop)
if err != nil {
t.Fail()
}
expected = []string{}
got_interface, err = redisPoolObj_list.LRange(key, 0, -1)
if err != nil {
t.Fail()
}
got, err = redisPoolObj_list.Strings(got_interface)
if err != nil {
t.Fail()
}
if isTwoOrderedSliceEqual(expected, got) == false {
t.Errorf("Expected to get %v, but got %v\n", expected, got)
return
}
}