列表List单元测试通过

This commit is contained in:
大石头 2020-01-12 09:44:37 +08:00
parent 0c205a154b
commit 8ac77afaa7
6 changed files with 322 additions and 8 deletions

112
.editorconfig Normal file
View File

@ -0,0 +1,112 @@
# EditorConfig is awesome:http://EditorConfig.org
# https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference
# top-most EditorConfig file
root = true
# Don't use tabs for indentation.
[*]
indent_style = space
# (Please don't specify an indent_size here; that has too many unintended consequences.)
# Code files
[*.{cs,csx,vb,vbx}]
indent_size = 4
insert_final_newline = false
charset = utf-8-bom
end_of_line = crlf
# Xml project files
[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}]
indent_size = 2
# Xml config files
[*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}]
indent_size = 2
# JSON files
[*.json]
indent_size = 2
# Dotnet code style settings:
[*.{cs,vb}]
# Sort using and Import directives with System.* appearing first
dotnet_sort_system_directives_first = true
csharp_indent_case_contents = true
csharp_indent_switch_labels = true
csharp_indent_labels = flush_left
#csharp_space_after_cast = true
#csharp_space_after_keywords_in_control_flow_statements = true
#csharp_space_between_method_declaration_parameter_list_parentheses = true
#csharp_space_between_method_call_parameter_list_parentheses = true
#csharp_space_between_parentheses = control_flow_statements, type_casts
# 单行放置代码
csharp_preserve_single_line_statements = true
csharp_preserve_single_line_blocks = true
# Avoid "this." and "Me." if not necessary
dotnet_style_qualification_for_field = false:warning
dotnet_style_qualification_for_property = false:warning
dotnet_style_qualification_for_method = false:warning
dotnet_style_qualification_for_event = false:warning
# Use language keywords instead of framework type names for type references
dotnet_style_predefined_type_for_locals_parameters_members = false:suggestion
dotnet_style_predefined_type_for_member_access = false:suggestion
#dotnet_style_require_accessibility_modifiers = for_non_interface_members:none/always:suggestion
# Suggest more modern language features when available
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_null_propagation = true:suggestion
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_prefer_inferred_tuple_names = true:suggestion
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
# CSharp code style settings:
[*.cs]
# Prefer "var" everywhere
csharp_style_var_for_built_in_types = true:warning
csharp_style_var_when_type_is_apparent = true:warning
csharp_style_var_elsewhere = true:warning
# Prefer method-like constructs to have a block body
csharp_style_expression_bodied_methods = when_on_single_line:suggestion
csharp_style_expression_bodied_constructors = when_on_single_line:suggestion
csharp_style_expression_bodied_operators = when_on_single_line:suggestion
# Prefer property-like constructs to have an expression-body
csharp_style_expression_bodied_properties = true:suggestion
csharp_style_expression_bodied_indexers = true:suggestion
#csharp_style_expression_bodied_accessors = true:suggestion
# Suggest more modern language features when available
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
csharp_style_inlined_variable_declaration = true:suggestion
csharp_prefer_simple_default_expression = true:suggestion
csharp_style_deconstructed_variable_declaration = true:suggestion
csharp_style_pattern_local_over_anonymous_function = true:suggestion
csharp_style_throw_expression = true:suggestion
csharp_style_conditional_delegate_call = true:suggestion
# 单行不需要大括号
csharp_prefer_braces = false:suggestion
# Newline settings
csharp_new_line_before_open_brace = all
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_between_query_expression_clauses = true
[*.md]
trim_trailing_whitespace = false

View File

