[TestMethod] public void Construct()
        {
            // Arrange
            var mockExtractor = new Mock <IFieldExtractor>();

            mockExtractor.Setup(e => e.ExpectedSource).Returns(typeof(string));
            mockExtractor.Setup(e => e.FieldType).Returns(typeof(int));
            var conv = DataConverter.Identity <int>();

            // Act
            var step = new PrimitiveExtractionStep(mockExtractor.Object, conv);

            // Assert
            step.ExpectedSource.Should().Be(typeof(string));
        }
        [TestMethod] public void ExtractFromNull()
        {
            // Arrange
            var result        = 10;
            var mockExtractor = new Mock <IFieldExtractor>();

            mockExtractor.Setup(e => e.ExpectedSource).Returns(typeof(string));
            mockExtractor.Setup(e => e.FieldType).Returns(typeof(int));
            mockExtractor.Setup(e => e.Execute(It.IsAny <string>())).Returns(result);
            var    conv   = DataConverter.Identity <int>();
            var    step   = new PrimitiveExtractionStep(mockExtractor.Object, conv);
            string?source = null;

            // Act
            var value = step.Execute(source);

            // Assert
            value.Should().BeEquivalentTo(new DBValue[] { DBValue.NULL });
        }
        [TestMethod] public void ExtractFromDerived()
        {
            // Arrange
            var result        = 10;
            var mockExtractor = new Mock <IFieldExtractor>();

            mockExtractor.Setup(e => e.ExpectedSource).Returns(typeof(Exception));
            mockExtractor.Setup(e => e.FieldType).Returns(typeof(int));
            mockExtractor.Setup(e => e.Execute(It.IsAny <Exception>())).Returns(result);
            var conv   = DataConverter.Identity <int>();
            var step   = new PrimitiveExtractionStep(mockExtractor.Object, conv);
            var source = new NullReferenceException();

            // Act
            var value = step.Execute(source);

            // Assert
            mockExtractor.Verify(e => e.Execute(source), Times.Once);
            value.Should().BeEquivalentTo(new DBValue[] { DBValue.Create(result) });
        }
        [TestMethod] public void ExtractWithNonIdentityConversion()
        {
            // Arrange
            var result        = 10;
            var mockExtractor = new Mock <IFieldExtractor>();

            mockExtractor.Setup(e => e.ExpectedSource).Returns(typeof(string));
            mockExtractor.Setup(e => e.FieldType).Returns(typeof(int));
            mockExtractor.Setup(e => e.Execute(It.IsAny <string>())).Returns(result);
            var conv   = DataConverter.Create <int, int>(i => i * 2);
            var step   = new PrimitiveExtractionStep(mockExtractor.Object, conv);
            var source = "Detroit";

            // Act
            var value = step.Execute(source);

            // Assert
            mockExtractor.Verify(e => e.Execute(source), Times.Once);
            value.Should().BeEquivalentTo(new DBValue[] { DBValue.Create(conv.Convert(result)) });
        }