Browse Source

Python forms designer now supports loading and generating code for standard control cursors (e.g. AppStarting, Help and WaitCursor).

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3846 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Matt Ward 17 years ago
parent
commit
9adfa8b5b9
  1. 2
      src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj
  2. 51
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonCodeDeserializer.cs
  3. 28
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonControlCursorProperty.cs
  4. 4
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonControlDefaultPropertyValues.cs
  5. 19
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonControlFieldExpression.cs
  6. 2
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonDesignerLoader.cs
  7. 2
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonForm.cs
  8. 14
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonFormWalker.cs
  9. 14
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonPropertyValueAssignment.cs
  10. 66
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/CursorTypeResolutionTestFixture.cs
  11. 53
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GenerateCursorFormTestFixture.cs
  12. 14
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/IsDefaultPropertyValueTests.cs
  13. 2
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadAccessibleRoleTestFixture.cs
  14. 53
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadCursorTestFixture.cs
  15. 2
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadFormWithBooleanPropertiesSetTestFixture.cs
  16. 2
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadSimpleFormTestFixture.cs
  17. 2
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadTextBoxTestFixture.cs
  18. 6
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/MissingInitializeComponentMethodTestFixture.cs
  19. 58
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonCodeDeserializerTests.cs
  20. 4
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonDesignerLoaderTestFixture.cs
  21. 2
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/TextBoxNotAddedToFormTestFixture.cs
  22. 2
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/UnknownTypeTestFixture.cs
  23. 4
      src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj
  24. 11
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/MockDesignerLoaderHost.cs
  25. 19
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/MockTypeResolutionService.cs

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

@ -80,6 +80,7 @@
<Compile Include="Src\NRefactoryToPythonConverterOld.cs" /> <Compile Include="Src\NRefactoryToPythonConverterOld.cs" />
<Compile Include="Src\PythonAstWalker.cs" /> <Compile Include="Src\PythonAstWalker.cs" />
<Compile Include="Src\PythonCodeCompletionBinding.cs" /> <Compile Include="Src\PythonCodeCompletionBinding.cs" />
<Compile Include="Src\PythonCodeDeserializer.cs" />
<Compile Include="Src\PythonCompilerError.cs" /> <Compile Include="Src\PythonCompilerError.cs" />
<Compile Include="Src\PythonCompilerSink.cs" /> <Compile Include="Src\PythonCompilerSink.cs" />
<Compile Include="Src\PythonConsole.cs" /> <Compile Include="Src\PythonConsole.cs" />
@ -89,6 +90,7 @@
<Compile Include="Src\PythonControlAutoScaleModeProperty.cs" /> <Compile Include="Src\PythonControlAutoScaleModeProperty.cs" />
<Compile Include="Src\PythonControlAutoValidateProperty.cs" /> <Compile Include="Src\PythonControlAutoValidateProperty.cs" />
<Compile Include="Src\PythonControlBooleanProperty.cs" /> <Compile Include="Src\PythonControlBooleanProperty.cs" />
<Compile Include="Src\PythonControlCursorProperty.cs" />
<Compile Include="Src\PythonControlDefaultPropertyValues.cs" /> <Compile Include="Src\PythonControlDefaultPropertyValues.cs" />
<Compile Include="Src\PythonControlFieldExpression.cs" /> <Compile Include="Src\PythonControlFieldExpression.cs" />
<Compile Include="Src\PythonControlImeModeProperty.cs" /> <Compile Include="Src\PythonControlImeModeProperty.cs" />

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

