コード例 #1
0
        public static void Execute___Should_return_registered_protocol___When_called()
        {
            // Arrange
            var systemUnderTest = new ChainOfResponsibilityProtocolFactory();

            IProtocol protocol1 = new SharedOperationProtocol1();
            IProtocol protocol2 = new SiblingOperationProtocol();
            IProtocol protocol3 = new SharedOperationProtocol2();

            var protocolFactory1 = protocol1.ToProtocolFactory();
            var protocolFactory2 = protocol2.ToProtocolFactory();
            var protocolFactory3 = protocol3.ToProtocolFactory();

            systemUnderTest.AddToEndOfChain(protocolFactory1);
            systemUnderTest.AddToEndOfChain(protocolFactory2);
            systemUnderTest.AddToEndOfChain(protocolFactory3);

            var operation1 = new GetProtocolOp(new SharedOperation());
            var operation2 = new GetProtocolOp(new SiblingOperation1());
            var operation3 = new GetProtocolOp(new SiblingOperation2());

            // Act
            var actual1 = systemUnderTest.Execute(operation1);
            var actual2 = systemUnderTest.Execute(operation2);
            var actual3 = systemUnderTest.Execute(operation3);

            // Assert
            actual1.AsTest().Must().BeSameReferenceAs(protocol1);
            actual2.AsTest().Must().BeSameReferenceAs(protocol2);
            actual3.AsTest().Must().BeSameReferenceAs(protocol2);
        }
コード例 #2
0
        public static void Constructor___Should_register_protocols_in_protocolTypeToGetProtocolFuncMap___When_called()
        {
            // Arrange
            IProtocol protocol1 = new SharedOperationProtocol1();
            IProtocol protocol2 = new SiblingOperationProtocol();

            var protocolTypeToGetProtocolFuncMap = new Dictionary <Type, Func <IProtocol> >
            {
                { typeof(SharedOperationProtocol1), () => protocol1 },
                { typeof(SiblingOperationProtocol), () => protocol2 },
            };

            var systemUnderTest = new ProtocolFactory(protocolTypeToGetProtocolFuncMap);

            var operation1 = new GetProtocolOp(new SharedOperation());
            var operation2 = new GetProtocolOp(new SiblingOperation1());
            var operation3 = new GetProtocolOp(new SiblingOperation2());

            // Act
            var actual1 = systemUnderTest.Execute(operation1);
            var actual2 = systemUnderTest.Execute(operation2);
            var actual3 = systemUnderTest.Execute(operation3);

            // Assert
            actual1.AsTest().Must().BeSameReferenceAs(protocol1);
            actual2.AsTest().Must().BeSameReferenceAs(protocol2);
            actual3.AsTest().Must().BeSameReferenceAs(protocol2);
        }
コード例 #3
0
        public static void Constructor___Should_register_protocol_factories_in_order_specified___When_called()
        {
            // Arrange
            IProtocol protocol1 = new SharedOperationProtocol1();
            IProtocol protocol2 = new SiblingOperationProtocol();
            IProtocol protocol3 = new SharedOperationProtocol2();

            var protocolFactory1 = protocol1.ToProtocolFactory();
            var protocolFactory2 = protocol2.ToProtocolFactory();
            var protocolFactory3 = protocol3.ToProtocolFactory();

            var systemUnderTest = new ChainOfResponsibilityProtocolFactory(new[] { protocolFactory1, protocolFactory2, protocolFactory3 });

            var operation1 = new GetProtocolOp(new SharedOperation());
            var operation2 = new GetProtocolOp(new SiblingOperation1());
            var operation3 = new GetProtocolOp(new SiblingOperation2());

            // Act
            var actual1 = systemUnderTest.Execute(operation1);
            var actual2 = systemUnderTest.Execute(operation2);
            var actual3 = systemUnderTest.Execute(operation3);

            // Assert
            actual1.AsTest().Must().BeSameReferenceAs(protocol1);
            actual2.AsTest().Must().BeSameReferenceAs(protocol2);
            actual3.AsTest().Must().BeSameReferenceAs(protocol2);
        }
