Browse Source

Python forms designer now handles loading and generating a form with a MenuStrip and ToolStripItems.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3978 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Matt Ward 17 years ago
parent
commit
00f01fce76
  1. 6
      src/AddIns/BackendBindings/Python/PyWalker/ResolveWalker.cs
  2. 1
      src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj
  3. 7
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/IComponentCreator.cs
  4. 1621
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/NRefactoryToPythonConverterOld.cs
  5. 62
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonCodeDeserializer.cs
  6. 118
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonControlFieldExpression.cs
  7. 14
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDesignerLoader.cs
  8. 206
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonForm.cs
  9. 31
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormWalker.cs
  10. 2
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/CursorTypeResolutionTestFixture.cs
  11. 14
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/DeserializeAssignmentTestFixtureBase.cs
  12. 2
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/DeserializeColorFromArgbTestFixture.cs
  13. 46
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/DeserializeStringArrayTestFixture.cs
  14. 52
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/DeserializeToolStripItemArrayTestFixture.cs
  15. 141
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GenerateMenuStripItemsTestFixture.cs
  16. 4
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GenerateNestedPanelFormTestFixture.cs
  17. 11
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GeneratePanelFormTestFixture.cs
  18. 79
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GetComponentFromDesignerLoaderTestFixture.cs
  19. 4
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadControlEventHandlerTestFixture.cs
  20. 4
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadEventHandlerTestFixture.cs
  21. 127
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadFormTestFixtureBase.cs
  22. 130
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadMenuStripFormTestFixture.cs
  23. 10
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadSimpleFormTestFixture.cs
  24. 30
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadTextBoxOnPanelTestFixture.cs
  25. 10
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadTextBoxTestFixture.cs
  26. 7
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/MissingInitializeComponentMethodTestFixture.cs
  27. 31
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonCodeDeserializerTests.cs
  28. 175
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonControlFieldExpressionTests.cs
  29. 6
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonDesignerLoaderTestFixture.cs
  30. 4
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/TextBoxNotAddedToFormTestFixture.cs
  31. 10
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/UnknownTypeTestFixture.cs
  32. 8
      src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj
  33. 5
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/CreatedComponent.cs
  34. 152
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/MockComponentCreator.cs
  35. 9
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/MockDesignerLoaderHost.cs
  36. 44
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/PythonParserHelper.cs

6
src/AddIns/BackendBindings/Python/PyWalker/ResolveWalker.cs

@ -170,6 +170,12 @@ namespace PyWalker @@ -170,6 +170,12 @@ namespace PyWalker
return base.Walk(node);
}
public override bool Walk(IndexExpression node)
{
writer.WriteLine("Index: " + node.Index.ToString());
return base.Walk(node);
}
public override bool Walk(UnaryExpression node)
{
writer.WriteLine("Unary");

1
src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj

@ -77,7 +77,6 @@ @@ -77,7 +77,6 @@
<Compile Include="Src\IsPythonRunningCondition.cs" />
<Compile Include="Src\ITextEditor.cs" />
<Compile Include="Src\NRefactoryToPythonConverter.cs" />
<Compile Include="Src\NRefactoryToPythonConverterOld.cs" />
<Compile Include="Src\PythonAstWalker.cs" />
<Compile Include="Src\PythonCodeCompletionBinding.cs" />
<Compile Include="Src\PythonCodeDeserializer.cs" />

7
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/IComponentCreator.cs

@ -34,6 +34,13 @@ namespace ICSharpCode.PythonBinding @@ -34,6 +34,13 @@ namespace ICSharpCode.PythonBinding
/// </summary>
void Add(IComponent component, string name);
/// <summary>
/// Gets a component that have been added via the Add method.
/// </summary>
/// <param name="name">The component name.</param>
/// <returns>Null if the component cannot be found.</returns>
IComponent GetComponent(string name);
/// <summary>
/// Creates a new instance of the object given its type.
/// </summary>

1621
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/NRefactoryToPythonConverterOld.cs

File diff suppressed because it is too large Load Diff

62
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonCodeDeserializer.cs

@ -85,20 +85,16 @@ namespace ICSharpCode.PythonBinding @@ -85,20 +85,16 @@ namespace ICSharpCode.PythonBinding
/// Deserializes expressions of the form:
///
/// 1) System.Drawing.Color.FromArgb(0, 192, 0)
/// 2) System.Array[String](["a", "b"])
/// </summary>
object Deserialize(CallExpression callExpression)
{
MemberExpression memberExpression = callExpression.Target as MemberExpression;
PythonControlFieldExpression field = PythonControlFieldExpression.Create(memberExpression);
Type type = GetType(field);
if (type != null) {
foreach (MethodInfo method in type.GetMethods(BindingFlags.Public | BindingFlags.Static)) {
if (method.Name == field.MemberName) {
if (method.GetParameters().Length == callExpression.Args.Length) {
return method.Invoke(null, GetArguments(callExpression).ToArray());
}
}
}
IndexExpression indexExpression = callExpression.Target as IndexExpression;
if (memberExpression != null) {
return DeserializeMethodCallExpression(callExpression, memberExpression);
} else if (indexExpression != null) {
return DeserializeCreateArrayExpression(callExpression, indexExpression);
}
return null;
}
@ -130,5 +126,51 @@ namespace ICSharpCode.PythonBinding @@ -130,5 +126,51 @@ namespace ICSharpCode.PythonBinding
{
return componentCreator.GetType(PythonControlFieldExpression.GetPrefix(field.FullMemberName));
}
/// <summary>
/// Deserializes a call expression where the target is an array expression.
///
/// System.Array[String](["a", "b"])
/// </summary>
object DeserializeCreateArrayExpression(CallExpression callExpression, IndexExpression target)
{
ListExpression list = callExpression.Args[0].Expression as ListExpression;
MemberExpression arrayTypeMemberExpression = target.Index as MemberExpression;
Type arrayType = componentCreator.GetType(PythonControlFieldExpression.GetMemberName(arrayTypeMemberExpression));
Array array = Array.CreateInstance(arrayType, list.Items.Length);
for (int i = 0; i < list.Items.Length; ++i) {
Expression listItemExpression = list.Items[i];
ConstantExpression constantExpression = listItemExpression as ConstantExpression;
MemberExpression memberExpression = listItemExpression as MemberExpression;
if (constantExpression != null) {
array.SetValue(constantExpression.Value, i);
} else if (memberExpression != null) {
string name = PythonControlFieldExpression.GetVariableName(memberExpression.Name.ToString());
array.SetValue(componentCreator.GetComponent(name), i);
}
}
return array;
}
/// <summary>
/// Deserializes an expression of the form:
///
/// System.Drawing.Color.FromArgb(0, 192, 0)
/// </summary>
object DeserializeMethodCallExpression(CallExpression callExpression, MemberExpression memberExpression)
{
PythonControlFieldExpression field = PythonControlFieldExpression.Create(memberExpression);
Type type = GetType(field);
if (type != null) {
foreach (MethodInfo method in type.GetMethods(BindingFlags.Public | BindingFlags.Static)) {
if (method.Name == field.MemberName) {
if (method.GetParameters().Length == callExpression.Args.Length) {
return method.Invoke(null, GetArguments(callExpression).ToArray());
}
}
}
}
return null;
}
}
}

118
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonControlFieldExpression.cs

@ -7,6 +7,8 @@ @@ -7,6 +7,8 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;
using System.Text;
using IronPython.Compiler.Ast;
@ -23,12 +25,14 @@ namespace ICSharpCode.PythonBinding @@ -23,12 +25,14 @@ namespace ICSharpCode.PythonBinding
string memberName = String.Empty;
string fullMemberName = String.Empty;
string variableName = String.Empty;
string methodName = String.Empty;
PythonControlFieldExpression(string memberName, string fullMemberName)
PythonControlFieldExpression(string memberName, string variableName, string methodName, string fullMemberName)
{
this.memberName = memberName;
this.variableName = variableName;
this.methodName = methodName;
this.fullMemberName = fullMemberName;
this.variableName = GetVariableNameFromSelfReference(fullMemberName);
}
/// <summary>
@ -52,6 +56,32 @@ namespace ICSharpCode.PythonBinding @@ -52,6 +56,32 @@ namespace ICSharpCode.PythonBinding
get { return variableName; }
}
/// <summary>
/// Returns the method being called by the field reference.
/// </summary>
public string MethodName {
get { return methodName; }
}
public override string ToString()
{
return fullMemberName;
}
public override bool Equals(object obj)
{
PythonControlFieldExpression rhs = obj as PythonControlFieldExpression;
if (rhs != null) {
return rhs.fullMemberName == fullMemberName;
}
return false;
}
public override int GetHashCode()
{
return fullMemberName.GetHashCode();
}
/// <summary>
/// Creates a PythonControlField from a member expression:
///
@ -60,11 +90,28 @@ namespace ICSharpCode.PythonBinding @@ -60,11 +90,28 @@ namespace ICSharpCode.PythonBinding
/// </summary>
public static PythonControlFieldExpression Create(MemberExpression expression)
{
string memberName = expression.Name.ToString();
string fullMemberName = PythonControlFieldExpression.GetMemberName(expression);
return new PythonControlFieldExpression(memberName, fullMemberName);
return Create(GetMemberNames(expression));
}
/// <summary>
/// Creates a PythonControlField from a call expression:
///
/// self._menuItem1.Items.AddRange(...)
/// </summary>
public static PythonControlFieldExpression Create(CallExpression expression)
{
string[] allNames = GetMemberNames(expression.Target as MemberExpression);
// Remove last member since it is the method name.
int lastItemIndex = allNames.Length - 1;
string[] memberNames = new string[lastItemIndex];
Array.Copy(allNames, memberNames, lastItemIndex);
PythonControlFieldExpression field = Create(memberNames);
field.methodName = allNames[lastItemIndex];
return field;
}
/// <summary>
/// From a name such as "System.Windows.Forms.Cursors.AppStarting" this method returns:
/// "System.Windows.Forms.Cursors"
@ -122,7 +169,7 @@ namespace ICSharpCode.PythonBinding @@ -122,7 +169,7 @@ namespace ICSharpCode.PythonBinding
public static string GetVariableName(string name)
{
if (!String.IsNullOrEmpty(name)) {
if (name.Length > 1) {
if (name.Length > 0) {
if (name[0] == '_') {
return name.Substring(1);
}
@ -136,22 +183,57 @@ namespace ICSharpCode.PythonBinding @@ -136,22 +183,57 @@ namespace ICSharpCode.PythonBinding
/// </summary>
public static string GetMemberName(MemberExpression expression)
{
StringBuilder typeName = new StringBuilder();
return GetMemberName(GetMemberNames(expression));
}
/// <summary>
/// Gets the member names that make up the MemberExpression in order.
/// </summary>
public static string[] GetMemberNames(MemberExpression expression)
{
List<string> names = new List<string>();
while (expression != null) {
typeName.Insert(0, expression.Name);
typeName.Insert(0, ".");
names.Insert(0, expression.Name.ToString());
NameExpression nameExpression = expression.Target as NameExpression;
expression = expression.Target as MemberExpression;
if (expression == null) {
if (nameExpression != null) {
typeName.Insert(0, nameExpression.Name);
names.Insert(0, nameExpression.Name.ToString());
}
}
}
return names.ToArray();
}
/// <summary>
/// Gets the member object that matches the field member.
/// </summary>
public object GetMember(IComponentCreator componentCreator)
{
object obj = componentCreator.GetComponent(variableName);
if (obj == null) {
return null;
}
return typeName.ToString();
Type type = obj.GetType();
string[] memberNames = fullMemberName.Split('.');
for (int i = 2; i < memberNames.Length; ++i) {
string name = memberNames[i];
BindingFlags propertyBindingFlags = BindingFlags.Public | BindingFlags.GetField | BindingFlags.Static | BindingFlags.Instance;
PropertyInfo property = type.GetProperty(name, propertyBindingFlags);
if (property != null) {
obj = property.GetValue(obj, null);
} else {
return null;
}
}
return obj;
}
static string GetMemberName(string[] names)
{
return String.Join(".", names);
}
/// <summary>
@ -173,6 +255,16 @@ namespace ICSharpCode.PythonBinding @@ -173,6 +255,16 @@ namespace ICSharpCode.PythonBinding
return String.Empty;
}
return name;
}
}
static PythonControlFieldExpression Create(string[] memberNames)
{
string memberName = String.Empty;
if (memberNames.Length > 1) {
memberName = memberNames[memberNames.Length - 1];
}
string fullMemberName = PythonControlFieldExpression.GetMemberName(memberNames);
return new PythonControlFieldExpression(memberName, GetVariableNameFromSelfReference(fullMemberName), String.Empty, fullMemberName);
}
}
}