@ -0,0 +1,51 @@
// <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.Design;
using System.Reflection;
using IronPython.Compiler.Ast;
namespace ICSharpCode.PythonBinding
{
/// <summary>
/// Creates objects from python code.
/// </summary>
public class PythonCodeDeserializer
{
IDesignerHost designerHost;
const BindingFlags propertyBindingFlags = BindingFlags.Public | BindingFlags.GetField | BindingFlags.Static | BindingFlags.Instance;
public PythonCodeDeserializer(IDesignerHost designerHost)
{
this.designerHost = designerHost;
}
/// <summary>
/// Creates or gets the object specified in the python AST.
/// </summary>
/// <returns>
/// Null if the node cannot be deserialized.
/// </returns>
public object Deserialize(Node node)
{
if (node == null) {
throw new ArgumentNullException("node");
}
PythonControlFieldExpression field = PythonControlFieldExpression.Create(node as MemberExpression);
Type type = designerHost.GetType(PythonControlFieldExpression.GetPrefix(field.FullMemberName));
if (type != null) {
PropertyInfo propertyInfo = type.GetProperty(field.MemberName, propertyBindingFlags);
if (propertyInfo != null) {
return propertyInfo.GetValue(type, null);
}
}
return null;
}
}
}

28
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonControlCursorProperty.cs

@ -0,0 +1,28 @@
// <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;
namespace ICSharpCode.PythonBinding
{
public class PythonControlCursorProperty : PythonControlProperty
{
public PythonControlCursorProperty()
{
}
public override bool IsDefaultValue(object propertyValue)
{
Cursor cursor = propertyValue as Cursor;
if (cursor != null) {
return cursor == Cursors.Default;
}
return false;
}
}
}

4
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonControlDefaultPropertyValues.cs

@ -30,6 +30,7 @@ namespace ICSharpCode.PythonBinding
defaultPropertyValues.Add("DoubleBuffered", new PythonControlBooleanProperty(false)); defaultPropertyValues.Add("DoubleBuffered", new PythonControlBooleanProperty(false));
defaultPropertyValues.Add("ImeMode", new PythonControlImeModeProperty()); defaultPropertyValues.Add("ImeMode", new PythonControlImeModeProperty());
defaultPropertyValues.Add("RightToLeft", new PythonControlRightToLeftProperty()); defaultPropertyValues.Add("RightToLeft", new PythonControlRightToLeftProperty());
defaultPropertyValues.Add("Cursor", new PythonControlCursorProperty());
} }
/// <summary> /// <summary>
@ -115,9 +116,6 @@ namespace ICSharpCode.PythonBinding
return true; return true;
} else if (propertyInfo.Name == "VerticalScroll") { } else if (propertyInfo.Name == "VerticalScroll") {
return true; return true;
} else if (propertyInfo.Name == "Cursor") {
// Cursors.Default
return true;
} else if (propertyInfo.Name == "Font") { } else if (propertyInfo.Name == "Font") {
// Default is Control.DefaultFont // Default is Control.DefaultFont
return true; return true;

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

@ -29,10 +29,16 @@ namespace ICSharpCode.PythonBinding
this.fullMemberName = fullMemberName; this.fullMemberName = fullMemberName;
} }
/// <summary>
/// From a member expression of the form: self._textBox1.Name this property will return "Name".
/// </summary>
public string MemberName { public string MemberName {
get { return memberName; } get { return memberName; }
} }
/// <summary>
/// From a member expression of the form: self._textBox1.Name this property will return "self._textBox1.Name".
/// </summary>
public string FullMemberName { public string FullMemberName {
get { return fullMemberName; } get { return fullMemberName; }
} }
@ -71,6 +77,19 @@ namespace ICSharpCode.PythonBinding
return name; return name;
} }
/// <summary>
/// From a name such as "System.Windows.Forms.Cursors.AppStarting" this method returns:
/// "System.Windows.Forms.Cursors"
/// </summary>
public static string GetPrefix(string name)
{
int index = name.LastIndexOf('.');
if (index > 0) {
return name.Substring(0, index);
}
return name;
}
/// <summary> /// <summary>
/// Gets the variable name of the control being added. /// Gets the variable name of the control being added.
/// </summary> /// </summary>

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

@ -91,7 +91,7 @@ namespace ICSharpCode.PythonBinding
{ {
// Create designer root object. // Create designer root object.
this.serializationManager = serializationManager; this.serializationManager = serializationManager;
PythonFormWalker visitor = new PythonFormWalker(this); PythonFormWalker visitor = new PythonFormWalker(this, base.LoaderHost);
visitor.CreateForm(generator.ViewContent.DesignerCodeFileContent); visitor.CreateForm(generator.ViewContent.DesignerCodeFileContent);
} }
} }

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