@ -16,6 +16,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Test2", "Test2\Test2.csproj
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XUnitTest", "XUnitTest\XUnitTest.csproj", "{08A39462-0531-45AB-ACBB-03F62AF4400F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{719C113A-6804-4150-8473-BF889F06DFD6}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU

View File

@ -124,9 +124,9 @@ namespace NewLife.Caching
#endregion
#region
/// <summary>批量添加</summary>
/// <summary>右边批量添加,返回队列元素总数</summary>
/// <param name="values"></param>
/// <returns></returns>
/// <returns>队列元素总数</returns>
public Int32 RPUSH(IEnumerable<T> values)
{
var args = new List<Object>
@ -140,9 +140,9 @@ namespace NewLife.Caching
return Execute(rc => rc.Execute<Int32>("RPUSH", args.ToArray()), true);
}
/// <summary>批量添加</summary>
/// <summary>左边批量添加,返回队列元素总数</summary>
/// <param name="values"></param>
/// <returns></returns>
/// <returns>队列元素总数</returns>
public Int32 LPUSH(IEnumerable<T> values)
{
var args = new List<Object>
@ -156,6 +156,22 @@ namespace NewLife.Caching
return Execute(rc => rc.Execute<Int32>("LPUSH", args.ToArray()), true);
}
/// <summary>移除并返回最右边一个元素</summary>
/// <returns></returns>
public T RPOP() => Execute(rc => rc.Execute<T>("RPOP", Key), true);
/// <summary>移除并返回最左边一个元素</summary>
/// <returns></returns>
public T LPOP() => Execute(rc => rc.Execute<T>("LPOP", Key), true);
/// <summary>移除并返回最右边一个元素,并插入目标列表左边,原子操作</summary>
/// <remarks>
/// 用于高可靠性消费
/// </remarks>
/// <param name="destKey">目标列表</param>
/// <returns></returns>
public T RPOPLPUSH(String destKey) => Execute(rc => rc.Execute<T>("RPOPLPUSH", Key, destKey), true);
/// <summary>在指定元素之前插入</summary>
/// <param name="pivot"></param>
/// <param name="value"></param>

181
XUnitTest/ListTests.cs Normal file
View File

@ -0,0 +1,181 @@
using NewLife.Caching;
using System;
using System.Linq;
using Xunit;
namespace XUnitTest
{
public class ListTests
{
private readonly FullRedis _redis;
public ListTests()
{
_redis = new FullRedis("127.0.0.1:6379", null, 2);
}
[Fact]
public void List_Normal()
{
var key = "lkey";
// 删除已有
_redis.Remove(key);
var l = _redis.GetList<String>(key);
_redis.SetExpire(key, TimeSpan.FromSeconds(60));
var list = l as RedisList<String>;
Assert.NotNull(list);
// 取出个数
var count = list.Count;
Assert.Equal(0, count);
// 添加
var vs = new[] { "1234", "abcd", "新生命团队", "ABEF" };
list.Add(vs[0]);
list.AddRange(vs.Skip(1));
// 对比个数
var count2 = list.Count;
Assert.Equal(count + vs.Length, count2);
Assert.False(l.IsReadOnly);
// 取出来
Assert.Equal(vs.Length, list.Count);
Assert.Equal(vs[0], list[0]);
Assert.Equal(vs[1], list[1]);
Assert.Equal(vs[2], list[2]);
Assert.Equal(vs[3], list[3]);
var exist = list.Contains(vs[3]);
Assert.True(exist);
}
[Fact]
public void List_Copy()
{
var key = "lkey_copy";
// 删除已有
_redis.Remove(key);
var l = _redis.GetList<String>(key);
_redis.SetExpire(key, TimeSpan.FromSeconds(60));
var list = l as RedisList<String>;
// 添加
var vs = new[] { "1234", "abcd", "新生命团队", "ABEF" };
list.AddRange(vs);
// 拷贝
var vs3 = new String[2];
list.CopyTo(vs3, 0);
Assert.Equal(2, vs3.Length);
Assert.Equal(vs[0], vs3[0]);
Assert.Equal(vs[1], vs3[1]);
}
[Fact]
public void List_Remove()
{
var key = "lkey_remove";
// 删除已有
_redis.Remove(key);
var l = _redis.GetList<String>(key);
_redis.SetExpire(key, TimeSpan.FromSeconds(60));
var list = l as RedisList<String>;
// 添加
var vs = new[] { "1234", "abcd", "新生命团队", "ABEF" };
list.AddRange(vs);
// 索引、删除
var idx = list.IndexOf("abcd");
Assert.Equal(1, idx);
list.RemoveAt(3);
list.Remove("1234");
Assert.Equal(2, list.Count);
Assert.Equal("abcd", list[0]);
// 插入
list.Insert(1, "12345");
Assert.Equal("abcd", list[0]);
Assert.Equal("12345", list[1]);
Assert.Equal("新生命团队", list[2]);
Assert.Equal(3, list.Count);
}
[Fact]
public void List_Advance()
{
var key = "lkey_advance";
// 删除已有
_redis.Remove(key);
var l = _redis.GetList<String>(key);
_redis.SetExpire(key, TimeSpan.FromSeconds(60));
var list = l as RedisList<String>;
Assert.NotNull(list);
// 添加
var vs = new[] { "1234", "abcd", "新生命团队", "ABEF" };
list.AddRange(vs);
// 压入
var vs2 = new[] { "0000", "1111" };
var n2 = list.LPUSH(vs2);
Assert.Equal(vs.Length + vs2.Length, n2);
Assert.Equal(vs2[1], list[0]);
Assert.Equal(vs2[0], list[1]);
var vs3 = new[] { "0000", "1111" };
var n3 = list.RPUSH(vs3);
Assert.Equal(vs.Length + vs2.Length + vs3.Length, n3);
Assert.Equal(vs3[1], list[0]);
Assert.Equal(vs3[0], list[1]);
// 弹出
var item1 = list.LPOP();
Assert.Equal(vs2[1], item1);
var item2 = list.RPOP();
Assert.Equal(vs3[1], item2);
}
[Fact]
public void RPOPLPUSH_Test()
{
var key = "lkey_rpoplpush";
var key2 = "lkey_rpoplpush2";
// 删除已有
_redis.Remove(key);
_redis.Remove(key2);
var l = _redis.GetList<String>(key);
_redis.SetExpire(key, TimeSpan.FromSeconds(60));
var list = l as RedisList<String>;
Assert.NotNull(list);
// 添加
var vs = new[] { "1234", "abcd", "新生命团队", "ABEF" };
list.AddRange(vs);
// 原子消费
list.RPOPLPUSH(key2);
Assert.Equal(vs.Length - 1, list.Count);
Assert.Equal(vs[2], list.RPOP());
// 第二列表
var l2 = _redis.GetList<String>(key2);
_redis.SetExpire(key2, TimeSpan.FromSeconds(60));
Assert.Equal(vs[3], l2[0]);
Assert.Equal(1, l2.Count);
}
}
}

View File

@ -36,7 +36,7 @@ namespace XUnitTest
// 添加
var vs = new[] { "1234", "abcd", "新生命团队", "ABEF" };
q.Add(vs);
queue.Add(vs);
// 对比个数
var count2 = queue.Count;
@ -44,7 +44,7 @@ namespace XUnitTest
Assert.Equal(count + vs.Length, count2);
// 取出来
var vs2 = q.Take(2).ToArray();
var vs2 = queue.Take(2).ToArray();
Assert.Equal(2, vs2.Length);
Assert.Equal(vs[0], vs2[0]);
Assert.Equal(vs[1], vs2[1]);

View File

@ -36,7 +36,7 @@ namespace XUnitTest
// 添加
var vs = new[] { "1234", "abcd", "新生命团队", "ABEF" };
s.Add(vs);
stack.Add(vs);
// 对比个数
var count2 = stack.Count;
@ -44,7 +44,7 @@ namespace XUnitTest
Assert.Equal(count + vs.Length, count2);
// 取出来
var vs2 = s.Take(2).ToArray();
var vs2 = stack.Take(2).ToArray();
Assert.Equal(2, vs2.Length);
Assert.Equal(vs[3], vs2[0]);
Assert.Equal(vs[2], vs2[1]);