14
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDesignerLoader.cs

@ -8,6 +8,7 @@ @@ -8,6 +8,7 @@
using System;
using System.CodeDom;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;
@ -29,6 +30,7 @@ namespace ICSharpCode.PythonBinding @@ -29,6 +30,7 @@ namespace ICSharpCode.PythonBinding
{
IPythonDesignerGenerator generator;
IDesignerSerializationManager serializationManager;
Dictionary<string, IComponent> addedObjects = new Dictionary<string, IComponent>();
public PythonDesignerLoader(IPythonDesignerGenerator generator)
{
@ -61,6 +63,18 @@ namespace ICSharpCode.PythonBinding @@ -61,6 +63,18 @@ namespace ICSharpCode.PythonBinding
public void Add(IComponent component, string name)
{
base.LoaderHost.Container.Add(component, name);
addedObjects.Add(name, component);
}
/// <summary>
/// Gets a component that has been added to the loader.
/// </summary>
/// <returns>Null if the component cannot be found.</returns>
public IComponent GetComponent(string name)
{
IComponent component = null;
addedObjects.TryGetValue(name, out component);
return component;
}
/// <summary>

206
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonForm.cs

@ -130,9 +130,8 @@ namespace ICSharpCode.PythonBinding @@ -130,9 +130,8 @@ namespace ICSharpCode.PythonBinding
void GenerateInitializeComponentMethodBodyInternal(Form form)
{
AppendChildControlCreation(form.Controls);
AppendChildControlCreation(form);
AppendChildControlSuspendLayout(form.Controls);
AppendIndentedLine("self.SuspendLayout()");
AppendForm(form);
AppendChildControlResumeLayout(form.Controls);
@ -166,30 +165,25 @@ namespace ICSharpCode.PythonBinding @@ -166,30 +165,25 @@ namespace ICSharpCode.PythonBinding
{
AppendComment(control.Name);
string propertyOwnerName = String.Empty;
if (addControlNameToProperty) {
propertyOwnerName = control.Name;
}
foreach (PropertyDescriptor property in GetSerializableProperties(control)) {
AppendProperty(propertyOwnerName, control, property);
}
string propertyOwnerName = GetPropertyOwnerName(control, addControlNameToProperty);
AppendProperties(propertyOwnerName, control);
foreach (Control childControl in control.Controls) {
if (IsSitedControl(childControl)) {
if (IsSitedComponent(childControl)) {
AppendIndentedLine(GetPropertyName(propertyOwnerName, "Controls") + ".Add(self._" + childControl.Name + ")");
}
}
AppendEventHandlers(propertyOwnerName, control);
MenuStrip menuStrip = control as MenuStrip;
if (menuStrip != null) {
AppendMenuStripItems(menuStrip);
}
if (addChildControlProperties) {
foreach (Control childControl in control.Controls) {
if (IsSitedControl(childControl)) {
AppendControl(childControl, true, true);
}
}
AppendChildControlProperties(control.Controls);
}
AppendEventHandlers(propertyOwnerName, control);
}
/// <summary>
@ -236,6 +230,11 @@ namespace ICSharpCode.PythonBinding @@ -236,6 +230,11 @@ namespace ICSharpCode.PythonBinding
{
++indent;
}
void DecreaseIndent()
{
--indent;
}
void Append(string text)
{
@ -260,19 +259,52 @@ namespace ICSharpCode.PythonBinding @@ -260,19 +259,52 @@ namespace ICSharpCode.PythonBinding
codeBuilder.Append(text);
}
void AppendChildControlCreation(Control parentControl)
{
MenuStrip menuStrip = parentControl as MenuStrip;
if (menuStrip != null) {
AppendChildControlCreation(menuStrip.Items);
} else {
AppendChildControlCreation(parentControl.Controls);
}
}
void AppendChildControlCreation(Control.ControlCollection controls)
{
foreach (Control control in controls) {
if (IsSitedControl(control)) {
AppendControlCreation(control);
AppendChildControlCreation(control.Controls);
if (IsSitedComponent(control)) {
AppendComponentCreation(control);
AppendChildControlCreation(control);
}
}
}
void AppendControlCreation(Control control)
void AppendChildControlCreation(ToolStripItemCollection toolStripItems)
{
AppendIndentedLine("self._" + control.Name + " = " + control.GetType().FullName + "()");
foreach (ToolStripItem item in toolStripItems) {
if (IsSitedComponent(item)) {
AppendComponentCreation(item);
}
ToolStripMenuItem menuItem = item as ToolStripMenuItem;
if (menuItem != null) {
AppendChildControlCreation(menuItem.DropDownItems);
}
}
}
void AppendComponentCreation(Control control)
{
AppendComponentCreation(control.Name, control);
}
void AppendComponentCreation(ToolStripItem item)
{
AppendComponentCreation(item.Name, item);
}
void AppendComponentCreation(string name, object obj)
{
AppendIndentedLine("self._" + name + " = " + obj.GetType().FullName + "()");
}
void AppendChildControlSuspendLayout(Control.ControlCollection controls)
@ -282,21 +314,20 @@ namespace ICSharpCode.PythonBinding @@ -282,21 +314,20 @@ namespace ICSharpCode.PythonBinding
void AppendChildControlResumeLayout(Control.ControlCollection controls)
{
AppendChildControlLayoutMethodCalls(controls, new string[] {"ResumeLayout(false)", "PerformLayout()"});
AppendChildControlLayoutMethodCalls(controls, new string[] {"ResumeLayout(False)", "PerformLayout()"});
}
void AppendChildControlLayoutMethodCalls(Control.ControlCollection controls, string[] methods)
{
foreach (Control control in controls) {
if (HasSitedChildControls(control)) {
if (HasSitedChildComponents(control)) {
foreach (string method in methods) {
AppendIndentedLine("self._" + control.Name + "." + method);
}
AppendChildControlLayoutMethodCalls(control.Controls, methods);
}
}
}
}
/// <summary>
/// Generates code that wires an event to an event handler.
@ -326,16 +357,21 @@ namespace ICSharpCode.PythonBinding @@ -326,16 +357,21 @@ namespace ICSharpCode.PythonBinding
}
}
static bool IsSitedControl(Control control)
static bool IsSitedComponent(IComponent component)
{
return control.Site != null;
return component.Site != null;
}
bool HasSitedChildControls(Control control)
bool HasSitedChildComponents(Control control)
{
MenuStrip menuStrip = control as MenuStrip;
if (menuStrip != null) {
return HasSitedComponents(menuStrip.Items);
}
if (control.Controls.Count > 0) {
foreach (Control childControl in control.Controls) {
if (!IsSitedControl(childControl)) {
if (!IsSitedComponent(childControl)) {
return false;
}
}
@ -343,5 +379,111 @@ namespace ICSharpCode.PythonBinding @@ -343,5 +379,111 @@ namespace ICSharpCode.PythonBinding
}
return false;
}
bool HasSitedComponents(ToolStripItemCollection items)
{
foreach (ToolStripItem item in items) {
if (IsSitedComponent(item)) {
return true;
}
}
return false;
}
/// <summary>
/// Adds ToolStripItems that are stored on the MenuStrip.
/// </summary>
void AppendMenuStripItems(MenuStrip menuStrip)
{
List<ToolStripItem> items = GetSitedToolStripItems(menuStrip.Items);
AppendMenuStripItemsAddRange(menuStrip.Name, items);
AppendToolStripItems(items);
}
void AppendSystemArray(string componentName, string methodName, string typeName, IList components)
{
if (components.Count > 0) {
AppendIndentedLine("self._" + componentName + "." + methodName + "(System.Array[" + typeName + "](");
IncreaseIndent();
for (int i = 0; i < components.Count; ++i) {
if (i == 0) {
AppendIndented("[");
} else {
Append(",");
AppendLine();
AppendIndented(String.Empty);
}
Append("self._" + ((IComponent)components[i]).Site.Name);
}
Append("]))");
AppendLine();
DecreaseIndent();
}
}
void AppendMenuStripItemsAddRange(string menuStripName, List<ToolStripItem> items)
{
AppendSystemArray(menuStripName, "Items.AddRange", typeof(ToolStripItem).FullName, items);
}
List<ToolStripItem> GetSitedToolStripItems(ToolStripItemCollection items)
{
List<ToolStripItem> sitedItems = new List<ToolStripItem>();
foreach (ToolStripItem item in items) {
if (IsSitedComponent(item)) {
sitedItems.Add(item);
}
}
return sitedItems;
}
void AppendToolStripItems(IList items)
{
foreach (ToolStripItem item in items) {
AppendToolStripItem(item);
}
}
void AppendToolStripItem(ToolStripItem item)
{
AppendComment(item.Name);
AppendProperties(item.Name, item);
ToolStripMenuItem menuItem = item as ToolStripMenuItem;
if (menuItem != null) {
List<ToolStripItem> sitedItems = GetSitedToolStripItems(menuItem.DropDownItems);
AppendToolStripMenuItemDropDownItems(menuItem.Name, sitedItems);
AppendToolStripItems(sitedItems);
}
}
void AppendToolStripMenuItemDropDownItems(string menuItemName, List<ToolStripItem> items)
{
AppendSystemArray(menuItemName, "DropDownItems.AddRange", typeof(ToolStripItem).FullName, items);
}
void AppendProperties(string propertyOwnerName, object obj)
{
foreach (PropertyDescriptor property in GetSerializableProperties(obj)) {
AppendProperty(propertyOwnerName, obj, property);
}
}
string GetPropertyOwnerName(Control control, bool addControlNameToProperty)
{
if (addControlNameToProperty) {
return control.Name;
}
return String.Empty;
}
void AppendChildControlProperties(Control.ControlCollection controls)
{
foreach (Control childControl in controls) {
if (IsSitedComponent(childControl)) {
AppendControl(childControl, true, true);
}
}
}
}
}

31
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormWalker.cs

@ -27,7 +27,6 @@ namespace ICSharpCode.PythonBinding @@ -27,7 +27,6 @@ namespace ICSharpCode.PythonBinding
PythonControlFieldExpression fieldExpression;
IComponentCreator componentCreator;
bool walkingAssignment;
Dictionary<string, object> createdObjects = new Dictionary<string, object>();
string formName = String.Empty;
PythonCodeDeserializer deserializer;
@ -65,7 +64,7 @@ namespace ICSharpCode.PythonBinding @@ -65,7 +64,7 @@ namespace ICSharpCode.PythonBinding
public override bool Walk(FunctionDefinition node)
{
if (IsInitializeComponentMethod(node)) {
if (IsInitializeComponentMethod(node)) {
form = (Form)componentCreator.CreateComponent(typeof(Form), formName);
node.Body.Walk(this);
}
@ -78,7 +77,6 @@ namespace ICSharpCode.PythonBinding @@ -78,7 +77,6 @@ namespace ICSharpCode.PythonBinding
MemberExpression lhsMemberExpression = node.Left[0] as MemberExpression;
if (lhsMemberExpression != null) {
fieldExpression = PythonControlFieldExpression.Create(lhsMemberExpression);
MemberExpression rhsMemberExpression = node.Right as MemberExpression;
if (rhsMemberExpression != null) {
object propertyValue = GetPropertyValueFromAssignmentRhs(rhsMemberExpression);
@ -130,6 +128,13 @@ namespace ICSharpCode.PythonBinding @@ -130,6 +128,13 @@ namespace ICSharpCode.PythonBinding
string parentControlName = PythonControlFieldExpression.GetParentControlNameAddingChildControls(name);
if (parentControlName != null) {
AddChildControl(parentControlName, node);
} else {
PythonControlFieldExpression field = PythonControlFieldExpression.Create(node);
object member = field.GetMember(componentCreator);
if (member != null) {
object parameter = deserializer.Deserialize(node.Args[0].Expression);
member.GetType().InvokeMember(field.MethodName, BindingFlags.InvokeMethod, Type.DefaultBinder, member, new object[] {parameter});
}
}
}
}
@ -187,19 +192,18 @@ namespace ICSharpCode.PythonBinding @@ -187,19 +192,18 @@ namespace ICSharpCode.PythonBinding
/// </summary>
bool SetPropertyValue(string name, object propertyValue)
{
Control control = GetCurrentControl();
return SetPropertyValue(control, name, propertyValue);
return SetPropertyValue(GetCurrentComponent(), name, propertyValue);
}
/// <summary>
/// Sets the value of a property on the control.
/// Sets the value of a property on the component.
/// </summary>
bool SetPropertyValue(Control control, string name, object propertyValue)
bool SetPropertyValue(object component, string name, object propertyValue)
{
PropertyDescriptor property = TypeDescriptor.GetProperties(control).Find(name, true);
PropertyDescriptor property = TypeDescriptor.GetProperties(component).Find(name, true);
if (property != null) {
propertyValue = ConvertPropertyValue(property, propertyValue);
property.SetValue(control, propertyValue);
property.SetValue(component, propertyValue);
return true;
}
return false;
@ -222,9 +226,7 @@ namespace ICSharpCode.PythonBinding @@ -222,9 +226,7 @@ namespace ICSharpCode.PythonBinding
/// </summary>
Control GetControl(string name)
{
object o = null;
createdObjects.TryGetValue(name, out o);
return o as Control;
return componentCreator.GetComponent(name) as Control;
}
/// <summary>
@ -234,16 +236,15 @@ namespace ICSharpCode.PythonBinding @@ -234,16 +236,15 @@ namespace ICSharpCode.PythonBinding
{
string variableName = PythonControlFieldExpression.GetVariableName(name);
componentCreator.Add(component as IComponent, variableName);
createdObjects.Add(variableName, component);
}
/// <summary>
/// Gets the current control being walked.
/// </summary>
Control GetCurrentControl()
object GetCurrentComponent()
{
if (fieldExpression.VariableName.Length > 0) {
return GetControl(fieldExpression.VariableName);
return componentCreator.GetComponent(fieldExpression.VariableName);
}
return form;
}

2
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/CursorTypeResolutionTestFixture.cs

@ -38,7 +38,7 @@ namespace PythonBinding.Tests.Designer @@ -38,7 +38,7 @@ namespace PythonBinding.Tests.Designer
[Test]
public void CursorsTypeResolved()
{
Assert.AreEqual("System.Windows.Forms.Cursors", base.LastTypeNameResolved);
Assert.AreEqual("System.Windows.Forms.Cursors", base.componentCreator.LastTypeNameResolved);
}
}
}

14
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/DeserializeAssignmentTestFixtureBase.cs

@ -21,25 +21,25 @@ namespace PythonBinding.Tests.Designer @@ -21,25 +21,25 @@ namespace PythonBinding.Tests.Designer
/// Base class for all tests of the PythonCodeDeserialize when deserializing an
/// assignment.
/// </summary>
public abstract class DeserializeAssignmentTestFixtureBase : LoadFormTestFixtureBase
public abstract class DeserializeAssignmentTestFixtureBase
{
protected Node rhsAssignmentNode;
protected object deserializedObject;
protected MockDesignerLoaderHost mockDesignerLoaderHost;
protected MockTypeResolutionService typeResolutionService;
protected MockComponentCreator componentCreator;
[TestFixtureSetUp]
public new void SetUpFixture()
public void SetUpFixture()
{
PythonParser parser = new PythonParser();
PythonAst ast = parser.CreateAst(@"snippet.py", GetPythonCode());
SuiteStatement suiteStatement = (SuiteStatement)ast.Body;
AssignmentStatement assignment = suiteStatement.Statements[0] as AssignmentStatement;
componentCreator = new MockComponentCreator();
AssignmentStatement assignment = PythonParserHelper.GetAssignmentStatement(GetPythonCode());
rhsAssignmentNode = assignment.Right;
mockDesignerLoaderHost = new MockDesignerLoaderHost();
typeResolutionService = mockDesignerLoaderHost.TypeResolutionService;
PythonCodeDeserializer deserializer = new PythonCodeDeserializer(this);
PythonCodeDeserializer deserializer = new PythonCodeDeserializer(componentCreator);
deserializedObject = deserializer.Deserialize(rhsAssignmentNode);
}

2
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/DeserializeColorFromArgbTestFixture.cs

@ -39,7 +39,7 @@ namespace PythonBinding.Tests.Designer @@ -39,7 +39,7 @@ namespace PythonBinding.Tests.Designer
[Test]
public void ColorTypeResolved()
{
Assert.AreEqual("System.Drawing.Color", LastTypeNameResolved);
Assert.AreEqual("System.Drawing.Color", componentCreator.LastTypeNameResolved);
}
}
}

46
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/DeserializeStringArrayTestFixture.cs

@ -0,0 +1,46 @@ @@ -0,0 +1,46 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Windows.Forms;
using ICSharpCode.PythonBinding;
using IronPython.Compiler.Ast;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Designer
{
/// <summary>
/// Tests that the string "System.Array" can be converted to an array.
/// </summary>
[TestFixture]
public class DeserializeStringArrayTestFixture : DeserializeAssignmentTestFixtureBase
{
public override string GetPythonCode()
{
return "self.Items = System.Array[System.String](\r\n" +
" [\"a\",\r\n" +
" \"b\"])";
}
[Test]
public void DeserializedObjectIsExpectedArray()
{
string[] expectedArray = new string[] {"a", "b"};
Assert.AreEqual(expectedArray, deserializedObject);
}
[Test]
public void StringTypeResolved()
{
Assert.AreEqual("System.String", componentCreator.LastTypeNameResolved);
}
}
}

52
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/DeserializeToolStripItemArrayTestFixture.cs

@ -0,0 +1,52 @@ @@ -0,0 +1,52 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Windows.Forms;
using ICSharpCode.PythonBinding;
using IronPython.Compiler.Ast;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Designer
{
[TestFixture]
public class DeserializeToolStripItemArrayTestFixture : DeserializeAssignmentTestFixtureBase
{
ToolStripMenuItem fileMenuItem;
ToolStripMenuItem editMenuItem;
public override string GetPythonCode()
{
fileMenuItem = (ToolStripMenuItem)componentCreator.CreateComponent(typeof(ToolStripMenuItem), "fileToolStripMenuItem");
editMenuItem = (ToolStripMenuItem)componentCreator.CreateComponent(typeof(ToolStripMenuItem), "editToolStripMenuItem");
componentCreator.Add(fileMenuItem, "fileToolStripMenuItem");
componentCreator.Add(editMenuItem, "editToolStripMenuItem");
return "self.Items = System.Array[System.Windows.Forms.ToolStripItem](\r\n" +
" [self._fileToolStripMenuItem,\r\n" +
" self._editToolStripMenuItem])";
}
[Test]
public void DeserializedObjectIsExpectedCustomColor()
{
ToolStripItem[] expectedArray = new ToolStripItem[] {fileMenuItem, editMenuItem};
Assert.AreEqual(expectedArray, deserializedObject);
}
[Test]
public void StringTypeResolved()
{
Assert.AreEqual("System.Windows.Forms.ToolStripItem", componentCreator.LastTypeNameResolved);
}
}
}

141
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GenerateMenuStripItemsTestFixture.cs

@ -0,0 +1,141 @@ @@ -0,0 +1,141 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;
using System.Drawing;
using System.Windows.Forms;
using ICSharpCode.PythonBinding;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Designer
{
[TestFixture]
public class GenerateMenuStripItemsFormTestFixture
{
string generatedPythonCode;
[TestFixtureSetUp]
public void SetUpFixture()
{
using (DesignSurface designSurface = new DesignSurface(typeof(Form))) {
IDesignerHost host = (IDesignerHost)designSurface.GetService(typeof(IDesignerHost));
IEventBindingService eventBindingService = new MockEventBindingService(host);
Form form = (Form)host.RootComponent;
form.ClientSize = new Size(200, 300);
PropertyDescriptorCollection descriptors = TypeDescriptor.GetProperties(form);
PropertyDescriptor namePropertyDescriptor = descriptors.Find("Name", false);
namePropertyDescriptor.SetValue(form, "MainForm");
// Add menu strip.
MenuStrip menuStrip = (MenuStrip)host.CreateComponent(typeof(MenuStrip), "menuStrip1");
menuStrip.Text = "menuStrip1";
menuStrip.TabIndex = 0;
menuStrip.Location = new Point(0, 0);
menuStrip.Size = new System.Drawing.Size(200, 24);
// Add menu strip items.
ToolStripMenuItem fileMenuItem = (ToolStripMenuItem)host.CreateComponent(typeof(ToolStripMenuItem), "fileToolStripMenuItem");
fileMenuItem.Size = new Size(37, 20);
fileMenuItem.Text = "&File";
ToolStripMenuItem openMenuItem = (ToolStripMenuItem)host.CreateComponent(typeof(ToolStripMenuItem), "openToolStripMenuItem");
openMenuItem.Size = new Size(37, 20);
openMenuItem.Text = "&Open";
ToolStripMenuItem exitMenuItem = (ToolStripMenuItem)host.CreateComponent(typeof(ToolStripMenuItem), "exitToolStripMenuItem");
exitMenuItem.Size = new Size(37, 20);
exitMenuItem.Text = "E&xit";
fileMenuItem.DropDownItems.Add(openMenuItem);
fileMenuItem.DropDownItems.Add(exitMenuItem);
// Add non-sited component.
fileMenuItem.DropDownItems.Add(new ToolStripMenuItem());
menuStrip.Items.Add(fileMenuItem);
ToolStripMenuItem editMenuItem = (ToolStripMenuItem)host.CreateComponent(typeof(ToolStripMenuItem), "editToolStripMenuItem");
editMenuItem.Size = new Size(39, 20);
editMenuItem.Text = "&Edit";
menuStrip.Items.Add(editMenuItem);
form.Controls.Add(menuStrip);
PythonForm pythonForm = new PythonForm(" ");
generatedPythonCode = pythonForm.GenerateInitializeComponentMethod(form);
}
}
[Test]
public void GeneratedCode()
{
string expectedCode = "def InitializeComponent(self):\r\n" +
" self._menuStrip1 = System.Windows.Forms.MenuStrip()\r\n" +
" self._fileToolStripMenuItem = System.Windows.Forms.ToolStripMenuItem()\r\n" +
" self._openToolStripMenuItem = System.Windows.Forms.ToolStripMenuItem()\r\n" +
" self._exitToolStripMenuItem = System.Windows.Forms.ToolStripMenuItem()\r\n" +
" self._editToolStripMenuItem = System.Windows.Forms.ToolStripMenuItem()\r\n" +
" self._menuStrip1.SuspendLayout()\r\n" +
" self.SuspendLayout()\r\n" +
" # \r\n" +
" # menuStrip1\r\n" +
" # \r\n" +
" self._menuStrip1.Location = System.Drawing.Point(0, 0)\r\n" +
" self._menuStrip1.Name = \"menuStrip1\"\r\n" +
" self._menuStrip1.Size = System.Drawing.Size(200, 24)\r\n" +
" self._menuStrip1.TabIndex = 0\r\n" +
" self._menuStrip1.Text = \"menuStrip1\"\r\n" +
" self._menuStrip1.Items.AddRange(System.Array[System.Windows.Forms.ToolStripItem](\r\n" +
" [self._fileToolStripMenuItem,\r\n" +
" self._editToolStripMenuItem]))\r\n" +
" # \r\n" +
" # fileToolStripMenuItem\r\n" +
" # \r\n" +
" self._fileToolStripMenuItem.Name = \"fileToolStripMenuItem\"\r\n" +
" self._fileToolStripMenuItem.Size = System.Drawing.Size(37, 20)\r\n" +
" self._fileToolStripMenuItem.Text = \"&File\"\r\n" +
" self._fileToolStripMenuItem.DropDownItems.AddRange(System.Array[System.Windows.Forms.ToolStripItem](\r\n" +
" [self._openToolStripMenuItem,\r\n" +
" self._exitToolStripMenuItem]))\r\n" +
" # \r\n" +
" # openToolStripMenuItem\r\n" +
" # \r\n" +
" self._openToolStripMenuItem.Name = \"openToolStripMenuItem\"\r\n" +
" self._openToolStripMenuItem.Size = System.Drawing.Size(37, 20)\r\n" +
" self._openToolStripMenuItem.Text = \"&Open\"\r\n" +
" # \r\n" +
" # exitToolStripMenuItem\r\n" +
" # \r\n" +
" self._exitToolStripMenuItem.Name = \"exitToolStripMenuItem\"\r\n" +
" self._exitToolStripMenuItem.Size = System.Drawing.Size(37, 20)\r\n" +
" self._exitToolStripMenuItem.Text = \"E&xit\"\r\n" +
" # \r\n" +
" # editToolStripMenuItem\r\n" +
" # \r\n" +
" self._editToolStripMenuItem.Name = \"editToolStripMenuItem\"\r\n" +
" self._editToolStripMenuItem.Size = System.Drawing.Size(39, 20)\r\n" +
" self._editToolStripMenuItem.Text = \"&Edit\"\r\n" +
" # \r\n" +
" # MainForm\r\n" +
" # \r\n" +
" self.ClientSize = System.Drawing.Size(200, 300)\r\n" +
" self.Name = \"MainForm\"\r\n" +
" self.Controls.Add(self._menuStrip1)\r\n" +
" self._menuStrip1.ResumeLayout(False)\r\n" +
" self._menuStrip1.PerformLayout()\r\n" +
" self.ResumeLayout(False)\r\n" +
" self.PerformLayout()\r\n";
Assert.AreEqual(expectedCode, generatedPythonCode);
}
}
}

4
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GenerateNestedPanelFormTestFixture.cs

@ -100,9 +100,9 @@ namespace PythonBinding.Tests.Designer @@ -100,9 +100,9 @@ namespace PythonBinding.Tests.Designer
" self.ClientSize = System.Drawing.Size(284, 264)\r\n" +
" self.Name = \"MainForm\"\r\n" +
" self.Controls.Add(self._panel1)\r\n" +
" self._panel1.ResumeLayout(false)\r\n" +
" self._panel1.ResumeLayout(False)\r\n" +
" self._panel1.PerformLayout()\r\n" +
" self._panel2.ResumeLayout(false)\r\n" +
" self._panel2.ResumeLayout(False)\r\n" +
" self._panel2.PerformLayout()\r\n" +
" self.ResumeLayout(False)\r\n" +
" self.PerformLayout()\r\n";

11
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GeneratePanelFormTestFixture.cs

@ -26,6 +26,7 @@ namespace PythonBinding.Tests.Designer @@ -26,6 +26,7 @@ namespace PythonBinding.Tests.Designer
{
using (DesignSurface designSurface = new DesignSurface(typeof(Form))) {
IDesignerHost host = (IDesignerHost)designSurface.GetService(typeof(IDesignerHost));
IEventBindingService eventBindingService = new MockEventBindingService(host);
Form form = (Form)host.RootComponent;
form.ClientSize = new Size(284, 264);
@ -43,6 +44,13 @@ namespace PythonBinding.Tests.Designer @@ -43,6 +44,13 @@ namespace PythonBinding.Tests.Designer
textBox.Size = new Size(110, 20);
panel.Controls.Add(textBox);
// Add an event handler to the panel to check that this code is generated
// before the text box is initialized.
EventDescriptorCollection events = TypeDescriptor.GetEvents(panel);
EventDescriptor clickEvent = events.Find("Click", false);
PropertyDescriptor clickEventProperty = eventBindingService.GetEventProperty(clickEvent);
clickEventProperty.SetValue(panel, "Panel1Click");
form.Controls.Add(panel);
string indentString = " ";
@ -67,6 +75,7 @@ namespace PythonBinding.Tests.Designer @@ -67,6 +75,7 @@ namespace PythonBinding.Tests.Designer
" self._panel1.Size = System.Drawing.Size(100, 120)\r\n" +
" self._panel1.TabIndex = 0\r\n" +
" self._panel1.Controls.Add(self._textBox1)\r\n" +
" self._panel1.Click += self.Panel1Click\r\n" +
" # \r\n" +
" # textBox1\r\n" +
" # \r\n" +
@ -80,7 +89,7 @@ namespace PythonBinding.Tests.Designer @@ -80,7 +89,7 @@ namespace PythonBinding.Tests.Designer
" self.ClientSize = System.Drawing.Size(284, 264)\r\n" +
" self.Name = \"MainForm\"\r\n" +
" self.Controls.Add(self._panel1)\r\n" +
" self._panel1.ResumeLayout(false)\r\n" +
" self._panel1.ResumeLayout(False)\r\n" +
" self._panel1.PerformLayout()\r\n" +
" self.ResumeLayout(False)\r\n" +
" self.PerformLayout()\r\n";

79
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GetComponentFromDesignerLoaderTestFixture.cs

@ -0,0 +1,79 @@ @@ -0,0 +1,79 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
using System.Windows.Forms;
using ICSharpCode.PythonBinding;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Designer
{
/// <summary>
/// Tests the GetComponent method of the PythonDesignerLoader.
/// </summary>
[TestFixture]
public class GetComponentFromDesignerLoaderTestFixture
{
PythonDesignerLoader loader;
TextBox textBox;
MockDesignerLoaderHost host;
Label label;
[SetUp]
public void Init()
{
host = new MockDesignerLoaderHost();
loader = new PythonDesignerLoader(new MockDesignerGenerator());
loader.BeginLoad(host);
textBox = (TextBox)loader.CreateComponent(typeof(TextBox), "textBox1");
label = (Label)loader.CreateComponent(typeof(Label), "label1");
loader.Add(label, "label1");
}
[TearDown]
public void TearDown()
{
if (textBox != null) {
textBox.Dispose();
}
}
[Test]
public void LabelAddedToContainer()
{
Assert.AreEqual(label, host.Container.Components["label1"]);
}
[Test]
public void TextBoxIsNotAddedToContainer()
{
Assert.IsNull(host.Container.Components["textBox1"]);
}
[Test]
public void GetUnknownCreatedComponent()
{
Assert.IsNull(loader.GetComponent("unknown"));
}
[Test]
public void GetTextBoxComponent()
{
Assert.IsNull(loader.GetComponent("textBox1"));
}
[Test]
public void GetLabelComponent()
{
Assert.AreEqual(label, loader.GetComponent("label1"));
}
}
}

4
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadControlEventHandlerTestFixture.cs

@ -49,7 +49,7 @@ namespace PythonBinding.Tests.Designer @@ -49,7 +49,7 @@ namespace PythonBinding.Tests.Designer
[TestFixtureSetUp]
public new void SetUpFixture()
{
base.SetEventPropertyDescriptor(new MockPropertyDescriptor("abc", "Button2KeyDown", true));
base.ComponentCreator.SetEventPropertyDescriptor(new MockPropertyDescriptor("abc", "Button2KeyDown", true));
base.SetUpFixture();
}
@ -67,7 +67,7 @@ namespace PythonBinding.Tests.Designer @@ -67,7 +67,7 @@ namespace PythonBinding.Tests.Designer
public MockPropertyDescriptor GetButtonKeyDownEventPropertyDescriptor()
{
EventDescriptor eventDescriptor = GetButtonKeyDownEventDescriptor();
return base.GetEventProperty(eventDescriptor) as MockPropertyDescriptor;
return base.ComponentCreator.GetEventProperty(eventDescriptor) as MockPropertyDescriptor;
}
[Test]

4
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadEventHandlerTestFixture.cs

@ -39,7 +39,7 @@ namespace PythonBinding.Tests.Designer @@ -39,7 +39,7 @@ namespace PythonBinding.Tests.Designer
[TestFixtureSetUp]
public new void SetUpFixture()
{
base.SetEventPropertyDescriptor(new MockPropertyDescriptor("abc", "TestFormLoad", true));
base.ComponentCreator.SetEventPropertyDescriptor(new MockPropertyDescriptor("abc", "TestFormLoad", true));
base.SetUpFixture();
}
@ -51,7 +51,7 @@ namespace PythonBinding.Tests.Designer @@ -51,7 +51,7 @@ namespace PythonBinding.Tests.Designer
public MockPropertyDescriptor GetLoadEventPropertyDescriptor()
{
EventDescriptor loadEventDescriptor = GetLoadEventDescriptor();
return base.GetEventProperty(loadEventDescriptor) as MockPropertyDescriptor;
return base.ComponentCreator.GetEventProperty(loadEventDescriptor) as MockPropertyDescriptor;
}
[Test]

127
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadFormTestFixtureBase.cs

@ -6,11 +6,6 @@ @@ -6,11 +6,6 @@
// </file>
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
@ -24,15 +19,9 @@ namespace PythonBinding.Tests.Designer @@ -24,15 +19,9 @@ namespace PythonBinding.Tests.Designer
/// <summary>
/// Base class for all LoadFormTestFixture classes.
/// </summary>
public class LoadFormTestFixtureBase : IComponentCreator
{
List <CreatedComponent> createdComponents = new List<CreatedComponent>();
List <CreatedInstance> createdInstances = new List<CreatedInstance>();
List <AddedComponent> addedComponents = new List<AddedComponent>();
List<string> typeNames = new List<string>();
PropertyDescriptor propertyDescriptor;
EventDescriptor eventDescriptor;
public class LoadFormTestFixtureBase
{
MockComponentCreator componentCreator = new MockComponentCreator();
Form form;
public LoadFormTestFixtureBase()
@ -42,7 +31,7 @@ namespace PythonBinding.Tests.Designer @@ -42,7 +31,7 @@ namespace PythonBinding.Tests.Designer
[TestFixtureSetUp]
public void SetUpFixture()
{
PythonFormWalker walker = new PythonFormWalker(this);
PythonFormWalker walker = new PythonFormWalker(componentCreator);
form = walker.CreateForm(PythonCode);
}
@ -59,112 +48,12 @@ namespace PythonBinding.Tests.Designer @@ -59,112 +48,12 @@ namespace PythonBinding.Tests.Designer
get { return String.Empty; }
}
public IComponent CreateComponent(Type componentClass, string name)
{
CreatedComponent c = new CreatedComponent(componentClass.FullName, name);
createdComponents.Add(c);
object instance = componentClass.Assembly.CreateInstance(componentClass.FullName);
return (IComponent)instance;
}
public void Add(IComponent component, string name)
{
AddedComponent addedComponent = new AddedComponent(component, name);
addedComponents.Add(addedComponent);
}
public object CreateInstance(Type type, ICollection arguments, string name, bool addToContainer)
{
CreatedInstance createdInstance = new CreatedInstance(type, arguments, name, addToContainer);
createdInstances.Add(createdInstance);
object[] argumentsArray = new object[arguments.Count];
arguments.CopyTo(argumentsArray, 0);
object o = null;
DesignerSerializationManager designerSerializationManager = new DesignerSerializationManager();
using (designerSerializationManager.CreateSession()) {
IDesignerSerializationManager manager = designerSerializationManager as IDesignerSerializationManager;
o = manager.CreateInstance(type, arguments, name, addToContainer);
}
createdInstance.Object = o;
return o;
}
public Type GetType(string typeName)
{
typeNames.Add(typeName);
// Lookup type in System.Windows.Forms assembly.
Type type = typeof(Form).Assembly.GetType(typeName);
if (type == null) {
// Lookup type System.Drawing assembly.
type = typeof(Size).Assembly.GetType(typeName);
}
return type;
}
public PropertyDescriptor GetEventProperty(EventDescriptor e)
{
this.eventDescriptor = e;
return propertyDescriptor;
}
public EventDescriptor EventDescriptorPassedToGetEventProperty {
get { return eventDescriptor; }
}
/// <summary>
/// Sets the property descriptor to return from the GetEventProperty method.
/// </summary>
public void SetEventPropertyDescriptor(PropertyDescriptor propertyDescriptor)
{
this.propertyDescriptor = propertyDescriptor;
protected MockComponentCreator ComponentCreator {
get { return componentCreator; }
}
protected Form Form {
get { return form; }
}
protected List<CreatedComponent> CreatedComponents {
get { return createdComponents; }
}
protected List<AddedComponent> AddedComponents {
get { return addedComponents; }
}
protected List<CreatedInstance> CreatedInstances {
get { return createdInstances; }
}
protected List<string> TypeNames {
get { return typeNames; }
}
protected string LastTypeNameResolved {
get { return TypeNames[TypeNames.Count - 1]; }
}
protected CreatedInstance GetCreatedInstance(Type type)
{
foreach (CreatedInstance instance in createdInstances) {
if (instance.InstanceType == type) {
return instance;
}
}
return null;
}
protected CreatedInstance GetCreatedInstance(string name)
{
foreach (CreatedInstance instance in createdInstances) {
if (instance.Name == name) {
return instance;
}
}
return null;
}
}
}
}

130
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadMenuStripFormTestFixture.cs

@ -0,0 +1,130 @@ @@ -0,0 +1,130 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using ICSharpCode.PythonBinding;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Designer
{
[TestFixture]
public class LoadMenuStripTestFixture : LoadFormTestFixtureBase
{
public override string PythonCode {
get {
return "class MainForm(System.Windows.Forms.Form):\r\n" +
" def InitializeComponent(self):\r\n" +
" self._menuStrip1 = System.Windows.Forms.MenuStrip()\r\n" +
" self._fileToolStripMenuItem = System.Windows.Forms.ToolStripMenuItem()\r\n" +
" self._openToolStripMenuItem = System.Windows.Forms.ToolStripMenuItem()\r\n" +
" self._exitToolStripMenuItem = System.Windows.Forms.ToolStripMenuItem()\r\n" +
" self._editToolStripMenuItem = System.Windows.Forms.ToolStripMenuItem()\r\n" +
" self._menuStrip1.SuspendLayout()\r\n" +
" self.SuspendLayout()\r\n" +
" # \r\n" +
" # menuStrip1\r\n" +
" # \r\n" +
" self._menuStrip1.Location = System.Drawing.Point(0, 0)\r\n" +
" self._menuStrip1.Name = \"menuStrip1\"\r\n" +
" self._menuStrip1.Size = System.Drawing.Size(200, 24)\r\n" +
" self._menuStrip1.TabIndex = 0\r\n" +
" self._menuStrip1.Text = \"menuStrip1\"\r\n" +
" self._menuStrip1.Items.AddRange(System.Array[System.Windows.Forms.ToolStripItem](\r\n" +
" [self._fileToolStripMenuItem,\r\n" +
" self._editToolStripMenuItem]))\r\n" +
" # \r\n" +
" # fileToolStripMenuItem\r\n" +
" # \r\n" +
" self._fileToolStripMenuItem.Name = \"fileToolStripMenuItem\"\r\n" +
" self._fileToolStripMenuItem.Size = System.Drawing.Size(37, 20)\r\n" +
" self._fileToolStripMenuItem.Text = \"&File\"\r\n" +
" self._fileToolStripMenuItem.DropDownItems.AddRange(System.Array[System.Windows.Forms.ToolStripItem](\r\n" +
" [self._openToolStripMenuItem,\r\n" +
" self._exitToolStripMenuItem]))\r\n" +
" # \r\n" +
" # openToolStripMenuItem\r\n" +
" # \r\n" +
" self._openToolStripMenuItem.Name = \"openToolStripMenuItem\"\r\n" +
" self._openToolStripMenuItem.Size = System.Drawing.Size(37, 20)\r\n" +
" self._openToolStripMenuItem.Text = \"&Open\"\r\n" +
" # \r\n" +
" # exitToolStripMenuItem\r\n" +
" # \r\n" +
" self._exitToolStripMenuItem.Name = \"exitToolStripMenuItem\"\r\n" +
" self._exitToolStripMenuItem.Size = System.Drawing.Size(37, 20)\r\n" +
" self._exitToolStripMenuItem.Text = \"E&xit\"\r\n" +
" # \r\n" +
" # editToolStripMenuItem\r\n" +
" # \r\n" +
" self._editToolStripMenuItem.Name = \"editToolStripMenuItem\"\r\n" +
" self._editToolStripMenuItem.Size = System.Drawing.Size(39, 20)\r\n" +
" self._editToolStripMenuItem.Text = \"&Edit\"\r\n" +
" # \r\n" +
" # MainForm\r\n" +
" # \r\n" +
" self.ClientSize = System.Drawing.Size(200, 300)\r\n" +
" self.Name = \"MainForm\"\r\n" +
" self.Controls.Add(self._menuStrip1)\r\n" +
" self._menuStrip1.ResumeLayout(False)\r\n" +
" self._menuStrip1.PerformLayout()\r\n" +
" self.ResumeLayout(False)\r\n" +
" self.PerformLayout()\r\n";
}
}
public MenuStrip MenuStrip {
get { return Form.Controls[0] as MenuStrip; }
}
public ToolStripMenuItem FileMenuItem {
get { return MenuStrip.Items[0] as ToolStripMenuItem; }
}
[Test]
public void MenuStripAddedToForm()
{
Assert.IsNotNull(MenuStrip);
}
[Test]
public void MenuStripHasTwoItems()
{
Assert.AreEqual(2, MenuStrip.Items.Count);
}
[Test]
public void MenuStripFirstItemIsFileMenuItem()
{
Assert.AreEqual("fileToolStripMenuItem", FileMenuItem.Name);
}
[Test]
public void FileMenuItemText()
{
Assert.AreEqual("&File", FileMenuItem.Text);
}
[Test]
public void MenuStripSecondItemIsEditMenuItem()
{
Assert.AreEqual("editToolStripMenuItem", MenuStrip.Items[1].Name);
}
[Test]
public void FileMenuItemHasDropDownItems()
{
Assert.AreEqual(2, FileMenuItem.DropDownItems.Count);
}
}
}

10
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadSimpleFormTestFixture.cs

@ -35,7 +35,7 @@ namespace PythonBinding.Tests.Designer @@ -35,7 +35,7 @@ namespace PythonBinding.Tests.Designer
}
public CreatedComponent FormComponent {
get { return CreatedComponents[0]; }
get { return ComponentCreator.CreatedComponents[0]; }
}
[Test]
@ -53,7 +53,7 @@ namespace PythonBinding.Tests.Designer @@ -53,7 +53,7 @@ namespace PythonBinding.Tests.Designer
[Test]
public void OneComponentCreated()
{
Assert.AreEqual(1, CreatedComponents.Count);
Assert.AreEqual(1, ComponentCreator.CreatedComponents.Count);
}
[Test]
@ -82,13 +82,13 @@ namespace PythonBinding.Tests.Designer @@ -82,13 +82,13 @@ namespace PythonBinding.Tests.Designer
[Test]
public void TypeNameLookedUp()
{
Assert.AreEqual("System.Drawing.Size", TypeNames[0]);
Assert.AreEqual("System.Drawing.Size", ComponentCreator.TypeNames[0]);
}
[Test]
public void OneObjectCreated()
{
Assert.AreEqual(1, CreatedInstances.Count);
Assert.AreEqual(1, ComponentCreator.CreatedInstances.Count);
}
[Test]
@ -101,7 +101,7 @@ namespace PythonBinding.Tests.Designer @@ -101,7 +101,7 @@ namespace PythonBinding.Tests.Designer
args.Add(height);
CreatedInstance expectedInstance = new CreatedInstance(typeof(Size), args, null, false);
Assert.AreEqual(expectedInstance, CreatedInstances[0]);
Assert.AreEqual(expectedInstance, ComponentCreator.CreatedInstances[0]);
}
}
}

