mirror of
https://github.com/Facepunch/sbox-public.git
synced 2025-12-23 22:48:07 -05:00
- Added Sandbox.Test.Unit project (contains independent tests that can run in parallel) - Modify some slow/stress tests (e.g. instead of doing a million iterations settle for 10k). Tests run almost twice as fast now.
127 lines
2.9 KiB
C#
127 lines
2.9 KiB
C#
using Sandbox.Network;
|
|
|
|
namespace Networking;
|
|
|
|
[TestClass]
|
|
public class StringTable
|
|
{
|
|
private void StringTablesMatch( Sandbox.Network.StringTable a, Sandbox.Network.StringTable b )
|
|
{
|
|
Assert.AreEqual( a.Entries.Count, b.Entries.Count );
|
|
|
|
foreach ( var e in a.Entries )
|
|
{
|
|
Assert.IsTrue( b.Entries.TryGetValue( e.Key, out var d ) );
|
|
Assert.IsTrue( d.Data.SequenceEqual( e.Value.Data ) );
|
|
}
|
|
}
|
|
|
|
[TestMethod]
|
|
public void Set()
|
|
{
|
|
Sandbox.Network.StringTable table = new( "Assembly", true );
|
|
|
|
table.Set( "TestAssembly", new byte[883712] );
|
|
|
|
Assert.AreEqual( 1, table.Entries.Count );
|
|
}
|
|
|
|
void DoUpdateExchange( Sandbox.Network.StringTable a, Sandbox.Network.StringTable b )
|
|
{
|
|
Assert.IsTrue( a.HasChanged );
|
|
|
|
var bs = ByteStream.Create( 1024 );
|
|
a.BuildUpdateMessage( ref bs );
|
|
var updateData = bs.ToArray();
|
|
bs.Dispose();
|
|
Assert.IsTrue( a.HasChanged );
|
|
a.ClearChanges();
|
|
Assert.IsFalse( a.HasChanged );
|
|
|
|
Assert.AreNotEqual( 0, updateData.Length );
|
|
|
|
var reader = ByteStream.CreateReader( updateData );
|
|
b.ReadUpdate( reader );
|
|
reader.Dispose();
|
|
}
|
|
|
|
void DoSnapshotExchange( Sandbox.Network.StringTable a, Sandbox.Network.StringTable b )
|
|
{
|
|
var bs = ByteStream.Create( 1024 );
|
|
a.BuildSnapshotMessage( ref bs );
|
|
var snapshotData = bs.ToArray();
|
|
bs.Dispose();
|
|
|
|
Assert.AreNotEqual( 0, snapshotData.Length );
|
|
|
|
var reader = ByteStream.CreateReader( snapshotData );
|
|
b.Reset();
|
|
|
|
b.ReadSnapshot( reader );
|
|
reader.Dispose();
|
|
}
|
|
|
|
[TestMethod]
|
|
public void Updates()
|
|
{
|
|
Sandbox.Network.StringTable a = new( "Assembly", true );
|
|
|
|
a.Set( "TestAssembly", new byte[883712] );
|
|
a.Set( "OtherAssembly", new byte[2345] );
|
|
|
|
Assert.AreEqual( 2, a.Entries.Count );
|
|
|
|
Sandbox.Network.StringTable b = new( "Assembly", true );
|
|
|
|
DoUpdateExchange( a, b );
|
|
|
|
Assert.AreEqual( a.Entries.Count, b.Entries.Count );
|
|
|
|
a.Remove( "TestAssembly" );
|
|
Assert.AreEqual( 1, a.Entries.Count );
|
|
|
|
DoUpdateExchange( a, b );
|
|
|
|
Assert.AreEqual( a.Entries.Count, b.Entries.Count );
|
|
|
|
a.Set( "HelloThere", new byte[2345] );
|
|
Assert.AreEqual( 2, a.Entries.Count );
|
|
|
|
DoUpdateExchange( a, b );
|
|
|
|
Assert.AreEqual( a.Entries.Count, b.Entries.Count );
|
|
}
|
|
|
|
[TestMethod]
|
|
public void EmptyEntries()
|
|
{
|
|
Sandbox.Network.StringTable a = new( "Assembly", true );
|
|
|
|
// start with an empty entry
|
|
a.Set( "TestAssembly", new byte[0] );
|
|
a.Set( "OtherAssembly", new byte[2345] );
|
|
|
|
Assert.AreEqual( 2, a.Entries.Count );
|
|
Sandbox.Network.StringTable b = new( "Assembly", true );
|
|
DoUpdateExchange( a, b );
|
|
StringTablesMatch( a, b );
|
|
|
|
// Change to empty
|
|
a.Set( "OtherAssembly", new byte[0] );
|
|
DoUpdateExchange( a, b );
|
|
StringTablesMatch( a, b );
|
|
|
|
// change to not empty
|
|
a.Set( "TestAssembly", new byte[43] );
|
|
a.Set( "OtherAssembly", new byte[56] );
|
|
DoUpdateExchange( a, b );
|
|
StringTablesMatch( a, b );
|
|
|
|
// change to empty again
|
|
a.Set( "OtherAssembly", new byte[0] );
|
|
DoSnapshotExchange( a, b );
|
|
StringTablesMatch( a, b );
|
|
}
|
|
|
|
}
|