コード例 #4
0
        public static void Execute___Should_return_last_registered_protocol___When_second_protocol_supporting_same_operation_is_registered_with_ProtocolAlreadyRegisteredForOperationStrategy_Replace()
        {
            // Arrange
            var systemUnderTest = new ProtocolFactory();

            IProtocol protocol1 = new SharedOperationProtocol1();
            IProtocol protocol2 = new SiblingOperationProtocol();

            systemUnderTest.RegisterProtocolForSupportedOperations(typeof(SharedOperationProtocol1), () => new SharedOperationProtocol1());
            systemUnderTest.RegisterProtocolForSupportedOperations(typeof(SiblingOperationProtocol), () => new SiblingOperationProtocol());

            systemUnderTest.RegisterProtocolForSupportedOperations(typeof(SharedOperationProtocol1), () => protocol1, ProtocolAlreadyRegisteredForOperationStrategy.Replace);
            systemUnderTest.RegisterProtocolForSupportedOperations(typeof(SiblingOperationProtocol), () => protocol2, ProtocolAlreadyRegisteredForOperationStrategy.Replace);

            var operation1 = new GetProtocolOp(new SharedOperation());
            var operation2 = new GetProtocolOp(new SiblingOperation1());
            var operation3 = new GetProtocolOp(new SiblingOperation2());

            // Act
            var actual1 = systemUnderTest.Execute(operation1);
            var actual2 = systemUnderTest.Execute(operation2);
            var actual3 = systemUnderTest.Execute(operation3);

            // Assert
            actual1.AsTest().Must().BeSameReferenceAs(protocol1);
            actual2.AsTest().Must().BeSameReferenceAs(protocol2);
            actual3.AsTest().Must().BeSameReferenceAs(protocol2);
        }
コード例 #5
0
        public static void ExecuteViaReflection_void___Should_execute_the_operation___When_called()
        {
            // Arrange
            var operation1Counter = 4;
            var operation2Counter = 10;

            var operation1 = new SiblingOperation1
            {
                ActionToRun = () => operation1Counter++,
            };

            var operation2 = new SiblingOperation2
            {
                ActionToRun = () => operation2Counter++,
            };

            var protocol = new SiblingOperationProtocol();

            // Act, Assert
            protocol.ExecuteViaReflection(operation1);
            operation1Counter.AsTest().Must().BeEqualTo(5);

            protocol.ExecuteViaReflection(operation2);
            operation2Counter.AsTest().Must().BeEqualTo(11);

            protocol.ExecuteViaReflection(operation1);
            operation1Counter.AsTest().Must().BeEqualTo(6);
        }
コード例 #6
0
        public static void Execute___Should_return_registered_protocol___When_called()
        {
            // Arrange
            var systemUnderTest = new ProtocolFactory();

            IProtocol protocol1 = new SharedOperationProtocol1();
            IProtocol protocol2 = new SiblingOperationProtocol();

            systemUnderTest.RegisterProtocolForSupportedOperations(typeof(SharedOperationProtocol1), () => protocol1);
            systemUnderTest.RegisterProtocolForSupportedOperations(typeof(SiblingOperationProtocol), () => protocol2);

            var operation1 = new GetProtocolOp(new SharedOperation());
            var operation2 = new GetProtocolOp(new SiblingOperation1());
            var operation3 = new GetProtocolOp(new SiblingOperation2());

            // Act
            var actual1 = systemUnderTest.Execute(operation1);
            var actual2 = systemUnderTest.Execute(operation2);
            var actual3 = systemUnderTest.Execute(operation3);

            // Assert
            actual1.AsTest().Must().BeSameReferenceAs(protocol1);
            actual2.AsTest().Must().BeSameReferenceAs(protocol2);
            actual3.AsTest().Must().BeSameReferenceAs(protocol2);
        }
