@@ -16,11 +16,13 @@ namespace Discord.Net.Commands.Tests | |||
new CommandServiceConfig{ SeparatorChar = '"'} | |||
}.Select(x => new object[] { x, x.SeparatorChar }); | |||
public static IEnumerable<string> DefaultAliases => _defaultAliases; | |||
private static readonly IEnumerable<string> _defaultAliases = new List<string> | |||
public static IEnumerable<object[]> CaseSensitivityTestData => _caseSensitivityTestData; | |||
private static readonly IEnumerable<object[]> _caseSensitivityTestData = new object[][] | |||
{ | |||
"debug ping", | |||
"debug pong" | |||
new object[]{ true, false }, | |||
new object[]{ true, true }, | |||
new object[]{ false, true }, | |||
new object[]{ false, false } | |||
}; | |||
} | |||
} |
@@ -1,4 +1,5 @@ | |||
using Discord.Commands; | |||
using Moq; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
@@ -14,37 +15,40 @@ namespace Discord.Net.Commands.Tests | |||
public async Task CommandSeparators(CommandServiceConfig config, char separatorChar) | |||
{ | |||
var service = new CommandService(config); | |||
var module = await service.AddModuleAsync(typeof(DummyModule)).ConfigureAwait(false); | |||
await service.AddModuleAsync(typeof(DummyModule)).ConfigureAwait(false); | |||
Assert.True(CommandsLoaded(service, separatorChar)); | |||
var contextMock = new Mock<ICommandContext>(); | |||
var context = contextMock.Object; | |||
var dummyContext = new DummyCommandContext(); | |||
foreach (var _alias in DefaultAliases) | |||
foreach (var _name in DummyModule.CommandNames) | |||
{ | |||
var alias = _alias.Replace(' ', separatorChar); | |||
var name = _name.Replace(' ', separatorChar); | |||
var result = service.Search(dummyContext, alias); | |||
var result = service.Search(context, name); | |||
Assert.True(result.IsSuccess, result.ErrorReason); | |||
} | |||
} | |||
public bool CommandsLoaded(CommandService service, char separatorChar) | |||
[Theory] | |||
[MemberData(nameof(CaseSensitivityTestData), MemberType = typeof(CommandServiceConfigTests))] | |||
public async Task CaseSensitivity(bool caseSensitive, bool upperCase) | |||
{ | |||
if (!service.Commands.Any()) | |||
return false; | |||
var service = new CommandService(new CommandServiceConfig { CaseSensitiveCommands = caseSensitive }); | |||
await service.AddModuleAsync(typeof(DummyModule)).ConfigureAwait(false); | |||
var loadedAliases = service.Commands.SelectMany(x => x.Aliases); | |||
var contextMock = new Mock<ICommandContext>(); | |||
var context = contextMock.Object; | |||
foreach (var alias in DefaultAliases) | |||
foreach (var _name in DummyModule.CommandNames) | |||
{ | |||
if (!loadedAliases.Contains(alias.Replace(' ', separatorChar))) | |||
{ | |||
return false; | |||
} | |||
} | |||
var name = upperCase ? _name.ToUpper() : _name; | |||
return true; | |||
var result = service.Search(context, name); | |||
if (caseSensitive && upperCase) | |||
Assert.False(result.IsSuccess, $"Searching for `{name}` returned successfully"); | |||
else | |||
Assert.True(result.IsSuccess, result.ErrorReason); | |||
} | |||
} | |||
} | |||
} |
@@ -0,0 +1,45 @@ | |||
using Discord.Commands; | |||
using System; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
using Xunit; | |||
namespace Discord.Net.Commands.Tests | |||
{ | |||
class CommandServiceTests | |||
{ | |||
[Fact] | |||
public async Task CommandsLoad() | |||
{ | |||
var service = new CommandService(); | |||
var module = await service.AddModuleAsync(typeof(DummyModule)).ConfigureAwait(false); | |||
Assert.NotNull(module); | |||
var commandAliases = module.Commands.SelectMany(x => x.Aliases); | |||
foreach (var name in DummyModule.CommandNames) | |||
{ | |||
Assert.True(commandAliases.Contains(name), $"The loaded module did not contain the command {name}"); | |||
} | |||
} | |||
[Fact] | |||
public async Task MultipleLoadsThrows() | |||
{ | |||
var service = new CommandService(); | |||
var module = await service.AddModuleAsync(typeof(DummyModule)).ConfigureAwait(false); | |||
await Assert.ThrowsAsync<ArgumentException>(() => service.AddModuleAsync(typeof(DummyModule))) | |||
.ConfigureAwait(false); | |||
} | |||
[Fact] | |||
public async Task InvalidTypeThrows() | |||
{ | |||
var service = new CommandService(); | |||
await Assert.ThrowsAsync<InvalidOperationException>(() => service.AddModuleAsync(typeof(CommandServiceTests))) | |||
.ConfigureAwait(false); | |||
} | |||
} | |||
} |
@@ -12,6 +12,7 @@ | |||
<ItemGroup> | |||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" /> | |||
<PackageReference Include="Moq" Version="4.7.25" /> | |||
<PackageReference Include="xunit" Version="2.2.0" /> | |||
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" /> | |||
</ItemGroup> | |||
@@ -1,20 +0,0 @@ | |||
using Discord.Commands; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
namespace Discord.Net.Commands.Tests | |||
{ | |||
class DummyCommandContext : ICommandContext | |||
{ | |||
public IDiscordClient Client { get; set; } | |||
public IGuild Guild { get; set; } | |||
public IMessageChannel Channel { get; set; } | |||
public IUser User { get; set; } | |||
public IUserMessage Message { get; set; } | |||
} | |||
} |
@@ -20,5 +20,19 @@ namespace Discord.Net.Commands.Tests | |||
{ | |||
return Task.Delay(0); | |||
} | |||
//NOTE: do not add this to CommandNames: it is intentional for this command to not be loaded! | |||
[Command("doesNotLoad")] | |||
private Task DoesNotLoadAsync() | |||
{ | |||
return Task.Delay(0); | |||
} | |||
public static IEnumerable<string> CommandNames => _commandNames; | |||
private static readonly IEnumerable<string> _commandNames = new List<string> | |||
{ | |||
"debug ping", | |||
"debug pong" | |||
}; | |||
} | |||
} |