30
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadTextBoxOnPanelTestFixture.cs

@ -69,34 +69,6 @@ namespace PythonBinding.Tests.Designer @@ -69,34 +69,6 @@ namespace PythonBinding.Tests.Designer
public void TextBoxAddedToPanel()
{
Assert.IsNotNull(TextBox);
}
[Test]
public void ParentControlNameAddingChildControls()
{
string code = "self._panel1.Controls.Add";
Assert.AreEqual("panel1", PythonControlFieldExpression.GetParentControlNameAddingChildControls(code));
}
[Test]
public void EmptyControlNameAddingChildControls()
{
string code = "self.Controls.Add";
Assert.AreEqual(String.Empty, PythonControlFieldExpression.GetParentControlNameAddingChildControls(code));
}
[Test]
public void CaseInsensitiveCheckForControlsAddStatement()
{
string code = "self._panel1.controls.add";
Assert.AreEqual("panel1", PythonControlFieldExpression.GetParentControlNameAddingChildControls(code));
}
[Test]
public void CodeDoesNotIncludeControlsAddStatement()
{
string code = "self._panel1.SuspendLayout";
Assert.IsNull(PythonControlFieldExpression.GetParentControlNameAddingChildControls(code));
}
}
}
}

10
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadTextBoxTestFixture.cs

