From e23387c7faebc1db29958a40a680acf1872b70cb Mon Sep 17 00:00:00 2001 From: Wouter Groeneveld Date: Mon, 17 Mar 2014 10:23:08 +0100 Subject: [PATCH] fix XElement copy, added unit tests & vsproject --- .gitignore | 6 ++ ObjectExtensions.cs | 2 + Properties/AssemblyInfo.cs | 36 ++++++++++ netobjdeepcopy.csproj | 53 +++++++++++++++ netobjdeepcopy.sln | 26 ++++++++ netobjdeepcopy.sln.DotSettings.user | 4 ++ netobjdeepcopy.v11.suo | Bin 0 -> 107520 bytes unittests/ObjectExtensionsTests.cs | 94 +++++++++++++++++++++++++++ unittests/Properties/AssemblyInfo.cs | 36 ++++++++++ unittests/unittests.csproj | 91 ++++++++++++++++++++++++++ 10 files changed, 348 insertions(+) create mode 100644 .gitignore create mode 100644 Properties/AssemblyInfo.cs create mode 100644 netobjdeepcopy.csproj create mode 100644 netobjdeepcopy.sln create mode 100644 netobjdeepcopy.sln.DotSettings.user create mode 100644 netobjdeepcopy.v11.suo create mode 100644 unittests/ObjectExtensionsTests.cs create mode 100644 unittests/Properties/AssemblyInfo.cs create mode 100644 unittests/unittests.csproj diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..940865e --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*.pdb +*.exe +**/obj/** +*.dll +*.class +**/bin/** diff --git a/ObjectExtensions.cs b/ObjectExtensions.cs index 02ea1cc..0c58025 100644 --- a/ObjectExtensions.cs +++ b/ObjectExtensions.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Reflection; using System.ArrayExtensions; +using System.Xml.Linq; namespace System { @@ -23,6 +24,7 @@ private static Object InternalCopy(Object originalObject, IDictionary + + + + Debug + AnyCPU + {7900459D-F2F7-461F-948A-FFE4EEFF6148} + Library + Properties + netobjdeepcopy + netobjdeepcopy + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/netobjdeepcopy.sln b/netobjdeepcopy.sln new file mode 100644 index 0000000..ba83e3f --- /dev/null +++ b/netobjdeepcopy.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "netobjdeepcopy", "netobjdeepcopy.csproj", "{7900459D-F2F7-461F-948A-FFE4EEFF6148}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "unittests", "unittests\unittests.csproj", "{F3B0CDAD-046C-4023-B980-C5EA0FCE9D9B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7900459D-F2F7-461F-948A-FFE4EEFF6148}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7900459D-F2F7-461F-948A-FFE4EEFF6148}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7900459D-F2F7-461F-948A-FFE4EEFF6148}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7900459D-F2F7-461F-948A-FFE4EEFF6148}.Release|Any CPU.Build.0 = Release|Any CPU + {F3B0CDAD-046C-4023-B980-C5EA0FCE9D9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F3B0CDAD-046C-4023-B980-C5EA0FCE9D9B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F3B0CDAD-046C-4023-B980-C5EA0FCE9D9B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F3B0CDAD-046C-4023-B980-C5EA0FCE9D9B}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/netobjdeepcopy.sln.DotSettings.user b/netobjdeepcopy.sln.DotSettings.user new file mode 100644 index 0000000..0d70c86 --- /dev/null +++ b/netobjdeepcopy.sln.DotSettings.user @@ -0,0 +1,4 @@ + + True + ObjectExtensionsTests + <Session><Elements><UnitTestElement Provider="MSTest" Id="MsTest:unittests.ObjectExtensionsTests" type="MsTestTestClassElement" TypeName="unittests.ObjectExtensionsTests" Project="F3B0CDAD-046C-4023-B980-C5EA0FCE9D9B" /><UnitTestElement Provider="MSTest" Id="MsTest:unittests.ObjectExtensionsTests.Copy_CopiesEnumerables" ParentId="MsTest:unittests.ObjectExtensionsTests" type="MsTestTestMethodElement" MethodName="Copy_CopiesEnumerables" TypeName="unittests.ObjectExtensionsTests" Project="F3B0CDAD-046C-4023-B980-C5EA0FCE9D9B" /><UnitTestElement Provider="MSTest" Id="MsTest:unittests.ObjectExtensionsTests.Copy_CopiesNestedObject" ParentId="MsTest:unittests.ObjectExtensionsTests" type="MsTestTestMethodElement" MethodName="Copy_CopiesNestedObject" TypeName="unittests.ObjectExtensionsTests" Project="F3B0CDAD-046C-4023-B980-C5EA0FCE9D9B" /><UnitTestElement Provider="MSTest" Id="MsTest:unittests.ObjectExtensionsTests.Copy_CopiesSingleBuiltInObjects" ParentId="MsTest:unittests.ObjectExtensionsTests" type="MsTestTestMethodElement" MethodName="Copy_CopiesSingleBuiltInObjects" TypeName="unittests.ObjectExtensionsTests" Project="F3B0CDAD-046C-4023-B980-C5EA0FCE9D9B" /><UnitTestElement Provider="MSTest" Id="MsTest:unittests.ObjectExtensionsTests.Copy_CopiesSingleObject" ParentId="MsTest:unittests.ObjectExtensionsTests" type="MsTestTestMethodElement" MethodName="Copy_CopiesSingleObject" TypeName="unittests.ObjectExtensionsTests" Project="F3B0CDAD-046C-4023-B980-C5EA0FCE9D9B" /><UnitTestElement Provider="MSTest" Id="MsTest:unittests.ObjectExtensionsTests.Copy_XElementWithChildren" ParentId="MsTest:unittests.ObjectExtensionsTests" type="MsTestTestMethodElement" MethodName="Copy_XElementWithChildren" TypeName="unittests.ObjectExtensionsTests" Project="F3B0CDAD-046C-4023-B980-C5EA0FCE9D9B" /></Elements></Session> \ No newline at end of file diff --git a/netobjdeepcopy.v11.suo b/netobjdeepcopy.v11.suo new file mode 100644 index 0000000000000000000000000000000000000000..91c4146f498ea15aea631eb8f07fcd87899fa0e0 GIT binary patch literal 107520 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 U?}r}$_;33jd}`N&t$_Fc0o26;6#xJL literal 0 HcmV?d00001 diff --git a/unittests/ObjectExtensionsTests.cs b/unittests/ObjectExtensionsTests.cs new file mode 100644 index 0000000..ec3c935 --- /dev/null +++ b/unittests/ObjectExtensionsTests.cs @@ -0,0 +1,94 @@ +#region + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Xml.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +#endregion + +namespace unittests +{ + [TestClass] + public class ObjectExtensionsTests + { + private class MySingleObject + { + public string One; + private int two; + + public int Two + { + get { return two; } + set { two = value; } + } + } + + private class MyNestedObject + { + public MySingleObject Single; + public string Meta; + } + + [TestMethod] + public void Copy_XElementWithChildren() + { + XElement el = XElement.Parse(@" + + hi + hello + "); + XElement copied = el.Copy(); + + var children = copied.Elements("child").ToList(); + Assert.AreEqual(2, children.Count); + Assert.AreEqual("wow", children[0].Attribute("attrib").Value); + Assert.AreEqual("hi", children[0].Value); + + Assert.AreEqual("yeah", children[1].Attribute("attrib").Value); + Assert.AreEqual("hello", children[1].Value); + } + + [TestMethod] + public void Copy_CopiesNestedObject() + { + MyNestedObject copied = + new MyNestedObject() {Meta = "metadata", Single = new MySingleObject() {One = "single_one"}}.Copy(); + + Assert.AreEqual("metadata", copied.Meta); + Assert.AreEqual("single_one", copied.Single.One); + } + + [TestMethod] + public void Copy_CopiesEnumerables() + { + IList list = new List() + { + new MySingleObject() {One = "1"}, + new MySingleObject() {One = "2"} + }; + IList copied = list.Copy(); + + Assert.AreEqual(2, copied.Count); + Assert.AreEqual("1", list[0].One); + Assert.AreEqual("2", list[1].One); + } + + [TestMethod] + public void Copy_CopiesSingleObject() + { + MySingleObject copied = new MySingleObject() {One = "one", Two = 2}.Copy(); + + Assert.AreEqual("one", copied.One); + Assert.AreEqual(2, copied.Two); + } + + [TestMethod] + public void Copy_CopiesSingleBuiltInObjects() + { + Assert.AreEqual("hello there", "hello there".Copy()); + Assert.AreEqual(123, 123.Copy()); + } + } +} \ No newline at end of file diff --git a/unittests/Properties/AssemblyInfo.cs b/unittests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..5c9077d --- /dev/null +++ b/unittests/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("unittests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Cegekanv")] +[assembly: AssemblyProduct("unittests")] +[assembly: AssemblyCopyright("Copyright © Cegekanv 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("ee1ceb32-5ed9-4c74-a402-2cb2d71450f0")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/unittests/unittests.csproj b/unittests/unittests.csproj new file mode 100644 index 0000000..9b8cffe --- /dev/null +++ b/unittests/unittests.csproj @@ -0,0 +1,91 @@ + + + + Debug + AnyCPU + {F3B0CDAD-046C-4023-B980-C5EA0FCE9D9B} + Library + Properties + unittests + unittests + v4.5 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + {7900459d-f2f7-461f-948a-ffe4eeff6148} + netobjdeepcopy + + + + + + + False + + + False + + + False + + + False + + + + + + + + \ No newline at end of file