1889 lines
39 KiB
Go
1889 lines
39 KiB
Go
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 进行 RPUSHX,PUSH 失败。
|
||
(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
|
||
}
|
||
}
|