Browse Source

Move IronPython and IronRuby designer generator unit tests to common Scripting test project.

pull/1/head
mrward 15 years ago
parent
commit
58a06cd626
  1. 1
      src/AddIns/Analysis/UnitTesting/Test/Utils/MockParameter.cs
  2. 7
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonCodeDomSerializer.cs
  3. 12
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/EventHandlerAlreadyExistsTestFixture.cs
  4. 125
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GeneratorMergeFindsInitializeComponentsTestFixture.cs
  5. 79
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/OneCompatibleMethodTestFixture.cs
  6. 32
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonGeneratorTestFixture.cs
  7. 90
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/TextEditorIndentPassedToGeneratorTestFixture.cs
  8. 3
      src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj
  9. 38
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/DerivedPythonDesignerGenerator.cs
  10. 12
      src/AddIns/BackendBindings/Ruby/RubyBinding/Test/Designer/EventHandlerAlreadyExistsTestFixture.cs
  11. 133
      src/AddIns/BackendBindings/Ruby/RubyBinding/Test/Designer/GeneratorMergeFindsInitializeComponentsTestFixture.cs
  12. 80
      src/AddIns/BackendBindings/Ruby/RubyBinding/Test/Designer/OneCompatibleMethodTestFixture.cs
  13. 38
      src/AddIns/BackendBindings/Ruby/RubyBinding/Test/Designer/RubyDesignerGeneratorTestFixture.cs
  14. 98
      src/AddIns/BackendBindings/Ruby/RubyBinding/Test/Designer/TextEditorIndentPassedToGeneratorTestFixture.cs
  15. 3
      src/AddIns/BackendBindings/Ruby/RubyBinding/Test/RubyBinding.Tests.csproj
  16. 38
      src/AddIns/BackendBindings/Ruby/RubyBinding/Test/Utils/DerivedRubyDesignerGenerator.cs
  17. 138
      src/AddIns/BackendBindings/Scripting/Project/Src/ScriptingDesignerGenerator.cs
  18. 160
      src/AddIns/BackendBindings/Scripting/Test/Designer/ScriptingDesignerGeneratorTests.cs
  19. 2
      src/AddIns/BackendBindings/Scripting/Test/ICSharpCode.Scripting.Tests.csproj
  20. 33
      src/AddIns/BackendBindings/Scripting/Test/Utils/FakeCodeDomSerializer.cs
  21. 57
      src/AddIns/BackendBindings/Scripting/Test/Utils/TestableScriptingDesignerGenerator.cs
  22. 95
      src/AddIns/BackendBindings/Scripting/Test/Utils/Tests/TestableScriptingDesignerGeneratorTests.cs

1
src/AddIns/Analysis/UnitTesting/Test/Utils/MockParameter.cs

@ -89,7 +89,6 @@ namespace UnitTesting.Tests.Utils @@ -89,7 +89,6 @@ namespace UnitTesting.Tests.Utils
public void Freeze()
{
throw new NotImplementedException();
}
}
}

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

