列表List单元测试通过
This commit is contained in:
parent
0c205a154b
commit
8ac77afaa7
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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]);
|
||||
|
|
|
@ -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]);
|
||||
|
|
Loading…
Reference in New Issue