public void ContractCollection_XmlRoundTrip() { var before = new ContractCollection(); before.GetOrAddReadContract(typeof(Person)); before.GetOrAddWriteContract(typeof(Person)); before.GetOrAddReadContract(typeof(Wrapper <Person>)); before.GetOrAddReadContract(typeof(EnumAbc)); before.GetOrAddWriteContract(typeof(EnumAbc)); before.GetOrAddReadContract(typeof(Wrapper <EnumAbc>)); before.GetOrAddReadContract(typeof(Union <int, string, Person, EnumAbcd>)); before.GetOrAddWriteContract(typeof(Union <int, string, Person, EnumAbcd>)); Assert.Equal(8, before.Contracts.OfType <ByRefContract>().Count()); before.UpdateByRefIds(); var xml = before.ToXml(); const string expectedXml = @"<Contracts> <ComplexRead Id=""Contract1""> <Field Name=""age"" Contract=""Int32"" IsRequired=""true"" /> <Field Name=""name"" Contract=""String"" IsRequired=""true"" /> </ComplexRead> <ComplexWrite Id=""Contract2""> <Field Name=""Age"" Contract=""Int32"" /> <Field Name=""Name"" Contract=""String"" /> </ComplexWrite> <ComplexRead Id=""Contract3""> <Field Name=""value"" Contract=""#Contract1"" IsRequired=""true"" /> </ComplexRead> <Enum Id=""Contract4""> <Member Name=""A"" /> <Member Name=""B"" /> <Member Name=""C"" /> </Enum> <ComplexRead Id=""Contract5""> <Field Name=""value"" Contract=""#Contract4"" IsRequired=""true"" /> </ComplexRead> <Enum Id=""Contract6""> <Member Name=""A"" /> <Member Name=""B"" /> <Member Name=""C"" /> <Member Name=""D"" /> </Enum> <UnionRead Id=""Contract7""> <Member Id=""Dasher.Tests.EnumAbcd"" Contract=""#Contract6"" /> <Member Id=""Dasher.Tests.Person"" Contract=""#Contract1"" /> <Member Id=""Int32"" Contract=""Int32"" /> <Member Id=""String"" Contract=""String"" /> </UnionRead> <UnionWrite Id=""Contract8""> <Member Id=""Dasher.Tests.EnumAbcd"" Contract=""#Contract6"" /> <Member Id=""Dasher.Tests.Person"" Contract=""#Contract2"" /> <Member Id=""Int32"" Contract=""Int32"" /> <Member Id=""String"" Contract=""String"" /> </UnionWrite> </Contracts>"; var actualXml = xml.ToString(); _output.WriteLine(actualXml); Assert.Equal(expectedXml, actualXml, new SelectiveStringComparer()); Assert.Equal(8, xml.Elements().Count()); var after = ContractCollection.FromXml(xml); Assert.True(new HashSet <Contract>(before.Contracts).SetEquals(new HashSet <Contract>(after.Contracts))); Assert.Equal(before.Contracts.Count, after.Contracts.Count); foreach (var b in before.Contracts) { Assert.Equal(1, after.Contracts.Count(s => s.Equals(b))); } foreach (var a in after.Contracts) { Assert.Equal(1, before.Contracts.Count(s => s.Equals(a))); } }