@ -143,7 +143,7 @@ namespace ICSharpCode.PythonBinding
/// </summary> /// </summary>
void AppendProperty(object obj, PropertyDescriptor propertyDescriptor) void AppendProperty(object obj, PropertyDescriptor propertyDescriptor)
{ {
if (propertyDescriptor.Name == "RightToLeft") { if (propertyDescriptor.Name == "Cursor") {
Console.WriteLine("ImeMode"); Console.WriteLine("ImeMode");
} }
object propertyValue = propertyDescriptor.GetValue(obj); object propertyValue = propertyDescriptor.GetValue(obj);

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

@ -8,6 +8,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing; using System.Drawing;
using System.Reflection; using System.Reflection;
using System.Text; using System.Text;
@ -28,10 +29,12 @@ namespace ICSharpCode.PythonBinding
bool walkingAssignment; bool walkingAssignment;
Dictionary<string, object> createdObjects = new Dictionary<string, object>(); Dictionary<string, object> createdObjects = new Dictionary<string, object>();
string formName = String.Empty; string formName = String.Empty;
PythonCodeDeserializer deserializer;
public PythonFormWalker(IComponentCreator componentCreator) public PythonFormWalker(IComponentCreator componentCreator, IDesignerHost designerHost)
{ {
this.componentCreator = componentCreator; this.componentCreator = componentCreator;
deserializer = new PythonCodeDeserializer(designerHost);
} }
/// <summary> /// <summary>
@ -78,8 +81,11 @@ namespace ICSharpCode.PythonBinding
MemberExpression rhsMemberExpression = node.Right as MemberExpression; MemberExpression rhsMemberExpression = node.Right as MemberExpression;
if (rhsMemberExpression != null) { if (rhsMemberExpression != null) {
string name = PythonControlFieldExpression.GetMemberName(rhsMemberExpression); object propertyValue = deserializer.Deserialize(rhsMemberExpression);
SetPropertyValue(fieldExpression.MemberName, name); if (propertyValue == null) {
propertyValue = PythonControlFieldExpression.GetMemberName(rhsMemberExpression);
}
SetPropertyValue(fieldExpression.MemberName, propertyValue);
} else { } else {
walkingAssignment = true; walkingAssignment = true;
node.Right.Walk(this); node.Right.Walk(this);
@ -175,7 +181,7 @@ namespace ICSharpCode.PythonBinding
if (propertyDescriptor.PropertyType.IsEnum) { if (propertyDescriptor.PropertyType.IsEnum) {
return Enum.Parse(propertyDescriptor.PropertyType, GetUnqualifiedEnumValue(propertyValue as String)); return Enum.Parse(propertyDescriptor.PropertyType, GetUnqualifiedEnumValue(propertyValue as String));
} }
return Convert.ChangeType(propertyValue, propertyDescriptor.PropertyType); return propertyDescriptor.Converter.ConvertFrom(propertyValue);
} }
return propertyValue; return propertyValue;
} }

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

@ -8,6 +8,7 @@
using System; using System;
using System.Drawing; using System.Drawing;
using System.Windows.Forms; using System.Windows.Forms;
using System.Reflection;
namespace ICSharpCode.PythonBinding namespace ICSharpCode.PythonBinding
{ {
@ -39,8 +40,21 @@ namespace ICSharpCode.PythonBinding
return size.GetType().FullName + "(" + size.Width + ", " + size.Height + ")"; return size.GetType().FullName + "(" + size.Width + ", " + size.Height + ")";
} else if (propertyType.IsEnum) { } else if (propertyType.IsEnum) {
return propertyType.FullName + "." + propertyValue.ToString(); return propertyType.FullName + "." + propertyValue.ToString();
} else if (propertyType == typeof(Cursor)) {
return GetCursorToString(propertyValue as Cursor);
} }
return propertyValue.ToString(); return propertyValue.ToString();
} }
static string GetCursorToString(Cursor cursor)
{
foreach (PropertyInfo propertyInfo in typeof(Cursors).GetProperties(BindingFlags.Public | BindingFlags.Static)) {
Cursor standardCursor = (Cursor)propertyInfo.GetValue(null, null);
if (standardCursor == cursor) {
return typeof(Cursors).FullName + "." + propertyInfo.Name;
}
}
return String.Empty;
}
} }
} }

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