@ -33,14 +33,9 @@ namespace ICSharpCode.PythonBinding @@ -33,14 +33,9 @@ namespace ICSharpCode.PythonBinding
public string GenerateInitializeComponentMethodBody(IDesignerHost host, IDesignerSerializationManager serializationManager)
{
return GenerateInitializeComponentMethodBody(host, serializationManager, String.Empty);
return GenerateInitializeComponentMethodBody(host, serializationManager, String.Empty, 0);
}
public string GenerateInitializeComponentMethodBody(IDesignerHost host, IDesignerSerializationManager serializationManager, string rootNamespace)
{
return GenerateInitializeComponentMethodBody(host, serializationManager, rootResourceName, 0);
}
public string GenerateInitializeComponentMethodBody(IDesignerHost host, IDesignerSerializationManager serializationManager, string rootNamespace, int initialIndent)
{
codeBuilder = new PythonCodeBuilder(initialIndent);

12
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/EventHandlerAlreadyExistsTestFixture.cs

@ -49,18 +49,6 @@ namespace PythonBinding.Tests.Designer @@ -49,18 +49,6 @@ namespace PythonBinding.Tests.Designer
{
Assert.AreEqual(12, position);
}
[Test]
public void TextPassedToParseFileMethod()
{
Assert.AreEqual(GetTextEditorCode(), generator.TextContentPassedToParseFileMethod);
}
[Test]
public void FileNamePassedToParseFileMethod()
{
Assert.AreEqual(fileName, generator.FileNamePassedToParseFileMethod);
}
protected override string GetTextEditorCode()
{

125
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/GeneratorMergeFindsInitializeComponentsTestFixture.cs

@ -1,125 +0,0 @@ @@ -1,125 +0,0 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using ICSharpCode.FormsDesigner;
using ICSharpCode.PythonBinding;
using ICSharpCode.Scripting.Tests.Utils;
using ICSharpCode.SharpDevelop.Dom;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
using UnitTesting.Tests.Utils;
namespace PythonBinding.Tests.Designer
{
/// <summary>
/// Tests that the PythonDesignerGenerator's MergeFormChanges
/// finds the InitializeComponents method and the class.
/// </summary>
[TestFixture]
public class GeneratorMergeFindsInitializeComponentsTestFixture
{
DerivedPythonDesignerGenerator generator;
FormsDesignerViewContent viewContent;
FormsDesignerViewContent viewContentAttached;
MockTextEditorViewContent mockViewContent;
[TestFixtureSetUp]
public void SetUpFixture()
{
generator = new DerivedPythonDesignerGenerator();
mockViewContent = new MockTextEditorViewContent();
viewContent = new FormsDesignerViewContent(mockViewContent, new MockOpenedFile("Test.py"));
viewContent.DesignerCodeFileContent = GetTextEditorCode();
generator.Attach(viewContent);
viewContentAttached = generator.GetViewContent();
PythonParser parser = new PythonParser();
ICompilationUnit parserCompilationUnit = parser.Parse(new DefaultProjectContent(), "Test.py", GetTextEditorCode());
ParseInformation parseInfo = new ParseInformation(parserCompilationUnit);
generator.ParseInfoToReturnFromParseFileMethod = parseInfo;
using (DesignSurface designSurface = new DesignSurface(typeof(Form))) {
IDesignerHost host = (IDesignerHost)designSurface.GetService(typeof(IDesignerHost));
Form form = (Form)host.RootComponent;
form.ClientSize = new Size(499, 309);
PropertyDescriptorCollection descriptors = TypeDescriptor.GetProperties(form);
PropertyDescriptor namePropertyDescriptor = descriptors.Find("Name", false);
namePropertyDescriptor.SetValue(form, "MainForm");
DesignerSerializationManager serializationManager = new DesignerSerializationManager(host);
using (serializationManager.CreateSession()) {
generator.MergeRootComponentChanges(host, serializationManager);
generator.Detach();
}
}
}
[Test]
public void GetDomRegion()
{
MockMethod method = new MockMethod(MockClass.CreateMockClassWithoutAnyAttributes());
DomRegion bodyRegion = new DomRegion(0, 4, 1, 4);
method.BodyRegion = bodyRegion;
DomRegion expectedRegion = new DomRegion(bodyRegion.BeginLine + 1, 1, bodyRegion.EndLine + 1, 1);
PythonDesignerGenerator generator = new PythonDesignerGenerator(new MockTextEditorOptions());
Assert.AreEqual(expectedRegion, generator.GetBodyRegionInDocument(method));
}
[Test]
public void ViewContentSetToNullAfterDetach()
{
Assert.IsNull(generator.GetViewContent());
}
[Test]
public void ViewContentAttached()
{
Assert.AreSame(viewContent, viewContentAttached);
}
[Test]
public void DocumentUpdated()
{
string expectedText = "from System.Windows.Forms import Form\r\n" +
"\r\n" +
"class MainForm(Form):\r\n" +
"\tdef __init__(self):\r\n" +
"\t\tself.InitializeComponents()\r\n" +
"\t\r\n" +
"\tdef InitializeComponents(self):\r\n" +
"\t\tself.SuspendLayout()\r\n" +
"\t\t# \r\n" +
"\t\t# MainForm\r\n" +
"\t\t# \r\n" +
"\t\tself.ClientSize = System.Drawing.Size(499, 309)\r\n" +
"\t\tself.Name = \"MainForm\"\r\n" +
"\t\tself.ResumeLayout(False)\r\n";
Assert.AreEqual(expectedText, viewContent.DesignerCodeFileContent);
}
string GetTextEditorCode()
{
return "from System.Windows.Forms import Form\r\n" +
"\r\n" +
"class MainForm(Form):\r\n" +
"\tdef __init__(self):\r\n" +
"\t\tself.InitializeComponents()\r\n" +
"\t\r\n" +
"\tdef InitializeComponents(self):\r\n" +
"\t\tpass\r\n";
}
}
}

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

@ -1,79 +0,0 @@ @@ -1,79 +0,0 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections;
using System.IO;
using ICSharpCode.PythonBinding;
using ICSharpCode.Scripting.Tests.Utils;
using ICSharpCode.SharpDevelop.Dom;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Designer
{
/// <summary>
/// Tests that one method is found to be that could
/// be used as a event handler.
/// </summary>
[TestFixture]
public class OneCompatibleMethodTestFixture
{
ICollection compatibleMethods;
[TestFixtureSetUp]
public void SetUpFixture()
{
DerivedPythonDesignerGenerator generator = new DerivedPythonDesignerGenerator();
MockTextEditorViewContent mockViewContent = new MockTextEditorViewContent();
DerivedFormDesignerViewContent viewContent = new DerivedFormDesignerViewContent(mockViewContent, new MockOpenedFile("Test.py"));
viewContent.DesignerCodeFileContent = GetTextEditorCode();
// Create parse info.
PythonParser parser = new PythonParser();
ICompilationUnit unit = parser.Parse(new MockProjectContent(), @"C:\Projects\MyProject\test.py", GetTextEditorCode());
ParseInformation parseInfo = new ParseInformation(unit);
generator.ParseInfoToReturnFromParseFileMethod = parseInfo;
// Attach view content to generator.
generator.Attach(viewContent);
// Get compatible methods for event.
MockEventDescriptor eventDescriptor = new MockEventDescriptor("Click");
compatibleMethods = generator.GetCompatibleMethods(eventDescriptor);
}
[Test]
public void OneCompatibleMethod()
{
Assert.AreEqual(1, compatibleMethods.Count);
}
[Test]
public void CompatibleMethodName()
{
IEnumerator enumerator = compatibleMethods.GetEnumerator();
enumerator.MoveNext();
Assert.AreEqual("button1_click", (string)enumerator.Current);
}
string GetTextEditorCode()
{
return "from System.Windows.Forms import Form\r\n" +
"\r\n" +
"class MainForm(Form):\r\n" +
"\tdef __init__(self):\r\n" +
"\t\tself.InitializeComponents()\r\n" +
"\t\r\n" +
"\tdef InitializeComponents(self):\r\n" +
"\t\tself._button1 = System.Windows.Forms.Button()\r\n" +
"\t\tself.Controls.Add(self._button1)\r\n" +
"\t\r\n" +
"\tdef button1_click(self, sender, e):\r\n" +
"\t\tpass";
}
}
}

32
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/PythonGeneratorTestFixture.cs

@ -20,7 +20,16 @@ namespace PythonBinding.Tests.Designer @@ -20,7 +20,16 @@ namespace PythonBinding.Tests.Designer
{
[TestFixture]
public class PythonGeneratorTestFixture
{
{
PythonDesignerGenerator generator;
[SetUp]
public void Init()
{
MockTextEditorOptions options = new MockTextEditorOptions();
generator = new PythonDesignerGenerator(options);
}
[Test]
public void GetMethodReplaceRegion()
{
@ -28,30 +37,29 @@ namespace PythonBinding.Tests.Designer @@ -28,30 +37,29 @@ namespace PythonBinding.Tests.Designer
DomRegion bodyRegion = new DomRegion(0, 4, 1, 4);
method.BodyRegion = bodyRegion;
DomRegion expectedRegion = new DomRegion(bodyRegion.BeginLine + 1, 1, bodyRegion.EndLine + 1, 1);
DerivedPythonDesignerGenerator generator = new DerivedPythonDesignerGenerator();
DomRegion region = generator.GetBodyRegionInDocument(method);
Assert.AreEqual(expectedRegion, generator.GetBodyRegionInDocument(method));
Assert.AreEqual(expectedRegion, region);
}
[Test]
public void GenerateEventHandlerWithEmptyMethodBody()
{
DerivedPythonDesignerGenerator generator = new DerivedPythonDesignerGenerator();
string eventHandler = generator.CallCreateEventHandler("button1_click", String.Empty, "\t");
string expectedEventHandler = "\tdef button1_click(self, sender, e):\r\n" +
"\t\tpass";
string eventHandler = generator.CreateEventHandler("button1_click", String.Empty, "\t");
string expectedEventHandler =
"\tdef button1_click(self, sender, e):\r\n" +
"\t\tpass";
Assert.AreEqual(expectedEventHandler, eventHandler);
}
[Test]
public void GenerateEventHandlerWithNullMethodBody()
{
DerivedPythonDesignerGenerator generator = new DerivedPythonDesignerGenerator();
string eventHandler = generator.CallCreateEventHandler("button2_click", null, String.Empty);
string expectedEventHandler = "def button2_click(self, sender, e):\r\n" +
"\tpass";
string eventHandler = generator.CreateEventHandler("button2_click", null, String.Empty);
string expectedEventHandler =
"def button2_click(self, sender, e):\r\n" +
"\tpass";
Assert.AreEqual(expectedEventHandler, eventHandler);
}
}
}

90
src/AddIns/BackendBindings/Python/PythonBinding/Test/Designer/TextEditorIndentPassedToGeneratorTestFixture.cs

@ -1,90 +0,0 @@ @@ -1,90 +0,0 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;
using System.Drawing;
using System.Windows.Forms;
using ICSharpCode.FormsDesigner;
using ICSharpCode.PythonBinding;
using ICSharpCode.Scripting.Tests.Utils;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Editor;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Designer
{
/// <summary>
/// Tests that the indent information in the ITextEditorProperties is passed to the generator.
/// </summary>
[TestFixture]
public class TextEditorIndentPassedToGeneratorTestFixture
{
IDocument document;
[TestFixtureSetUp]
public void SetUpFixture()
{
using (FormsDesignerViewContent viewContent = new FormsDesignerViewContent(new MockViewContent(), new MockOpenedFile("Test.py"))) {
viewContent.DesignerCodeFileContent = "class MainForm(Form):\r\n" +
" def __init__(self):\r\n" +
" self.InitializeComponent()\r\n" +
"\r\n" +
" def InitializeComponent(self):\r\n" +
" pass\r\n";
document = viewContent.DesignerCodeFileDocument;
PythonParser parser = new PythonParser();
ICompilationUnit compilationUnit = parser.Parse(new DefaultProjectContent(), @"test.py", document.Text);
ParseInformation parseInfo = new ParseInformation(compilationUnit);
using (DesignSurface designSurface = new DesignSurface(typeof(Form))) {
IDesignerHost host = (IDesignerHost)designSurface.GetService(typeof(IDesignerHost));
Form form = (Form)host.RootComponent;
form.ClientSize = new Size(284, 264);
PropertyDescriptorCollection descriptors = TypeDescriptor.GetProperties(form);
PropertyDescriptor namePropertyDescriptor = descriptors.Find("Name", false);
namePropertyDescriptor.SetValue(form, "MainForm");
MockTextEditorOptions textEditorOptions = new MockTextEditorOptions();
textEditorOptions.ConvertTabsToSpaces = true;
textEditorOptions.IndentationSize = 1;
DerivedPythonDesignerGenerator generator = new DerivedPythonDesignerGenerator(textEditorOptions);
generator.ParseInfoToReturnFromParseFileMethod = parseInfo;
generator.Attach(viewContent);
DesignerSerializationManager serializationManager = new DesignerSerializationManager(host);
using (serializationManager.CreateSession()) {
generator.MergeRootComponentChanges(host, serializationManager);
}
}
}
}
[Test]
public void GeneratedCode()
{
string expectedCode =
"class MainForm(Form):\r\n" +
" def __init__(self):\r\n" +
" self.InitializeComponent()\r\n" +
"\r\n" +
" 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.Name = \"MainForm\"\r\n" +
" self.ResumeLayout(False)\r\n";
Assert.AreEqual(expectedCode, document.Text);
}
}
}

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

@ -252,7 +252,6 @@ @@ -252,7 +252,6 @@
<Compile Include="Designer\GenerateTimerTestFixture.cs" />
<Compile Include="Designer\GenerateToolTipFormTestFixture.cs" />
<Compile Include="Designer\GenerateTreeViewTestFixture.cs" />
<Compile Include="Designer\GeneratorMergeFindsInitializeComponentsTestFixture.cs" />
<Compile Include="Designer\IgnoreDesignTimePropertiesTestFixture.cs" />
<Compile Include="Designer\InsertEventHandlerTestFixtureBase.cs" />
<Compile Include="Designer\InsertEventHandlerWithSpaceIndentTestFixture.cs" />
@ -294,7 +293,6 @@ @@ -294,7 +293,6 @@
<Compile Include="Designer\MergeFormTestFixture.cs" />
<Compile Include="Designer\MissingInitializeComponentMethodTestFixture.cs" />
<Compile Include="Designer\NoNewLineAfterInitializeComponentTestFixture.cs" />
<Compile Include="Designer\OneCompatibleMethodTestFixture.cs" />
<Compile Include="Designer\ProjectRootNamespacePassedToMergeTestFixture.cs" />
<Compile Include="Designer\PythonBaseClassTests.cs" />
<Compile Include="Designer\PythonCodeDeserializerTests.cs" />
@ -306,7 +304,6 @@ @@ -306,7 +304,6 @@
<Compile Include="Designer\PythonPropertyAssignmentToStringTests.cs" />
<Compile Include="Designer\RemoveMainMenuStripFromFormTestFixture.cs" />
<Compile Include="Designer\TextBoxNotAddedToFormTestFixture.cs" />
<Compile Include="Designer\TextEditorIndentPassedToGeneratorTestFixture.cs" />
<Compile Include="Designer\UnknownTypeTestFixture.cs" />
<Compile Include="Expressions\FindExpressionOnLineWithSingleSpaceTestFixture.cs" />
<Compile Include="Expressions\FindExpressionWithImportOnPreviousLineTestFixture.cs" />

38
src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/DerivedPythonDesignerGenerator.cs

@ -23,8 +23,6 @@ namespace PythonBinding.Tests.Utils @@ -23,8 +23,6 @@ namespace PythonBinding.Tests.Utils
/// </summary>
public class DerivedPythonDesignerGenerator : PythonDesignerGenerator
{
string fileNamePassedToParseFile;
string textContentPassedToParseFile;
ParseInformation parseInfoToReturnFromParseFile;
public DerivedPythonDesignerGenerator() : this(new MockTextEditorOptions())
@ -36,24 +34,6 @@ namespace PythonBinding.Tests.Utils @@ -36,24 +34,6 @@ namespace PythonBinding.Tests.Utils
{
}
/// <summary>
/// Gets the filename passed to the ParseFile method. This is called
/// at the start of the GetInitializeComponents method to get the
/// latest parse information.
/// </summary>
public string FileNamePassedToParseFileMethod {
get { return fileNamePassedToParseFile; }
}
/// <summary>
/// Gets the text content passed to the ParseFile method when
/// the GetInitializeComponents method is called.
/// </summary>
public string TextContentPassedToParseFileMethod {
get { return textContentPassedToParseFile; }
}
/// <summary>
/// Gets or sets the parse information that will be returned from the
/// ParseFile method.
@ -62,27 +42,9 @@ namespace PythonBinding.Tests.Utils @@ -62,27 +42,9 @@ namespace PythonBinding.Tests.Utils
get { return parseInfoToReturnFromParseFile; }
set { parseInfoToReturnFromParseFile = value; }
}
/// <summary>
/// Gets the view content attached to the Python Designer Generator.
/// </summary>
public FormsDesignerViewContent GetViewContent()
{
return base.ViewContent;
}
/// <summary>
/// Calls the PythonDesignerGenerator's CreateEventHandler method.
/// </summary>
public string CallCreateEventHandler(string eventMethodName, string body, string indentation)
{
return base.CreateEventHandler(eventMethodName, body, indentation);
}
protected override ParseInformation ParseFile(string fileName, string textContent)
{
fileNamePassedToParseFile = fileName;
textContentPassedToParseFile = textContent;
return parseInfoToReturnFromParseFile;
}
}

12
src/AddIns/BackendBindings/Ruby/RubyBinding/Test/Designer/EventHandlerAlreadyExistsTestFixture.cs

@ -49,18 +49,6 @@ namespace RubyBinding.Tests.Designer @@ -49,18 +49,6 @@ namespace RubyBinding.Tests.Designer
{
Assert.AreEqual(12, position);
}
[Test]
public void TextPassedToParseFileMethod()
{
Assert.AreEqual(GetTextEditorCode(), generator.TextContentPassedToParseFileMethod);
}
[Test]
public void FileNamePassedToParseFileMethod()
{
Assert.AreEqual(fileName, generator.FileNamePassedToParseFileMethod);
}
protected override string GetTextEditorCode()
{

133
src/AddIns/BackendBindings/Ruby/RubyBinding/Test/Designer/GeneratorMergeFindsInitializeComponentsTestFixture.cs

@ -1,133 +0,0 @@ @@ -1,133 +0,0 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using ICSharpCode.FormsDesigner;
using ICSharpCode.RubyBinding;
using ICSharpCode.Scripting.Tests.Utils;
using ICSharpCode.SharpDevelop.Dom;
using NUnit.Framework;
using RubyBinding.Tests.Utils;
using UnitTesting.Tests.Utils;
namespace RubyBinding.Tests.Designer
{
/// <summary>
/// Tests that the RubyDesignerGenerator's MergeFormChanges
/// finds the InitializeComponents method and the class.
/// </summary>
[TestFixture]
public class GeneratorMergeFindsInitializeComponentsTestFixture
{
DerivedRubyDesignerGenerator generator;
FormsDesignerViewContent viewContent;
FormsDesignerViewContent viewContentAttached;
MockTextEditorViewContent mockViewContent;
[TestFixtureSetUp]
public void SetUpFixture()
{
generator = new DerivedRubyDesignerGenerator();
mockViewContent = new MockTextEditorViewContent();
viewContent = new FormsDesignerViewContent(mockViewContent, new MockOpenedFile("Test.rb"));
viewContent.DesignerCodeFileContent = GetTextEditorCode();
generator.Attach(viewContent);
viewContentAttached = generator.GetViewContent();
RubyParser parser = new RubyParser();
ICompilationUnit parserCompilationUnit = parser.Parse(new DefaultProjectContent(), "Test.rb", GetTextEditorCode());
ParseInformation parseInfo = new ParseInformation(parserCompilationUnit);
generator.ParseInfoToReturnFromParseFileMethod = parseInfo;
using (DesignSurface designSurface = new DesignSurface(typeof(Form))) {
IDesignerHost host = (IDesignerHost)designSurface.GetService(typeof(IDesignerHost));
Form form = (Form)host.RootComponent;
form.ClientSize = new Size(499, 309);
PropertyDescriptorCollection descriptors = TypeDescriptor.GetProperties(form);
PropertyDescriptor namePropertyDescriptor = descriptors.Find("Name", false);
namePropertyDescriptor.SetValue(form, "MainForm");
DesignerSerializationManager serializationManager = new DesignerSerializationManager(host);
using (serializationManager.CreateSession()) {
generator.MergeRootComponentChanges(host, serializationManager);
generator.Detach();
}
}
}
[Test]
public void GetDomRegion()
{
MockMethod method = MockMethod.CreateMockMethodWithoutAnyAttributes();
DomRegion bodyRegion = new DomRegion(0, 4, 1, 4);
method.BodyRegion = bodyRegion;
DomRegion expectedRegion = new DomRegion(bodyRegion.BeginLine + 1, 1, bodyRegion.EndLine, 1);
Assert.AreEqual(expectedRegion, generator.GetBodyRegionInDocument(method));
}
[Test]
public void ViewContentSetToNullAfterDetach()
{
Assert.IsNull(generator.GetViewContent());
}
[Test]
public void ViewContentAttached()
{
Assert.AreSame(viewContent, viewContentAttached);
}
[Test]
public void DocumentUpdated()
{
string expectedText = "require \"mscorlib\"\r\n" +
"require \"System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\"\r\n" +
"require \"System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\"\r\n" +
"\r\n" +
"class MainForm < System::Windows::Forms::Form\r\n" +
"\tdef initialize()\r\n" +
"\t\tself.InitializeComponents()\r\n" +
"\tend\r\n" +
"\t\r\n" +
"\tdef InitializeComponents()\r\n" +
"\t\tself.SuspendLayout()\r\n" +
"\t\t# \r\n" +
"\t\t# MainForm\r\n" +
"\t\t# \r\n" +
"\t\tself.ClientSize = System::Drawing::Size.new(499, 309)\r\n" +
"\t\tself.Name = \"MainForm\"\r\n" +
"\t\tself.ResumeLayout(false)\r\n" +
"\tend\r\n" +
"end";
Assert.AreEqual(expectedText, viewContent.DesignerCodeFileContent);
}
string GetTextEditorCode()
{
return "require \"mscorlib\"\r\n" +
"require \"System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\"\r\n" +
"require \"System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\"\r\n" +
"\r\n" +
"class MainForm < System::Windows::Forms::Form\r\n" +
"\tdef initialize()\r\n" +
"\t\tself.InitializeComponents()\r\n" +
"\tend\r\n" +
"\t\r\n" +
"\tdef InitializeComponents()\r\n" +
"\tend\r\n" +
"end";
}
}
}

80
src/AddIns/BackendBindings/Ruby/RubyBinding/Test/Designer/OneCompatibleMethodTestFixture.cs

@ -1,80 +0,0 @@ @@ -1,80 +0,0 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections;
using System.IO;
using ICSharpCode.RubyBinding;
using ICSharpCode.Scripting.Tests.Utils;
using ICSharpCode.SharpDevelop.Dom;
using NUnit.Framework;
using RubyBinding.Tests.Utils;
namespace RubyBinding.Tests.Designer
{
/// <summary>
/// Tests that one method is found to be that could
/// be used as a event handler.
/// </summary>
[TestFixture]
public class OneCompatibleMethodTestFixture
{
ICollection compatibleMethods;
[TestFixtureSetUp]
public void SetUpFixture()
{
DerivedRubyDesignerGenerator generator = new DerivedRubyDesignerGenerator();
MockTextEditorViewContent mockViewContent = new MockTextEditorViewContent();
DerivedFormDesignerViewContent viewContent = new DerivedFormDesignerViewContent(mockViewContent, new MockOpenedFile("Test.rb"));
viewContent.DesignerCodeFileContent = GetTextEditorCode();
// Create parse info.
RubyParser parser = new RubyParser();
ICompilationUnit unit = parser.Parse(new MockProjectContent(), @"C:\Projects\MyProject\test.rb", GetTextEditorCode());
ParseInformation parseInfo = new ParseInformation(unit);
generator.ParseInfoToReturnFromParseFileMethod = parseInfo;
// Attach view content to generator.
generator.Attach(viewContent);
// Get compatible methods for event.
MockEventDescriptor eventDescriptor = new MockEventDescriptor("Click");
compatibleMethods = generator.GetCompatibleMethods(eventDescriptor);
}
[Test]
public void OneCompatibleMethod()
{
Assert.AreEqual(1, compatibleMethods.Count);
}
[Test]
public void CompatibleMethodName()
{
IEnumerator enumerator = compatibleMethods.GetEnumerator();
enumerator.MoveNext();
Assert.AreEqual("button1_click", (string)enumerator.Current);
}
string GetTextEditorCode()
{
return "class MainForm < System::Windows::Forms::Form\r\n" +
"\tdef initialize()\r\n" +
"\t\tself.InitializeComponents()\r\n" +
"\tend\r\n" +
"\t\r\n" +
"\tdef InitializeComponents()\r\n" +
"\t\t@button1 = System::Windows::Forms::Button.new()\r\n" +
"\t\tself.Controls.Add(@button1)\r\n" +
"\tend\r\n" +
"\t\r\n" +
"\tdef button1_click(sender, e)\r\n" +
"\tend\r\n" +
"end";
}
}
}

38
src/AddIns/BackendBindings/Ruby/RubyBinding/Test/Designer/RubyDesignerGeneratorTestFixture.cs

@ -7,8 +7,9 @@ using System.CodeDom.Compiler; @@ -7,8 +7,9 @@ using System.CodeDom.Compiler;
using System.ComponentModel;
using System.IO;
using ICSharpCode.RubyBinding;
using ICSharpCode.FormsDesigner;
using ICSharpCode.RubyBinding;
using ICSharpCode.Scripting.Tests.Utils;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom;
using NUnit.Framework;
@ -19,7 +20,16 @@ namespace RubyBinding.Tests.Designer @@ -19,7 +20,16 @@ namespace RubyBinding.Tests.Designer
{
[TestFixture]
public class RubyDesignerGeneratorTestFixture
{
{
RubyDesignerGenerator generator;
[SetUp]
public void Init()
{
MockTextEditorOptions options = new MockTextEditorOptions();
generator = new RubyDesignerGenerator(options);
}
[Test]
public void GetMethodReplaceRegion()
{
@ -27,30 +37,30 @@ namespace RubyBinding.Tests.Designer @@ -27,30 +37,30 @@ namespace RubyBinding.Tests.Designer
DomRegion bodyRegion = new DomRegion(0, 4, 1, 4);
method.BodyRegion = bodyRegion;
DomRegion expectedRegion = new DomRegion(bodyRegion.BeginLine + 1, 1, bodyRegion.EndLine, 1);
DerivedRubyDesignerGenerator generator = new DerivedRubyDesignerGenerator();
DomRegion region = generator.GetBodyRegionInDocument(method);
Assert.AreEqual(expectedRegion, generator.GetBodyRegionInDocument(method));
Assert.AreEqual(expectedRegion, region);
}
[Test]
public void GenerateEventHandlerWithEmptyMethodBody()
{
DerivedRubyDesignerGenerator generator = new DerivedRubyDesignerGenerator();
string eventHandler = generator.CallCreateEventHandler("button1_click", String.Empty, "\t");
string expectedEventHandler = "\tdef button1_click(sender, e)\r\n" +
"\t\t\r\n" +
"\tend";
string eventHandler = generator.CreateEventHandler("button1_click", String.Empty, "\t");
string expectedEventHandler =
"\tdef button1_click(sender, e)\r\n" +
"\t\t\r\n" +
"\tend";
Assert.AreEqual(expectedEventHandler, eventHandler);
}
[Test]
public void GenerateEventHandlerWithNullMethodBody()
{
DerivedRubyDesignerGenerator generator = new DerivedRubyDesignerGenerator();
string eventHandler = generator.CallCreateEventHandler("button2_click", null, String.Empty);
string expectedEventHandler = "def button2_click(sender, e)\r\n" +
"\t\r\n" +
"end";
string eventHandler = generator.CreateEventHandler("button2_click", null, String.Empty);
string expectedEventHandler =
"def button2_click(sender, e)\r\n" +
"\t\r\n" +
"end";
Assert.AreEqual(expectedEventHandler, eventHandler);
}
}

98
src/AddIns/BackendBindings/Ruby/RubyBinding/Test/Designer/TextEditorIndentPassedToGeneratorTestFixture.cs

@ -1,98 +0,0 @@ @@ -1,98 +0,0 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.CodeDom;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using ICSharpCode.FormsDesigner;
using ICSharpCode.RubyBinding;
using ICSharpCode.Scripting.Tests.Utils;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Editor;
using NUnit.Framework;
using RubyBinding.Tests.Utils;
namespace RubyBinding.Tests.Designer
{
/// <summary>
/// Tests that the indent information in the ITextEditorProperties is passed to the generator.
/// </summary>
[TestFixture]
public class TextEditorIndentPassedToGeneratorTestFixture
{
IDocument document;
[TestFixtureSetUp]
public void SetUpFixture()
{
using (FormsDesignerViewContent viewContent = new FormsDesignerViewContent(new MockViewContent(), new MockOpenedFile("Test.rb"))) {
viewContent.DesignerCodeFileContent =
"class MainForm < Form\r\n" +
" def initialize()\r\n" +
" self.InitializeComponent()\r\n" +
" end\r\n" +
"\r\n" +
" def InitializeComponent()\r\n" +
" end\r\n" +
"end";
document = viewContent.DesignerCodeFileDocument;
RubyParser parser = new RubyParser();
ICompilationUnit compilationUnit = parser.Parse(new DefaultProjectContent(), @"test.rb", document.Text);
ParseInformation parseInfo = new ParseInformation(compilationUnit);
using (DesignSurface designSurface = new DesignSurface(typeof(Form))) {
IDesignerHost host = (IDesignerHost)designSurface.GetService(typeof(IDesignerHost));
Form form = (Form)host.RootComponent;
form.ClientSize = new Size(284, 264);
PropertyDescriptorCollection descriptors = TypeDescriptor.GetProperties(form);
PropertyDescriptor namePropertyDescriptor = descriptors.Find("Name", false);
namePropertyDescriptor.SetValue(form, "MainForm");
MockTextEditorOptions textEditorOptions = new MockTextEditorOptions();
textEditorOptions.ConvertTabsToSpaces = true;
textEditorOptions.IndentationSize = 1;
DerivedRubyDesignerGenerator generator = new DerivedRubyDesignerGenerator(textEditorOptions);
generator.ParseInfoToReturnFromParseFileMethod = parseInfo;
generator.Attach(viewContent);
DesignerSerializationManager serializationManager = new DesignerSerializationManager(host);
using (serializationManager.CreateSession()) {
generator.MergeRootComponentChanges(host, serializationManager);
}
}
}
}
[Test]
public void GeneratedCode()
{
string expectedCode =
"class MainForm < Form\r\n" +
" def initialize()\r\n" +
" self.InitializeComponent()\r\n" +
" end\r\n" +
"\r\n" +
" def InitializeComponent()\r\n" +
" self.SuspendLayout()\r\n" +
" # \r\n" +
" # MainForm\r\n" +
" # \r\n" +
" self.ClientSize = System::Drawing::Size.new(284, 264)\r\n" +
" self.Name = \"MainForm\"\r\n" +
" self.ResumeLayout(false)\r\n" +
" end\r\n" +
"end";
Assert.AreEqual(expectedCode, document.Text);
}
}
}

3
src/AddIns/BackendBindings/Ruby/RubyBinding/Test/RubyBinding.Tests.csproj

@ -227,7 +227,6 @@ @@ -227,7 +227,6 @@
<Compile Include="Designer\GenerateTimerTestFixture.cs" />
<Compile Include="Designer\GenerateToolTipFormTestFixture.cs" />
<Compile Include="Designer\GenerateTreeViewTestFixture.cs" />
<Compile Include="Designer\GeneratorMergeFindsInitializeComponentsTestFixture.cs" />
<Compile Include="Designer\IgnoreDesignTimePropertiesTestFixture.cs" />
<Compile Include="Designer\InsertEventHandlerTestFixtureBase.cs" />
<Compile Include="Designer\InsertEventHandlerWithSpaceIndentTestFixture.cs" />
@ -270,7 +269,6 @@ @@ -270,7 +269,6 @@
<Compile Include="Designer\MergeFormTestFixture.cs" />
<Compile Include="Designer\MissingInitializeComponentMethodTestFixture.cs" />
<Compile Include="Designer\NoNewLineAfterInitializeComponentMethodTestFixture.cs" />
<Compile Include="Designer\OneCompatibleMethodTestFixture.cs" />
<Compile Include="Designer\ProjectRootNamespacePassedToMergeTestFixture.cs" />
<Compile Include="Designer\RemoveMainMenuStripFromFormTestFixture.cs" />
<Compile Include="Designer\RubyBaseClassTests.cs" />
@ -281,7 +279,6 @@ @@ -281,7 +279,6 @@
<Compile Include="Designer\RubyDesignerGeneratorTestFixture.cs" />
<Compile Include="Designer\RubyPropertyAssignmentToStringTests.cs" />
<Compile Include="Designer\TextBoxNotAddedToFormTestFixture.cs" />
<Compile Include="Designer\TextEditorIndentPassedToGeneratorTestFixture.cs" />
<Compile Include="Designer\UnknownTypeTestFixture.cs" />
<Compile Include="Gui\DebugRunRubyCommandTestFixture.cs" />
<Compile Include="Gui\RubyIndentationTests.cs" />

38
src/AddIns/BackendBindings/Ruby/RubyBinding/Test/Utils/DerivedRubyDesignerGenerator.cs

@ -23,8 +23,6 @@ namespace RubyBinding.Tests.Utils @@ -23,8 +23,6 @@ namespace RubyBinding.Tests.Utils
/// </summary>
public class DerivedRubyDesignerGenerator : RubyDesignerGenerator
{
string fileNamePassedToParseFile;
string textContentPassedToParseFile;
ParseInformation parseInfoToReturnFromParseFile;
public DerivedRubyDesignerGenerator() : this(new MockTextEditorOptions())
@ -35,24 +33,6 @@ namespace RubyBinding.Tests.Utils @@ -35,24 +33,6 @@ namespace RubyBinding.Tests.Utils
: base(textEditorOptions)
{
}
/// <summary>
/// Gets the filename passed to the ParseFile method. This is called
/// at the start of the GetInitializeComponents method to get the
/// latest parse information.
/// </summary>
public string FileNamePassedToParseFileMethod {
get { return fileNamePassedToParseFile; }
}
/// <summary>
/// Gets the text content passed to the ParseFile method when
/// the GetInitializeComponents method is called.
/// </summary>
public string TextContentPassedToParseFileMethod {
get { return textContentPassedToParseFile; }
}
/// <summary>
/// Gets or sets the parse information that will be returned from the
@ -62,27 +42,9 @@ namespace RubyBinding.Tests.Utils @@ -62,27 +42,9 @@ namespace RubyBinding.Tests.Utils
get { return parseInfoToReturnFromParseFile; }
set { parseInfoToReturnFromParseFile = value; }
}
/// <summary>
/// Gets the view content attached to the Ruby Designer Generator.
/// </summary>
public FormsDesignerViewContent GetViewContent()
{
return base.ViewContent;
}
/// <summary>
/// Calls the RubyDesignerGenerator's CreateEventHandler method.
/// </summary>
public string CallCreateEventHandler(string eventMethodName, string body, string indentation)
{
return base.CreateEventHandler(eventMethodName, body, indentation);
}
protected override ParseInformation ParseFile(string fileName, string textContent)
{
fileNamePassedToParseFile = fileName;
textContentPassedToParseFile = textContent;
return parseInfoToReturnFromParseFile;
}
}

138
src/AddIns/BackendBindings/Scripting/Project/Src/ScriptingDesignerGenerator.cs

@ -70,21 +70,60 @@ namespace ICSharpCode.Scripting @@ -70,21 +70,60 @@ namespace ICSharpCode.Scripting
/// </summary>
public ICollection GetCompatibleMethods(EventDescriptor edesc)
{
// Get the form or user control class.
ParseInformation parseInfo = ParseFile();
// Look at the form's methods and see which are compatible.
ArrayList methods = new ArrayList();
return GetCompatibleMethods(parseInfo);
}
/// <summary>
/// Parses the form or user control being designed.
/// </summary>
ParseInformation ParseFile()
{
string fileName = viewContent.DesignerCodeFile.FileName;
string textContent = viewContent.DesignerCodeFileContent;
return ParseFile(fileName, textContent);
}
/// <summary>
/// The default implementation calls the ParserService.ParseFile. This
/// method is overridable so the class can be easily tested without
/// the ParserService being required.
/// </summary>
protected virtual ParseInformation ParseFile(string fileName, string textContent)
{
return ParserService.ParseFile(fileName, new StringTextBuffer(textContent));
}
ICollection GetCompatibleMethods(ParseInformation parseInfo)
{
IClass c = GetClass(parseInfo.CompilationUnit);
return GetCompatibleMethods(c);
}
/// <summary>
/// Gets the form or user control class from the compilation unit.
/// </summary>
IClass GetClass(ICompilationUnit unit)
{
return unit.Classes[0];
}
ICollection GetCompatibleMethods(IClass c)
{
ArrayList methods = new ArrayList();
foreach (IMethod method in c.Methods) {
if (method.Parameters.Count == 2) {
if (IsCompatibleMethod(method)) {
methods.Add(method.Name);
}
}
return methods;
}
bool IsCompatibleMethod(IMethod method)
{
return method.Parameters.Count == 2;
}
public void NotifyFormRenamed(string newName)
{
}
@ -98,16 +137,6 @@ namespace ICSharpCode.Scripting @@ -98,16 +137,6 @@ namespace ICSharpCode.Scripting
Merge(host, ViewContent.DesignerCodeFileDocument, parseInfo.CompilationUnit, serializationManager);
}
/// <summary>
/// The default implementation calls the ParserService.ParseFile. This
/// method is overridable so the class can be easily tested without
/// the ParserService being required.
/// </summary>
protected virtual ParseInformation ParseFile(string fileName, string textContent)
{
return ParserService.ParseFile(fileName, new StringTextBuffer(textContent));
}
/// <summary>
/// Merges the generated code into the specified document.
/// </summary>
@ -116,25 +145,17 @@ namespace ICSharpCode.Scripting @@ -116,25 +145,17 @@ namespace ICSharpCode.Scripting
/// <param name="parseInfo">The current compilation unit for the <paramref name="document"/>.</param>
public void Merge(IDesignerHost host, IDocument document, ICompilationUnit compilationUnit, IDesignerSerializationManager serializationManager)
{
IMethod method = GetInitializeComponents(compilationUnit);
// Generate the python source code.
IScriptingCodeDomSerializer serializer = CreateCodeDomSerializer(TextEditorOptions);
int indent = GetIndent(method);
string rootNamespace = GetProjectRootNamespace(compilationUnit);
string methodBody = serializer.GenerateInitializeComponentMethodBody(host, serializationManager, rootNamespace, indent);
// Merge the code.
DomRegion methodRegion = GetBodyRegionInDocument(method);
int startOffset = GetStartOffset(document, methodRegion);
int endOffset = GetEndOffset(document, methodRegion);
document.Replace(startOffset, endOffset - startOffset, methodBody);
IMethod method = GetInitializeComponents(compilationUnit);
string methodBody = GenerateMethodBody(method, host, serializationManager);
UpdateMethodBody(document, method, methodBody);
}
public virtual IScriptingCodeDomSerializer CreateCodeDomSerializer(ITextEditorOptions options)
public string GenerateMethodBody(IMethod method, IDesignerHost host, IDesignerSerializationManager serializationManager)
{
return null;
int indent = GetIndent(method);
string rootNamespace = GetProjectRootNamespace(method.CompilationUnit);
IScriptingCodeDomSerializer serializer = CreateCodeDomSerializer(textEditorOptions);
return serializer.GenerateInitializeComponentMethodBody(host, serializationManager, rootNamespace, indent);
}
public int GetIndent(IMethod method)
@ -149,6 +170,29 @@ namespace ICSharpCode.Scripting @@ -149,6 +170,29 @@ namespace ICSharpCode.Scripting
return indent;
}
public string GetProjectRootNamespace(ICompilationUnit compilationUnit)
{
IProject project = compilationUnit.ProjectContent.Project as IProject;
if (project != null) {
return project.RootNamespace;
}
return String.Empty;
}
public virtual IScriptingCodeDomSerializer CreateCodeDomSerializer(ITextEditorOptions options)
{
return null;
}
public void UpdateMethodBody(IDocument document, IMethod method, string methodBody)
{
DomRegion methodRegion = GetBodyRegionInDocument(method);
int startOffset = GetStartOffset(document, methodRegion);
int endOffset = GetEndOffset(document, methodRegion);
document.Replace(startOffset, endOffset - startOffset, methodBody);
}
public virtual DomRegion GetBodyRegionInDocument(IMethod method)
{
return DomRegion.Empty;
@ -177,14 +221,6 @@ namespace ICSharpCode.Scripting @@ -177,14 +221,6 @@ namespace ICSharpCode.Scripting
}
return null;
}
/// <summary>
/// Gets the form or user control class from the compilation unit.
/// </summary>
IClass GetClass(ICompilationUnit unit)
{
return unit.Classes[0];
}
/// <summary>
/// Gets the start offset of the region.
@ -217,8 +253,7 @@ namespace ICSharpCode.Scripting @@ -217,8 +253,7 @@ namespace ICSharpCode.Scripting
// of the source code before we insert any new code.
viewContent.MergeFormChanges();
// Insert the event handler at the end of the class with an extra
// new line before it.
// Insert the event handler at the end of the class.
IDocument doc = ViewContent.DesignerCodeFileDocument;
string eventHandler = CreateEventHandler(eventMethodName, body, TextEditorOptions.IndentationString);
position = InsertEventHandler(doc, eventHandler);
@ -254,23 +289,6 @@ namespace ICSharpCode.Scripting @@ -254,23 +289,6 @@ namespace ICSharpCode.Scripting
public virtual int InsertEventHandler(IDocument document, string eventHandler)
{
return 0;
}
/// <summary>
/// Parses the form or user control being designed.
/// </summary>
ParseInformation ParseFile()
{
return ParseFile(this.ViewContent.DesignerCodeFile.FileName, this.ViewContent.DesignerCodeFileContent);
}
string GetProjectRootNamespace(ICompilationUnit compilationUnit)
{
IProject project = compilationUnit.ProjectContent.Project as IProject;
if (project != null) {
return project.RootNamespace;
}
return String.Empty;
}
}
}
}

