namespace EonaCat.FastBin.Tester { public class User { public int Id; public string Name; public string Email; public DateTime CreatedAt; public List Orders; public User Manager; // Self-referencing for testing } public class Order { public Guid OrderId; public decimal TotalAmount; public List Items; public OrderStatus Status; } public class OrderItem { public string ProductName; public int Quantity; public decimal Price; } public enum OrderStatus { Pending, Processing, Shipped, Delivered } public class GetUserRequest { public int UserId; } public class CreateOrderRequest { public int UserId; public List Items; } public class CreateOrderResponse { public Guid OrderId; public string Message; } class Program { static async Task Main(string[] args) { Console.WriteLine("=== EonaCat.FastBin Tester ===\n"); // Test 1: Basic Serialization Console.WriteLine("Test 1: Basic Serialization"); TestBasicSerialization(); // Test 2: Complex Objects with Nesting Console.WriteLine("\nTest 2: Complex Objects with Nesting"); TestComplexObjects(); // Test 3: Self-Referencing Objects Console.WriteLine("\nTest 3: Self-Referencing Objects"); TestSelfReferencing(); // Test 4: Polymorphism Console.WriteLine("\nTest 4: Polymorphism"); TestPolymorphism(); // Test 5: Client-Server Communication Console.WriteLine("\nTest 5: Client-Server Communication"); await TestClientServer(); Console.WriteLine("\n=== All EonaCat.FastBin Tests Complete ==="); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } static void TestBasicSerialization() { var data = new Dictionary { ["string"] = "Someone is a brasser", ["int"] = 42, ["double"] = 3.14159, ["bool"] = true, ["guid"] = Guid.NewGuid(), ["date"] = DateTime.Now }; var bytes = FastBin.Serialize(data); var restored = FastBin.Deserialize>(bytes); Console.WriteLine($"Original count: {data.Count}"); Console.WriteLine($"Restored count: {restored.Count}"); Console.WriteLine($"Serialized size: {bytes.Length} bytes"); Console.WriteLine("Basic serialization works!"); } static void TestComplexObjects() { var user = new User { Id = 1, Name = "Brian Asser", Email = "brasser@example.com", CreatedAt = DateTime.Now, Orders = new List { new Order { OrderId = Guid.NewGuid(), TotalAmount = 299.99m, Status = OrderStatus.Delivered, Items = new List { new OrderItem { ProductName = "Laptop", Quantity = 1, Price = 299.99m } } } } }; var bytes = FastBin.Serialize(user); var restored = FastBin.Deserialize(bytes); Console.WriteLine($"User: {restored.Name}"); Console.WriteLine($"Orders: {restored.Orders.Count}"); Console.WriteLine($"First order total: ${restored.Orders[0].TotalAmount}"); Console.WriteLine($"Serialized size: {bytes.Length} bytes"); Console.WriteLine("Complex objects work!"); } static void TestSelfReferencing() { var manager = new User { Id = 1, Name = "Manager", Email = "manager@example.com", CreatedAt = DateTime.Now }; var employee = new User { Id = 2, Name = "Brasser", Email = "brasser@example.com", CreatedAt = DateTime.Now, Manager = manager }; manager.Manager = manager; // Self-reference var bytes = FastBin.Serialize(employee); var restored = FastBin.Deserialize(bytes); Console.WriteLine($"Employee: {restored.Name}"); Console.WriteLine($"Manager: {restored.Manager.Name}"); Console.WriteLine($"Manager's manager: {restored.Manager.Manager.Name}"); Console.WriteLine($"Self-reference intact: {ReferenceEquals(restored.Manager, restored.Manager.Manager)}"); Console.WriteLine("Self-referencing works!"); } static void TestPolymorphism() { object[] items = new object[] { "A string", 42, new User { Id = 1, Name = "ThisGuy", Email = "ThisGuy@test.com", CreatedAt = DateTime.Now }, new Order { OrderId = Guid.NewGuid(), TotalAmount = 99.99m, Status = OrderStatus.Pending } }; var bytes = FastBin.Serialize(items); var restored = FastBin.Deserialize(bytes); Console.WriteLine($"Item 0: {restored[0]} (type: {restored[0].GetType().Name})"); Console.WriteLine($"Item 1: {restored[1]} (type: {restored[1].GetType().Name})"); Console.WriteLine($"Item 2: {((User)restored[2]).Name} (type: {restored[2].GetType().Name})"); Console.WriteLine($"Item 3: ${((Order)restored[3]).TotalAmount} (type: {restored[3].GetType().Name})"); Console.WriteLine("Polymorphism works!"); } static async Task TestClientServer() { var server = new FastServer(); // Register handlers server.RegisterHandler("GetUser", request => { return new User { Id = request.UserId, Name = "Brian Asser", Email = "Brasser@example.com", CreatedAt = DateTime.Now, Orders = new List() }; }); server.RegisterHandler("CreateOrder", request => { return new CreateOrderResponse { OrderId = Guid.NewGuid(), Message = $"Order created for user {request.UserId} with {request.Items.Count} items" }; }); // Start server in background var serverTask = Task.Run(() => server.StartAsync(5000)); // Give server time to start await Task.Delay(1000); try { // Create client using (var client = new FastClient()) { await client.ConnectAsync("localhost", 5000); Console.WriteLine("Connected to server"); // Test GetUser var user = await client.CallAsync( "GetUser", new GetUserRequest { UserId = 123 } ); Console.WriteLine($"Retrieved user: {user.Name} ({user.Email})"); // Test CreateOrder var orderResponse = await client.CallAsync( "CreateOrder", new CreateOrderRequest { UserId = 123, Items = new List { new OrderItem { ProductName = "Widget", Quantity = 5, Price = 19.99m } } } ); Console.WriteLine($"Created order: {orderResponse.OrderId}"); Console.WriteLine($"Message: {orderResponse.Message}"); } Console.WriteLine("Client-Server communication works!"); } finally { server.Stop(); } } } }