diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt
index 6aaf6c80bc..c48ede5f80 100644
--- a/CONTRIBUTORS.txt
+++ b/CONTRIBUTORS.txt
@@ -77,7 +77,6 @@ what it is today.
* Intimidated
* Jeremy Bongio (IBM)
* jhurliman
-* Mike Osias (IBM)
* John R Sohn (XenReborn)
* jonc
* Junta Kohime
@@ -91,6 +90,7 @@ what it is today.
* maimedleech
* Mic Bowman
* Michelle Argus
+* Mike Osias (IBM)
* Mike Pitman (IBM)
* mikkopa/_someone - RealXtend
* Mircea Kitsune
@@ -119,9 +119,11 @@ what it is today.
* Xantor
* Y. Nitta
* YZh
+* Zackary Geers aka Kunnis Basiat
* Zha Ewry
+
LSL Devs
* Alondria
diff --git a/OpenSim/Client/Linden/LLClientStackModule.cs b/OpenSim/Client/Linden/LLClientStackModule.cs
index a9649894ea..f882d5d301 100644
--- a/OpenSim/Client/Linden/LLClientStackModule.cs
+++ b/OpenSim/Client/Linden/LLClientStackModule.cs
@@ -41,12 +41,18 @@ using OpenSim.Region.Framework.Interfaces;
namespace OpenSim.Client.Linden
{
+ ///
+ /// Linden UDP Stack Region Module
+ ///
public class LLClientStackModule : INonSharedRegionModule
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
#region IRegionModule Members
+ ///
+ /// Scene that contains the region's data
+ ///
protected Scene m_scene;
protected bool m_createClientStack = false;
protected IClientNetworkServer m_clientServer;
diff --git a/OpenSim/Data/Tests/BasicUserTest.cs b/OpenSim/Data/Tests/BasicUserTest.cs
index d3e6f41c27..4e4ddc8572 100644
--- a/OpenSim/Data/Tests/BasicUserTest.cs
+++ b/OpenSim/Data/Tests/BasicUserTest.cs
@@ -204,8 +204,16 @@ namespace OpenSim.Data.Tests
UUID webloginkey = UUID.Random();
uint homeregx = (uint) random.Next();
uint homeregy = (uint) random.Next();
- Vector3 homeloc = new Vector3((float)Math.Round(random.NextDouble(),5),(float)Math.Round(random.NextDouble(),5),(float)Math.Round(random.NextDouble(),5));
- Vector3 homelookat = new Vector3((float)Math.Round(random.NextDouble(),5),(float)Math.Round(random.NextDouble(),5),(float)Math.Round(random.NextDouble(),5));
+ Vector3 homeloc
+ = new Vector3(
+ (float)Math.Round(random.NextDouble(), 5),
+ (float)Math.Round(random.NextDouble(), 5),
+ (float)Math.Round(random.NextDouble(), 5));
+ Vector3 homelookat
+ = new Vector3(
+ (float)Math.Round(random.NextDouble(), 5),
+ (float)Math.Round(random.NextDouble(), 5),
+ (float)Math.Round(random.NextDouble(), 5));
int created = random.Next();
int lastlogin = random.Next();
string userinvuri = RandomName();
diff --git a/OpenSim/Data/Tests/PropertyCompareConstraint.cs b/OpenSim/Data/Tests/PropertyCompareConstraint.cs
new file mode 100644
index 0000000000..678501e842
--- /dev/null
+++ b/OpenSim/Data/Tests/PropertyCompareConstraint.cs
@@ -0,0 +1,298 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using NUnit.Framework;
+using NUnit.Framework.Constraints;
+using NUnit.Framework.SyntaxHelpers;
+using OpenMetaverse;
+using OpenSim.Framework;
+
+namespace OpenSim.Data.Tests
+{
+ public static class Constraints
+ {
+ //This is here because C# has a gap in the language, you can't infer type from a constructor
+ public static PropertyCompareConstraint PropertyCompareConstraint(T expected)
+ {
+ return new PropertyCompareConstraint(expected);
+ }
+ }
+
+ public class PropertyCompareConstraint : NUnit.Framework.Constraints.Constraint
+ {
+ private readonly object _expected;
+ //the reason everywhere uses propertyNames.Reverse().ToArray() is because the stack is backwards of the order we want to display the properties in.
+ private string failingPropertyName = string.Empty;
+ private object failingExpected;
+ private object failingActual;
+
+ public PropertyCompareConstraint(T expected)
+ {
+ _expected = expected;
+ }
+
+ public override bool Matches(object actual)
+ {
+ return ObjectCompare(_expected, actual, new Stack());
+ }
+
+ private bool ObjectCompare(object expected, object actual, Stack propertyNames)
+ {
+ if (actual.GetType() != expected.GetType())
+ {
+ propertyNames.Push("GetType()");
+ failingPropertyName = string.Join(".", propertyNames.Reverse().ToArray());
+ propertyNames.Pop();
+ failingActual = actual.GetType();
+ failingExpected = expected.GetType();
+ return false;
+ }
+
+ if(actual.GetType() == typeof(Color))
+ {
+ Color actualColor = (Color) actual;
+ Color expectedColor = (Color) expected;
+ if (actualColor.R != expectedColor.R)
+ {
+ propertyNames.Push("R");
+ failingPropertyName = string.Join(".", propertyNames.Reverse().ToArray());
+ propertyNames.Pop();
+ failingActual = actualColor.R;
+ failingExpected = expectedColor.R;
+ return false;
+ }
+ if (actualColor.G != expectedColor.G)
+ {
+ propertyNames.Push("G");
+ failingPropertyName = string.Join(".", propertyNames.Reverse().ToArray());
+ propertyNames.Pop();
+ failingActual = actualColor.G;
+ failingExpected = expectedColor.G;
+ return false;
+ }
+ if (actualColor.B != expectedColor.B)
+ {
+ propertyNames.Push("B");
+ failingPropertyName = string.Join(".", propertyNames.Reverse().ToArray());
+ propertyNames.Pop();
+ failingActual = actualColor.B;
+ failingExpected = expectedColor.B;
+ return false;
+ }
+ if (actualColor.A != expectedColor.A)
+ {
+ propertyNames.Push("A");
+ failingPropertyName = string.Join(".", propertyNames.Reverse().ToArray());
+ propertyNames.Pop();
+ failingActual = actualColor.A;
+ failingExpected = expectedColor.A;
+ return false;
+ }
+ return true;
+ }
+
+ //Skip static properties. I had a nasty problem comparing colors because of all of the public static colors.
+ PropertyInfo[] properties = expected.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
+ foreach (var property in properties)
+ {
+ if (ignores.Contains(property.Name))
+ continue;
+
+ object actualValue = property.GetValue(actual, null);
+ object expectedValue = property.GetValue(expected, null);
+
+ //If they are both null, they are equal
+ if (actualValue == null && expectedValue == null)
+ continue;
+
+ //If only one is null, then they aren't
+ if (actualValue == null || expectedValue == null)
+ {
+ propertyNames.Push(property.Name);
+ failingPropertyName = string.Join(".", propertyNames.Reverse().ToArray());
+ propertyNames.Pop();
+ failingActual = actualValue;
+ failingExpected = expectedValue;
+ return false;
+ }
+
+ IComparable comp = actualValue as IComparable;
+ if (comp != null)
+ {
+ if (comp.CompareTo(expectedValue) != 0)
+ {
+ propertyNames.Push(property.Name);
+ failingPropertyName = string.Join(".", propertyNames.Reverse().ToArray());
+ propertyNames.Pop();
+ failingActual = actualValue;
+ failingExpected = expectedValue;
+ return false;
+ }
+ continue;
+ }
+
+ IEnumerable arr = actualValue as IEnumerable;
+ if (arr != null)
+ {
+ List