160
src/AddIns/BackendBindings/Scripting/Test/Designer/ScriptingDesignerGeneratorTests.cs

@ -6,12 +6,15 @@ @@ -6,12 +6,15 @@
// </file>
using System;
using System.Collections;
using System.Collections.Generic;
using ICSharpCode.FormsDesigner;
using ICSharpCode.Scripting;
using ICSharpCode.Scripting.Tests.Utils;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom;
using NUnit.Framework;
using UnitTesting.Tests.Utils;
namespace ICSharpCode.Scripting.Tests.Designer
{
@ -24,6 +27,10 @@ namespace ICSharpCode.Scripting.Tests.Designer @@ -24,6 +27,10 @@ namespace ICSharpCode.Scripting.Tests.Designer
FormsDesignerViewContent formsDesignerView;
MockTextEditorViewContent textEditorViewContent;
MockOpenedFile formsDesignerOpenedFile;
MockDesignerLoaderHost host;
FakeDesignerSerializationManager serializationManager;
FakeCodeDomSerializer serializer;
MockMethod method;
[Test]
public void GetSourceFiles_FormDesignerViewHasOpenFile_ReturnsOneFile()
@ -45,6 +52,7 @@ namespace ICSharpCode.Scripting.Tests.Designer @@ -45,6 +52,7 @@ namespace ICSharpCode.Scripting.Tests.Designer
textEditorOptions = new MockTextEditorOptions();
generator = new TestableScriptingDesignerGenerator(textEditorOptions);
generator.Attach(formsDesignerView);
generator.ParseInfoToReturnFromParseFile = generator.CreateParseInfoWithOneClass();
}
int HowManyInCollection(IEnumerable<OpenedFile> files)
@ -86,5 +94,157 @@ namespace ICSharpCode.Scripting.Tests.Designer @@ -86,5 +94,157 @@ namespace ICSharpCode.Scripting.Tests.Designer
AssertAreEqual(formsDesignerOpenedFile, file);
}
[Test]
public void GetCompatibleMethods_OneClassMethod_CallsParseFile()
{
CreateDesignerGenerator();
CallGetCompatibleMethods();
Assert.IsTrue(generator.IsParseFileCalled);
}
ICollection CallGetCompatibleMethods()
{
MockEventDescriptor descriptor = new MockEventDescriptor("Click");
return generator.GetCompatibleMethods(descriptor);
}
[Test]
public void GetCompatibleMethods_OneClassMethod_ParseFilePassedFileNameOpenInTextEditor()
{
CreateDesignerGenerator();
CallGetCompatibleMethods();
string fileName = generator.FileNamePassedToParseFile;
string expectedFileName = "test.py";
Assert.AreEqual(expectedFileName, fileName);
}
[Test]
public void GetCompatibleMethods_OneClassMethod_ParseFilePassedTextContentInTextEditor()
{
CreateDesignerGenerator();
formsDesignerView.DesignerCodeFileContent = "code";
CallGetCompatibleMethods();
string textContent = generator.TextContentPassedToParseFile;
string expectedTextContent = "code";
Assert.AreEqual(expectedTextContent, textContent);
}
[Test]
public void GetCompatibleMethods_OneMethodWithTwoParameters_MethodNameReturnedInCompatibleMethods()
{
CreateDesignerGenerator();
ParseInformation parseInfo = generator.CreateParseInfoWithOneMethodWithTwoParameters("button1_click");
generator.ParseInfoToReturnFromParseFile = parseInfo;
ICollection methods = CallGetCompatibleMethods();
string[] expectedMethods = new string[] { "button1_click" };
Assert.AreEqual(expectedMethods, methods);
}
[Test]
public void GetCompatibleMethods_OneMethodWithNoParameters_NoMethodsReturnedInCompatibleMethods()
{
CreateDesignerGenerator();
ParseInformation parseInfo = generator.CreateParseInfoWithOneMethod("button1_click");
generator.ParseInfoToReturnFromParseFile = parseInfo;
ICollection methods = CallGetCompatibleMethods();
Assert.AreEqual(0, methods.Count);
}
[Test]
public void Detach_FormsDesignerViewAlreadyAttached_SetsViewContentToNull()
{
CreateDesignerGenerator();
generator.Detach();
Assert.IsNull(generator.ViewContent);
}
[Test]
public void GenerateMethodBody_PassedDesignerHost_DesignerHostPassedToCodeDomSerializer()
{
CreateDesignerGenerator();
CreateParametersForGenerateMethodBodyCall();
CallGenerateMethodBody();
Assert.AreEqual(host, serializer.HostPassedToGenerateInitializeComponentMethodBody);
}
void CreateParametersForGenerateMethodBodyCall()
{
serializer = new FakeCodeDomSerializer();
generator.SerializerToReturnFromCreateCodeDomSerializer = serializer;
method = MockMethod.CreateMockMethodWithoutAnyAttributes();
host = new MockDesignerLoaderHost();
serializationManager = new FakeDesignerSerializationManager();
}
string CallGenerateMethodBody()
{
return generator.GenerateMethodBody(method, host, serializationManager);
}
[Test]
public void GenerateMethodBody_MethodBodyCreated_ReturnsMethodBodyFromCodeDomSerializer()
{
CreateDesignerGenerator();
CreateParametersForGenerateMethodBodyCall();
serializer.MethodBodyToReturnFromGenerateMethodBodyCall = "test";
string methodBody = CallGenerateMethodBody();
string expectedMethodBody = "test";
Assert.AreEqual(expectedMethodBody, methodBody);
}
[Test]
public void GenerateMethodBody_PassedDesignerSerializationManager_DesignerSerializationManagerPassedToCodeDomSerializer()
{
CreateDesignerGenerator();
CreateParametersForGenerateMethodBodyCall();
CallGenerateMethodBody();
Assert.AreEqual(serializationManager, serializer.SerializationManagerGenerateInitializeComponentMethodBody);
}
[Test]
public void GenerateMethodBody_TextEditorOptionsConvertTabsToSpacesIsFalse_MethodBeginColumnIsIndentPassedToGenerateMethodBody()
{
CreateDesignerGenerator();
CreateParametersForGenerateMethodBodyCall();
int beginLine = 1;
int beginColumn = 3;
int endLine = 2;
int endColumn = 1;
method.Region = new DomRegion(beginLine, beginColumn, endLine, endColumn);
textEditorOptions.ConvertTabsToSpaces = false;
CallGenerateMethodBody();
int expectedIndent = 3;
Assert.AreEqual(expectedIndent, serializer.InitialIndentPassedToGenerateInitializeComponentMethodBody);
}
[Test]
public void GenerateMethodBody_ProjectHasRootNamespace_RootNamespacePassedToCodeDomSerializer()
{
CreateDesignerGenerator();
CreateParametersForGenerateMethodBodyCall();
method.MockDeclaringType.MockProjectContent.ProjectAsIProject.RootNamespace = "Test";
CallGenerateMethodBody();
string expectedRootNamespace = "Test";
Assert.AreEqual(expectedRootNamespace, serializer.RootNamespacePassedToGenerateInitializeComponentMethodBody);
}
}
}

