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 { /// /// Redis 集合学习 测试 /// [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"; /// /// 构造 /// 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); } /// /// 排它性参数Exclude设置 测试 /// [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); } /// /// 排它性参数Exclude设置 测试 /// [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); } /// /// 分数相同,字典排序,逐字符比较(汉字的比较等待确认) /// 字典顺序(”0”<…<”9”<”A”<…<”Z”<”a”<…<”z”) /// [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 清理 public void Dispose() { redisDatabase.KeyDelete(defaultRedisKey); } #endregion } }