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
}
}