2
src/AddIns/BackendBindings/Scripting/Test/ICSharpCode.Scripting.Tests.csproj

@ -95,6 +95,7 @@ @@ -95,6 +95,7 @@
<Compile Include="Utils\DerivedToolStripMenuItem.cs" />
<Compile Include="Utils\DoublePropertyUserControl.cs" />
<Compile Include="Utils\FakeCaret.cs" />
<Compile Include="Utils\FakeCodeDomSerializer.cs" />
<Compile Include="Utils\FakeComponentWalker.cs" />
<Compile Include="Utils\FakeDesignerSerializationManager.cs" />
<Compile Include="Utils\FakeDocument.cs" />
@ -142,6 +143,7 @@ @@ -142,6 +143,7 @@
<Compile Include="Utils\Tests\MockEditableViewContentTestFixture.cs" />
<Compile Include="Utils\Tests\MockProjectContentTests.cs" />
<Compile Include="Utils\Tests\MockScriptingFileServiceTests.cs" />
<Compile Include="Utils\Tests\TestableScriptingDesignerGeneratorTests.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj">

33
src/AddIns/BackendBindings/Scripting/Test/Utils/FakeCodeDomSerializer.cs

@ -0,0 +1,33 @@ @@ -0,0 +1,33 @@
// <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.ComponentModel.Design.Serialization;
namespace ICSharpCode.Scripting.Tests.Utils
{
public class FakeCodeDomSerializer : IScriptingCodeDomSerializer
{
public string MethodBodyToReturnFromGenerateMethodBodyCall = String.Empty;
public IDesignerHost HostPassedToGenerateInitializeComponentMethodBody;
public IDesignerSerializationManager SerializationManagerGenerateInitializeComponentMethodBody;
public string RootNamespacePassedToGenerateInitializeComponentMethodBody;
public int InitialIndentPassedToGenerateInitializeComponentMethodBody;
public string GenerateInitializeComponentMethodBody(IDesignerHost host, IDesignerSerializationManager serializationManager, string rootNamespace, int initialIndent)
{
HostPassedToGenerateInitializeComponentMethodBody = host;
SerializationManagerGenerateInitializeComponentMethodBody = serializationManager;
RootNamespacePassedToGenerateInitializeComponentMethodBody = rootNamespace;
InitialIndentPassedToGenerateInitializeComponentMethodBody = initialIndent;
return MethodBodyToReturnFromGenerateMethodBodyCall;
}
}
}

