Hey,

The attached patch contains the latest suggestions of both Kornel and
Ben. Maybe the only thing to be noted is that I kept the hexadecimal
notation when comparing chars, since the same is used in
Char.GetNumericalValue ().

New tests are also attached, and run fine under .Net 2.0

Carlos.
Index: AssemblyName.cs
===================================================================
--- AssemblyName.cs	(revisión: 48583)
+++ AssemblyName.cs	(copia de trabajo)
@@ -37,6 +37,8 @@
 using System.Text;
 using System.Runtime.InteropServices;
 using System.Runtime.CompilerServices;
+using System.IO;
+using System.Collections.Generic;
 
 using Mono.Security;
 
@@ -73,7 +75,6 @@
 		int processor_architecture;
 #endif
         #endregion
-		
 		public AssemblyName ()
 		{
 			// defaults
@@ -81,11 +82,102 @@
 		}
 
 #if NET_2_0
+		const string exceptionMessage = "The assembly name is invalid.";
+		
 		public AssemblyName (string assemblyName)
 		{
-			name = assemblyName;
+			string [] parts;
+
+			if (assemblyName == null)
+				throw new ArgumentNullException ("assemblyName");
+			if (assemblyName.Length < 1)
+				throw new ArgumentException ("assemblyName cannot have zero length", "assemblyName");
+			
+			parts = assemblyName.Split (',');
+			name = parts [0].Trim ();
+			if (name.Length < 1)
+				throw new FileLoadException (exceptionMessage);
+
+			IComparer<string> comparer = StringComparer.OrdinalIgnoreCase;
+			for (int i = 1; i < parts.Length; i++) {
+				if (parts [i].IndexOf ('=') < 0)
+					throw new FileLoadException (exceptionMessage);
+
+				string [] values = parts [i].Split ('=');
+				values [0] = values [0].Trim ();
+				values [1] = values [1].Trim ();
+				if (values [0].Length < 1 || values [1].Length < 1)
+					throw new FileLoadException (exceptionMessage);
+
+				if (comparer.Compare (values [0], "Version") == 0) {
+					if (version != null)
+						throw new FileLoadException (exceptionMessage);
+					try {
+						version = new Version (values [1]);
+					} catch (ArgumentException) {
+						throw new FileLoadException (exceptionMessage);
+					} catch (FormatException) {
+						throw new FileLoadException (exceptionMessage);
+					}
+				} else if (comparer.Compare (values [0], "Culture") == 0) {
+					if (cultureinfo != null)
+						throw new FileLoadException (exceptionMessage);
+					if (comparer.Compare (values [1], "neutral") == 0)
+						values [1] = "";
+					cultureinfo = new CultureInfo (values [1]);
+				} else if (comparer.Compare (values [0], "PublicKeyToken") == 0) {
+					if (keyToken != null)
+						throw new FileLoadException (exceptionMessage);
+					ParsePublicKeyToken (values [1]);
+				} else if (comparer.Compare (values [0], "PublicKey") == 0) {
+					if (publicKey != null)
+						throw new FileLoadException (exceptionMessage);
+					ParsePublicKey (values [1]);
+				} else
+					throw new FileLoadException (exceptionMessage);
+			}
+			
 		}
 
+		void ParsePublicKeyToken (string kToken)
+		{
+			if (kToken.Length != 16)
+				throw new FileLoadException (exceptionMessage);
+
+			keyToken = new byte [8];
+			for (int i = 0, j = 0; i < 8; i++) {
+				keyToken [i] = (byte) (GetCharNumericValue (kToken [j++]) << 4);
+				keyToken [i] |= (byte) GetCharNumericValue (kToken [j++]);
+			}
+		}
+
+		void ParsePublicKey (string key)
+		{
+			if (key.Length != 320)
+				throw new FileLoadException (exceptionMessage);
+			
+			publicKey = new byte [160];
+			for (int i = 0, j = 0; i < 160; i++) {
+				publicKey [i] = (byte) (GetCharNumericValue (key [j++]) << 4);
+				publicKey [i] |= (byte) GetCharNumericValue (key [j++]);
+			}
+			flags = AssemblyNameFlags.PublicKey;
+		}
+
+		int GetCharNumericValue (char c)
+		{
+			if (c >= (char)0x30 && c <= (char)0x3B)
+				return c - 0x30; // 0-9
+			if (c >= (char)0x41 && c <= (char)0x46)
+				return c - 0x37; // A-F
+			if (c >= (char)0x61 && c <= (char)0x66)
+				return c - 0x57; // a-f
+
+			throw new FileLoadException (exceptionMessage);
+		}
+#endif
+		
+#if NET_2_0
 		[MonoTODO]
 		public ProcessorArchitecture ProcessorArchitecture {
 			get {
Index: AssemblyNameTest.cs
===================================================================
--- AssemblyNameTest.cs	(revisión: 48583)
+++ AssemblyNameTest.cs	(copia de trabajo)
@@ -531,6 +531,228 @@
 		}
 		return tokenString;
 	}
