namespace Syrette.Tests; public class ServiceContainerRegistrationTests { [Fact(DisplayName = "AddSingleton registers a service that can be resolved")] public void AddSingleton_TInterface_TImplementation_registers_successfully() { var container = new ServiceContainer(); container.AddSingleton(); Assert.NotNull(container.GetService()); } [Fact(DisplayName = "AddSingleton with constructor args registers and resolves")] public void AddSingleton_TInterface_TImplementation_with_args_registers_successfully() { var container = new ServiceContainer(); container.AddSingleton(Guid.NewGuid()); Assert.NotNull(container.GetService()); } [Fact(DisplayName = "AddSingleton (self-registration) registers and resolves")] public void AddSingleton_TClass_registers_successfully() { var container = new ServiceContainer(); container.AddSingleton(); Assert.NotNull(container.GetService()); } [Fact(DisplayName = "AddSingleton with constructor args registers and resolves")] public void AddSingleton_TClass_with_args_registers_successfully() { var container = new ServiceContainer(); container.AddSingleton(Guid.NewGuid()); Assert.NotNull(container.GetService()); } [Fact(DisplayName = "AddTransient registers a service that can be resolved")] public void AddTransient_TInterface_TImplementation_registers_successfully() { var container = new ServiceContainer(); container.AddTransient(); Assert.NotNull(container.GetService()); } [Fact(DisplayName = "AddTransient with constructor args registers and resolves")] public void AddTransient_TInterface_TImplementation_with_args_registers_successfully() { var container = new ServiceContainer(); container.AddTransient(Guid.NewGuid()); Assert.NotNull(container.GetService()); } [Fact(DisplayName = "AddTransient (self-registration) registers and resolves")] public void AddTransient_TClass_registers_successfully() { var container = new ServiceContainer(); container.AddTransient(); Assert.NotNull(container.GetService()); } [Fact(DisplayName = "AddTransient with constructor args registers and resolves")] public void AddTransient_TClass_with_args_registers_successfully() { var container = new ServiceContainer(); container.AddTransient(Guid.NewGuid()); Assert.NotNull(container.GetService()); } [Fact(DisplayName = "Fluent chaining returns the same ServiceContainer instance")] public void Fluent_chaining_returns_same_container() { var container = new ServiceContainer(); var result = container .AddSingleton() .AddTransient(); Assert.Same(container, result); } [Fact(DisplayName = "Registering the same (ServiceType, ImplementationType) pair twice throws InvalidOperationException")] public void Duplicate_registration_same_pair_throws() { var container = new ServiceContainer(); container.AddSingleton(); Assert.Throws(() => container.AddSingleton()); } [Fact(DisplayName = "Registering two different implementations for the same service type is allowed and both are resolvable")] public void Duplicate_registration_different_impl_for_same_service_allowed() { var container = new ServiceContainer(); container.AddSingleton(); container.AddSingleton(); var services = container.GetServiceTypes(); Assert.Equal(2, services.Count); Assert.Contains(typeof(TestServiceImpl), services); Assert.Contains(typeof(TestServiceAlt), services); } }