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

591 lines
22 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using StackExchange.Redis;
using Xunit;
using Xunit.Extensions;
using Xunit.Serialization;
using Xunit.Abstractions;
using Xunit.Sdk;
using RedisStuy;
namespace RedisStudyTest
{
/// <summary>
/// Redis 集合学习 测试
/// </summary>
[Trait("RedisSortedSet", "All")]
public class RedisSortedSetStudyTest : IDisposable
{
#region 初始化
private readonly ITestOutputHelper testOutput;
private IDatabase redisDatabase = null;
private RedisSortedSetStudy redisSortedSetStudy = null;
private TimeSpan defaultExpiry = TimeSpan.FromSeconds(20);
private string defaultRedisKey = "RedisStudy:SortedSet:xUnitTest";
/// <summary>
/// 构造
/// </summary>
public RedisSortedSetStudyTest(ITestOutputHelper output)
{
this.testOutput = output;
redisDatabase = RedisHelper.GetRedisDatabase();
redisSortedSetStudy = new RedisSortedSetStudy();
}
#endregion
#region SetAdd
[Fact]
public void SortedAdd_NotKey_Test()
{
var addNumber = redisSortedSetStudy.SortedSetAdd(defaultRedisKey, new SortedSetEntry[] { }, CommandFlags.None);
Assert.Equal(0, addNumber);
var exits = redisDatabase.KeyExists(defaultRedisKey);
Assert.False(exits);
var result = redisSortedSetStudy.SortedSetAdd(defaultRedisKey, "first", 1, CommandFlags.None);
Assert.True(result);
var number = redisSortedSetStudy.SortedSetLength(defaultRedisKey);
Assert.Equal(1, number);
}
[Fact]
public void SetAdd_SortedSetEntrys_Empty_Test()
{
var addNumber = redisSortedSetStudy.SortedSetAdd(defaultRedisKey, new SortedSetEntry[] { }, CommandFlags.None);
Assert.Equal(0, addNumber);
}
[Fact]
public void SetAddByOneTest()
{
//重载方法1
var addResult = redisSortedSetStudy.SortedSetAdd(defaultRedisKey,"first",1);
Assert.True(addResult);
//重载方法2
var addResult2 = redisSortedSetStudy.SortedSetAdd(defaultRedisKey, "second", 2, CommandFlags.None);
Assert.True(addResult2);
//反向验证
var members = redisSortedSetStudy.SortedSetLength(defaultRedisKey);
Assert.Equal(2, members);
}
[Fact]
public void SetAddByGroupTest()
{
SortedSetEntry[] sortedSetEntrys = new SortedSetEntry[]
{
new SortedSetEntry("first", 1),
new SortedSetEntry("second", 2),
new SortedSetEntry("third", 3),
new SortedSetEntry("four", 4),
new SortedSetEntry("five", 5),
};
SortedSetEntry[] sortedSetEntrys2 = new SortedSetEntry[]
{
new SortedSetEntry("six", 6),
new SortedSetEntry("seven", 7),
};
//重载方法1
var memberNumber = redisSortedSetStudy.SortedSetAdd(defaultRedisKey, sortedSetEntrys, CommandFlags.None);
Assert.Equal(5, memberNumber);
//重载方法2
var memberNumber2 = redisSortedSetStudy.SortedSetAdd(defaultRedisKey, sortedSetEntrys2, When.Always, CommandFlags.None);
Assert.Equal(2, memberNumber2);
//验证数据
var totalNumber = redisSortedSetStudy.SortedSetLength(defaultRedisKey);
Assert.Equal(7, totalNumber);
}
#endregion
#region SortedSetIncrement
[Fact]
public void SortedSetIncrement_NotKey_Test()
{
var incResult = redisSortedSetStudy.SortedSetIncrement(defaultRedisKey, "first", 1.0);
Assert.Equal(1.0, incResult);
}
[Fact]
public void SortedSetIncrementTest()
{
var incResult = redisSortedSetStudy.SortedSetIncrement(defaultRedisKey, "first", 1.0);
Assert.Equal(1.0, incResult);
incResult = redisSortedSetStudy.SortedSetIncrement(defaultRedisKey, "first", 1.5);
double differenceValue = incResult - 2.5;
Assert.True(differenceValue < 0.01);
//增加负值等于减少
incResult = redisSortedSetStudy.SortedSetIncrement(defaultRedisKey, "first", -2.1);
differenceValue =0.4 - incResult;
Assert.True(differenceValue < 0.01);
}
#endregion
#region SortedSetDecrement
[Fact]
public void SortedSetDecrement_NotKey_Test()
{
var incResult = redisSortedSetStudy.SortedSetDecrement(defaultRedisKey, "first", 1.0);
Assert.Equal(-1.0, incResult);
}
[Fact]
public void SortedSetDecrementTest()
{
var decResult = redisSortedSetStudy.SortedSetIncrement(defaultRedisKey, "first", -1.0);
Assert.Equal(-1.0, decResult);
decResult = redisSortedSetStudy.SortedSetIncrement(defaultRedisKey, "first", -1.5);
double differenceValue =Math.Abs( -2.5 - decResult);
Assert.True(differenceValue < 0.01);
//减少负值等于增加
decResult = redisSortedSetStudy.SortedSetIncrement(defaultRedisKey, "first", 2.1);
differenceValue =Math.Abs(-0.4 - decResult);
Assert.True(differenceValue < 0.01);
}
#endregion
#region SortedSetLength
[Fact]
public void SortedSetLength_NotKey_Test()
{
var memberCount = redisSortedSetStudy.SortedSetLength(defaultRedisKey);
Assert.Equal(0, memberCount);
}
/// <summary>
/// 排它性参数Exclude设置 测试
/// </summary>
[Fact]
public void SortedSetLength_Exclude_Test()
{
SortedSetEntry[] sortedSetEntries = new SortedSetEntry[]
{
new SortedSetEntry("first",1),
new SortedSetEntry("second",2),
new SortedSetEntry("third",3),
new SortedSetEntry("four",4),
new SortedSetEntry("five",5),
};
redisSortedSetStudy.SortedSetAdd(defaultRedisKey, sortedSetEntries);
//默认Exclude.None [Start,Stop]
var memberCount = redisSortedSetStudy.SortedSetLength(defaultRedisKey, 2, 4, Exclude.None, CommandFlags.None);
Assert.Equal(3, memberCount);
//Exclude.Start (Start,Stop]
memberCount = redisSortedSetStudy.SortedSetLength(defaultRedisKey, 2, 4, Exclude.Start, CommandFlags.None);
Assert.Equal(2, memberCount);
//Exclude.Stop [Start,Stop)
memberCount = redisSortedSetStudy.SortedSetLength(defaultRedisKey, 2, 4, Exclude.Stop, CommandFlags.None);
Assert.Equal(2, memberCount);
//Exclude.Both (Start,Stop)
memberCount = redisSortedSetStudy.SortedSetLength(defaultRedisKey, 2, 4, Exclude.Both, CommandFlags.None);
Assert.Equal(1, memberCount);
}
[Fact]
public void SortedSetLengthTest()
{
SortedSetEntry[] sortedSetEntries=new SortedSetEntry[]
{
new SortedSetEntry("first",1),
new SortedSetEntry("second",2),
new SortedSetEntry("third",3),
new SortedSetEntry("four",4),
new SortedSetEntry("five",5),
};
redisSortedSetStudy.SortedSetAdd(defaultRedisKey, sortedSetEntries);
var memberCount = redisSortedSetStudy.SortedSetLength(defaultRedisKey, 1, 5);
Assert.Equal(sortedSetEntries.Length, memberCount);
}
#endregion
#region SortedSetLengthByValue 分数相同则字典排序
[Fact]
public void SortedSetLengthByValue_NotKey_Test()
{
var memberCount = redisSortedSetStudy.SortedSetLengthByValue(defaultRedisKey,1,200);
Assert.Equal(0, memberCount);
}
/// <summary>
/// 排它性参数Exclude设置 测试
/// </summary>
[Fact]
public void SortedSetLengthByValue_Exclude_Test()
{
SortedSetEntry[] sortedSetEntries = new SortedSetEntry[]
{
new SortedSetEntry("first",0),
new SortedSetEntry("second",0),
new SortedSetEntry("third",0),
new SortedSetEntry("four",0),
new SortedSetEntry("five",0),
};
redisSortedSetStudy.SortedSetAdd(defaultRedisKey, sortedSetEntries);
//默认Exclude.None [Start,Stop]
var memberCount = redisSortedSetStudy.SortedSetLengthByValue(defaultRedisKey, "first", "four", Exclude.None, CommandFlags.None);
Assert.Equal(3, memberCount);
//Exclude.Start (Start,Stop]
memberCount = redisSortedSetStudy.SortedSetLengthByValue(defaultRedisKey, "first", "four", Exclude.Start, CommandFlags.None);
Assert.Equal(2, memberCount);
//Exclude.Stop [Start,Stop)
memberCount = redisSortedSetStudy.SortedSetLengthByValue(defaultRedisKey, "first", "four", Exclude.Stop, CommandFlags.None);
Assert.Equal(2, memberCount);
//Exclude.Both (Start,Stop)
memberCount = redisSortedSetStudy.SortedSetLengthByValue(defaultRedisKey, "first", "four", Exclude.Both, CommandFlags.None);
Assert.Equal(1, memberCount);
}
/// <summary>
/// 分数相同,字典排序,逐字符比较(汉字的比较等待确认)
/// 字典顺序”0”<…<”9”<”A”<…<”Z”<”a”<…<”z”
/// </summary>
[Fact]
public void SortedSetLengthByValueTest()
{
SortedSetEntry[] sortedSetEntries = new SortedSetEntry[]
{
new SortedSetEntry("Andy",0),
new SortedSetEntry("and",0),
new SortedSetEntry("And",0),
new SortedSetEntry("Banana",0),
new SortedSetEntry("color",0),
new SortedSetEntry("query",0),
new SortedSetEntry("remove",0),
new SortedSetEntry("101",0),
new SortedSetEntry("304",0),
new SortedSetEntry("404",0),
new SortedSetEntry("王高峰",0),
new SortedSetEntry("刘山东",0),
};
redisSortedSetStudy.SortedSetAdd(defaultRedisKey, sortedSetEntries);
//数字排序
var memberCount = redisSortedSetStudy.SortedSetLengthByValue(defaultRedisKey, "0", "5");
Assert.Equal(3, memberCount);
memberCount = redisSortedSetStudy.SortedSetLengthByValue(defaultRedisKey, "10", "4");
Assert.Equal(2, memberCount);
memberCount = redisSortedSetStudy.SortedSetLengthByValue(defaultRedisKey, "11", "40");
Assert.Equal(1, memberCount);
//字母排序
memberCount = redisSortedSetStudy.SortedSetLengthByValue(defaultRedisKey, "And", "color");
//And Andy Banana and color
Assert.Equal(5, memberCount);
memberCount = redisSortedSetStudy.SortedSetLengthByValue(defaultRedisKey, "A", "color");
//And Andy Banana and color
Assert.Equal(5, memberCount);
memberCount = redisSortedSetStudy.SortedSetLengthByValue(defaultRedisKey, "A", "B");
//And Andy 不包括Banana,因为Ba排在B后
Assert.Equal(2, memberCount);
memberCount = redisSortedSetStudy.SortedSetLengthByValue(defaultRedisKey, "A", "Bb");
//And Andy Banana
Assert.Equal(3, memberCount);
//汉字排序(转码后比较,转码规则不清楚)
//TODO:汉字排序规则不清楚)
memberCount = redisSortedSetStudy.SortedSetLengthByValue(defaultRedisKey, "王", "赵");
//王高峰
Assert.Equal(1, memberCount);
}
#endregion
#region SortedSetRank
[Fact]
public void SortedSetRank_NotKey_Test()
{
var index = redisSortedSetStudy.SortedSetRank(defaultRedisKey, "first");
Assert.Null(index);
}
[Fact]
public void SortedSetRankTest()
{
SortedSetEntry[] sortedSetEntries = new SortedSetEntry[]
{
new SortedSetEntry("first",1),
new SortedSetEntry("second",2),
new SortedSetEntry("third",3),
new SortedSetEntry("four",4),
new SortedSetEntry("five",5),
};
redisSortedSetStudy.SortedSetAdd(defaultRedisKey, sortedSetEntries);
long? memberRank = null;
memberRank = redisSortedSetStudy.SortedSetRank(defaultRedisKey, "first");
Assert.Equal(0, memberRank);
memberRank = redisSortedSetStudy.SortedSetRank(defaultRedisKey, "second");
Assert.Equal(1, memberRank);
memberRank = redisSortedSetStudy.SortedSetRank(defaultRedisKey, "third");
Assert.Equal(2, memberRank);
memberRank = redisSortedSetStudy.SortedSetRank(defaultRedisKey, "four");
Assert.Equal(3, memberRank);
memberRank = redisSortedSetStudy.SortedSetRank(defaultRedisKey, "five");
Assert.Equal(4, memberRank);
}
#endregion
#region SortedSetRangeByRank
[Fact]
public void SortedSetRangeByRank_NotKey_Test()
{
var members = redisSortedSetStudy.SortedSetRangeByRank(defaultRedisKey);
Assert.Empty(members);
}
[Fact]
public void SortedSetRangeByRankTest()
{
SortedSetEntry[] sortedSetEntries = new SortedSetEntry[]
{
new SortedSetEntry("first",1),
new SortedSetEntry("second",2),
new SortedSetEntry("third",3),
new SortedSetEntry("four",4),
new SortedSetEntry("five",5),
};
redisSortedSetStudy.SortedSetAdd(defaultRedisKey, sortedSetEntries);
var members = redisSortedSetStudy.SortedSetRangeByRank(defaultRedisKey);
Assert.NotEmpty(members);
for (var i=0; i< sortedSetEntries.Length; i++)
{
Assert.Equal(sortedSetEntries[0].Element, members[0]);
}
members = redisSortedSetStudy.SortedSetRangeByRank(defaultRedisKey, 1, -1, Order.Descending, CommandFlags.None);
//four third second first
Assert.Equal(sortedSetEntries[3].Element, members[0]);
Assert.Equal(sortedSetEntries[2].Element, members[1]);
Assert.Equal(sortedSetEntries[1].Element, members[2]);
Assert.Equal(sortedSetEntries[0].Element, members[3]);
}
#endregion
#region SortedSetLengthByValue
[Fact]
public void SortedSetRangeByValue_NotKey_Test()
{
var mumbers = redisSortedSetStudy.SortedSetRangeByValue(defaultRedisKey, 0, -1);
Assert.Empty(mumbers);
}
/// <summary>
/// 排它性参数Exclude设置 测试
/// </summary>
[Fact]
public void SortedSetRangeByValue_Exclude_Test()
{
SortedSetEntry[] sortedSetEntries = new SortedSetEntry[]
{
new SortedSetEntry("first",0),
new SortedSetEntry("second",0),
new SortedSetEntry("third",0),
new SortedSetEntry("four",0),
new SortedSetEntry("five",0),
};
redisSortedSetStudy.SortedSetAdd(defaultRedisKey, sortedSetEntries);
//默认Exclude.None [Start,Stop]
var members = redisSortedSetStudy.SortedSetRangeByValue(defaultRedisKey, "first", "second", Exclude.None);
//firt five four second
Assert.Equal(4, members.Length);
//Exclude.Start (Start,Stop]
members = redisSortedSetStudy.SortedSetRangeByValue(defaultRedisKey, "first", "second", Exclude.Start);
//five four second
Assert.Equal(3, members.Length);
//Exclude.Stop [Start,Stop)
members = redisSortedSetStudy.SortedSetRangeByValue(defaultRedisKey, "first", "four", Exclude.Stop);
Assert.Equal(2, members.Length);
//Exclude.Both (Start,Stop)
members = redisSortedSetStudy.SortedSetRangeByValue(defaultRedisKey, "first", "four", Exclude.Both);
Assert.Single(members);
}
/// <summary>
/// 分数相同,字典排序,逐字符比较(汉字的比较等待确认)
/// 字典顺序”0”<…<”9”<”A”<…<”Z”<”a”<…<”z”
/// </summary>
[Fact]
public void SortedSetRangeByValueTest()
{
SortedSetEntry[] sortedSetEntries = new SortedSetEntry[]
{
new SortedSetEntry("Andy",0),
new SortedSetEntry("and",0),
new SortedSetEntry("And",0),
new SortedSetEntry("Banana",0),
new SortedSetEntry("color",0),
new SortedSetEntry("query",0),
new SortedSetEntry("remove",0),
new SortedSetEntry("101",0),
new SortedSetEntry("304",0),
new SortedSetEntry("404",0),
new SortedSetEntry("王高峰",0),
new SortedSetEntry("刘山东",0),
};
redisSortedSetStudy.SortedSetAdd(defaultRedisKey, sortedSetEntries);
//数字排序
var members = redisSortedSetStudy.SortedSetRangeByValue(defaultRedisKey, "0", "5");
Assert.Contains("101", members);
Assert.Contains("304", members);
Assert.Contains("404", members);
members = redisSortedSetStudy.SortedSetRangeByValue(defaultRedisKey, "10", "4");
Assert.Contains("101", members);
Assert.Contains("304", members);
members = redisSortedSetStudy.SortedSetRangeByValue(defaultRedisKey, "11", "40");
Assert.Contains("304", members);
//字母排序
members = redisSortedSetStudy.SortedSetRangeByValue(defaultRedisKey, "And", "color");
//And Andy Banana and color
Assert.Contains("And", members);
Assert.Contains("Andy", members);
Assert.Contains("Banana", members);
Assert.Contains("and", members);
Assert.Contains("color", members);
members = redisSortedSetStudy.SortedSetRangeByValue(defaultRedisKey, "A", "color");
//And Andy Banana and color
Assert.Contains("And", members);
Assert.Contains("Andy", members);
Assert.Contains("Banana", members);
Assert.Contains("and", members);
Assert.Contains("color", members);
members = redisSortedSetStudy.SortedSetRangeByValue(defaultRedisKey, "A", "B");
//And Andy 不包括Banana,因为Ba排在B后
Assert.Contains("And", members);
Assert.Contains("Andy", members);
members = redisSortedSetStudy.SortedSetRangeByValue(defaultRedisKey, "A", "Bb");
//And Andy Banana
Assert.Contains("And", members);
Assert.Contains("Andy", members);
Assert.Contains("Banana", members);
//TODO:汉字排序规则不清楚
members = redisSortedSetStudy.SortedSetRangeByValue(defaultRedisKey, "王", "赵");
//王高峰
Assert.Contains("王高峰", members);
}
/// <summary>
/// 分页测试
/// </summary>
[Fact]
public void SortedSetRangeByValue_Page_Test()
{
SortedSetEntry[] sortedSetEntries = new SortedSetEntry[]
{
new SortedSetEntry("Andy",0),
new SortedSetEntry("and",0),
new SortedSetEntry("And",0),
new SortedSetEntry("Banana",0),
new SortedSetEntry("color",0),
new SortedSetEntry("query",0),
new SortedSetEntry("remove",0),
new SortedSetEntry("101",0),
new SortedSetEntry("304",0),
new SortedSetEntry("404",0),
new SortedSetEntry("王高峰",0),
new SortedSetEntry("刘山东",0),
};
redisSortedSetStudy.SortedSetAdd(defaultRedisKey, sortedSetEntries);
//第一页
var members = redisSortedSetStudy.SortedSetRangeByValue(defaultRedisKey, "101", "remove", Exclude.None, 0, 4, CommandFlags.None);
Assert.Equal(4, members.Length);
Assert.Contains("101", members);
Assert.Contains("304", members);
Assert.Contains("404", members);
Assert.Contains("And", members);
//第2页
members = redisSortedSetStudy.SortedSetRangeByValue(defaultRedisKey, "101", "remove", Exclude.None, 4, 4, CommandFlags.None);
Assert.Equal(4, members.Length);
Assert.Contains("Andy", members);
Assert.Contains("Banana", members);
Assert.Contains("and", members);
Assert.Contains("color", members);
//第3页
members = redisSortedSetStudy.SortedSetRangeByValue(defaultRedisKey, "101", "remove", Exclude.None, 8, 4, CommandFlags.None);
Assert.Equal(2, members.Length);
Assert.Contains("query", members);
Assert.Contains("remove", members);
}
#endregion
#region SortedSetRangeByScore
[Fact]
public void SortedSetRangeByScore_NotKey_Test()
{
redisSortedSetStudy.SortedSetRangeByScore(defaultRedisKey);
}
#endregion
#region 清理
public void Dispose()
{
redisDatabase.KeyDelete(defaultRedisKey);
}
#endregion
}
}