@ -0,0 +1,66 @@
// <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.Windows.Forms.Cursors.AppStarting" can be resolved by the
/// PythonCodeDeserializer.
/// </summary>
[TestFixture]
public class CursorTypeResolutionTestFixture
{
string pythonCode = "self.Cursors = System.Windows.Forms.Cursors.AppStarting";
Node rhsAssignmentNode;
object obj;
MockDesignerLoaderHost mockDesignerLoaderHost;
MockTypeResolutionService typeResolutionService;
[TestFixtureSetUp]
public void SetUpFixture()
{
PythonParser parser = new PythonParser();
PythonAst ast = parser.CreateAst(@"snippet.py", pythonCode);
SuiteStatement suiteStatement = (SuiteStatement)ast.Body;
AssignmentStatement assignment = suiteStatement.Statements[0] as AssignmentStatement;
rhsAssignmentNode = assignment.Right;
mockDesignerLoaderHost = new MockDesignerLoaderHost();
typeResolutionService = mockDesignerLoaderHost.TypeResolutionService;
PythonCodeDeserializer deserializer = new PythonCodeDeserializer(mockDesignerLoaderHost);
obj = deserializer.Deserialize(rhsAssignmentNode);
}
[Test]
public void RhsAssignmentNodeExists()
{
Assert.IsNotNull(rhsAssignmentNode);
}
[Test]
public void DeserializedObjectIsCursorsAppStarting()
{
Assert.AreEqual(Cursors.AppStarting, obj);
}
[Test]
public void CursorsTypeResolved()
{
Assert.AreEqual("System.Windows.Forms.Cursors", typeResolutionService.LastTypeNameResolved);
}
}
}

53
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GenerateCursorFormTestFixture.cs

@ -0,0 +1,53 @@
// <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.Drawing;
using System.Windows.Forms;
using ICSharpCode.PythonBinding;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Designer
{
[TestFixture]
public class GenerateCursorFormTestFixture
{
string generatedPythonCode;
[TestFixtureSetUp]
public void SetUpFixture()
{
using (Form form = new Form()) {
form.Name = "MainForm";
form.ClientSize = new Size(284, 264);
form.Cursor = Cursors.Help;
string indentString = " ";
PythonForm pythonForm = new PythonForm(indentString);
generatedPythonCode = pythonForm.GenerateInitializeComponentMethod(form);
}
}
[Test]
public void GeneratedCode()
{
string expectedCode = "def InitializeComponent(self):\r\n" +
" self.SuspendLayout()\r\n" +
" # \r\n" +
" # MainForm\r\n" +
" # \r\n" +
" self.ClientSize = System.Drawing.Size(284, 264)\r\n" +
" self.Cursor = System.Windows.Forms.Cursors.Help\r\n" +
" self.Name = \"MainForm\"\r\n" +
" self.ResumeLayout(False)\r\n" +
" self.PerformLayout()\r\n";
Assert.AreEqual(expectedCode, generatedPythonCode);
}
}
}

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

@ -110,5 +110,19 @@ namespace PythonBinding.Tests.Designer
Assert.IsTrue(defaultPropertyValues.IsDefaultValue("DoubleBuffered", form)); Assert.IsTrue(defaultPropertyValues.IsDefaultValue("DoubleBuffered", form));
} }
[Test]
public void CursorDefaultIsCursorsDefault()
{
form.Cursor = Cursors.Default;
Assert.IsTrue(defaultPropertyValues.IsDefaultValue("Cursor", form));
}
[Test]
public void HelpCursorIsNotDefaultValue()
{
form.Cursor = Cursors.Help;
Assert.IsFalse(defaultPropertyValues.IsDefaultValue("Cursor", form));
}
} }
} }

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