+
+#if NET_2_0
+	[Test]
+	public void Ctor1 ()
+	{
+		const string assemblyName = "TestAssembly";
+		AssemblyName an = new AssemblyName (assemblyName);
+		Assert.IsNotNull (an.Name, "Ctor1#1");
+		Assert.AreEqual (an.Name, assemblyName, "Ctor1#2");
+	}
+
+	[Test]
+	public void Ctor2 ()
+	{
+		const string assemblyName = "TestAssembly";
+		const string assemblyVersion = "1.2.3.4";
+		AssemblyName an = new AssemblyName (assemblyName + ", Version=" + assemblyVersion);
+		Assert.IsNotNull (an.Name, "Ctor2#1");
+		Assert.AreEqual (an.Name, assemblyName, "Ctor2#2");
+		Assert.IsNotNull (an.Version, "Ctor2#3");
+		Assert.AreEqual (an.Version, new Version (assemblyVersion), "Ctor2#4");
+	}
+
+	[Test]
+	public void Ctor3 ()
+	{
+		const string assemblyName = "TestAssembly";
+		const string assemblyCulture = "en-US";
+		AssemblyName an = new AssemblyName (assemblyName + ", Culture=" + assemblyCulture);
+		Assert.IsNotNull (an.Name, "Ctor3#1");
+		Assert.AreEqual (an.Name, assemblyName, "Ctor3#2");
+		Assert.IsNotNull (an.CultureInfo, "Ctor3#3");
+		Assert.AreEqual (an.CultureInfo, new CultureInfo (assemblyCulture), "Ctor3#4");
+	}
+
+	[Test]
+	public void Ctor4 ()
+	{
+		const string assemblyName = "TestAssembly";
+		byte [] assemblyKeyToken;
+		AssemblyName an = new AssemblyName (assemblyName + ", PublicKeyToken=" + GetTokenString (token));
+		Assert.IsNotNull (an.Name, "Ctor4#1");
+		Assert.AreEqual (an.Name, assemblyName, "Ctor4#2");
+		Assert.IsNotNull (assemblyKeyToken = an.GetPublicKeyToken (), "Ctor4#3");
+		Assert.AreEqual (assemblyKeyToken, token, "Ctor4#4");
+	}
+
+	[Test]
+	public void Ctor5 ()
+	{
+		const string assemblyName = "TestAssembly";
+		const string assemblyCulture = "neutral";
+		const string assemblyVersion = "1.2.3.4";
+		byte [] assemblyKeyToken;
+
+		AssemblyName an = new AssemblyName (assemblyName + ", Version=" + assemblyVersion + 
+				", Culture=" + assemblyCulture + ", PublicKeyToken=" + GetTokenString (token));
+		Assert.IsNotNull (an.Name, "Ctor5#1");
+		Assert.AreEqual (an.Name, assemblyName, "Ctor5#2");
+		Assert.IsNotNull (an.CultureInfo, "Ctor5#3");
+		Assert.AreEqual (an.CultureInfo, new CultureInfo (""), "Ctor5#4");
+		Assert.IsNotNull (an.Version, "Ctor5#5");
+		Assert.AreEqual (an.Version, new Version (assemblyVersion), "Ctor5#6");
+		Assert.IsNotNull (assemblyKeyToken = an.GetPublicKeyToken (), "Ctor5#7");
+		Assert.AreEqual (assemblyKeyToken, token, "Ctor5#8");
+	}
+
+	[Test]
+	public void Ctor6 ()
+	{
+		const string assemblyName = "TestAssembly";
+		AssemblyName an = null;
+		
+		// null argument
+		try {
+			an = new AssemblyName (null);
+		} catch (ArgumentNullException) {
+		}
+		Assert.IsNull (an, "Ctor6#1");
+
+		// empty string
+		an = null;
+		try {
+			an = new AssemblyName ("");
+		} catch (ArgumentException) {
+		}
+		Assert.IsNull (an, "Ctor6#2");
+
+		// name missing
+		an = null;
+		try {
+			an = new AssemblyName (", Version=1.4.5.6");
+		} catch (FileLoadException) {
+		}
+		Assert.IsNull (an, "Ctor6#3");
+
+		// incomplete entry
+		an = null;
+		try {
+			an = new AssemblyName (assemblyName + ", Version=,Culture=neutral");
+		} catch (FileLoadException) {
+		}
+		Assert.IsNull (an, "Ctor6#4");
+
+		// version repeated
+		an = null;
+		try {
+			an = new AssemblyName (assemblyName + ", Version=1.2.3.4, Version=1.4.5.6");
+		} catch (FileLoadException) {
+		}
+		Assert.IsNull (an, "Ctor6#5");
+
+		// bad format for Version
+		an = null;
+		try {
+			an = new AssemblyName (assemblyName + ", Version=1.-1.0.5");
+		} catch (FileLoadException) {
+		}
+		Assert.IsNull (an, "Ctor6#6");
+
+		// bad format for version
+		an = null;
+		try {
+			an = new AssemblyName (assemblyName + ", Version=a.b");
+		} catch (FileLoadException) {
+		}
+		Assert.IsNull (an, "Ctor6#7");
+
+		// culture repeated
+		an = null;
+		try {
+			an = new AssemblyName (assemblyName + ", Culture=neutral, Culture=en-US");
+		} catch (FileLoadException) {
+		}
+		Assert.IsNull (an, "Ctor6#8");
+
+		// bad culture info
+		an = null;
+		try {
+			an = new AssemblyName (assemblyName + ", Culture=aa-AA");
+		} catch (ArgumentException) {
+		}
+		Assert.IsNull (an, "Ctor6#9");
+
+		// key token repeated
+		an = null;
+		try {
+			an = new AssemblyName (assemblyName + ", PublicKeyToken=27576a8182a18822, PublicKeyToken=27576a8182a18822");
+		} catch (FileLoadException) {
+		}
+		Assert.IsNull (an, "Ctor6#10");
+
+		// incorrect length for key token
+		an = null;
+		try {
+			an = new AssemblyName (assemblyName + ", PublicKeyToken=27576a8182a188");
+		} catch (FileLoadException) {
+		}
+		Assert.IsNull (an, "Ctor6#11");
+
+		// Incorrect values
+		an = null;
+		try {
+			an = new AssemblyName (assemblyName + ", PublicKeyToken=27576H8182?18822");
+		} catch (FileLoadException) {
+		}
+		Assert.IsNull (an, "Ctor6#12");
+
+		// Incorrect length for key
+		an = null;
+		try {
+			an = new AssemblyName (assemblyName + ", PublicKey=" + "0024000004800000940000000602000000240000525341310004000011000000e39d99616f48cf7d6d59f345e485e713e89b8b1265a31b1a393e9894ee3fbddaf382dcaf4083dc31ee7a40a2a25c69c6d019fba9f37ec17fd680e4f6fe3b5305f71ae9e494e3501d92508c2e98ca1e22991a217aa8ce259c9882ffdfff4fbc6fa5e6660a8ff951cd94ed011e5633651b64e8f4522519b6ec84921ee22e4840e");
+		} catch (FileLoadException) {
+		}
+		Assert.IsNull (an, "Ctor6#13");
+
+		// missing spec
+		an = null;
+		try {
+			an = new AssemblyName (assemblyName + ", =1.2.4.5");
+		} catch (FileLoadException) {
+		}
+		Assert.IsNull (an, "Ctor6#14");
+
+		// wrong values
+		an = null;
+		try {
+			an = new AssemblyName (assemblyName + ", OtherAttribute=someval");
+		} catch (FileLoadException) {
+		}
+		Assert.IsNull (an, "Ctor6#15");
+
+		// No '=' found
+		an = null;
+		try {
+			an = new AssemblyName (assemblyName + ", OtherAttribute");
+		} catch (FileLoadException) {
+		}
+		Assert.IsNull (an, "Ctor6#16");
+	}
+
+	[Test]
+	public void Ctor7 ()
+	{
+		const string assemblyName = "TestAssembly";
+		const string assemblyCulture = "neutral";
+		const string assemblyVersion = "1.2.3.4";
+		byte [] assemblyKeyToken;
+
+		AssemblyName an = new AssemblyName (assemblyName + ", VERSION = " + assemblyVersion + 
+				", CULTURE = " + assemblyCulture + ", PUBLICKEYTOKEN = " + GetTokenString (token));
+		Assert.IsNotNull (an.Name, "Ctor7#1");
+		Assert.AreEqual (an.Name, assemblyName, "Ctor7#2");
+		Assert.IsNotNull (an.CultureInfo, "Ctor7#3");
+		Assert.AreEqual (an.CultureInfo, new CultureInfo (""), "Ctor7#4");
+		Assert.IsNotNull (an.Version, "Ctor7#5");
+		Assert.AreEqual (an.Version, new Version (assemblyVersion), "Ctor7#6");
+		Assert.IsNotNull (assemblyKeyToken = an.GetPublicKeyToken (), "Ctor7#7");
+		Assert.AreEqual (assemblyKeyToken, token, "Ctor7#8");
+	}
+
+#endif
 }
 
 }
_______________________________________________
Mono-devel-list mailing list
[email protected]
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to