57
src/AddIns/BackendBindings/Scripting/Test/Utils/TestableScriptingDesignerGenerator.cs

@ -6,15 +6,72 @@ @@ -6,15 +6,72 @@
// </file>
using System;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Editor;
using UnitTesting.Tests.Utils;
namespace ICSharpCode.Scripting.Tests.Utils
{
public class TestableScriptingDesignerGenerator : ScriptingDesignerGenerator
{
public bool IsParseFileCalled;
public ParseInformation ParseInfoToReturnFromParseFile;
public string FileNamePassedToParseFile;
public string TextContentPassedToParseFile;
public FakeCodeDomSerializer SerializerToReturnFromCreateCodeDomSerializer;
public TestableScriptingDesignerGenerator(ITextEditorOptions textEditorOptions)
: base(textEditorOptions)
{
}
public ParseInformation CreateParseInfoWithOneClass()
{
MockClass c = CreateClass();
return new ParseInformation(c.CompilationUnit);
}
MockClass CreateClass()
{
MockClass c = MockClass.CreateMockClassWithoutAnyAttributes();
c.CompilationUnit.Classes.Add(c);
return c;
}
protected override ParseInformation ParseFile(string fileName, string textContent)
{
IsParseFileCalled = true;
FileNamePassedToParseFile = fileName;
TextContentPassedToParseFile = textContent;
return ParseInfoToReturnFromParseFile;
}
public ParseInformation CreateParseInfoWithOneMethod(string name)
{
MockMethod method = CreateMethod(name);
return new ParseInformation(method.CompilationUnit);
}
MockMethod CreateMethod(string name)
{
MockClass c = CreateClass();
MockMethod method = new MockMethod(c, name);
c.Methods.Add(method);
return method;
}
public ParseInformation CreateParseInfoWithOneMethodWithTwoParameters(string name)
{
MockMethod method = CreateMethod(name);
method.Parameters.Add(new MockParameter());
method.Parameters.Add(new MockParameter());
return new ParseInformation(method.CompilationUnit);
}
public override IScriptingCodeDomSerializer CreateCodeDomSerializer(ITextEditorOptions options)
{
return SerializerToReturnFromCreateCodeDomSerializer;
}
}
}

