public void TestProjectStartedEventArgs()
        {
            // Test with reasonable values
            ProjectStartedEventArgs genericEvent = new ProjectStartedEventArgs(8, "Message", "HelpKeyword", "ProjectFile", null, null, null, new BuildEventContext(7, 8, 9, 10));
            genericEvent.BuildEventContext = new BuildEventContext(5, 4, 3, 2);

            // Serialize
            genericEvent.WriteToStream(_writer);
            long streamWriteEndPosition = _stream.Position;

            // Deserialize and Verify
            _stream.Position = 0;
            ProjectStartedEventArgs newGenericEvent = new ProjectStartedEventArgs(-1, null, null, null, null, null, null, null);
            newGenericEvent.CreateFromStream(_reader, _eventArgVersion);
            long streamReadEndPosition = _stream.Position;
            Assert.IsTrue(streamWriteEndPosition == streamReadEndPosition, "Stream End Positions Should Match");
            VerifyGenericEventArg(genericEvent, newGenericEvent);
            VerifyProjectStartedEvent(genericEvent, newGenericEvent);

            // Test with empty strings
            _stream.Position = 0;
            genericEvent = new ProjectStartedEventArgs(-1, string.Empty, string.Empty, string.Empty, string.Empty, null, null, null);
            genericEvent.BuildEventContext = new BuildEventContext(5, 4, 3, 2);

            // Serialize
            genericEvent.WriteToStream(_writer);
            streamWriteEndPosition = _stream.Position;

            // Deserialize and Verify
            _stream.Position = 0;
            newGenericEvent = new ProjectStartedEventArgs(-1, null, null, null, null, null, null, null);
            newGenericEvent.CreateFromStream(_reader, _eventArgVersion);
            streamReadEndPosition = _stream.Position;
            Assert.IsTrue(streamWriteEndPosition == streamReadEndPosition, "Stream end positions should be equal");
            VerifyGenericEventArg(genericEvent, newGenericEvent);
            VerifyProjectStartedEvent(genericEvent, newGenericEvent);

            // Test with null strings
            _stream.Position = 0;
            genericEvent = new ProjectStartedEventArgs(-1, null, null, null, null, null, null, null);
            genericEvent.BuildEventContext = null;

            // Serialize
            genericEvent.WriteToStream(_writer);
            streamWriteEndPosition = _stream.Position;

            // Deserialize and Verify
            _stream.Position = 0;
            newGenericEvent = new ProjectStartedEventArgs(4, "Something", "Something", "Something", null, null, null, null);
            newGenericEvent.CreateFromStream(_reader, _eventArgVersion);
            streamReadEndPosition = _stream.Position;
            Assert.IsTrue(streamWriteEndPosition == streamReadEndPosition, "Stream End Positions Should Match");
            VerifyGenericEventArg(genericEvent, newGenericEvent);
            VerifyProjectStartedEvent(genericEvent, newGenericEvent);
        }
        public void TestProjectStartedPropertySerialization()
        {
            // Create a list of test properties which should make it through serialization
            List<DictionaryEntry> propertyList = new List<DictionaryEntry>();
            propertyList.Add(new DictionaryEntry("TeamBuildOutDir", "c:\\outdir"));
            propertyList.Add(new DictionaryEntry("Configuration", "BuildConfiguration"));
            propertyList.Add(new DictionaryEntry("Platform", "System Platform"));
            propertyList.Add(new DictionaryEntry("OutDir", "myOutDir"));
            propertyList.Add(new DictionaryEntry("WorkSpaceName", " MyWorkspace"));
            propertyList.Add(new DictionaryEntry("WorkSpaceOwner", "The workspace owner"));
            propertyList.Add(new DictionaryEntry("IAmBlank", string.Empty));

            ProjectStartedEventArgs genericEvent = new ProjectStartedEventArgs(8, "Message", "HelpKeyword", "ProjectFile", null, propertyList, null, new BuildEventContext(7, 8, 9, 10));
            genericEvent.BuildEventContext = new BuildEventContext(7, 8, 9, 10);

            // Serialize
            genericEvent.WriteToStream(_writer);
            long streamWriteEndPosition = _stream.Position;

            // Deserialize and Verify
            _stream.Position = 0;
            ProjectStartedEventArgs newGenericEvent = new ProjectStartedEventArgs(-1, null, null, null, null, null, null, null);

            newGenericEvent.CreateFromStream(_reader, _eventArgVersion);
            long streamReadEndPosition = _stream.Position;

            Assert.IsTrue(streamWriteEndPosition == streamReadEndPosition, "Stream End Positions Should Match");
            Assert.IsNotNull(newGenericEvent.Properties, "Expected Properties to not be null");

            // Create a list of all of the dictionaryEntries which were deserialized
            List<DictionaryEntry> entryList = new List<DictionaryEntry>();
            foreach (DictionaryEntry entry in newGenericEvent.Properties)
            {
                entryList.Add(entry);
            }

            // Verify that each of the items in propertyList is inside of the deserialized entryList.
            AssertDictionaryEntry(entryList, propertyList);
        }