@ -49,17 +49,17 @@ namespace PythonBinding.Tests.Designer @@ -49,17 +49,17 @@ namespace PythonBinding.Tests.Designer
[Test]
public void AddedComponentsContainsTextBox()
{
CreatedInstance instance = GetCreatedInstance(typeof(TextBox));
CreatedInstance instance = ComponentCreator.GetCreatedInstance(typeof(TextBox));
AddedComponent component = new AddedComponent(instance.Object as IComponent, "textBox1");
Assert.Contains(component, AddedComponents);
Assert.Contains(component, ComponentCreator.AddedComponents);
}
[Test]
public void TextBoxInstanceCreated()
{
CreatedInstance instance = new CreatedInstance(typeof(TextBox), new List<object>(), null, false);
Assert.Contains(instance, CreatedInstances);
Assert.Contains(instance, ComponentCreator.CreatedInstances);
}
[Test]
@ -71,7 +71,7 @@ namespace PythonBinding.Tests.Designer @@ -71,7 +71,7 @@ namespace PythonBinding.Tests.Designer
[Test]
public void TextBoxObjectMatchesObjectAddedToComponentCreator()
{
CreatedInstance instance = GetCreatedInstance(typeof(TextBox));
CreatedInstance instance = ComponentCreator.GetCreatedInstance(typeof(TextBox));
Assert.AreSame(TextBox, instance.Object as TextBox);
}
@ -90,7 +90,7 @@ namespace PythonBinding.Tests.Designer @@ -90,7 +90,7 @@ namespace PythonBinding.Tests.Designer
[Test]
public void CreatedInstancesDoesNotIncludeLocation()
{
Assert.IsNull(GetCreatedInstance("Location"));
Assert.IsNull(ComponentCreator.GetCreatedInstance("Location"));
}
[Test]