@ -34,7 +34,7 @@ namespace PythonBinding.Tests.Designer
[TestFixtureSetUp] [TestFixtureSetUp]
public void SetUpFixture() public void SetUpFixture()
{ {
PythonFormWalker walker = new PythonFormWalker(this); PythonFormWalker walker = new PythonFormWalker(this, new MockDesignerLoaderHost());
form = walker.CreateForm(pythonCode); form = walker.CreateForm(pythonCode);
} }

53
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/LoadCursorTestFixture.cs

@ -0,0 +1,53 @@
// <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.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 LoadCursorTestFixture : LoadFormTestFixtureBase
{
string pythonCode = "class TestForm(System.Windows.Forms.Form):\r\n" +
" def InitializeComponent(self):\r\n" +
" self.SuspendLayout()\r\n" +
" # \r\n" +
" # TestForm\r\n" +
" # \r\n" +
" self.Cursor = System.Windows.Forms.Cursors.Hand\r\n" +
" self.Name = \"TestForm\"\r\n" +
" self.ResumeLayout(False)\r\n";
Form form;
[TestFixtureSetUp]
public void SetUpFixture()
{
PythonFormWalker walker = new PythonFormWalker(this, new MockDesignerLoaderHost());
form = walker.CreateForm(pythonCode);
}
[TestFixtureTearDown]
public void TearDownFixture()
{
form.Dispose();
}
[Test]
public void FormCursorIsHand()
{
Assert.AreEqual(Cursors.Hand, form.Cursor);
}
}
}

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

@ -35,7 +35,7 @@ namespace PythonBinding.Tests.Designer
[TestFixtureSetUp] [TestFixtureSetUp]
public void SetUpFixture() public void SetUpFixture()
{ {
PythonFormWalker walker = new PythonFormWalker(this); PythonFormWalker walker = new PythonFormWalker(this, new MockDesignerLoaderHost());
form = walker.CreateForm(pythonCode); form = walker.CreateForm(pythonCode);
} }

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

