goProject/trunk/goutil/redisUtil/redisPool_list_test.go

1889 lines
39 KiB
Go
Raw Permalink Normal View History

2025-01-06 16:01:02 +08:00
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
}
}