public void DiscoverChangeHandlerInvocations_InterfaceType_CreatesDescriptor()
        {
            var serviceProvider = new ServiceCollection()
                                  .AddScoped <IBeforeSaveTrigger <IComparable>, TriggerStub <IComparable> >()
                                  .BuildServiceProvider();

            var subject = new TriggerDiscoveryService(new TriggerServiceProviderAccessor(serviceProvider), new TriggerTypeRegistryService());

            var result = subject.DiscoverTriggers(typeof(IBeforeSaveTrigger <>), typeof(string), type => new BeforeSaveTriggerDescriptor(type));

            Assert.Single(result);
        }
        public void DiscoverTriggers_BaseType_CreatesDescriptor()
        {
            var serviceProvider = new ServiceCollection()
                                  .AddScoped <IBeforeSaveTrigger <object>, TriggerStub <object> >()
                                  .BuildServiceProvider();

            var subject = new TriggerDiscoveryService(new TriggerServiceProviderAccessor(serviceProvider), new TriggerTypeRegistryService());

            var result = subject.DiscoverTriggers(typeof(IBeforeSaveTrigger <>), typeof(string), type => new BeforeSaveTriggerDescriptor(type));

            Assert.Single(result);
        }
        public void DiscoverChangeHandlerInvocations_SortTriggersByBaseTypeThenDerivedType()
        {
            var objectTrigger   = new TriggerStub <object>();
            var concreteTrigger = new TriggerStub <string>();

            var serviceProvider = new ServiceCollection()
                                  .AddSingleton <IBeforeSaveTrigger <string> >(concreteTrigger)
                                  .AddSingleton <IBeforeSaveTrigger <object> >(objectTrigger)
                                  .BuildServiceProvider();

            var subject = new TriggerDiscoveryService(new TriggerServiceProviderAccessor(serviceProvider), new TriggerTypeRegistryService());

            var result = subject.DiscoverTriggers(typeof(IBeforeSaveTrigger <>), typeof(string), type => new BeforeSaveTriggerDescriptor(type));

            Assert.Equal(2, result.Count());
            Assert.Equal(objectTrigger, result.First().Trigger);
            Assert.Equal(concreteTrigger, result.Last().Trigger);
        }
        public void DiscoverChangeHandlerInvocations_SortTriggersByInterfaceThenType()
        {
            var interfaceTrigger = new TriggerStub <IComparable>();
            var typeTrigger      = new TriggerStub <string>();

            var serviceProvider = new ServiceCollection()
                                  .AddSingleton <IBeforeSaveTrigger <string> >(typeTrigger)
                                  .AddSingleton <IBeforeSaveTrigger <IComparable> >(interfaceTrigger)
                                  .BuildServiceProvider();

            var subject = new TriggerDiscoveryService(new TriggerServiceProviderAccessor(serviceProvider), new TriggerTypeRegistryService());

            var result = subject.DiscoverTriggers(typeof(IBeforeSaveTrigger <>), typeof(string), type => new BeforeSaveTriggerDescriptor(type));

            Assert.Equal(2, result.Count());
            Assert.Equal(interfaceTrigger, result.First().Trigger);
            Assert.Equal(typeTrigger, result.Last().Trigger);
        }
        public void SetServiceProvider_OverridesDefaultServiceProvider()
        {
            var defaultServiceProviderTrigger  = new TriggerStub <object>();
            var externalServiceProviderTrigger = new TriggerStub <object>();

            var defaultServiceProvider = new ServiceCollection()
                                         .BuildServiceProvider();

            var externalServiceProvider = new ServiceCollection()
                                          .AddSingleton <IBeforeSaveTrigger <object> >(externalServiceProviderTrigger)
                                          .BuildServiceProvider();

            var subject = new TriggerDiscoveryService(new TriggerServiceProviderAccessor(defaultServiceProvider), new TriggerTypeRegistryService());

            subject.ServiceProvider = externalServiceProvider;

            var result = subject.DiscoverTriggers(typeof(IBeforeSaveTrigger <>), typeof(string), type => new BeforeSaveTriggerDescriptor(type));

            Assert.Single(result);
        }
        public void DiscoverChangeHandlerInvocations_SortByPriorities()
        {
            var earlyTrigger = new TriggerStub <object> {
                Priority = CommonTriggerPriority.Early
            };
            var lateTrigger = new TriggerStub <object> {
                Priority = CommonTriggerPriority.Late
            };

            var serviceProvider = new ServiceCollection()
                                  .AddSingleton <IBeforeSaveTrigger <object> >(lateTrigger)
                                  .AddSingleton <IBeforeSaveTrigger <object> >(earlyTrigger)
                                  .BuildServiceProvider();

            var subject = new TriggerDiscoveryService(new TriggerServiceProviderAccessor(serviceProvider), new TriggerTypeRegistryService());

            var result = subject.DiscoverTriggers(typeof(IBeforeSaveTrigger <>), typeof(string), type => new BeforeSaveTriggerDescriptor(type));

            Assert.Equal(2, result.Count());
            Assert.Equal(earlyTrigger, result.First().Trigger);
            Assert.Equal(lateTrigger, result.Last().Trigger);
        }