Unit tests for chat command prefix parsing and routing. Verifies ChatCommandPrefix.Owns, parsing behavior for exact slash-root tokens, handling of quoted arguments, resolution to CommandRoute, and that malformed or oversized inputs are still considered owned and produce an error on parse.
using SboxSuperuser.Core.Commands;
using Xunit;
namespace SboxSuperuser.Tests;
public sealed class ChatCommandPrefixTests
{
[Theory]
[InlineData( "/admin", true )]
[InlineData( "/admin help", true )]
[InlineData( "/admin\thelp", true )]
[InlineData( "/administrator", false )]
[InlineData( "/admin-extra", false )]
[InlineData( "!admin help", false )]
[InlineData( "hello /admin", false )]
[InlineData( " /admin help", false )]
[InlineData( "/Admin help", false )]
[InlineData( null, false )]
public void OnlyExactSlashRootWithTokenBoundaryIsOwned( string message, bool expected )
{
Assert.Equal( expected, new ChatCommandPrefix( "admin" ).Owns( message ) );
}
[Fact]
public void EmptyRootPayloadRoutesToHelpAndQuotedValuesRemainWhole()
{
var prefix = new ChatCommandPrefix( "operators" );
Assert.False( prefix.Owns( "/admin help" ) );
Assert.Equal( "help", CommandRoute.Resolve( prefix.Parse( "/operators" ).Tokens ).Command );
var route = CommandRoute.Resolve( prefix.Parse( "/operators user \"Some Player\" group add moderator" ).Tokens );
Assert.Equal( "user.group.add", route.Command );
Assert.Equal( new[] { "Some Player", "moderator" }, route.Arguments );
}
[Fact]
public void MalformedAndOversizedAdminInputIsStillOwned()
{
var prefix = new ChatCommandPrefix( "admin" );
foreach ( var message in new[] { "/admin \"unfinished", "/admin\nhelp", "/admin " + new string( 'x', 4096 ) } )
{
Assert.True( prefix.Owns( message ) );
Assert.NotNull( prefix.Parse( message ).Error );
}
}
}