Jo Shields 3c1f479b9d Imported Upstream version 4.0.0~alpha1
Former-commit-id: 806294f5ded97629b74c85c09952f2a74fe182d9
2015-04-07 09:35:12 +01:00

617 lines
20 KiB
C#

//
// TestHelper.cs: Helper class for MWF unit tests.
//
// Author:
// Everaldo Canuto (ecanuto@novell.com)
// Andreia Gaita (avidigal@novell.com)
//
// (C) 2006 Novell, Inc. (http://www.novell.com)
//
using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Drawing;
using System.Reflection;
using System.Collections;
using NUnit.Framework;
using System.IO;
using System.Diagnostics;
namespace MonoTests.System.Windows.Forms
{
public class TestHelper
{
[SetUp]
protected virtual void SetUp ()
{
}
[TearDown]
protected virtual void TearDown () {
int c = Application.OpenForms.Count;
if (c > 0) {
Console.WriteLine ("HEY! You created " + c.ToString () + " form(s) and you didn't dispose of them!");
Console.WriteLine ("Please modify your test to shut me up.");
}
for (int i = Application.OpenForms.Count - 1; i >= 0; i--) {
Application.OpenForms[i].Dispose ();
}
}
public class FormWatcher : Form
{
int[] watches;
public FormWatcher (int[] watches) : base () {
this.watches = watches;
}
protected override void WndProc (ref Message m)
{
foreach (int i in watches) {
if ((int)m.Msg == i) {
Console.WriteLine ((this.Name != "" && this.Name != null ? this.Name : "FormWatcher") + " received message " + m.ToString ());
break;
}
}
base.WndProc (ref m);
}
}
public class ControlWatcher : Control
{
int[] watches;
public ControlWatcher (int[] watches) : base () {
this.watches = watches;
}
protected override void WndProc (ref Message m)
{
foreach (int i in watches) {
if ((int)m.Msg == i) {
Console.WriteLine ((this.Name != "" && this.Name != null ? this.Name : "ControlWatcher") + " received message " + m.ToString ());
break;
}
}
base.WndProc (ref m);
}
}
public class ButtonWatcher : Button
{
int[] watches;
public ButtonWatcher (int[] watches) : base () {
this.watches = watches;
foreach (int i in this.watches) {
Console.WriteLine ("Listening to " + Enum.GetName (typeof(Msg), i));
}
}
protected override void WndProc (ref Message m)
{
foreach (int i in watches) {
if ((int)m.Msg == i) {
Console.WriteLine ((this.Name != "" && this.Name != null ? this.Name : "ButtonWatcher") + " received message " + m.ToString ());
break;
}
}
base.WndProc (ref m);
}
}
public static void DumpObject (object obj, string objName)
{
DumpObject (obj, obj.GetType (), objName, "#", int.MaxValue);
}
public static void DumpObject (object obj, string objName, int maxrecursive)
{
DumpObject (obj, obj.GetType (), objName, "#", maxrecursive);
}
public static void DumpObject (object obj, Type objType, string objName, string prefix, int maxrecursive)
{
using (StringWriter writer = new StringWriter ()) {
DumpObject (obj, objType, objName, writer, 0, prefix, new ArrayList (), maxrecursive, 0);
Debug.WriteLine (writer.ToString ());
//return writer.ToString ();
}
}
public static void DumpObject (object obj, Type objType, string objName, StringWriter writer, int tabs, string prefix, ArrayList done, int maxrecursive, int level)
{
if (obj == null)
return;
for (int j = 0; j < done.Count; j++) {
if (!(obj.GetType ().IsClass || obj.GetType ().IsInterface))
continue;
if (done [j] == obj)
return;
}
if (obj.GetType ().IsClass || obj.GetType ().IsInterface)
done.Add (obj);
PropertyInfo [] properties = objType.GetProperties (BindingFlags.Public | BindingFlags.Instance);
FieldInfo [] fields = objType.GetFields (BindingFlags.Public | BindingFlags.Instance);
Hashtable values = new Hashtable ();
Hashtable members = new Hashtable ();
foreach (PropertyInfo property in properties) {
MethodInfo getter;
object value;
getter = property.GetGetMethod ();
if (getter == null)
continue;
if (getter.GetParameters ().Length > 0)
continue;
try {
value = getter.Invoke (obj, new object [] {});
} catch (TargetInvocationException ex) {
if (ex.InnerException != null) {
value = ex.InnerException;
} else {
value = ex;
}
} catch (Exception ex) {
value = ex;
}
members.Add (property.Name, property);
values.Add (property.Name, value);
}
foreach (FieldInfo field in fields) {
object value;
try {
value = field.GetValue (obj);
} catch (TargetInvocationException ex) {
if (ex.InnerException != null) {
value = ex.InnerException;
} else {
value = ex;
}
} catch (Exception ex) {
value = ex;
}
members.Add (field.Name, field);
values.Add (field.Name, value);
}
string [] sorted = new string [values.Count];
int i = 0;
foreach (DictionaryEntry entry in values) {
sorted [i++] = (string) entry.Key;
}
Array.Sort (sorted);
string showName = objName;
for (int j = 0; j < sorted.Length; j++) {
string name = sorted [j];
object value = values [name];
string message = prefix + showName + "." + name;
string tab = new string ('\t', tabs);
if (value == null) {
writer.WriteLine ("{0}Assert.IsNull ({1}.{2}, \"{3}\");", tab, showName, name, message);
continue;
}
string code;
switch (Type.GetTypeCode (value.GetType ())) {
case TypeCode.Boolean:
code = ((bool) value) ? "true" : "false"; break;
case TypeCode.Byte:
case TypeCode.Decimal:
case TypeCode.Double:
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.SByte:
case TypeCode.Single:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
if (value.GetType ().IsEnum) {
string [] flags = value.ToString ().Split (',');
for (int k = 0; k < flags.Length; k++)
flags [k] = value.GetType ().Name + "." + flags [k].Trim ();
code = string.Join (" | ", flags);
} else {
code = value.ToString ();
}
break;
case TypeCode.Char:
code = "'" + ((char) value).ToString () + "'"; break;
case TypeCode.DateTime:
code = "new System.DateTime (" + ((DateTime) value).Ticks + ")"; break;
case TypeCode.DBNull:
code = "System.DBNull.Value" ; break;
case TypeCode.Object:
code = null;
if (value is Exception) {
writer.WriteLine (tab + "try {");
writer.WriteLine (tab + "\tobject zxf = {0}.{1};", showName, name);
writer.WriteLine (tab + "\tTestHelper.RemoveWarning (zxf);");
writer.WriteLine (tab + "\tAssert.Fail (\"Expected '{0}', but no exception was thrown.\", \"{1}\");", value.GetType ().FullName, message);
writer.WriteLine (tab + "}} catch ({0} ex) {{", value.GetType ().Name);
writer.WriteLine (tab + "\tAssert.AreEqual (@\"{0}\", ex.Message);", ((Exception) value).Message.Replace ("\"", "\"\""));
writer.WriteLine (tab + "} catch (Exception ex) {");
writer.WriteLine (tab + "\tAssert.Fail (\"Expected '{0}', got '\" + ex.GetType ().FullName + \"'.\", \"{1}\");", value.GetType ().FullName, message);
writer.WriteLine (tab + "}");
} else {
if (maxrecursive > level) {
DumpObject (value, ((MemberInfo)members [name]).DeclaringType, showName + "." + name, writer, tabs, prefix, done, maxrecursive, level + 1);
} else {
writer.WriteLine ("{0}Assert.IsNotNull ({1}.{2}, \"{3}\");", tab, showName, name, message);
}
}
break;
case TypeCode.String:
code = "@\"" + ((string) value).Replace ("\"", "\"\"") + "\""; break;
default:
code = null; break;
}
if (code == null)
continue;
writer.WriteLine ("{0}Assert.AreEqual ({4}, {1}.{2}, \"{3}\");", tab, showName, name, message, code);
}
}
public TestHelper()
{
}
public static void RemoveWarning (params object [] param)
{
// Call this function with the unused variable as the parameter.
}
public static CreateParams GetCreateParams (Control control)
{
CreateParams cp = (CreateParams) control.GetType().GetProperty("CreateParams", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(control, null);
return cp;
}
public static bool IsStyleSet (Control control, WindowStyles style) {
CreateParams cp = GetCreateParams (control);
return ((cp.Style & (int) style) == (int) style);
}
public static bool IsExStyleSet (Control control, WindowExStyles style) {
CreateParams cp = GetCreateParams (control);
return ((cp.ExStyle & (int) style) == (int) style);
}
public static bool RunningOnUnix {
get {
// check for Unix platforms - see FAQ for more details
// http://www.mono-project.com/FAQ:_Technical#How_to_detect_the_execution_platform_.3F
int platform = (int) Environment.OSVersion.Platform;
return ((platform == 4) || (platform == 128) || (platform == 6));
}
}
}
[Flags]
public enum WindowStyles : int {
WS_OVERLAPPED = 0x00000000,
WS_POPUP = unchecked((int)0x80000000),
WS_CHILD = 0x40000000,
WS_MINIMIZE = 0x20000000,
WS_VISIBLE = 0x10000000,
WS_DISABLED = 0x08000000,
WS_CLIPSIBLINGS = 0x04000000,
WS_CLIPCHILDREN = 0x02000000,
WS_MAXIMIZE = 0x01000000,
WS_CAPTION = 0x00C00000,
WS_BORDER = 0x00800000,
WS_DLGFRAME = 0x00400000,
WS_VSCROLL = 0x00200000,
WS_HSCROLL = 0x00100000,
WS_SYSMENU = 0x00080000,
WS_THICKFRAME = 0x00040000,
WS_GROUP = 0x00020000,
WS_TABSTOP = 0x00010000,
WS_MINIMIZEBOX = 0x00020000,
WS_MAXIMIZEBOX = 0x00010000,
WS_TILED = 0x00000000,
WS_ICONIC = 0x20000000,
WS_SIZEBOX = 0x00040000,
WS_POPUPWINDOW = unchecked((int)0x80880000),
WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW,
WS_CHILDWINDOW = WS_CHILD
}
[Flags]
public enum WindowExStyles : int {
// Extended Styles
WS_EX_DLGMODALFRAME = 0x00000001,
WS_EX_DRAGDETECT = 0x00000002,
WS_EX_NOPARENTNOTIFY = 0x00000004,
WS_EX_TOPMOST = 0x00000008,
WS_EX_ACCEPTFILES = 0x00000010,
WS_EX_TRANSPARENT = 0x00000020,
WS_EX_MDICHILD = 0x00000040,
WS_EX_TOOLWINDOW = 0x00000080,
WS_EX_WINDOWEDGE = 0x00000100,
WS_EX_CLIENTEDGE = 0x00000200,
WS_EX_CONTEXTHELP = 0x00000400,
WS_EX_RIGHT = 0x00001000,
WS_EX_LEFT = 0x00000000,
WS_EX_RTLREADING = 0x00002000,
WS_EX_LTRREADING = 0x00000000,
WS_EX_LEFTSCROLLBAR = 0x00004000,
WS_EX_LAYERED = 0x00080000,
WS_EX_RIGHTSCROLLBAR = 0x00000000,
WS_EX_CONTROLPARENT = 0x00010000,
WS_EX_STATICEDGE = 0x00020000,
WS_EX_APPWINDOW = 0x00040000,
WS_EX_NOINHERITLAYOUT = 0x00100000,
WS_EX_LAYOUTRTL = 0x00400000,
WS_EX_COMPOSITED = 0x02000000,
WS_EX_NOACTIVATE = 0x08000000,
WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE,
WS_EX_PALETTEWINDOW = WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST
}
public enum Msg {
WM_NULL = 0x0000,
WM_CREATE = 0x0001,
WM_DESTROY = 0x0002,
WM_MOVE = 0x0003,
WM_SIZE = 0x0005,
WM_ACTIVATE = 0x0006,
WM_SETFOCUS = 0x0007,
WM_KILLFOCUS = 0x0008,
// public const uint WM_SETVISIBLE = 0x0009;
WM_ENABLE = 0x000A,
WM_SETREDRAW = 0x000B,
WM_SETTEXT = 0x000C,
WM_GETTEXT = 0x000D,
WM_GETTEXTLENGTH = 0x000E,
WM_PAINT = 0x000F,
WM_CLOSE = 0x0010,
WM_QUERYENDSESSION = 0x0011,
WM_QUIT = 0x0012,
WM_QUERYOPEN = 0x0013,
WM_ERASEBKGND = 0x0014,
WM_SYSCOLORCHANGE = 0x0015,
WM_ENDSESSION = 0x0016,
// public const uint WM_SYSTEMERROR = 0x0017;
WM_SHOWWINDOW = 0x0018,
WM_CTLCOLOR = 0x0019,
WM_WININICHANGE = 0x001A,
WM_SETTINGCHANGE = 0x001A,
WM_DEVMODECHANGE = 0x001B,
WM_ACTIVATEAPP = 0x001C,
WM_FONTCHANGE = 0x001D,
WM_TIMECHANGE = 0x001E,
WM_CANCELMODE = 0x001F,
WM_SETCURSOR = 0x0020,
WM_MOUSEACTIVATE = 0x0021,
WM_CHILDACTIVATE = 0x0022,
WM_QUEUESYNC = 0x0023,
WM_GETMINMAXINFO = 0x0024,
WM_PAINTICON = 0x0026,
WM_ICONERASEBKGND = 0x0027,
WM_NEXTDLGCTL = 0x0028,
// public const uint WM_ALTTABACTIVE = 0x0029;
WM_SPOOLERSTATUS = 0x002A,
WM_DRAWITEM = 0x002B,
WM_MEASUREITEM = 0x002C,
WM_DELETEITEM = 0x002D,
WM_VKEYTOITEM = 0x002E,
WM_CHARTOITEM = 0x002F,
WM_SETFONT = 0x0030,
WM_GETFONT = 0x0031,
WM_SETHOTKEY = 0x0032,
WM_GETHOTKEY = 0x0033,
// public const uint WM_FILESYSCHANGE = 0x0034;
// public const uint WM_ISACTIVEICON = 0x0035;
// public const uint WM_QUERYPARKICON = 0x0036;
WM_QUERYDRAGICON = 0x0037,
WM_COMPAREITEM = 0x0039,
// public const uint WM_TESTING = 0x003a;
// public const uint WM_OTHERWINDOWCREATED = 0x003c;
WM_GETOBJECT = 0x003D,
// public const uint WM_ACTIVATESHELLWINDOW = 0x003e;
WM_COMPACTING = 0x0041,
WM_COMMNOTIFY = 0x0044 ,
WM_WINDOWPOSCHANGING = 0x0046,
WM_WINDOWPOSCHANGED = 0x0047,
WM_POWER = 0x0048,
WM_COPYDATA = 0x004A,
WM_CANCELJOURNAL = 0x004B,
WM_NOTIFY = 0x004E,
WM_INPUTLANGCHANGEREQUEST = 0x0050,
WM_INPUTLANGCHANGE = 0x0051,
WM_TCARD = 0x0052,
WM_HELP = 0x0053,
WM_USERCHANGED = 0x0054,
WM_NOTIFYFORMAT = 0x0055,
WM_CONTEXTMENU = 0x007B,
WM_STYLECHANGING = 0x007C,
WM_STYLECHANGED = 0x007D,
WM_DISPLAYCHANGE = 0x007E,
WM_GETICON = 0x007F,
// Non-Client messages
WM_SETICON = 0x0080,
WM_NCCREATE = 0x0081,
WM_NCDESTROY = 0x0082,
WM_NCCALCSIZE = 0x0083,
WM_NCHITTEST = 0x0084,
WM_NCPAINT = 0x0085,
WM_NCACTIVATE = 0x0086,
WM_GETDLGCODE = 0x0087,
WM_SYNCPAINT = 0x0088,
// public const uint WM_SYNCTASK = 0x0089;
WM_NCMOUSEMOVE = 0x00A0,
WM_NCLBUTTONDOWN = 0x00A1,
WM_NCLBUTTONUP = 0x00A2,
WM_NCLBUTTONDBLCLK = 0x00A3,
WM_NCRBUTTONDOWN = 0x00A4,
WM_NCRBUTTONUP = 0x00A5,
WM_NCRBUTTONDBLCLK = 0x00A6,
WM_NCMBUTTONDOWN = 0x00A7,
WM_NCMBUTTONUP = 0x00A8,
WM_NCMBUTTONDBLCLK = 0x00A9,
// public const uint WM_NCXBUTTONDOWN = 0x00ab;
// public const uint WM_NCXBUTTONUP = 0x00ac;
// public const uint WM_NCXBUTTONDBLCLK = 0x00ad;
WM_KEYDOWN = 0x0100,
WM_KEYFIRST = 0x0100,
WM_KEYUP = 0x0101,
WM_CHAR = 0x0102,
WM_DEADCHAR = 0x0103,
WM_SYSKEYDOWN = 0x0104,
WM_SYSKEYUP = 0x0105,
WM_SYSCHAR = 0x0106,
WM_SYSDEADCHAR = 0x0107,
WM_KEYLAST = 0x0108,
WM_IME_STARTCOMPOSITION = 0x010D,
WM_IME_ENDCOMPOSITION = 0x010E,
WM_IME_COMPOSITION = 0x010F,
WM_IME_KEYLAST = 0x010F,
WM_INITDIALOG = 0x0110,
WM_COMMAND = 0x0111,
WM_SYSCOMMAND = 0x0112,
WM_TIMER = 0x0113,
WM_HSCROLL = 0x0114,
WM_VSCROLL = 0x0115,
WM_INITMENU = 0x0116,
WM_INITMENUPOPUP = 0x0117,
// public const uint WM_SYSTIMER = 0x0118;
WM_MENUSELECT = 0x011F,
WM_MENUCHAR = 0x0120,
WM_ENTERIDLE = 0x0121,
WM_MENURBUTTONUP = 0x0122,
WM_MENUDRAG = 0x0123,
WM_MENUGETOBJECT = 0x0124,
WM_UNINITMENUPOPUP = 0x0125,
WM_MENUCOMMAND = 0x0126,
// public const uint WM_CHANGEUISTATE = 0x0127;
// public const uint WM_UPDATEUISTATE = 0x0128;
// public const uint WM_QUERYUISTATE = 0x0129;
// public const uint WM_LBTRACKPOINT = 0x0131;
WM_CTLCOLORMSGBOX = 0x0132,
WM_CTLCOLOREDIT = 0x0133,
WM_CTLCOLORLISTBOX = 0x0134,
WM_CTLCOLORBTN = 0x0135,
WM_CTLCOLORDLG = 0x0136,
WM_CTLCOLORSCROLLBAR = 0x0137,
WM_CTLCOLORSTATIC = 0x0138,
WM_MOUSEMOVE = 0x0200,
WM_MOUSEFIRST = 0x0200,
WM_LBUTTONDOWN = 0x0201,
WM_LBUTTONUP = 0x0202,
WM_LBUTTONDBLCLK = 0x0203,
WM_RBUTTONDOWN = 0x0204,
WM_RBUTTONUP = 0x0205,
WM_RBUTTONDBLCLK = 0x0206,
WM_MBUTTONDOWN = 0x0207,
WM_MBUTTONUP = 0x0208,
WM_MBUTTONDBLCLK = 0x0209,
WM_MOUSEWHEEL = 0x020A,
WM_MOUSELAST = 0x020D,
// public const uint WM_XBUTTONDOWN = 0x020B;
// public const uint WM_XBUTTONUP = 0x020C;
// public const uint WM_XBUTTONDBLCLK = 0x020D;
WM_PARENTNOTIFY = 0x0210,
WM_ENTERMENULOOP = 0x0211,
WM_EXITMENULOOP = 0x0212,
WM_NEXTMENU = 0x0213,
WM_SIZING = 0x0214,
WM_CAPTURECHANGED = 0x0215,
WM_MOVING = 0x0216,
// public const uint WM_POWERBROADCAST = 0x0218;
WM_DEVICECHANGE = 0x0219,
WM_MDICREATE = 0x0220,
WM_MDIDESTROY = 0x0221,
WM_MDIACTIVATE = 0x0222,
WM_MDIRESTORE = 0x0223,
WM_MDINEXT = 0x0224,
WM_MDIMAXIMIZE = 0x0225,
WM_MDITILE = 0x0226,
WM_MDICASCADE = 0x0227,
WM_MDIICONARRANGE = 0x0228,
WM_MDIGETACTIVE = 0x0229,
/* D&D messages */
// public const uint WM_DROPOBJECT = 0x022A;
// public const uint WM_QUERYDROPOBJECT = 0x022B;
// public const uint WM_BEGINDRAG = 0x022C;
// public const uint WM_DRAGLOOP = 0x022D;
// public const uint WM_DRAGSELECT = 0x022E;
// public const uint WM_DRAGMOVE = 0x022F;
WM_MDISETMENU = 0x0230,
WM_ENTERSIZEMOVE = 0x0231,
WM_EXITSIZEMOVE = 0x0232,
WM_DROPFILES = 0x0233,
WM_MDIREFRESHMENU = 0x0234,
WM_IME_SETCONTEXT = 0x0281,
WM_IME_NOTIFY = 0x0282,
WM_IME_CONTROL = 0x0283,
WM_IME_COMPOSITIONFULL = 0x0284,
WM_IME_SELECT = 0x0285,
WM_IME_CHAR = 0x0286,
WM_IME_REQUEST = 0x0288,
WM_IME_KEYDOWN = 0x0290,
WM_IME_KEYUP = 0x0291,
WM_NCMOUSEHOVER = 0x02A0,
WM_MOUSEHOVER = 0x02A1,
WM_NCMOUSELEAVE = 0x02A2,
WM_MOUSELEAVE = 0x02A3,
WM_CUT = 0x0300,
WM_COPY = 0x0301,
WM_PASTE = 0x0302,
WM_CLEAR = 0x0303,
WM_UNDO = 0x0304,
WM_RENDERFORMAT = 0x0305,
WM_RENDERALLFORMATS = 0x0306,
WM_DESTROYCLIPBOARD = 0x0307,
WM_DRAWCLIPBOARD = 0x0308,
WM_PAINTCLIPBOARD = 0x0309,
WM_VSCROLLCLIPBOARD = 0x030A,
WM_SIZECLIPBOARD = 0x030B,
WM_ASKCBFORMATNAME = 0x030C,
WM_CHANGECBCHAIN = 0x030D,
WM_HSCROLLCLIPBOARD = 0x030E,
WM_QUERYNEWPALETTE = 0x030F,
WM_PALETTEISCHANGING = 0x0310,
WM_PALETTECHANGED = 0x0311,
WM_HOTKEY = 0x0312,
WM_PRINT = 0x0317,
WM_PRINTCLIENT = 0x0318,
WM_HANDHELDFIRST = 0x0358,
WM_HANDHELDLAST = 0x035F,
WM_AFXFIRST = 0x0360,
WM_AFXLAST = 0x037F,
WM_PENWINFIRST = 0x0380,
WM_PENWINLAST = 0x038F,
WM_APP = 0x8000,
WM_USER = 0x0400,
// Our "private" ones
WM_MOUSE_ENTER = 0x0401,
WM_ASYNC_MESSAGE = 0x0403,
WM_REFLECT = WM_USER + 0x1c00,
WM_CLOSE_INTERNAL = WM_USER + 0x1c01
}
}