7
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/MissingInitializeComponentMethodTestFixture.cs

@ -74,11 +74,16 @@ namespace PythonBinding.Tests.Designer @@ -74,11 +74,16 @@ namespace PythonBinding.Tests.Designer
throw new NotImplementedException();
}
public void Add(System.ComponentModel.IComponent component, string name)
public void Add(IComponent component, string name)
{
throw new NotImplementedException();
}
public IComponent GetComponent(string name)
{
return null;
}
public object CreateInstance(Type type, ICollection arguments, string name, bool addToContainer)
{
throw new NotImplementedException();

31
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonCodeDeserializerTests.cs

@ -18,14 +18,16 @@ using PythonBinding.Tests.Utils; @@ -18,14 +18,16 @@ using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Designer
{
[TestFixture]
public class PythonCodeDeserializerTests : LoadFormTestFixtureBase
public class PythonCodeDeserializerTests
{
PythonCodeDeserializer deserializer;
MockComponentCreator componentCreator;
[TestFixtureSetUp]
public new void SetUpFixture()
public void SetUpFixture()
{
deserializer = new PythonCodeDeserializer(this);
componentCreator = new MockComponentCreator();
deserializer = new PythonCodeDeserializer(componentCreator);
}
[Test]
@ -40,31 +42,28 @@ namespace PythonBinding.Tests.Designer @@ -40,31 +42,28 @@ namespace PythonBinding.Tests.Designer
public void UnknownTypeName()
{
string pythonCode = "self.Cursors = System.Windows.Forms.UnknownType.AppStarting";
Assert.IsNull(Deserialize(pythonCode));
Assert.IsNull(DeserializeRhsAssignment(pythonCode));
}
[Test]
public void UnknownPropertyName()
{
string pythonCode = "self.Cursors = System.Windows.Forms.Cursors.UnknownCursorsProperty";
Assert.IsNull(Deserialize(pythonCode));
Assert.IsNull(DeserializeRhsAssignment(pythonCode));
}
[Test]
public void UnknownTypeNameInCallExpression()
{
string pythonCode = "self.Cursors = System.Windows.Forms.UnknownType.CreateDefaultCursor()";
Assert.IsNull(Deserialize(pythonCode));
Assert.IsNull(DeserializeRhsAssignment(pythonCode));
}
[Test]
public void EnumReturnedInArgumentsPassedToConstructor()
{
string pythonCode = "self.Font = System.Drawing.Font(\"Times New Roman\", System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point)";
PythonParser parser = new PythonParser();
PythonAst ast = parser.CreateAst(@"snippet.py", pythonCode);
SuiteStatement suiteStatement = (SuiteStatement)ast.Body;
AssignmentStatement assignment = suiteStatement.Statements[0] as AssignmentStatement;
AssignmentStatement assignment = PythonParserHelper.GetAssignmentStatement(pythonCode);
List<object> expectedArgs = new List<object>();
expectedArgs.Add("Times New Roman");
@ -82,7 +81,7 @@ namespace PythonBinding.Tests.Designer @@ -82,7 +81,7 @@ namespace PythonBinding.Tests.Designer
string pythonCode = "self.textBox1.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom";
AnchorStyles expectedStyles = AnchorStyles.Top | AnchorStyles.Bottom;
Assert.AreEqual(expectedStyles, Deserialize(pythonCode));
Assert.AreEqual(expectedStyles, DeserializeRhsAssignment(pythonCode));
}
[Test]
@ -91,19 +90,15 @@ namespace PythonBinding.Tests.Designer @@ -91,19 +90,15 @@ namespace PythonBinding.Tests.Designer
string pythonCode = "self.textBox1.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left";
AnchorStyles expectedStyles = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
Assert.AreEqual(expectedStyles, Deserialize(pythonCode));
Assert.AreEqual(expectedStyles, DeserializeRhsAssignment(pythonCode));
}
/// <summary>
/// Deserializes the right hand side of the assignment.
/// </summary>
object Deserialize(string pythonCode)
object DeserializeRhsAssignment(string pythonCode)
{
PythonParser parser = new PythonParser();
PythonAst ast = parser.CreateAst(@"snippet.py", pythonCode);
SuiteStatement suiteStatement = (SuiteStatement)ast.Body;
AssignmentStatement assignment = suiteStatement.Statements[0] as AssignmentStatement;
return deserializer.Deserialize(assignment.Right);
return deserializer.Deserialize(PythonParserHelper.GetAssignmentStatement(pythonCode).Right);
}
}
}

