public void PayloadKindDetectionAtomTest()
        {
            var testDescriptors = Enumerable.Empty <PayloadKindDetectionTestDescriptor>();

            IEdmModel         model      = Microsoft.Test.OData.Utils.Metadata.TestModels.BuildTestModel();
            IEdmTypeReference personType = model.FindType("TestModel.Person").ToTypeReference();

            string[] genericPayloadTemplates = new string[]
            {
                "<{0} xmlns=\"{1}\" />",
                "<!-- Comment --><?pi Ignore this?><{0} xmlns=\"{1}\" />",
            };

            {
                // atom:entry
                // NOTE: since feeds are not allowed in requests we decide based on the content type in requests (and ignore the payload)
                string[] entryContentTypes     = new string[] { "application/atom+xml", "application/atom+xml;type=entry" };
                var      entryPayloadTemplates = genericPayloadTemplates.ConcatSingle(
                    "<{0} xmlns=\"{1}\"><category term='TestModel.Person' scheme='http://docs.oasis-open.org/odata/ns/scheme'/></{0}>"
                    );
                var entryResult                 = new PayloadKindResult(ODataPayloadKind.Entry, /*expectedType*/ personType, /*expectedException*/ null);
                var entryInvalidResult          = new PayloadKindResult(ODataPayloadKind.Entry, /*expectedType*/ personType, ODataExpectedExceptions.ODataException("ODataAtomEntryAndFeedDeserializer_EntryElementWrongName", invalidLocalName, invalidNamespace));
                var entryInvalidLocalNameResult = new PayloadKindResult(ODataPayloadKind.Entry, /*expectedType*/ personType, ODataExpectedExceptions.ODataException("ODataAtomEntryAndFeedDeserializer_EntryElementWrongName", invalidLocalName, TestAtomConstants.AtomNamespace));
                var entryInvalidNamespaceResult = new PayloadKindResult(ODataPayloadKind.Entry, /*expectedType*/ personType, ODataExpectedExceptions.ODataException("ODataAtomEntryAndFeedDeserializer_EntryElementWrongName", TestAtomConstants.AtomEntryElementName, invalidNamespace));
                testDescriptors = testDescriptors.Concat(
                    entryContentTypes.SelectMany(ct =>
                                                 entryPayloadTemplates.SelectMany(pt =>
                                                                                  CreatePayloadKindDetectionTestCases(
                                                                                      ct,
                                                                                      pt,
                                                                                      TestAtomConstants.AtomEntryElementName,
                                                                                      TestAtomConstants.AtomNamespace,
                                                                                      model,
                                                                                      testConfig => CreateEnumerable(entryResult),
                                                                                      testConfig => testConfig.IsRequest ? CreateEnumerable(entryInvalidResult) : CreateEnumerable(),
                                                                                      testConfig => testConfig.IsRequest ? CreateEnumerable(entryInvalidLocalNameResult) : CreateEnumerable(),
                                                                                      testConfig => testConfig.IsRequest ? CreateEnumerable(entryInvalidNamespaceResult) : CreateEnumerable()))));
            }

            {
                // atom:feed
                // NOTE: since feeds are not allowed in requests we decide based on the content type in requests (and ignore the payload)
                var feedContentTypes     = new string[] { "application/atom+xml", "application/atom+xml;type=feed" };
                var feedPayloadTemplates = genericPayloadTemplates.ConcatSingle(
                    "<{0} xmlns=\"{1}\"><entry><category term='TestModel.Person' scheme='http://docs.oasis-open.org/odata/ns/scheme' /></entry></{0}>"
                    );
                var feedResult = new PayloadKindResult(ODataPayloadKind.Feed, /*expectedType*/ personType, /*expectedException*/ null);
                var feedDetectedAsEntryResult                 = new PayloadKindResult(ODataPayloadKind.Entry, /*expectedType*/ personType, ODataExpectedExceptions.ODataException("ODataAtomEntryAndFeedDeserializer_EntryElementWrongName", TestAtomConstants.AtomFeedElementName, TestAtomConstants.AtomNamespace));
                var feedDetectedAsEntryInvalidResult          = new PayloadKindResult(ODataPayloadKind.Entry, /*expectedType*/ personType, ODataExpectedExceptions.ODataException("ODataAtomEntryAndFeedDeserializer_EntryElementWrongName", invalidLocalName, invalidNamespace));
                var feedDetectedAsEntryInvalidLocalNameResult = new PayloadKindResult(ODataPayloadKind.Entry, /*expectedType*/ personType, ODataExpectedExceptions.ODataException("ODataAtomEntryAndFeedDeserializer_EntryElementWrongName", invalidLocalName, TestAtomConstants.AtomNamespace));
                var feedDetectedAsEntryInvalidNamespaceResult = new PayloadKindResult(ODataPayloadKind.Entry, /*expectedType*/ personType, ODataExpectedExceptions.ODataException("ODataAtomEntryAndFeedDeserializer_EntryElementWrongName", TestAtomConstants.AtomFeedElementName, invalidNamespace));
                testDescriptors = testDescriptors.Concat(
                    feedContentTypes.SelectMany(ct =>
                                                feedPayloadTemplates.SelectMany(pt =>
                                                                                CreatePayloadKindDetectionTestCases(
                                                                                    ct,
                                                                                    pt,
                                                                                    TestAtomConstants.AtomFeedElementName,
                                                                                    TestAtomConstants.AtomNamespace,
                                                                                    model,
                                                                                    testConfig => testConfig.IsRequest ? CreateEnumerable(feedDetectedAsEntryResult) : CreateEnumerable(feedResult),
                                                                                    testConfig => testConfig.IsRequest ? CreateEnumerable(feedDetectedAsEntryInvalidResult) : CreateEnumerable(),
                                                                                    testConfig => testConfig.IsRequest ? CreateEnumerable(feedDetectedAsEntryInvalidLocalNameResult) : CreateEnumerable(),
                                                                                    testConfig => testConfig.IsRequest ? CreateEnumerable(feedDetectedAsEntryInvalidNamespaceResult) : CreateEnumerable()))));
            }

            {
                // atompub:service
                var serviceDocContentTypes     = new string[] { "application/xml" };
                var serviceDocPayloadTemplates = new string[] { "<{0} xmlns=\"{1}\"><workspace></workspace></{0}>" };
                var serviceDocResult           = new PayloadKindResult(ODataPayloadKind.ServiceDocument, /*expectedType*/ null, /*expectedException*/ null);
                testDescriptors = testDescriptors.Concat(
                    serviceDocContentTypes.SelectMany(ct =>
                                                      serviceDocPayloadTemplates.SelectMany(pt =>
                                                                                            CreatePayloadKindDetectionTestCases(
                                                                                                ct,
                                                                                                pt,
                                                                                                TestAtomConstants.AtomPublishingServiceElementName,
                                                                                                TestAtomConstants.AtomPublishingNamespace,
                                                                                                model,
                                                                                                testConfig => testConfig.IsRequest ? CreateEnumerable() : CreateEnumerable(serviceDocResult),
                                                                                                testConfig => CreateEnumerable()))));

                // NOTE: for application/atomsvc+xml we always decide based on the content type.
                var serviceDocContentTypes2           = new string[] { "application/atomsvc+xml" };
                var serviceDocInvalidResult2          = new PayloadKindResult(ODataPayloadKind.ServiceDocument, /*expectedType*/ null, ODataExpectedExceptions.ODataException("ODataAtomServiceDocumentDeserializer_ServiceDocumentRootElementWrongNameOrNamespace", invalidLocalName, invalidNamespace));
                var serviceDocInvalidLocalNameResult2 = new PayloadKindResult(ODataPayloadKind.ServiceDocument, /*expectedType*/ null, ODataExpectedExceptions.ODataException("ODataAtomServiceDocumentDeserializer_ServiceDocumentRootElementWrongNameOrNamespace", invalidLocalName, TestAtomConstants.AtomPublishingNamespace));
                var serviceDocInvalidNamespaceResult2 = new PayloadKindResult(ODataPayloadKind.ServiceDocument, /*expectedType*/ null, ODataExpectedExceptions.ODataException("ODataAtomServiceDocumentDeserializer_ServiceDocumentRootElementWrongNameOrNamespace", TestAtomConstants.AtomPublishingServiceElementName, invalidNamespace));
                testDescriptors = testDescriptors.Concat(
                    serviceDocContentTypes2.SelectMany(ct =>
                                                       serviceDocPayloadTemplates.SelectMany(pt =>
                                                                                             CreatePayloadKindDetectionTestCases(
                                                                                                 ct,
                                                                                                 pt,
                                                                                                 TestAtomConstants.AtomPublishingServiceElementName,
                                                                                                 TestAtomConstants.AtomPublishingNamespace,
                                                                                                 model,
                                                                                                 testConfig => testConfig.IsRequest ? CreateEnumerable() : CreateEnumerable(serviceDocResult),
                                                                                                 testConfig => testConfig.IsRequest ? CreateEnumerable() : CreateEnumerable(serviceDocInvalidResult2),
                                                                                                 testConfig => testConfig.IsRequest ? CreateEnumerable() : CreateEnumerable(serviceDocInvalidLocalNameResult2),
                                                                                                 testConfig => testConfig.IsRequest ? CreateEnumerable() : CreateEnumerable(serviceDocInvalidNamespaceResult2)))));
            }

            {
                // m:error
                var errorContentTypes     = new string[] { "application/xml" };
                var errorPayloadTemplates = genericPayloadTemplates.ConcatSingle("<{0} xmlns=\"{1}\"><code>Some error code</code></{0}>");
                var errorResult           = new PayloadKindResult(ODataPayloadKind.Error, /*expectedType*/ null, /*expectedException*/ null);
                testDescriptors = testDescriptors.Concat(
                    errorContentTypes.SelectMany(ct =>
                                                 errorPayloadTemplates.SelectMany(pt =>
                                                                                  CreatePayloadKindDetectionTestCases(
                                                                                      ct,
                                                                                      pt,
                                                                                      TestAtomConstants.ODataErrorElementName,
                                                                                      TestAtomConstants.ODataMetadataNamespace,
                                                                                      model,
                                                                                      testConfig => testConfig.IsRequest ? CreateEnumerable() : CreateEnumerable(errorResult),
                                                                                      testConfig => CreateEnumerable()))));
            }

            // collection and property test descriptors
            var collAndPropertyContentTypes = new string[] { "application/xml", "text/xml" };
            var collAndPropertyElementNames = new string[] { "Id", "element" };

            testDescriptors = testDescriptors.Concat(
                collAndPropertyContentTypes.SelectMany(ct =>
                                                       collAndPropertyElementNames.SelectMany(en =>
                                                                                              this.CreateCollectionAndPropertyTestDescriptors(model, en, ct))));

            // Add some manual test descriptors
            testDescriptors = testDescriptors.Concat(new PayloadKindDetectionTestDescriptor[]
            {
                // Non-Xml payload
                new PayloadKindDetectionTestDescriptor(this.Settings)
                {
                    ContentType              = "application/xml",
                    PayloadString            = "Some non-Xml payload",
                    ExpectedDetectionResults = testConfig => emptyDetectionResult,
                },

                // Invalid content type
                new PayloadKindDetectionTestDescriptor(this.Settings)
                {
                    ContentType              = "application/invalid",
                    PayloadString            = "Some non-Xml payload",
                    ExpectedDetectionResults = testConfig => emptyDetectionResult,
                },

                // Custom Xml payload
                new PayloadKindDetectionTestDescriptor(this.Settings)
                {
                    ContentType              = "application/xml",
                    PayloadString            = "<custom />",
                    ExpectedDetectionResults = testConfig => emptyDetectionResult,
                },
            });

            this.CombinatorialEngineProvider.RunCombinations(
                testDescriptors,
                // NOTE: only using the configurations that disable stream disposal since we potentially read multiple
                //       times from the stream (to verify that we can read all the detected payload kinds).
                this.ReaderTestConfigurationProvider.AtomFormatConfigurations.Where(tc => tc.MessageReaderSettings.DisableMessageStreamDisposal),
                (testDescriptor, testConfiguration) => testDescriptor.RunTest(testConfiguration));
        }
        public void PayloadKindDetectionAtomTest()
        {
            var testDescriptors = Enumerable.Empty<PayloadKindDetectionTestDescriptor>();

            IEdmModel model = Microsoft.Test.OData.Utils.Metadata.TestModels.BuildTestModel();
            IEdmTypeReference personType = model.FindType("TestModel.Person").ToTypeReference();

            string[] genericPayloadTemplates = new string[]
                {
                    "<{0} xmlns=\"{1}\" />",
                    "<!-- Comment --><?pi Ignore this?><{0} xmlns=\"{1}\" />",
                };

            {
                // atom:entry
                // NOTE: since feeds are not allowed in requests we decide based on the content type in requests (and ignore the payload)
                string[] entryContentTypes = new string[] { "application/atom+xml", "application/atom+xml;type=entry" };
                var entryPayloadTemplates = genericPayloadTemplates.ConcatSingle(
                        "<{0} xmlns=\"{1}\"><category term='TestModel.Person' scheme='http://docs.oasis-open.org/odata/ns/scheme'/></{0}>"
                    );
                var entryResult = new PayloadKindResult(ODataPayloadKind.Entry, /*expectedType*/personType, /*expectedException*/null);
                var entryInvalidResult = new PayloadKindResult(ODataPayloadKind.Entry, /*expectedType*/personType, ODataExpectedExceptions.ODataException("ODataAtomEntryAndFeedDeserializer_EntryElementWrongName", invalidLocalName, invalidNamespace));
                var entryInvalidLocalNameResult = new PayloadKindResult(ODataPayloadKind.Entry, /*expectedType*/personType, ODataExpectedExceptions.ODataException("ODataAtomEntryAndFeedDeserializer_EntryElementWrongName", invalidLocalName, TestAtomConstants.AtomNamespace));
                var entryInvalidNamespaceResult = new PayloadKindResult(ODataPayloadKind.Entry, /*expectedType*/personType, ODataExpectedExceptions.ODataException("ODataAtomEntryAndFeedDeserializer_EntryElementWrongName", TestAtomConstants.AtomEntryElementName, invalidNamespace));
                testDescriptors = testDescriptors.Concat(
                    entryContentTypes.SelectMany(ct =>
                        entryPayloadTemplates.SelectMany(pt =>
                            CreatePayloadKindDetectionTestCases(
                                ct,
                                pt,
                                TestAtomConstants.AtomEntryElementName,
                                TestAtomConstants.AtomNamespace,
                                model,
                                testConfig => CreateEnumerable(entryResult),
                                testConfig => testConfig.IsRequest ? CreateEnumerable(entryInvalidResult) : CreateEnumerable(),
                                testConfig => testConfig.IsRequest ? CreateEnumerable(entryInvalidLocalNameResult) : CreateEnumerable(),
                                testConfig => testConfig.IsRequest ? CreateEnumerable(entryInvalidNamespaceResult) : CreateEnumerable()))));
            }

            {
                // atom:feed
                // NOTE: since feeds are not allowed in requests we decide based on the content type in requests (and ignore the payload)
                var feedContentTypes = new string[] { "application/atom+xml", "application/atom+xml;type=feed" };
                var feedPayloadTemplates = genericPayloadTemplates.ConcatSingle(
                        "<{0} xmlns=\"{1}\"><entry><category term='TestModel.Person' scheme='http://docs.oasis-open.org/odata/ns/scheme' /></entry></{0}>"
                    );
                var feedResult = new PayloadKindResult(ODataPayloadKind.Feed, /*expectedType*/personType, /*expectedException*/null);
                var feedDetectedAsEntryResult = new PayloadKindResult(ODataPayloadKind.Entry, /*expectedType*/personType, ODataExpectedExceptions.ODataException("ODataAtomEntryAndFeedDeserializer_EntryElementWrongName", TestAtomConstants.AtomFeedElementName, TestAtomConstants.AtomNamespace));
                var feedDetectedAsEntryInvalidResult = new PayloadKindResult(ODataPayloadKind.Entry, /*expectedType*/personType, ODataExpectedExceptions.ODataException("ODataAtomEntryAndFeedDeserializer_EntryElementWrongName", invalidLocalName, invalidNamespace));
                var feedDetectedAsEntryInvalidLocalNameResult = new PayloadKindResult(ODataPayloadKind.Entry, /*expectedType*/personType, ODataExpectedExceptions.ODataException("ODataAtomEntryAndFeedDeserializer_EntryElementWrongName", invalidLocalName, TestAtomConstants.AtomNamespace));
                var feedDetectedAsEntryInvalidNamespaceResult = new PayloadKindResult(ODataPayloadKind.Entry, /*expectedType*/personType, ODataExpectedExceptions.ODataException("ODataAtomEntryAndFeedDeserializer_EntryElementWrongName", TestAtomConstants.AtomFeedElementName, invalidNamespace));
                testDescriptors = testDescriptors.Concat(
                    feedContentTypes.SelectMany(ct =>
                        feedPayloadTemplates.SelectMany(pt =>
                            CreatePayloadKindDetectionTestCases(
                                ct,
                                pt,
                                TestAtomConstants.AtomFeedElementName,
                                TestAtomConstants.AtomNamespace,
                                model,
                                testConfig => testConfig.IsRequest ? CreateEnumerable(feedDetectedAsEntryResult) : CreateEnumerable(feedResult),
                                testConfig => testConfig.IsRequest ? CreateEnumerable(feedDetectedAsEntryInvalidResult) : CreateEnumerable(),
                                testConfig => testConfig.IsRequest ? CreateEnumerable(feedDetectedAsEntryInvalidLocalNameResult) : CreateEnumerable(),
                                testConfig => testConfig.IsRequest ? CreateEnumerable(feedDetectedAsEntryInvalidNamespaceResult) : CreateEnumerable()))));
            }

            {
                // atompub:service
                var serviceDocContentTypes = new string[] { "application/xml" };
                var serviceDocPayloadTemplates = new string[] { "<{0} xmlns=\"{1}\"><workspace></workspace></{0}>" };
                var serviceDocResult = new PayloadKindResult(ODataPayloadKind.ServiceDocument, /*expectedType*/null, /*expectedException*/null);
                testDescriptors = testDescriptors.Concat(
                    serviceDocContentTypes.SelectMany(ct =>
                        serviceDocPayloadTemplates.SelectMany(pt =>
                            CreatePayloadKindDetectionTestCases(
                                ct,
                                pt,
                                TestAtomConstants.AtomPublishingServiceElementName,
                                TestAtomConstants.AtomPublishingNamespace,
                                model,
                                testConfig => testConfig.IsRequest ? CreateEnumerable() : CreateEnumerable(serviceDocResult),
                                testConfig => CreateEnumerable()))));

                // NOTE: for application/atomsvc+xml we always decide based on the content type.
                var serviceDocContentTypes2 = new string[] { "application/atomsvc+xml" };
                var serviceDocInvalidResult2 = new PayloadKindResult(ODataPayloadKind.ServiceDocument, /*expectedType*/null, ODataExpectedExceptions.ODataException("ODataAtomServiceDocumentDeserializer_ServiceDocumentRootElementWrongNameOrNamespace", invalidLocalName, invalidNamespace));
                var serviceDocInvalidLocalNameResult2 = new PayloadKindResult(ODataPayloadKind.ServiceDocument, /*expectedType*/null, ODataExpectedExceptions.ODataException("ODataAtomServiceDocumentDeserializer_ServiceDocumentRootElementWrongNameOrNamespace", invalidLocalName, TestAtomConstants.AtomPublishingNamespace));
                var serviceDocInvalidNamespaceResult2 = new PayloadKindResult(ODataPayloadKind.ServiceDocument, /*expectedType*/null, ODataExpectedExceptions.ODataException("ODataAtomServiceDocumentDeserializer_ServiceDocumentRootElementWrongNameOrNamespace", TestAtomConstants.AtomPublishingServiceElementName, invalidNamespace));
                testDescriptors = testDescriptors.Concat(
                    serviceDocContentTypes2.SelectMany(ct =>
                        serviceDocPayloadTemplates.SelectMany(pt =>
                            CreatePayloadKindDetectionTestCases(
                                ct,
                                pt,
                                TestAtomConstants.AtomPublishingServiceElementName,
                                TestAtomConstants.AtomPublishingNamespace,
                                model,
                                testConfig => testConfig.IsRequest ? CreateEnumerable() : CreateEnumerable(serviceDocResult),
                                testConfig => testConfig.IsRequest ? CreateEnumerable() : CreateEnumerable(serviceDocInvalidResult2),
                                testConfig => testConfig.IsRequest ? CreateEnumerable() : CreateEnumerable(serviceDocInvalidLocalNameResult2),
                                testConfig => testConfig.IsRequest ? CreateEnumerable() : CreateEnumerable(serviceDocInvalidNamespaceResult2)))));
            }

            {
                // m:error
                var errorContentTypes = new string[] { "application/xml" };
                var errorPayloadTemplates = genericPayloadTemplates.ConcatSingle("<{0} xmlns=\"{1}\"><code>Some error code</code></{0}>");
                var errorResult = new PayloadKindResult(ODataPayloadKind.Error, /*expectedType*/null, /*expectedException*/null);
                testDescriptors = testDescriptors.Concat(
                    errorContentTypes.SelectMany(ct =>
                        errorPayloadTemplates.SelectMany(pt =>
                            CreatePayloadKindDetectionTestCases(
                                ct,
                                pt,
                                TestAtomConstants.ODataErrorElementName,
                                TestAtomConstants.ODataMetadataNamespace,
                                model,
                                testConfig => testConfig.IsRequest ? CreateEnumerable() : CreateEnumerable(errorResult),
                                testConfig => CreateEnumerable()))));
            }

            // collection and property test descriptors
            var collAndPropertyContentTypes = new string[] { "application/xml", "text/xml" };
            var collAndPropertyElementNames = new string[] { "Id", "element" };
            testDescriptors = testDescriptors.Concat(
                collAndPropertyContentTypes.SelectMany(ct =>
                    collAndPropertyElementNames.SelectMany(en =>
                        this.CreateCollectionAndPropertyTestDescriptors(model, en, ct))));

            // Add some manual test descriptors
            testDescriptors = testDescriptors.Concat(new PayloadKindDetectionTestDescriptor[]
            {
                // Non-Xml payload
                new PayloadKindDetectionTestDescriptor(this.Settings)
                {
                    ContentType = "application/xml",
                    PayloadString = "Some non-Xml payload",
                    ExpectedDetectionResults = testConfig => emptyDetectionResult,
                },

                // Invalid content type
                new PayloadKindDetectionTestDescriptor(this.Settings)
                {
                    ContentType = "application/invalid",
                    PayloadString = "Some non-Xml payload",
                    ExpectedDetectionResults = testConfig => emptyDetectionResult,
                },

                // Custom Xml payload
                new PayloadKindDetectionTestDescriptor(this.Settings)
                {
                    ContentType = "application/xml",
                    PayloadString = "<custom />",
                    ExpectedDetectionResults = testConfig => emptyDetectionResult,
                },
            });

            this.CombinatorialEngineProvider.RunCombinations(
                testDescriptors,
                // NOTE: only using the configurations that disable stream disposal since we potentially read multiple
                //       times from the stream (to verify that we can read all the detected payload kinds).
                this.ReaderTestConfigurationProvider.AtomFormatConfigurations.Where(tc => tc.MessageReaderSettings.DisableMessageStreamDisposal),
                (testDescriptor, testConfiguration) => testDescriptor.RunTest(testConfiguration));
        }
        /// <summary>
        /// Create test descriptors for collection and/or property payloads.
        /// </summary>
        /// <param name="model">The metadata model to use.</param>
        /// <param name="localName">The specified local name.</param>
        /// <param name="contentType">The specified content type.</param>
        /// <returns>The generated test descriptors.</returns>
        private IEnumerable <PayloadKindDetectionTestDescriptor> CreateCollectionAndPropertyTestDescriptors(
            IEdmModel model,
            string localName,
            string contentType)
        {
            var propertyResult = localName == "Id"
                ? new PayloadKindResult(ODataPayloadKind.Property, EdmCoreModel.Instance.GetInt32(false), /*expectedException*/ null)
                : new PayloadKindResult(ODataPayloadKind.Property, /*expectedType*/ null, /*expectedException*/ null);
            var invalidPropertyResult             = new PayloadKindResult(ODataPayloadKind.Property, EdmCoreModel.Instance.GetInt32(false), ODataExpectedExceptions.ODataException("ReaderValidationUtils_CannotConvertPrimitiveValue", "", "Edm.Int32"));
            var collectionResult                  = new PayloadKindResult(ODataPayloadKind.Collection, /*expectedType*/ null, /*expectedException*/ null);
            var collectionAsPropertyInvalidResult = new PayloadKindResult(ODataPayloadKind.Property, EdmCoreModel.Instance.GetInt32(false), ODataExpectedExceptions.ODataException("XmlReaderExtension_InvalidNodeInStringValue", "Element"));

            // empty <d:TestAtomConstants.ODataValueElementName /> element
            yield return(new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString = "<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\" />",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => CreateAtomFormatResult(model, invalidPropertyResult),
            });

            // <d:TestAtomConstants.ODataValueElementName /> element with empty content
            yield return(new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString = "<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\"></" + TestAtomConstants.ODataValueElementName + ">",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => CreateAtomFormatResult(model, invalidPropertyResult),
            });

            // <d:TestAtomConstants.ODataValueElementName /> element with text content
            yield return(new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString = "<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\">1</" + TestAtomConstants.ODataValueElementName + ">",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => CreateAtomFormatResult(model, propertyResult),
            });

            // single <m:element /> element
            yield return(new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString =
                    "<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\">" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + " />" +
                    "</" + TestAtomConstants.ODataValueElementName + ">",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => testConfig.IsRequest
                    ? CreateAtomFormatResult(model, collectionAsPropertyInvalidResult)
                    : CreateAtomFormatResult(model, collectionAsPropertyInvalidResult, collectionResult),
            });

            // single <m:element /> element with empty content
            yield return(new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString = ("<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\">" +
                                 "  <" + TestAtomConstants.ODataCollectionItemElementName + "></" + TestAtomConstants.ODataCollectionItemElementName + ">" +
                                 "</" + TestAtomConstants.ODataValueElementName + ">"),
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => testConfig.IsRequest
                    ? CreateAtomFormatResult(model, collectionAsPropertyInvalidResult)
                    : CreateAtomFormatResult(model, collectionAsPropertyInvalidResult, collectionResult),
            });

            // single <m:element /> element with text content
            yield return(new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString =
                    "<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\">" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + ">1</" + TestAtomConstants.ODataCollectionItemElementName + ">" +
                    "</" + TestAtomConstants.ODataValueElementName + ">",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => testConfig.IsRequest
                    ? CreateAtomFormatResult(model, collectionAsPropertyInvalidResult)
                    : CreateAtomFormatResult(model, collectionAsPropertyInvalidResult, collectionResult),
            });

            // multiple <m:element /> elements
            yield return(new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString =
                    "<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\">" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + " />" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + " />" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + " />" +
                    "</" + TestAtomConstants.ODataValueElementName + ">",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => testConfig.IsRequest
                    ? CreateAtomFormatResult(model, collectionAsPropertyInvalidResult)
                    : CreateAtomFormatResult(model, collectionAsPropertyInvalidResult, collectionResult),
            });

            // <d:localname /> and <d:element />
            yield return(new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString =
                    "<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\" xmlns:d=\"" + TestAtomConstants.ODataNamespace + "\">" +
                    "  <" + (localName != TestAtomConstants.ODataCollectionItemElementName ? "d:" : "") + localName + " />" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + ">1</" + TestAtomConstants.ODataCollectionItemElementName + ">" +
                    "</" + TestAtomConstants.ODataValueElementName + ">",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig =>
                                           localName == TestAtomConstants.ODataCollectionItemElementName && !testConfig.IsRequest
                        ? CreateAtomFormatResult(model, collectionAsPropertyInvalidResult, collectionResult)
                        : CreateAtomFormatResult(model, collectionAsPropertyInvalidResult),
            });

            // <d:element />, <d:TestAtomConstants.ODataValueElementName /> and <d:element />
            yield return(new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString =
                    "<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\" xmlns:d=\"" + TestAtomConstants.ODataNamespace + "\">" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + ">1</" + TestAtomConstants.ODataCollectionItemElementName + ">" +
                    "  <" + (localName != TestAtomConstants.ODataCollectionItemElementName ? "d:" : "") + localName + " />" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + ">1</" + TestAtomConstants.ODataCollectionItemElementName + ">" +
                    "</" + TestAtomConstants.ODataValueElementName + ">",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig =>
                                           localName == TestAtomConstants.ODataCollectionItemElementName && !testConfig.IsRequest
                        ? CreateAtomFormatResult(model, collectionAsPropertyInvalidResult, collectionResult)
                        : CreateAtomFormatResult(model, collectionAsPropertyInvalidResult),
            });

            // <m:element />, <m:element /> and <m:TestAtomConstants.ODataValueElementName />
            yield return(new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString =
                    "<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\" xmlns:d=\"" + TestAtomConstants.ODataNamespace + "\">" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + ">1</" + TestAtomConstants.ODataCollectionItemElementName + ">" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + ">1</" + TestAtomConstants.ODataCollectionItemElementName + ">" +
                    "  <" + (localName != TestAtomConstants.ODataCollectionItemElementName ? "d:" : "") + localName + " />" +
                    "</" + TestAtomConstants.ODataValueElementName + ">",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig =>
                                           localName == TestAtomConstants.ODataCollectionItemElementName && !testConfig.IsRequest
                        ? CreateAtomFormatResult(model, collectionAsPropertyInvalidResult, collectionResult)
                        : CreateAtomFormatResult(model, collectionAsPropertyInvalidResult),
            });

            // <d:localname m:type="Edm.Int32"/> element with m:type of Edm.Int32
            yield return(new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString = "<" + TestAtomConstants.ODataValueElementName + " m:type='Edm.Int32' xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\" xmlns:m=\"" + TestAtomConstants.ODataMetadataNamespace + "\" />",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => CreateAtomFormatResult(model, invalidPropertyResult),
            });

            // <d:localname m:type="TestModel.SomeComplexType"/> element with m:type of TestModel.SomeComplexType
            var invalidTypeKindPropertyResult = new PayloadKindResult(ODataPayloadKind.Property, EdmCoreModel.Instance.GetInt32(false), ODataExpectedExceptions.ODataException("ValidationUtils_IncorrectTypeKind", "TestModel.SomeComplexType", "Primitive", "Complex"));

            yield return(new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString = "<" + TestAtomConstants.ODataValueElementName + " m:type='TestModel.SomeComplexType' xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\" xmlns:m=\"" + TestAtomConstants.ODataMetadataNamespace + "\" />",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => CreateAtomFormatResult(model, invalidTypeKindPropertyResult),
            });

            // <d:localname m:type="Collection(Edm.Int32)"/> element with m:type of Collection(Edm.Int32)
            // Will be recognized as property just because it has the m:type
            var invalidCollectionTypeKindPropertyResult = new PayloadKindResult(ODataPayloadKind.Property, EdmCoreModel.Instance.GetInt32(false), ODataExpectedExceptions.ODataException("ValidationUtils_IncorrectTypeKind", "Collection(Edm.Int32)", "Primitive", "Collection"));

            yield return(new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString = "<" + TestAtomConstants.ODataValueElementName + " m:type='Collection(Edm.Int32)' xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\" xmlns:m=\"" + TestAtomConstants.ODataMetadataNamespace + "\" />",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => testConfig.IsRequest
                    ? CreateAtomFormatResult(model, invalidCollectionTypeKindPropertyResult)
                    : CreateAtomFormatResult(model, invalidCollectionTypeKindPropertyResult),
                SkipTestConfiguration = tc => tc.Version < ODataVersion.V4
            });

            // <d:localname m:type="Collection(TestModel.SomeComplexType)"/> element with m:type of Collection(TestModel.SomeComplexType)
            // Will be recognized as property just because it has the m:type
            var invalidCollectionTypeKindPropertyResult2 = new PayloadKindResult(ODataPayloadKind.Property, EdmCoreModel.Instance.GetInt32(false), ODataExpectedExceptions.ODataException("ValidationUtils_IncorrectTypeKind", "Collection(TestModel.SomeComplexType)", "Primitive", "Collection"));

            yield return(new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString = "<" + TestAtomConstants.ODataValueElementName + " m:type='Collection(TestModel.SomeComplexType)' xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\" xmlns:m=\"" + TestAtomConstants.ODataMetadataNamespace + "\" />",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => testConfig.IsRequest
                    ? CreateAtomFormatResult(model, invalidCollectionTypeKindPropertyResult2)
                    : CreateAtomFormatResult(model, invalidCollectionTypeKindPropertyResult2),
                SkipTestConfiguration = tc => tc.Version < ODataVersion.V4
            });
        }
        /// <summary>
        /// Create test descriptors for collection and/or property payloads.
        /// </summary>
        /// <param name="model">The metadata model to use.</param>
        /// <param name="localName">The specified local name.</param>
        /// <param name="contentType">The specified content type.</param>
        /// <returns>The generated test descriptors.</returns>
        private IEnumerable<PayloadKindDetectionTestDescriptor> CreateCollectionAndPropertyTestDescriptors(
            IEdmModel model,
            string localName,
            string contentType)
        {
            var propertyResult = localName == "Id"
                ? new PayloadKindResult(ODataPayloadKind.Property, EdmCoreModel.Instance.GetInt32(false), /*expectedException*/ null)
                : new PayloadKindResult(ODataPayloadKind.Property, /*expectedType*/ null, /*expectedException*/ null);
            var invalidPropertyResult = new PayloadKindResult(ODataPayloadKind.Property, EdmCoreModel.Instance.GetInt32(false), ODataExpectedExceptions.ODataException("ReaderValidationUtils_CannotConvertPrimitiveValue", "", "Edm.Int32"));
            var collectionResult = new PayloadKindResult(ODataPayloadKind.Collection, /*expectedType*/ null, /*expectedException*/ null);
            var collectionAsPropertyInvalidResult = new PayloadKindResult(ODataPayloadKind.Property, EdmCoreModel.Instance.GetInt32(false), ODataExpectedExceptions.ODataException("XmlReaderExtension_InvalidNodeInStringValue", "Element"));

            // empty <d:TestAtomConstants.ODataValueElementName /> element
            yield return new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString = "<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\" />",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => CreateAtomFormatResult(model, invalidPropertyResult),
            };
            // <d:TestAtomConstants.ODataValueElementName /> element with empty content
            yield return new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString = "<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\"></" + TestAtomConstants.ODataValueElementName + ">",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => CreateAtomFormatResult(model, invalidPropertyResult),
            };
            // <d:TestAtomConstants.ODataValueElementName /> element with text content
            yield return new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString = "<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\">1</" + TestAtomConstants.ODataValueElementName + ">",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => CreateAtomFormatResult(model, propertyResult),
            };
            // single <m:element /> element
            yield return new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString =
                    "<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\">" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + " />" +
                    "</" + TestAtomConstants.ODataValueElementName + ">",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => testConfig.IsRequest
                    ? CreateAtomFormatResult(model, collectionAsPropertyInvalidResult)
                    : CreateAtomFormatResult(model, collectionAsPropertyInvalidResult, collectionResult),
            };
            // single <m:element /> element with empty content
            yield return new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString = ("<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\">" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + "></" + TestAtomConstants.ODataCollectionItemElementName + ">" +
                    "</" + TestAtomConstants.ODataValueElementName + ">"),
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => testConfig.IsRequest
                    ? CreateAtomFormatResult(model, collectionAsPropertyInvalidResult)
                    : CreateAtomFormatResult(model, collectionAsPropertyInvalidResult, collectionResult),
            };
            // single <m:element /> element with text content
            yield return new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString =
                    "<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\">" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + ">1</" + TestAtomConstants.ODataCollectionItemElementName + ">" +
                    "</" + TestAtomConstants.ODataValueElementName + ">",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => testConfig.IsRequest
                    ? CreateAtomFormatResult(model, collectionAsPropertyInvalidResult)
                    : CreateAtomFormatResult(model, collectionAsPropertyInvalidResult, collectionResult),
            };
            // multiple <m:element /> elements
            yield return new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString =
                    "<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\">" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + " />" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + " />" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + " />" +
                "</" + TestAtomConstants.ODataValueElementName + ">",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => testConfig.IsRequest
                    ? CreateAtomFormatResult(model, collectionAsPropertyInvalidResult)
                    : CreateAtomFormatResult(model, collectionAsPropertyInvalidResult, collectionResult),
            };
            // <d:localname /> and <d:element />
            yield return new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString =
                    "<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\" xmlns:d=\"" + TestAtomConstants.ODataNamespace + "\">" +
                    "  <" + (localName != TestAtomConstants.ODataCollectionItemElementName ? "d:" : "") + localName + " />" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + ">1</" + TestAtomConstants.ODataCollectionItemElementName + ">" +
                    "</" + TestAtomConstants.ODataValueElementName + ">",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig =>
                    localName == TestAtomConstants.ODataCollectionItemElementName && !testConfig.IsRequest
                        ? CreateAtomFormatResult(model, collectionAsPropertyInvalidResult, collectionResult)
                        : CreateAtomFormatResult(model, collectionAsPropertyInvalidResult),
            };
            // <d:element />, <d:TestAtomConstants.ODataValueElementName /> and <d:element />
            yield return new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString =
                    "<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\" xmlns:d=\"" + TestAtomConstants.ODataNamespace + "\">" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + ">1</" + TestAtomConstants.ODataCollectionItemElementName + ">" +
                    "  <" + (localName != TestAtomConstants.ODataCollectionItemElementName ? "d:" : "") + localName + " />" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + ">1</" + TestAtomConstants.ODataCollectionItemElementName + ">" +
                    "</" + TestAtomConstants.ODataValueElementName + ">",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig =>
                    localName == TestAtomConstants.ODataCollectionItemElementName && !testConfig.IsRequest
                        ? CreateAtomFormatResult(model, collectionAsPropertyInvalidResult, collectionResult)
                        : CreateAtomFormatResult(model, collectionAsPropertyInvalidResult),
            };
            // <m:element />, <m:element /> and <m:TestAtomConstants.ODataValueElementName />
            yield return new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString =
                    "<" + TestAtomConstants.ODataValueElementName + " xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\" xmlns:d=\"" + TestAtomConstants.ODataNamespace + "\">" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + ">1</" + TestAtomConstants.ODataCollectionItemElementName + ">" +
                    "  <" + TestAtomConstants.ODataCollectionItemElementName + ">1</" + TestAtomConstants.ODataCollectionItemElementName + ">" +
                    "  <" + (localName != TestAtomConstants.ODataCollectionItemElementName ? "d:" : "") + localName + " />" +
                    "</" + TestAtomConstants.ODataValueElementName + ">",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig =>
                    localName == TestAtomConstants.ODataCollectionItemElementName && !testConfig.IsRequest
                        ? CreateAtomFormatResult(model, collectionAsPropertyInvalidResult, collectionResult)
                        : CreateAtomFormatResult(model, collectionAsPropertyInvalidResult),
            };
            // <d:localname m:type="Edm.Int32"/> element with m:type of Edm.Int32
            yield return new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString = "<" + TestAtomConstants.ODataValueElementName + " m:type='Edm.Int32' xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\" xmlns:m=\"" + TestAtomConstants.ODataMetadataNamespace + "\" />",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => CreateAtomFormatResult(model, invalidPropertyResult),
            };
            // <d:localname m:type="TestModel.SomeComplexType"/> element with m:type of TestModel.SomeComplexType
            var invalidTypeKindPropertyResult = new PayloadKindResult(ODataPayloadKind.Property, EdmCoreModel.Instance.GetInt32(false), ODataExpectedExceptions.ODataException("ValidationUtils_IncorrectTypeKind", "TestModel.SomeComplexType", "Primitive", "Complex"));
            yield return new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString = "<" + TestAtomConstants.ODataValueElementName + " m:type='TestModel.SomeComplexType' xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\" xmlns:m=\"" + TestAtomConstants.ODataMetadataNamespace + "\" />",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => CreateAtomFormatResult(model, invalidTypeKindPropertyResult),
            };
            // <d:localname m:type="Collection(Edm.Int32)"/> element with m:type of Collection(Edm.Int32)
            // Will be recognized as property just because it has the m:type
            var invalidCollectionTypeKindPropertyResult = new PayloadKindResult(ODataPayloadKind.Property, EdmCoreModel.Instance.GetInt32(false), ODataExpectedExceptions.ODataException("ValidationUtils_IncorrectTypeKind", "Collection(Edm.Int32)", "Primitive", "Collection"));
            yield return new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString = "<" + TestAtomConstants.ODataValueElementName + " m:type='Collection(Edm.Int32)' xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\" xmlns:m=\"" + TestAtomConstants.ODataMetadataNamespace + "\" />",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => testConfig.IsRequest
                    ? CreateAtomFormatResult(model, invalidCollectionTypeKindPropertyResult)
                    : CreateAtomFormatResult(model, invalidCollectionTypeKindPropertyResult),
                SkipTestConfiguration = tc => tc.Version < ODataVersion.V4
            };
            // <d:localname m:type="Collection(TestModel.SomeComplexType)"/> element with m:type of Collection(TestModel.SomeComplexType)
            // Will be recognized as property just because it has the m:type
            var invalidCollectionTypeKindPropertyResult2 = new PayloadKindResult(ODataPayloadKind.Property, EdmCoreModel.Instance.GetInt32(false), ODataExpectedExceptions.ODataException("ValidationUtils_IncorrectTypeKind", "Collection(TestModel.SomeComplexType)", "Primitive", "Collection"));
            yield return new PayloadKindDetectionTestDescriptor(this.Settings)
            {
                ContentType = contentType,
                PayloadString = "<" + TestAtomConstants.ODataValueElementName + " m:type='Collection(TestModel.SomeComplexType)' xmlns=\"" + TestAtomConstants.ODataMetadataNamespace + "\" xmlns:m=\"" + TestAtomConstants.ODataMetadataNamespace + "\" />",
                PayloadEdmModel = model,
                ReadDetectedPayloads = true,
                ExpectedDetectionResults = testConfig => testConfig.IsRequest
                    ? CreateAtomFormatResult(model, invalidCollectionTypeKindPropertyResult2)
                    : CreateAtomFormatResult(model, invalidCollectionTypeKindPropertyResult2),
                SkipTestConfiguration = tc => tc.Version < ODataVersion.V4
            };
        }