コード例 #7
0
        public static async Task ExecuteViaReflectionAsync_TResult___Should_execute_the_operation___When_called()
        {
            // Arrange
            var operation1 = new SiblingOperation3
            {
                Value = 4,
            };

            var operation2 = new SiblingOperation4
            {
                Value = 6,
            };

            var operation3 = new SiblingOperation3
            {
                Value = 1,
            };

            var protocol = new SiblingOperationProtocol();

            // Act
            var actual1 = await protocol.ExecuteViaReflectionAsync <int>(operation1);

            var actual2 = await protocol.ExecuteViaReflectionAsync <int>(operation2);

            var actual3 = await protocol.ExecuteViaReflectionAsync <int>(operation3);

            // Assert
            actual1.AsTest().Must().BeEqualTo(7);
            actual2.AsTest().Must().BeEqualTo(10);
            actual3.AsTest().Must().BeEqualTo(4);
        }
コード例 #8
0
        public static void ExecuteViaReflection_TResult___Should_execute_the_operation___When_called()
        {
            // Arrange
            var operation1 = new SiblingOperation3
            {
                Value = 4,
            };

            var operation2 = new SiblingOperation4
            {
                Value = 6,
            };

            var operation3 = new SiblingOperation3
            {
                Value = 1,
            };

            var protocol = new SiblingOperationProtocol();

            // Act
            var actual1 = protocol.ExecuteViaReflection <int>(operation1);
            var actual2 = protocol.ExecuteViaReflection <int>(operation2);
            var actual3 = protocol.ExecuteViaReflection <int>(operation3);

            // Assert
            actual1.AsTest().Must().BeEqualTo(5);
            actual2.AsTest().Must().BeEqualTo(8);
            actual3.AsTest().Must().BeEqualTo(2);
        }
コード例 #9
0
        public static void ToProtocolFactory___Should_create_working_factory___When_called()
        {
            // Arrange
            IProtocol protocol = new SiblingOperationProtocol();

            // Act
            var actual = protocol.ToProtocolFactory();

            // Assert
            actual.Execute(new GetProtocolOp(new SiblingOperation4())).AsTest().Must().BeSameReferenceAs(protocol);
        }
コード例 #10
0
        public static void ExecuteViaReflection_void___Should_throw_ArgumentException___When_protocol_cannot_execute_operation()
        {
            // Arrange
            var operation = new DummyVoidOperation();

            var protocol1 = new ProtocolWithNoOperations();
            var protocol2 = new SiblingOperationProtocol();

            // Act
            var actual1 = Record.Exception(() => protocol1.ExecuteViaReflection(operation));
            var actual2 = Record.Exception(() => protocol2.ExecuteViaReflection(operation));

            // Assert
            actual1.AsTest().Must().BeOfType <ArgumentException>();
            actual1.Message.AsTest().Must().ContainString(Invariant($"The specified '{nameof(ProtocolExtensionsTest)}.{nameof(ProtocolWithNoOperations)}' protocol does not have a void Execute method with a single parameter that the specified '{nameof(ProtocolExtensionsTest)}.{nameof(DummyVoidOperation)}' operation is assignable to."));

            actual2.AsTest().Must().BeOfType <ArgumentException>();
            actual2.Message.AsTest().Must().ContainString(Invariant($"The specified '{nameof(ProtocolExtensionsTest)}.{nameof(SiblingOperationProtocol)}' protocol does not have a void Execute method with a single parameter that the specified '{nameof(ProtocolExtensionsTest)}.{nameof(DummyVoidOperation)}' operation is assignable to."));
        }