175
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonControlFieldExpressionTests.cs

@ -0,0 +1,175 @@ @@ -0,0 +1,175 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Windows.Forms;
using ICSharpCode.PythonBinding;
using IronPython.Compiler.Ast;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Designer
{
[TestFixture]
public class PythonControlFieldExpressionTests
{
[Test]
public void HasPrefixTest()
{
Assert.AreEqual("a", PythonControlFieldExpression.GetPrefix("a.b"));
}
[Test]
public void NoDotHasPrefixTest()
{
Assert.AreEqual("a", PythonControlFieldExpression.GetPrefix("a"));
}
[Test]
public void ParentControlNameAddingChildControls()
{
string code = "self._panel1.Controls.Add";
Assert.AreEqual("panel1", PythonControlFieldExpression.GetParentControlNameAddingChildControls(code));
}
[Test]
public void EmptyControlNameAddingChildControls()
{
string code = "self.Controls.Add";
Assert.AreEqual(String.Empty, PythonControlFieldExpression.GetParentControlNameAddingChildControls(code));
}
[Test]
public void CaseInsensitiveCheckForControlsAddStatement()
{
string code = "self._panel1.controls.add";
Assert.AreEqual("panel1", PythonControlFieldExpression.GetParentControlNameAddingChildControls(code));
}
[Test]
public void CodeDoesNotIncludeControlsAddStatement()
{
string code = "self._panel1.SuspendLayout";
Assert.IsNull(PythonControlFieldExpression.GetParentControlNameAddingChildControls(code));
}
[Test]
public void GetVariableName()
{
Assert.AreEqual("abc", PythonControlFieldExpression.GetVariableName("_abc"));
}
[Test]
public void VariableNameHasOnlyUnderscore()
{
Assert.AreEqual(String.Empty, PythonControlFieldExpression.GetVariableName("_"));
}
[Test]
public void VariableNameIsEmpty()
{
Assert.AreEqual(String.Empty, PythonControlFieldExpression.GetVariableName(String.Empty));
}
[Test]
public void FullMemberExpression()
{
CallExpression call = PythonParserHelper.GetCallExpression("self._a.b.Add()");
Assert.AreEqual("self._a.b.Add", PythonControlFieldExpression.GetMemberName(call.Target as MemberExpression));
}
[Test]
public void NullMemberExpression()
{
Assert.AreEqual(String.Empty, PythonControlFieldExpression.GetMemberName(null));
}
[Test]
public void PythonControlFieldExpressionEquals()
{
AssignmentStatement statement = PythonParserHelper.GetAssignmentStatement("self._textBox1.Name = \"abc\"");
PythonControlFieldExpression field1 = PythonControlFieldExpression.Create(statement.Left[0] as MemberExpression);
statement = PythonParserHelper.GetAssignmentStatement("self._textBox1.Name = \"def\"");
PythonControlFieldExpression field2 = PythonControlFieldExpression.Create(statement.Left[0] as MemberExpression);
Assert.AreEqual(field1, field2);
}
[Test]
public void NullPassedToPythonControlFieldExpressionEquals()
{
AssignmentStatement statement = PythonParserHelper.GetAssignmentStatement("self._textBox1.Name = \"abc\"");
PythonControlFieldExpression field = PythonControlFieldExpression.Create(statement.Left[0] as MemberExpression);
Assert.IsFalse(field.Equals(null));
}
[Test]
public void GetControlNameBeingAdded()
{
string code = "self.Controls.Add(self._menuItem1)";
CallExpression expression = PythonParserHelper.GetCallExpression(code);
Assert.AreEqual("menuItem1", PythonControlFieldExpression.GetControlNameBeingAdded(expression));
}
[Test]
public void MethodName()
{
string code = "self.menuItem.Items.Add(self._fileMenuItem)";
CallExpression expression = PythonParserHelper.GetCallExpression(code);
PythonControlFieldExpression field = PythonControlFieldExpression.Create(expression);
AssertAreEqual(field, "menuItem", "Items", "Add", "self.menuItem.Items");
}
[Test]
public void GetMemberNames()
{
string[] expected = new string[] { "a", "b" };
string code = "a.b = 0";
AssignmentStatement statement = PythonParserHelper.GetAssignmentStatement(code);
Assert.AreEqual(expected, PythonControlFieldExpression.GetMemberNames(statement.Left[0] as MemberExpression));
}
[Test]
public void GetObjectInMethodCall()
{
string pythonCode = "self._menuStrip1.Items.AddRange(System.Array[System.Windows.Forms.ToolStripItem](\r\n" +
" [self._fileToolStripMenuItem,\r\n" +
" self._editToolStripMenuItem]))";
CallExpression callExpression = PythonParserHelper.GetCallExpression(pythonCode);
PythonControlFieldExpression field = PythonControlFieldExpression.Create(callExpression);
using (MenuStrip menuStrip = new MenuStrip()) {
MockComponentCreator creator = new MockComponentCreator();
creator.Add(menuStrip, "menuStrip1");
Assert.AreEqual(menuStrip.Items, field.GetMember(creator));
}
}
[Test]
public void GetObjectForUnknownComponent()
{
string pythonCode = "self._menuStrip1.SuspendLayout()";
CallExpression callExpression = PythonParserHelper.GetCallExpression(pythonCode);
PythonControlFieldExpression field = PythonControlFieldExpression.Create(callExpression);
using (MenuStrip menuStrip = new MenuStrip()) {
MockComponentCreator creator = new MockComponentCreator();
creator.Add(menuStrip, "unknown");
Assert.IsNull(field.GetMember(creator));
}
}
void AssertAreEqual(PythonControlFieldExpression field, string variableName, string memberName, string methodName, string fullMemberName)
{
string expected = "Variable: " + variableName + " Member: " + memberName + " Method: " + methodName + " FullMemberName: " + fullMemberName;
string actual = "Variable: " + field.VariableName + " Member: " + field.MemberName + " Method: " + field.MethodName + " FullMemberName: " + field.FullMemberName;
Assert.AreEqual(expected, actual);
}
}
}

