public void StreamMessage(ODataMessageReaderTestWrapper reader, ODataMessageWriterTestWrapper writer, ODataPayloadKind payloadKind, WriterTestConfiguration config)
        {
            ExceptionUtilities.CheckArgumentNotNull(reader, "reader is required");
            ExceptionUtilities.CheckArgumentNotNull(writer, "writer is required");
            ExceptionUtilities.CheckArgumentNotNull(payloadKind, "payloadKind is required");
            ExceptionUtilities.CheckArgumentNotNull(config, "config is required");

            this.testConfiguration = config;

            switch(payloadKind)
            {
                case ODataPayloadKind.Entry:
                    this.StartRead(reader.CreateODataEntryReader(), writer.CreateODataEntryWriter());
                    break;

                case ODataPayloadKind.Feed:
                    this.StartRead(reader.CreateODataFeedReader(), writer.CreateODataFeedWriter());
                    break;
                default:
                    throw new NotSupportedException("ObjectModelReadWriteStreamer currently supports only feed and entry");
            };
        }
 private void WriteTopLevelEntry(ODataMessageWriterTestWrapper messageWriter, ODataMessageReaderTestWrapper messageReader, ODataEntry entry)
 {
     ODataWriter entryWriter = messageWriter.CreateODataEntryWriter();
     Lazy<ODataReader> lazyEntryReader = new Lazy<ODataReader>(() => messageReader.CreateODataEntryReader());
     this.WriteEntry(entryWriter, lazyEntryReader, entry);
 }
            /// <summary>
            /// Read an entry as the message content.
            /// </summary>
            /// <param name="messageReader">The message reader to use for reading.</param>
            /// <param name="entitySet">The entity set to use for reading entry or feed payloads.</param>
            /// <param name="expectedEntityTypeReference">The expected entity type to pass to the reader.</param>
            /// <returns>An <see cref="ODataEntry"/>, possibly with annotations.</returns>
            public ODataEntry ReadTopLevelEntry(ODataMessageReaderTestWrapper messageReader, IEdmEntitySet entitySet, IEdmTypeReference expectedEntityTypeReference)
            {
                IEdmEntityType entityType = expectedEntityTypeReference == null ? null : expectedEntityTypeReference.Definition as IEdmEntityType;
                ODataReader entryReader = messageReader.CreateODataEntryReader(entitySet, entityType);
                try
                {
                    // read the start of the entry
                    entryReader.Read();
                    this.assert.AreEqual(ODataReaderState.EntryStart, entryReader.State, "Reader states don't match.");

                    ODataEntry entry = this.ReadEntry(entryReader);
                    this.assert.AreEqual(ODataReaderState.EntryEnd, entryReader.State, "Reader states don't match.");

                    // read once more to the end-of-input
                    bool moreToRead = entryReader.Read();
                    this.assert.IsFalse(moreToRead, "Expected to reach the end of the input.");

                    return entry;
                }
                catch (Exception e)
                {
                    if (ExceptionUtilities.IsCatchable(e))
                    {
                        this.assert.AreEqual(ODataReaderState.Exception, entryReader.State, "Expected the reader to be in 'Exception' state.");
                    }

                    throw;
                }
            }