コード例 #11
0
        public static void ShallowClone___Should_return_a_shallow_clone___When_called()
        {
            // Arrange
            var systemUnderTest1 = new ProtocolFactory();
            var systemUnderTest2 = new ProtocolFactory();

            IProtocol protocol1 = new SharedOperationProtocol1();
            IProtocol protocol2 = new SiblingOperationProtocol();

            systemUnderTest1.RegisterProtocolForSupportedOperations(typeof(SharedOperationProtocol1), () => protocol1);
            systemUnderTest2.RegisterProtocolForSupportedOperations(typeof(SharedOperationProtocol1), () => protocol1);

            // Act
            var actual1 = systemUnderTest1.ShallowClone();
            var actual2 = systemUnderTest2.ShallowClone();

            actual1.RegisterProtocolForSupportedOperations(typeof(SiblingOperationProtocol), () => protocol2);
            systemUnderTest2.RegisterProtocolForSupportedOperations(typeof(SiblingOperationProtocol), () => protocol2);

            // Assert
            var operation1            = new GetProtocolOp(new SharedOperation());
            var protocolFromOriginal1 = systemUnderTest1.Execute(operation1);
            var protocolFromOriginal2 = systemUnderTest2.Execute(operation1);
            var protocolFromClone1    = actual1.Execute(operation1);
            var protocolFromClone2    = actual2.Execute(operation1);

            protocolFromOriginal1.AsTest().Must().BeSameReferenceAs(protocol1);
            protocolFromOriginal2.AsTest().Must().BeSameReferenceAs(protocol1);
            protocolFromClone1.AsTest().Must().BeSameReferenceAs(protocol1);
            protocolFromClone2.AsTest().Must().BeSameReferenceAs(protocol1);

            var operation2 = new GetProtocolOp(new SiblingOperation1(), MissingProtocolStrategy.ReturnNull);

            protocolFromOriginal1 = systemUnderTest1.Execute(operation2);
            protocolFromOriginal2 = systemUnderTest2.Execute(operation2);
            protocolFromClone1    = actual1.Execute(operation2);
            protocolFromClone2    = actual2.Execute(operation2);
            protocolFromOriginal1.AsTest().Must().BeNull();
            protocolFromOriginal2.AsTest().Must().BeSameReferenceAs(protocol2);
            protocolFromClone1.AsTest().Must().BeSameReferenceAs(protocol2);
            protocolFromClone2.AsTest().Must().BeNull();
        }
コード例 #12
0
        public static async Task ExecuteViaReflectionAsync_TResult___Should_throw_ArgumentException___When_protocol_cannot_execute_operation()
        {
            // Arrange
            var operation = new DummyReturningOperation();

            var protocol1 = new ProtocolWithNoOperations();
            var protocol2 = new SiblingOperationProtocol();

            // Act
            var actual1 = await Record.ExceptionAsync(() => protocol1.ExecuteViaReflectionAsync <int>(operation));

            var actual2 = await Record.ExceptionAsync(() => protocol2.ExecuteViaReflectionAsync <int>(operation));

            // Assert
            actual1.AsTest().Must().BeOfType <ArgumentException>();
            actual1.Message.AsTest().Must().ContainString(Invariant($"The specified '{nameof(ProtocolExtensionsTest)}.{nameof(ProtocolWithNoOperations)}' protocol does not have a returning ExecuteAsync method with a single parameter that the specified '{nameof(ProtocolExtensionsTest)}.{nameof(DummyReturningOperation)}' operation is assignable to AND a return type that is assignable to the specified 'int' return type."));

            actual2.AsTest().Must().BeOfType <ArgumentException>();
            actual2.Message.AsTest().Must().ContainString(Invariant($"The specified '{nameof(ProtocolExtensionsTest)}.{nameof(SiblingOperationProtocol)}' protocol does not have a returning ExecuteAsync method with a single parameter that the specified '{nameof(ProtocolExtensionsTest)}.{nameof(DummyReturningOperation)}' operation is assignable to AND a return type that is assignable to the specified 'int' return type."));
        }