@ -37,7 +37,7 @@ namespace PythonBinding.Tests.Designer
[TestFixtureSetUp] [TestFixtureSetUp]
public void SetUpFixture() public void SetUpFixture()
{ {
PythonFormWalker walker = new PythonFormWalker(this); PythonFormWalker walker = new PythonFormWalker(this, new MockDesignerLoaderHost());
form = walker.CreateForm(pythonCode); form = walker.CreateForm(pythonCode);
if (CreatedComponents.Count > 0) { if (CreatedComponents.Count > 0) {

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

@ -41,7 +41,7 @@ namespace PythonBinding.Tests.Designer
[TestFixtureSetUp] [TestFixtureSetUp]
public void SetUpFixture() public void SetUpFixture()
{ {
PythonFormWalker walker = new PythonFormWalker(this); PythonFormWalker walker = new PythonFormWalker(this, new MockDesignerLoaderHost());
form = walker.CreateForm(pythonCode); form = walker.CreateForm(pythonCode);
if (form.Controls.Count > 0) { if (form.Controls.Count > 0) {
textBox = form.Controls[0] as TextBox; textBox = form.Controls[0] as TextBox;

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

@ -38,7 +38,7 @@ namespace PythonBinding.Tests.Designer
[ExpectedException(typeof(PythonFormWalkerException))] [ExpectedException(typeof(PythonFormWalkerException))]
public void PythonFormWalkerExceptionThrown() public void PythonFormWalkerExceptionThrown()
{ {
PythonFormWalker walker = new PythonFormWalker(this); PythonFormWalker walker = new PythonFormWalker(this, new MockDesignerLoaderHost());
walker.CreateForm(pythonCode); walker.CreateForm(pythonCode);
Assert.Fail("Exception should have been thrown before this."); Assert.Fail("Exception should have been thrown before this.");
} }
@ -50,7 +50,7 @@ namespace PythonBinding.Tests.Designer
public void ClassWithNoBody() public void ClassWithNoBody()
{ {
ClassDefinition classDef = new ClassDefinition(new SymbolId(10), null, null); ClassDefinition classDef = new ClassDefinition(new SymbolId(10), null, null);
PythonFormWalker walker = new PythonFormWalker(this); PythonFormWalker walker = new PythonFormWalker(this, new MockDesignerLoaderHost());
walker.Walk(classDef); walker.Walk(classDef);
} }
@ -63,7 +63,7 @@ namespace PythonBinding.Tests.Designer
{ {
List<Expression> lhs = new List<Expression>(); List<Expression> lhs = new List<Expression>();
AssignmentStatement assign = new AssignmentStatement(lhs.ToArray(), null); AssignmentStatement assign = new AssignmentStatement(lhs.ToArray(), null);
PythonFormWalker walker = new PythonFormWalker(this); PythonFormWalker walker = new PythonFormWalker(this, new MockDesignerLoaderHost());
walker.Walk(assign); walker.Walk(assign);
} }
} }

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

@ -0,0 +1,58 @@
// <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;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Designer
{
[TestFixture]
public class PythonCodeDeserializerTests
{
PythonCodeDeserializer deserializer;
[TestFixtureSetUp]
public void SetUpFixture()
{
deserializer = new PythonCodeDeserializer(new MockDesignerLoaderHost());
}
[Test]
[ExpectedException(typeof(ArgumentNullException))]
public void NullIronPythonAstNode()
{
deserializer.Deserialize(null);
}
[Test]
public void UnknownTypeName()
{
string pythonCode = "self.Cursors = System.Windows.Forms.UnknownType.AppStarting";
PythonParser parser = new PythonParser();
PythonAst ast = parser.CreateAst(@"snippet.py", pythonCode);
SuiteStatement suiteStatement = (SuiteStatement)ast.Body;
AssignmentStatement assignment = suiteStatement.Statements[0] as AssignmentStatement;
Assert.IsNull(deserializer.Deserialize(assignment.Right));
}
[Test]
public void UnknownPropertyName()
{
string pythonCode = "self.Cursors = System.Windows.Forms.Cursors.UnknownCursorsProperty";
PythonParser parser = new PythonParser();
PythonAst ast = parser.CreateAst(@"snippet.py", pythonCode);
SuiteStatement suiteStatement = (SuiteStatement)ast.Body;
AssignmentStatement assignment = suiteStatement.Statements[0] as AssignmentStatement;
Assert.IsNull(deserializer.Deserialize(assignment.Right));
}
}
}

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

@ -51,10 +51,10 @@ namespace PythonBinding.Tests.Designer
// Begin load. // Begin load.
mockDesignerLoaderHost = new MockDesignerLoaderHost(); mockDesignerLoaderHost = new MockDesignerLoaderHost();
mockTypeResolutionService = mockDesignerLoaderHost.TypeResolutionService;
mockExtenderProviderService = new MockExtenderProviderService(); mockExtenderProviderService = new MockExtenderProviderService();
mockDesignerLoaderHost.AddService(typeof(IExtenderProviderService), mockExtenderProviderService); mockDesignerLoaderHost.AddService(typeof(IExtenderProviderService), mockExtenderProviderService);
mockTypeResolutionService = new MockTypeResolutionService();
mockDesignerLoaderHost.AddService(typeof(ITypeResolutionService), mockTypeResolutionService);
System.Console.WriteLine("Before BeginLoad"); System.Console.WriteLine("Before BeginLoad");
loader.BeginLoad(mockDesignerLoaderHost); loader.BeginLoad(mockDesignerLoaderHost);
System.Console.WriteLine("After BeginLoad"); System.Console.WriteLine("After BeginLoad");

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

@ -45,7 +45,7 @@ namespace PythonBinding.Tests.Designer
[TestFixtureSetUp] [TestFixtureSetUp]
public void SetUpFixture() public void SetUpFixture()
{ {
PythonFormWalker walker = new PythonFormWalker(this); PythonFormWalker walker = new PythonFormWalker(this, new MockDesignerLoaderHost());
form = walker.CreateForm(pythonCode); form = walker.CreateForm(pythonCode);
} }

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

@ -38,7 +38,7 @@ namespace PythonBinding.Tests.Designer
[ExpectedException(typeof(PythonFormWalkerException))] [ExpectedException(typeof(PythonFormWalkerException))]
public void PythonFormWalkerExceptionThrown() public void PythonFormWalkerExceptionThrown()
{ {
PythonFormWalker walker = new PythonFormWalker(this); PythonFormWalker walker = new PythonFormWalker(this, new MockDesignerLoaderHost());
walker.CreateForm(pythonCode); walker.CreateForm(pythonCode);
Assert.Fail("Exception should have been thrown before this."); Assert.Fail("Exception should have been thrown before this.");
} }

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

@ -145,11 +145,13 @@
<Compile Include="Converter\VBClassConversionTestFixture.cs" /> <Compile Include="Converter\VBClassConversionTestFixture.cs" />
<Compile Include="Converter\VBStringConcatTestFixture.cs" /> <Compile Include="Converter\VBStringConcatTestFixture.cs" />
<Compile Include="Converter\WhileLoopConversionTestFixture.cs" /> <Compile Include="Converter\WhileLoopConversionTestFixture.cs" />
<Compile Include="Designer\CursorTypeResolutionTestFixture.cs" />
<Compile Include="Designer\EnabledSetUsingPropertyDescriptorTestFixture.cs" /> <Compile Include="Designer\EnabledSetUsingPropertyDescriptorTestFixture.cs" />
<Compile Include="Designer\FindInitializeComponentMethodTestFixture.cs" /> <Compile Include="Designer\FindInitializeComponentMethodTestFixture.cs" />
<Compile Include="Designer\GenerateAccessibleRoleFormTestFixture.cs" /> <Compile Include="Designer\GenerateAccessibleRoleFormTestFixture.cs" />
<Compile Include="Designer\GenerateAutoScaleModeFormTestFixture.cs" /> <Compile Include="Designer\GenerateAutoScaleModeFormTestFixture.cs" />
<Compile Include="Designer\GenerateAutoScrollFormTestFixture.cs" /> <Compile Include="Designer\GenerateAutoScrollFormTestFixture.cs" />
<Compile Include="Designer\GenerateCursorFormTestFixture.cs" />
<Compile Include="Designer\GenerateDoubleBufferedFormTestFixture.cs" /> <Compile Include="Designer\GenerateDoubleBufferedFormTestFixture.cs" />
<Compile Include="Designer\GenerateImeModeFormTestFixture.cs" /> <Compile Include="Designer\GenerateImeModeFormTestFixture.cs" />
<Compile Include="Designer\GenerateRightToLeftFormTestFixture.cs" /> <Compile Include="Designer\GenerateRightToLeftFormTestFixture.cs" />
@ -160,6 +162,7 @@
<Compile Include="Designer\IsDefaultPropertyValueTests.cs" /> <Compile Include="Designer\IsDefaultPropertyValueTests.cs" />
<Compile Include="Designer\IsFullyQualifiedBaseClassFormDesignableTestFixture.cs" /> <Compile Include="Designer\IsFullyQualifiedBaseClassFormDesignableTestFixture.cs" />
<Compile Include="Designer\LoadAccessibleRoleTestFixture.cs" /> <Compile Include="Designer\LoadAccessibleRoleTestFixture.cs" />
<Compile Include="Designer\LoadCursorTestFixture.cs" />
<Compile Include="Designer\LoadFormTestFixtureBase.cs" /> <Compile Include="Designer\LoadFormTestFixtureBase.cs" />
<Compile Include="Designer\LoadFormWithBooleanPropertiesSetTestFixture.cs" /> <Compile Include="Designer\LoadFormWithBooleanPropertiesSetTestFixture.cs" />
<Compile Include="Designer\LoadSimpleFormTestFixture.cs" /> <Compile Include="Designer\LoadSimpleFormTestFixture.cs" />
@ -168,6 +171,7 @@
<Compile Include="Designer\MissingInitializeComponentMethodTestFixture.cs" /> <Compile Include="Designer\MissingInitializeComponentMethodTestFixture.cs" />
<Compile Include="Designer\NoNewLineAfterInitializeComponentTestFixture.cs" /> <Compile Include="Designer\NoNewLineAfterInitializeComponentTestFixture.cs" />
<Compile Include="Designer\OneCompatibleMethodTestFixture.cs" /> <Compile Include="Designer\OneCompatibleMethodTestFixture.cs" />
<Compile Include="Designer\PythonCodeDeserializerTests.cs" />
<Compile Include="Designer\PythonGeneratorTestFixture.cs" /> <Compile Include="Designer\PythonGeneratorTestFixture.cs" />
<Compile Include="Designer\IsFormDesignableTestFixture.cs" /> <Compile Include="Designer\IsFormDesignableTestFixture.cs" />
<Compile Include="Designer\NullGeneratorPassedToLoader.cs" /> <Compile Include="Designer\NullGeneratorPassedToLoader.cs" />

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

@ -22,10 +22,12 @@ namespace PythonBinding.Tests.Utils
ServiceContainer serviceContainer = new ServiceContainer(); ServiceContainer serviceContainer = new ServiceContainer();
List<CreatedComponent> createdComponents = new List<CreatedComponent>(); List<CreatedComponent> createdComponents = new List<CreatedComponent>();
IComponent rootComponent; IComponent rootComponent;
MockTypeResolutionService typeResolutionService = new MockTypeResolutionService();
public MockDesignerLoaderHost() public MockDesignerLoaderHost()
{ {
AddService(typeof(IServiceContainer), serviceContainer); AddService(typeof(IServiceContainer), serviceContainer);
AddService(typeof(ITypeResolutionService), typeResolutionService);
} }
public event EventHandler Activated; public event EventHandler Activated;
@ -43,6 +45,10 @@ namespace PythonBinding.Tests.Utils
get { return createdComponents; } get { return createdComponents; }
} }
public MockTypeResolutionService TypeResolutionService {
get { return typeResolutionService; }
}
public bool Loading { public bool Loading {
get { get {
throw new NotImplementedException(); throw new NotImplementedException();
@ -128,10 +134,7 @@ namespace PythonBinding.Tests.Utils
public Type GetType(string typeName) public Type GetType(string typeName)
{ {
System.Console.WriteLine("DesignerLoaderHost.GetType: " + typeName); System.Console.WriteLine("DesignerLoaderHost.GetType: " + typeName);
if (typeName == "Form") { return typeResolutionService.GetType(typeName);
return typeof(System.Windows.Forms.Form);
}
return Type.GetType(typeName);
} }
public void AddService(Type serviceType, object serviceInstance) public void AddService(Type serviceType, object serviceInstance)

19
src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/MockTypeResolutionService.cs

@ -8,6 +8,7 @@
using System; using System;
using System.ComponentModel.Design; using System.ComponentModel.Design;
using System.Reflection; using System.Reflection;
using System.Windows.Forms;
namespace PythonBinding.Tests.Utils namespace PythonBinding.Tests.Utils
{ {
@ -16,10 +17,19 @@ namespace PythonBinding.Tests.Utils
/// </summary> /// </summary>
public class MockTypeResolutionService : ITypeResolutionService public class MockTypeResolutionService : ITypeResolutionService
{ {
string lastTypeNameResolved;
public MockTypeResolutionService() public MockTypeResolutionService()
{ {
} }
/// <summary>
/// Returns the last type name passed to the GetType method.
/// </summary>
public string LastTypeNameResolved {
get { return lastTypeNameResolved; }
}
public Assembly GetAssembly(AssemblyName name) public Assembly GetAssembly(AssemblyName name)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
@ -33,9 +43,16 @@ namespace PythonBinding.Tests.Utils
public Type GetType(string name) public Type GetType(string name)
{ {
System.Console.WriteLine("TypeResolutionService.GetType: " + name); System.Console.WriteLine("TypeResolutionService.GetType: " + name);
lastTypeNameResolved = name;
if (name == "Form") { if (name == "Form") {
return typeof(System.Windows.Forms.Form); return typeof(Form);
} }
Type type = typeof(Form).Assembly.GetType(name, false);
if (type != null) {
return type;
}
return Type.GetType(name); return Type.GetType(name);
} }

Loading…
Cancel
Save