public void ReadXmlWithoutProperties()
        {
            var xml = $"<san:Properties xmlns:s0='urn' xmlns:san='{SchemaAnnotation.NAMESPACE}' />";

            using (var reader = XmlReader.Create(new StringReader(xml)))
            {
                var sut = new PropertyExtractorCollection();
                sut.ReadXml(reader);
                sut.Should().BeEmpty();
            }
        }
        public void ReadXmlForConstantExtractor()
        {
            var xml = $"<san:Properties xmlns:s0='urn' xmlns:san='{SchemaAnnotation.NAMESPACE}'>"
                      + "<s0:Property1 value='constant'/>"
                      + "</san:Properties>";

            using (var reader = XmlReader.Create(new StringReader(xml)))
            {
                var sut = new PropertyExtractorCollection();
                sut.ReadXml(reader);
                sut.Should().BeEquivalentTo(new ConstantExtractor(new XmlQualifiedName("Property1", "urn"), "constant", ExtractionMode.Write));
            }
        }
        public void ReadXmlForXPathExtractorWithPromotedAttribute()
        {
            var xml = $"<san:Properties xmlns:s0='urn' xmlns:san='{SchemaAnnotation.NAMESPACE}'>"
                      + "<s0:Property2 promoted='true' xpath='*/other-node'/>"
                      + "</san:Properties>";

            using (var reader = XmlReader.Create(new StringReader(xml)))
            {
                var sut = new PropertyExtractorCollection();
                sut.ReadXml(reader);
                sut.Should().BeEquivalentTo(new XPathExtractor(new XmlQualifiedName("Property2", "urn"), "*/other-node", ExtractionMode.Promote));
            }
        }
        public void ReadXmlForQNameValueExtractorFallsBackOnXPathExtractorWhenQNameValueExtractionModeIsDefault()
        {
            var xml = $"<san:Properties xmlns:s0='urn' xmlns:san='{SchemaAnnotation.NAMESPACE}'>"
                      + "<s0:Property3 mode='promote' qnameValue='name' xpath='*/extra-node'/>"
                      + "</san:Properties>";

            using (var reader = XmlReader.Create(new StringReader(xml)))
            {
                var sut = new PropertyExtractorCollection();
                sut.ReadXml(reader);
                sut.Should().BeEquivalentTo(new XPathExtractor(new XmlQualifiedName("Property3", "urn"), "*/extra-node", ExtractionMode.Promote));
            }
        }
        public void ReadXml()
        {
            var xml = $"<san:Properties xmlns:s0='urn' xmlns:san='{SchemaAnnotation.NAMESPACE}'>"
                      + "<s0:Property1 xpath='*/some-node'/>"
                      + "<s0:Property2 promoted='true' xpath='*/other-node'/>"
                      + "<s0:Property3 mode='write' value='constant'/>"
                      + "<s0:Property4 mode='clear'/>"
                      + "</san:Properties>";

            using (var reader = XmlReader.Create(new StringReader(xml)))
            {
                var sut = new PropertyExtractorCollection();
                sut.ReadXml(reader);
                sut.Should().BeEquivalentTo(
                    new XPathExtractor(new XmlQualifiedName("Property1", "urn"), "*/some-node", ExtractionMode.Write),
                    new XPathExtractor(new XmlQualifiedName("Property2", "urn"), "*/other-node", ExtractionMode.Promote),
                    new ConstantExtractor(new XmlQualifiedName("Property3", "urn"), "constant", ExtractionMode.Write),
                    new PropertyExtractor(new XmlQualifiedName("Property4", "urn"), ExtractionMode.Clear)
                    );
            }
        }