95
src/AddIns/BackendBindings/Scripting/Test/Utils/Tests/TestableScriptingDesignerGeneratorTests.cs

@ -0,0 +1,95 @@ @@ -0,0 +1,95 @@
// <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.SharpDevelop.Dom;
using NUnit.Framework;
namespace ICSharpCode.Scripting.Tests.Utils.Tests
{
[TestFixture]
public class TestableScriptingDesignerGeneratorTests
{
ParseInformation parseInfo;
TestableScriptingDesignerGenerator generator;
[Test]
public void CreateParseInfoWithOneMethod_MethodNamePassed_ReturnsParseInfoWithOneClass()
{
CreateTestableScriptingDesignerGenerator();
CreateParseInfoWithOneMethod("MyMethod");
int classCount = parseInfo.CompilationUnit.Classes.Count;
Assert.AreEqual(1, classCount);
}
void CreateTestableScriptingDesignerGenerator()
{
MockTextEditorOptions options = new MockTextEditorOptions();
generator = new TestableScriptingDesignerGenerator(options);
}
void CreateParseInfoWithOneMethod(string name)
{
parseInfo = generator.CreateParseInfoWithOneMethod(name);
}
[Test]
public void CreateParseInfoWithOneMethod_MethodNamePassed_ReturnsClassWithOneMethod()
{
CreateTestableScriptingDesignerGenerator();
CreateParseInfoWithOneMethod("MyMethod");
IClass c = parseInfo.CompilationUnit.Classes[0];
int methodCount = c.Methods.Count;
Assert.AreEqual(1, methodCount);
}
[Test]
public void CreateParseInfoWithOneMethod_MethodNamePassed_ReturnsMethodWithExpectedMethodName()
{
CreateTestableScriptingDesignerGenerator();
CreateParseInfoWithOneMethod("MyMethod");
IClass c = parseInfo.CompilationUnit.Classes[0];
IMethod method = c.Methods[0];
string name = method.Name;
string expectedName = "MyMethod";
Assert.AreEqual(expectedName, name);
}
[Test]
public void Constructor_NewInstance_ParseInfoToReturnFromParseFileHasOneClass()
{
CreateTestableScriptingDesignerGenerator();
parseInfo = generator.CreateParseInfoWithOneClass();
int count = parseInfo.CompilationUnit.Classes.Count;
Assert.AreEqual(1, count);
}
[Test]
public void CreateParseInfoWithOneMethodWithTwoParameters_MethodNamePassed_ReturnsMethodWithTwoParameters()
{
CreateTestableScriptingDesignerGenerator();
CreateParseInfoWithOneMethodWithTwoParameters("MyMethod");
IClass c = parseInfo.CompilationUnit.Classes[0];
IMethod method = c.Methods[0];
int parameterCount = method.Parameters.Count;
Assert.AreEqual(2, parameterCount);
}
void CreateParseInfoWithOneMethodWithTwoParameters(string name)
{
parseInfo = generator.CreateParseInfoWithOneMethodWithTwoParameters(name);
}
}
}
Loading…
Cancel
Save