6
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonDesignerLoaderTestFixture.cs

@ -67,7 +67,7 @@ namespace PythonBinding.Tests.Designer @@ -67,7 +67,7 @@ namespace PythonBinding.Tests.Designer
designedForm = new Form();
designedForm.Name = "NewMainForm";
mockDesignerLoaderHost.RootComponent = designedForm;
mockDesignerLoaderHost.RootComponent = designedForm;
loader.CallPerformFlush();
}
@ -89,11 +89,11 @@ namespace PythonBinding.Tests.Designer @@ -89,11 +89,11 @@ namespace PythonBinding.Tests.Designer
public void CreateComponent()
{
List<CreatedComponent> expectedCreatedComponents = new List<CreatedComponent>();
expectedCreatedComponents.Add(new CreatedComponent(typeof(Form).FullName, "MainForm"));
expectedCreatedComponents.Add(new CreatedComponent(typeof(Form).FullName, "MainForm", null));
Assert.AreEqual(expectedCreatedComponents, mockDesignerLoaderHost.CreatedComponents);
}
[Test]
public void ComponentSerializationServiceCreated()
{

4
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/TextBoxNotAddedToFormTestFixture.cs

@ -48,10 +48,10 @@ namespace PythonBinding.Tests.Designer @@ -48,10 +48,10 @@ namespace PythonBinding.Tests.Designer
[Test]
public void AddedComponentsContainsTextBox()
{
CreatedInstance instance = GetCreatedInstance(typeof(TextBox));
CreatedInstance instance = ComponentCreator.GetCreatedInstance(typeof(TextBox));
AddedComponent c = new AddedComponent(instance.Object as IComponent, "textBox1");
Assert.Contains(c, AddedComponents);
Assert.Contains(c, ComponentCreator.AddedComponents);
}
[Test]

10
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/UnknownTypeTestFixture.cs

@ -24,7 +24,7 @@ namespace PythonBinding.Tests.Designer @@ -24,7 +24,7 @@ namespace PythonBinding.Tests.Designer
/// form.
/// </summary>
[TestFixture]
public class UnknownTypeTestFixture : LoadFormTestFixtureBase
public class UnknownTypeTestFixture
{
string pythonCode = "from System.Windows.Forms import Form\r\n" +
"\r\n" +
@ -35,17 +35,11 @@ namespace PythonBinding.Tests.Designer @@ -35,17 +35,11 @@ namespace PythonBinding.Tests.Designer
" def InitializeComponent(self):\r\n" +
" self.ClientSize = Unknown.Type(10)\r\n";
[TestFixtureSetUp]
public new void SetUpFixture()
{
// Do not call base class SetUpFixture.
}
[Test]
[ExpectedException(typeof(PythonFormWalkerException))]
public void PythonFormWalkerExceptionThrown()
{
PythonFormWalker walker = new PythonFormWalker(this);
PythonFormWalker walker = new PythonFormWalker(new MockComponentCreator());
walker.CreateForm(pythonCode);
Assert.Fail("Exception should have been thrown before this.");
}

8
src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj

@ -148,6 +148,8 @@ @@ -148,6 +148,8 @@
<Compile Include="Designer\CursorTypeResolutionTestFixture.cs" />
<Compile Include="Designer\DeserializeAssignmentTestFixtureBase.cs" />
<Compile Include="Designer\DeserializeColorFromArgbTestFixture.cs" />
<Compile Include="Designer\DeserializeStringArrayTestFixture.cs" />
<Compile Include="Designer\DeserializeToolStripItemArrayTestFixture.cs" />
<Compile Include="Designer\EnabledSetUsingPropertyDescriptorTestFixture.cs" />
<Compile Include="Designer\FindInitializeComponentMethodTestFixture.cs" />
<Compile Include="Designer\GenerateAcceptButtonFormTestFixture.cs" />
@ -162,6 +164,7 @@ @@ -162,6 +164,7 @@
<Compile Include="Designer\GenerateFormPaddingTestFixture.cs" />
<Compile Include="Designer\GenerateImeModeFormTestFixture.cs" />
<Compile Include="Designer\GenerateMenuStripFormTestFixture.cs" />
<Compile Include="Designer\GenerateMenuStripItemsTestFixture.cs" />
<Compile Include="Designer\GenerateMinSizeFormTestFixture.cs" />
<Compile Include="Designer\GenerateNestedPanelFormTestFixture.cs" />
<Compile Include="Designer\GeneratePanelFormTestFixture.cs" />
@ -169,6 +172,7 @@ @@ -169,6 +172,7 @@
<Compile Include="Designer\GenerateSimpleFormTestFixture.cs" />
<Compile Include="Designer\GenerateTextBoxFormTestFixture.cs" />
<Compile Include="Designer\GeneratorMergeFindsInitializeComponentsTestFixture.cs" />
<Compile Include="Designer\GetComponentFromDesignerLoaderTestFixture.cs" />
<Compile Include="Designer\IgnoreDesignTimePropertiesTestFixture.cs" />
<Compile Include="Designer\InsertNewEventHandlerTestFixture.cs" />
<Compile Include="Designer\InsertSecondEventHandlerTestFixture.cs" />
@ -183,6 +187,7 @@ @@ -183,6 +187,7 @@
<Compile Include="Designer\LoadFontTestFixture.cs" />
<Compile Include="Designer\LoadFormTestFixtureBase.cs" />
<Compile Include="Designer\LoadFormWithBooleanPropertiesSetTestFixture.cs" />
<Compile Include="Designer\LoadMenuStripFormTestFixture.cs" />
<Compile Include="Designer\LoadSimpleFormTestFixture.cs" />
<Compile Include="Designer\LoadTextBoxOnPanelTestFixture.cs" />
<Compile Include="Designer\LoadTextBoxTestFixture.cs" />
@ -191,6 +196,7 @@ @@ -191,6 +196,7 @@
<Compile Include="Designer\NoNewLineAfterInitializeComponentTestFixture.cs" />
<Compile Include="Designer\OneCompatibleMethodTestFixture.cs" />
<Compile Include="Designer\PythonCodeDeserializerTests.cs" />
<Compile Include="Designer\PythonControlFieldExpressionTests.cs" />
<Compile Include="Designer\PythonGeneratorTestFixture.cs" />
<Compile Include="Designer\IsFormDesignableTestFixture.cs" />
<Compile Include="Designer\NullGeneratorPassedToLoader.cs" />
@ -253,6 +259,7 @@ @@ -253,6 +259,7 @@
<Compile Include="Utils\DerivedPythonDesignerLoader.cs" />
<Compile Include="Utils\DerivedPythonFormsDesignerDisplayBinding.cs" />
<Compile Include="Utils\MockClass.cs" />
<Compile Include="Utils\MockComponentCreator.cs" />
<Compile Include="Utils\MockDesignerGenerator.cs" />
<Compile Include="Utils\MockDesignerLoaderHost.cs" />
<Compile Include="Utils\MockEditableViewContent.cs" />
@ -281,6 +288,7 @@ @@ -281,6 +288,7 @@
</EmbeddedResource>
<None Include="app.config" />
<Compile Include="Parsing\AddInvalidSourceSpanToErrorSinkTestFixture.cs" />
<Compile Include="Utils\PythonParserHelper.cs" />
<None Include="TODO.txt" />
</ItemGroup>
<ItemGroup>

5
src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/CreatedComponent.cs

@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
// </file>
using System;
using System.ComponentModel;
namespace PythonBinding.Tests.Utils
{
@ -14,14 +15,16 @@ namespace PythonBinding.Tests.Utils @@ -14,14 +15,16 @@ namespace PythonBinding.Tests.Utils
/// </summary>
public class CreatedComponent
{
public CreatedComponent(string typeName, string name)
public CreatedComponent(string typeName, string name, IComponent component)
{
TypeName = typeName;
Name = name;
Component = component;
}
public string TypeName { get; set; }
public string Name { get; set; }
public IComponent Component { get; set; }
public override bool Equals(object obj)
{

152
src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/MockComponentCreator.cs

@ -0,0 +1,152 @@ @@ -0,0 +1,152 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
using ICSharpCode.PythonBinding;
namespace PythonBinding.Tests.Utils
{
public class MockComponentCreator : IComponentCreator
{
List <CreatedComponent> createdComponents = new List<CreatedComponent>();
List <CreatedInstance> createdInstances = new List<CreatedInstance>();
List <AddedComponent> addedComponents = new List<AddedComponent>();
List<string> typeNames = new List<string>();
PropertyDescriptor propertyDescriptor;
EventDescriptor eventDescriptor;
public MockComponentCreator()
{
}
public IComponent CreateComponent(Type componentClass, string name)
{
object instance = componentClass.Assembly.CreateInstance(componentClass.FullName);
CreatedComponent c = new CreatedComponent(componentClass.FullName, name, (IComponent)instance);
createdComponents.Add(c);
return (IComponent)instance;
}
public void Add(IComponent component, string name)
{
AddedComponent addedComponent = new AddedComponent(component, name);
addedComponents.Add(addedComponent);
}
public IComponent GetComponent(string name)
{
foreach (AddedComponent c in addedComponents) {
if (c.Name == name) {
return c.Component;
}
}
return null;
}
public object CreateInstance(Type type, ICollection arguments, string name, bool addToContainer)
{
CreatedInstance createdInstance = new CreatedInstance(type, arguments, name, addToContainer);
createdInstances.Add(createdInstance);
object[] argumentsArray = new object[arguments.Count];
arguments.CopyTo(argumentsArray, 0);
object o = null;
DesignerSerializationManager designerSerializationManager = new DesignerSerializationManager();
using (designerSerializationManager.CreateSession()) {
IDesignerSerializationManager manager = designerSerializationManager as IDesignerSerializationManager;
o = manager.CreateInstance(type, arguments, name, addToContainer);
}
createdInstance.Object = o;
return o;
}
public Type GetType(string typeName)
{
typeNames.Add(typeName);
// Lookup type in System.Windows.Forms assembly.
Type type = typeof(Form).Assembly.GetType(typeName);
if (type == null) {
// Lookup type System.Drawing assembly.
type = typeof(Size).Assembly.GetType(typeName);
}
if (type == null) {
type = typeof(String).Assembly.GetType(typeName);
}
return type;
}
public PropertyDescriptor GetEventProperty(EventDescriptor e)
{
this.eventDescriptor = e;
return propertyDescriptor;
}
public EventDescriptor EventDescriptorPassedToGetEventProperty {
get { return eventDescriptor; }
}
/// <summary>
/// Sets the property descriptor to return from the GetEventProperty method.
/// </summary>
public void SetEventPropertyDescriptor(PropertyDescriptor propertyDescriptor)
{
this.propertyDescriptor = propertyDescriptor;
}
public List<CreatedComponent> CreatedComponents {
get { return createdComponents; }
}
public List<AddedComponent> AddedComponents {
get { return addedComponents; }
}
public List<CreatedInstance> CreatedInstances {
get { return createdInstances; }
}
public List<string> TypeNames {
get { return typeNames; }
}
public string LastTypeNameResolved {
get { return TypeNames[TypeNames.Count - 1]; }
}
public CreatedInstance GetCreatedInstance(Type type)
{
foreach (CreatedInstance instance in createdInstances) {
if (instance.InstanceType == type) {
return instance;
}
}
return null;
}
public CreatedInstance GetCreatedInstance(string name)
{
foreach (CreatedInstance instance in createdInstances) {
if (instance.Name == name) {
return instance;
}
}
return null;
}
}
}

9
src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/MockDesignerLoaderHost.cs

@ -23,7 +23,8 @@ namespace PythonBinding.Tests.Utils @@ -23,7 +23,8 @@ namespace PythonBinding.Tests.Utils
List<CreatedComponent> createdComponents = new List<CreatedComponent>();
IComponent rootComponent;
MockTypeResolutionService typeResolutionService = new MockTypeResolutionService();
Container container = new Container();
public MockDesignerLoaderHost()
{
AddService(typeof(IServiceContainer), serviceContainer);
@ -62,9 +63,7 @@ namespace PythonBinding.Tests.Utils @@ -62,9 +63,7 @@ namespace PythonBinding.Tests.Utils
}
public IContainer Container {
get {
throw new NotImplementedException();
}
get { return container; }
}
public IComponent RootComponent {
@ -104,11 +103,11 @@ namespace PythonBinding.Tests.Utils @@ -104,11 +103,11 @@ namespace PythonBinding.Tests.Utils
public IComponent CreateComponent(Type componentClass, string name)
{
createdComponents.Add(new CreatedComponent(componentClass.FullName, name));
IComponent component = componentClass.Assembly.CreateInstance(componentClass.FullName) as IComponent;
if (rootComponent == null) {
rootComponent = component;
}
createdComponents.Add(new CreatedComponent(componentClass.FullName, name, component));
return component;
}

44
src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/PythonParserHelper.cs

@ -0,0 +1,44 @@ @@ -0,0 +1,44 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
// <version>$Revision$</version>
// </file>
using System;
using ICSharpCode.PythonBinding;
using IronPython.Compiler.Ast;
namespace PythonBinding.Tests.Utils
{
/// <summary>
/// Description of PythonParserHelper.
/// </summary>
public class PythonParserHelper
{
/// <summary>
/// Parses the code and returns the first statement as an assignment statement.
/// </summary>
public static AssignmentStatement GetAssignmentStatement(string code)
{
return GetFirstStatement(code) as AssignmentStatement;
}
/// <summary>
/// Parses the code and returns the first statement's expression as call expression.
/// </summary>
public static CallExpression GetCallExpression(string code)
{
ExpressionStatement expressionStatement = GetFirstStatement(code) as ExpressionStatement;
return expressionStatement.Expression as CallExpression;
}
static Statement GetFirstStatement(string code)
{
PythonParser parser = new PythonParser();
PythonAst ast = parser.CreateAst(@"snippet.py", code);
SuiteStatement suiteStatement = (SuiteStatement)ast.Body;
return suiteStatement.Statements[0];
}
}
}
Loading…
Cancel
Save