public void HigherPriorityClassIsPickedOverLowerPriorityDuringRegistration()
        {
            // arrange
            var sut = new AutomaticRegistrationMock();

            // act
            sut.RetrieveClassesRequiringRegistration(true);

            // assert
            sut.DiscoveredTypes.Should().Contain(typeof(HigherPriorityDummy));
            sut.DiscoveredTypes.Should().NotContain(typeof(DefaultPriorityDummy));
        }
        public void GatherAndAutoRegisterConcretionClasses()
        {
            // arrange
            const bool autoRegister = true;
            var        sut          = new AutomaticRegistrationMock();

            // act
            sut.RetrieveConcretionClassesRequiringRegistration(autoRegister);

            // assert
            sut.RegisterConcretionClassesCalled.Should().BeTrue();
        }
        public void ConcretionRegistrationPicksUpClassesThatInheritFromInterfacesInheritingBaseInterface()
        {
            // arrange
            const bool autoRegister = false;
            var        sut          = new AutomaticRegistrationMock();

            // act
            sut.RetrieveConcretionClassesRequiringRegistration(autoRegister);

            // assert
            sut.DiscoveredConcretionClasses[typeof(IInterfaceDummy)].Should().Contain(typeof(DoubleInterfaceImplementationDummy));
        }
        public void ConcretionRegistrationIgnoresInterfacesThatImplementInterfaces()
        {
            // arrange
            const bool autoRegister = false;
            var        sut          = new AutomaticRegistrationMock();

            // act
            sut.RetrieveConcretionClassesRequiringRegistration(autoRegister);

            // assert
            sut.DiscoveredConcretionClasses[typeof(IInterfaceDummy)].Should().NotContain(typeof(IDeepInterfaceDummy));
        }
        public void ConcretionRegistrationAvoidsAbstractChildClasses()
        {
            // arrange
            const bool autoRegister = false;
            var        sut          = new AutomaticRegistrationMock();

            // act
            sut.RetrieveConcretionClassesRequiringRegistration(autoRegister);

            // assert
            sut.DiscoveredConcretionClasses[typeof(BaseClassDummy)].Should().NotContain(typeof(InheritingAbstractDummy));
        }
        public void GatherClassesForAutomaticRegistration()
        {
            // arrange
            const bool autoRegister = false;
            const int  knownClassesWithAutomaticRegistration = 1;
            var        sut = new AutomaticRegistrationMock();

            // act
            sut.RetrieveClassesRequiringRegistration(autoRegister);

            // assert
            sut.RegisterClassesCalled.Should().BeFalse();
            sut.RegisteredClasses.Should().BeGreaterOrEqualTo(knownClassesWithAutomaticRegistration);
            sut.DiscoveredTypes.Should().Contain(typeof(AutomaticRegistrationDummy));
        }
        public void RetrieveAllClassesImplementingABaseClass()
        {
            // arrange
            const bool autoRegister          = false;
            const int  knowConcretionClasses = 2;
            const int  knownConcretionBases  = 2;

            var sut = new AutomaticRegistrationMock();

            // act
            sut.RetrieveConcretionClassesRequiringRegistration(autoRegister);

            // assert
            sut.ConcretionClassesRegistered.Should().BeGreaterOrEqualTo(knowConcretionClasses);
            sut.ConcretionBaseClasses.Should().BeGreaterOrEqualTo(knownConcretionBases);
            sut.RegisterConcretionClassesCalled.Should().BeFalse();
            sut.DiscoveredConcretionClasses.Should().ContainKey(typeof(BaseClassDummy));
            sut.DiscoveredConcretionClasses.Should().ContainKey(typeof(IInterfaceDummy));
            sut.DiscoveredConcretionClasses[typeof(BaseClassDummy)].Should().Contain(typeof(ConcretionClassDummy));
            sut.DiscoveredConcretionClasses[typeof(IInterfaceDummy)].Should()
            .Contain(typeof(InterfaceImplementationDummy));
        }