Browse Source

Asterisk character treated as a normal key character when completing IronPython code.

pull/1/head
mrward 15 years ago
parent
commit
72b0a52bcf
  1. 2
      src/AddIns/BackendBindings/Python/PythonBinding.sln
  2. 2
      src/AddIns/BackendBindings/Python/PythonBinding/Project/PythonBinding.csproj
  3. 29
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonCodeCompletionBinding.cs
  4. 16
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonCodeCompletionItemProvider.cs
  5. 25
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonCompletionItemList.cs
  6. 14
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonImportCompletion.cs
  7. 7
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonImportExpressionContext.cs
  8. 42
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/CodeCompletionBindingFromImportCompletionTestFixture.cs
  9. 70
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/CodeCompletionBindingFromImportCompletionTests.cs
  10. 89
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/CodeCompletionBindingImportCompletionTestFixture.cs
  11. 101
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/CodeCompletionBindingImportCompletionTests.cs
  12. 10
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/FromImportDotNetNamespaceCompletionTests.cs
  13. 20
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/FromImportPythonModuleCompletionTests.cs
  14. 23
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/PythonCodeCompletionItemProviderTests.cs
  15. 41
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/PythonCompletionItemListTests.cs
  16. 53
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/PythonImportExpressionContextTests.cs
  17. 16
      src/AddIns/BackendBindings/Python/PythonBinding/Test/PythonBinding.Tests.csproj
  18. 20
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ImportModuleResolveResultTests.cs
  19. 94
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/DerivedPythonCodeCompletionBinding.cs
  20. 24
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/FakeCompletionItemProvider.cs
  21. 51
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/TestablePythonCodeCompletionBinding.cs
  22. 17
      src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/TestablePythonCodeCompletionItemProvider.cs

2
src/AddIns/BackendBindings/Python/PythonBinding.sln

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
# SharpDevelop 4.0.0.6569
# SharpDevelop 4.0.0.6611
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PythonBinding", "PythonBinding\Project\PythonBinding.csproj", "{8D732610-8FC6-43BA-94C9-7126FD7FE361}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PythonBinding.Tests", "PythonBinding\Test\PythonBinding.Tests.csproj", "{23B517C9-1ECC-4419-A13F-0B7136D085CB}"

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

@ -92,6 +92,8 @@ @@ -92,6 +92,8 @@
<Compile Include="Src\MemberName.cs" />
<Compile Include="Src\PythonBuiltInModuleMemberName.cs" />
<Compile Include="Src\PythonClassResolver.cs" />
<Compile Include="Src\PythonCodeCompletionItemProvider.cs" />
<Compile Include="Src\PythonCompletionItemList.cs" />
<Compile Include="Src\PythonConsoleApplication.cs" />
<Compile Include="Src\PythonDotNetMethodResolver.cs" />
<Compile Include="Src\PythonFromImport.cs" />

29
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonCodeCompletionBinding.cs

@ -10,43 +10,38 @@ using System.Collections.Generic; @@ -10,43 +10,38 @@ using System.Collections.Generic;
namespace ICSharpCode.PythonBinding
{
/// <summary>
/// Python code completion binding.
/// </summary>
public class PythonCodeCompletionBinding : DefaultCodeCompletionBinding
{
public PythonCodeCompletionBinding()
{
}
/// <summary>
/// Shows the code completion window if the keyword is handled.
/// </summary>
/// <param name="word">The keyword string.</param>
/// <returns>true if the keyword is handled; otherwise false.</returns>
public override bool HandleKeyword(ICSharpCode.SharpDevelop.Editor.ITextEditor editor, string word)
public override bool HandleKeyword(ITextEditor editor, string word)
{
if (word != null) {
switch (word.ToLowerInvariant()) {
case "import":
case "from":
AbstractCompletionItemProvider dataProvider = CreateCompletionDataProvider();
ShowCodeCompletionWindow(editor, dataProvider, ' ');
return true;
return HandleImportKeyword(editor);
}
}
return false;
}
protected virtual AbstractCompletionItemProvider CreateCompletionDataProvider()
bool HandleImportKeyword(ITextEditor editor)
{
return new CodeCompletionItemProvider();
AbstractCompletionItemProvider provider = CreateKeywordCompletionItemProvider();
ShowCodeCompletionWindow(provider, editor);
return true;
}
/// <summary>
/// Shows the code completion window.
/// </summary>
protected virtual void ShowCodeCompletionWindow(ICSharpCode.SharpDevelop.Editor.ITextEditor editor, AbstractCompletionItemProvider completionItemProvider, char ch)
protected virtual AbstractCompletionItemProvider CreateKeywordCompletionItemProvider()
{
return new PythonCodeCompletionItemProvider();
}
protected virtual void ShowCodeCompletionWindow(AbstractCompletionItemProvider completionItemProvider, ITextEditor editor)
{
completionItemProvider.ShowCompletion(editor);
}

16
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonCodeCompletionItemProvider.cs

@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
// 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 ICSharpCode.SharpDevelop.Editor.CodeCompletion;
namespace ICSharpCode.PythonBinding
{
public class PythonCodeCompletionItemProvider : CodeCompletionItemProvider
{
protected override DefaultCompletionItemList CreateCompletionItemList()
{
return new PythonCompletionItemList();
}
}
}

25
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonCompletionItemList.cs

@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
// 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 ICSharpCode.SharpDevelop.Editor.CodeCompletion;
namespace ICSharpCode.PythonBinding
{
public class PythonCompletionItemList : DefaultCompletionItemList
{
public override CompletionItemListKeyResult ProcessInput(char key)
{
if (key == '*') {
return ProcessAsterisk();
}
return base.ProcessInput(key);
}
CompletionItemListKeyResult ProcessAsterisk()
{
InsertSpace = false;
return CompletionItemListKeyResult.NormalKey;
}
}
}

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

@ -12,6 +12,8 @@ namespace ICSharpCode.PythonBinding @@ -12,6 +12,8 @@ namespace ICSharpCode.PythonBinding
{
public class PythonImportCompletion
{
public static readonly NamespaceEntry ImportAll = new NamespaceEntry("*");
IProjectContent projectContent;
static readonly PythonStandardModules standardPythonModules = new PythonStandardModules();
@ -41,12 +43,22 @@ namespace ICSharpCode.PythonBinding @@ -41,12 +43,22 @@ namespace ICSharpCode.PythonBinding
}
public List<ICompletionEntry> GetCompletionItemsFromModule(string module)
{
List<ICompletionEntry> items = GetCompletionItemsFromStandardPythonModules(module);
if (items == null) {
items = projectContent.GetNamespaceContents(module);
}
items.Add(ImportAll);
return items;
}
List<ICompletionEntry> GetCompletionItemsFromStandardPythonModules(string module)
{
PythonStandardModuleType type = standardPythonModules.GetModuleType(module);
if (type != null) {
return GetCompletionItemsFromModule(type);
}
return projectContent.GetNamespaceContents(module);
return null;
}
List<ICompletionEntry> GetCompletionItemsFromModule(PythonStandardModuleType type)

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

@ -31,8 +31,15 @@ namespace ICSharpCode.PythonBinding @@ -31,8 +31,15 @@ namespace ICSharpCode.PythonBinding
return true;
} else if (entry is IClass) {
return true;
} else if (entry is NamespaceEntry) {
return IsImportAll(entry);
}
return false;
}
bool IsImportAll(ICompletionEntry entry)
{
return PythonImportCompletion.ImportAll.Equals(entry);
}
}
}

42
src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/CodeCompletionBindingFromImportCompletionTestFixture.cs

@ -1,42 +0,0 @@ @@ -1,42 +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 ICSharpCode.Core;
using ICSharpCode.PythonBinding;
using ICSharpCode.SharpDevelop.Editor.AvalonEdit;
using ICSharpCode.SharpDevelop.Dom;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Completion
{
/// <summary>
/// Tests that the From keyword is correctly identified as a
/// importable code completion keyword.
/// </summary>
[TestFixture]
public class FromImportCompletionTestFixture
{
DerivedPythonCodeCompletionBinding codeCompletionBinding;
bool handlesImportKeyword;
AvalonEditTextEditorAdapter textEditor;
[TestFixtureSetUp]
public void SetUpFixture()
{
if (!PropertyService.Initialized) {
PropertyService.InitializeService(String.Empty, String.Empty, String.Empty);
}
textEditor = new AvalonEditTextEditorAdapter(new ICSharpCode.AvalonEdit.TextEditor());
codeCompletionBinding = new DerivedPythonCodeCompletionBinding();
handlesImportKeyword = codeCompletionBinding.HandleKeyword(textEditor, "from");
}
[Test]
public void HandlesImportKeyWord()
{
Assert.IsTrue(handlesImportKeyword);
}
}
}

70
src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/CodeCompletionBindingFromImportCompletionTests.cs

@ -0,0 +1,70 @@ @@ -0,0 +1,70 @@
// 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 ICSharpCode.PythonBinding;
using ICSharpCode.Scripting.Tests.Utils;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Editor.CodeCompletion;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Completion
{
/// <summary>
/// Tests that the From keyword is correctly identified as a
/// importable code completion keyword.
/// </summary>
[TestFixture]
public class CodeCompletionBindingFromImportCompletionTests
{
MockTextEditor fakeTextEditor;
TestablePythonCodeCompletionBinding codeCompletionBinding;
void CreatePythonCodeCompletionBinding()
{
fakeTextEditor = new MockTextEditor();
codeCompletionBinding = new TestablePythonCodeCompletionBinding();
}
[Test]
public void HandleKeyword_KeywordIsFrom_ReturnsTrue()
{
CreatePythonCodeCompletionBinding();
bool handled = codeCompletionBinding.HandleKeyword(fakeTextEditor, "from");
Assert.IsTrue(handled);
}
[Test]
public void HandleKeyword_KeywordIsFrom_PythonDotCodeCompletionItemProviderUsedToShowCompletionWindow()
{
CreatePythonCodeCompletionBinding();
codeCompletionBinding.HandleKeyword(fakeTextEditor, "from");
ITextEditor textEditor = codeCompletionBinding.TextEditorPassedToShowCompletionWindow;
Assert.AreEqual(fakeTextEditor, textEditor);
}
[Test]
public void HandleKeyword_KeywordIsFrom_PythonCodeCompletionItemProviderCreated()
{
CreatePythonCodeCompletionBinding();
codeCompletionBinding.HandleKeyword(fakeTextEditor, "from");
PythonCodeCompletionItemProvider provider = codeCompletionBinding.KeywordCompletionItemProviderCreated as PythonCodeCompletionItemProvider;
Assert.IsNotNull(provider);
}
[Test]
public void HandleKeyword_KeywordIsFrom_PythonCodeCompletionItemProviderPassedToShowCompletionWindow()
{
CreatePythonCodeCompletionBinding();
codeCompletionBinding.HandleKeyword(fakeTextEditor, "from");
AbstractCompletionItemProvider provider = codeCompletionBinding.CompletionItemProviderUsedWhenDisplayingCodeCompletionWindow;
Assert.AreSame(codeCompletionBinding.KeywordCompletionItemProviderCreated, provider);
}
}
}

89
src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/CodeCompletionBindingImportCompletionTestFixture.cs

@ -1,89 +0,0 @@ @@ -1,89 +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 ICSharpCode.Core;
using ICSharpCode.PythonBinding;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Editor.AvalonEdit;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Completion
{
/// <summary>
/// Tests the code completion after an "import" statement.
/// </summary>
[TestFixture]
public class CodeCompletionBindingImportCompletionTestFixture
{
DerivedPythonCodeCompletionBinding codeCompletionBinding;
bool handlesImportKeyword;
AvalonEditTextEditorAdapter textEditor;
[TestFixtureSetUp]
public void SetUpFixture()
{
if (!PropertyService.Initialized) {
PropertyService.InitializeService(String.Empty, String.Empty, String.Empty);
}
textEditor = new AvalonEditTextEditorAdapter(new ICSharpCode.AvalonEdit.TextEditor());
codeCompletionBinding = new DerivedPythonCodeCompletionBinding();
handlesImportKeyword = codeCompletionBinding.HandleKeyword(textEditor, "import");
}
[Test]
public void HandlesImportKeyWord()
{
Assert.IsTrue(handlesImportKeyword);
}
[Test]
public void UnknownKeywordNotHandled()
{
Assert.IsFalse(codeCompletionBinding.HandleKeyword(textEditor, "Unknown"));
}
[Test]
public void HandlesUppercaseImportKeyword()
{
Assert.IsTrue(codeCompletionBinding.HandleKeyword(textEditor, "IMPORT"));
}
[Test]
public void NullKeyword()
{
Assert.IsFalse(codeCompletionBinding.HandleKeyword(textEditor, null));
}
[Test]
public void CompletionDataProviderCreated()
{
Assert.IsTrue(codeCompletionBinding.IsCompletionDataProviderCreated);
}
[Test]
public void CodeCompletionWindowDisplayed()
{
Assert.IsTrue(codeCompletionBinding.IsCodeCompletionWindowDisplayed);
}
[Test]
public void TextAreaControlUsedToDisplayCodeCompletionWindow()
{
Assert.AreSame(textEditor, codeCompletionBinding.TextEditorUsedToShowCompletionWindow);
}
[Test]
public void CompletionProviderUsedWhenDisplayingCodeCompletionWindow()
{
Assert.AreSame(codeCompletionBinding.CompletionDataProvider, codeCompletionBinding.CompletionProviderUsedWhenDisplayingCodeCompletionWindow);
}
[Test]
public void CompletionCharacterIsSpace()
{
Assert.AreEqual(' ', codeCompletionBinding.CompletionCharacter);
}
}
}

101
src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/CodeCompletionBindingImportCompletionTests.cs

@ -0,0 +1,101 @@ @@ -0,0 +1,101 @@
// 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 ICSharpCode.Scripting.Tests.Utils;
using ICSharpCode.SharpDevelop.Editor.CodeCompletion;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Completion
{
/// <summary>
/// Tests the code completion after an "import" statement.
/// </summary>
[TestFixture]
public class CodeCompletionBindingImportCompletionTests
{
TestablePythonCodeCompletionBinding codeCompletionBinding;
MockTextEditor textEditor;
bool handled;
public void CreateCompletionBinding()
{
textEditor = new MockTextEditor();
codeCompletionBinding = new TestablePythonCodeCompletionBinding();
}
public void HandlesImportKeyword()
{
CreateCompletionBinding();
handled = codeCompletionBinding.HandleKeyword(textEditor, "import");
}
[Test]
public void HandleKeyword_KeywordIsImport_ReturnsTrue()
{
HandlesImportKeyword();
Assert.IsTrue(handled);
}
[Test]
public void HandleKeyword_UnknownKeyword_ReturnsFalse()
{
bool handled = codeCompletionBinding.HandleKeyword(textEditor, "Unknown");
Assert.IsFalse(handled);
}
[Test]
public void HandleKeyword_KeywordIsImportInUpperCase_ReturnsTrue()
{
bool handled = codeCompletionBinding.HandleKeyword(textEditor, "IMPORT");
Assert.IsTrue(handled);
}
[Test]
public void HandleKeyword_KeywordIsNull_ReturnsFalse()
{
bool handled = codeCompletionBinding.HandleKeyword(textEditor, null);
Assert.IsFalse(handled);
}
[Test]
public void HandleKeyword_KeywordIsImport_CodeCompletionWindowDisplayed()
{
HandlesImportKeyword();
Assert.IsTrue(codeCompletionBinding.IsCodeCompletionWindowDisplayed);
}
[Test]
public void HandleKeyword_KeywordIsImport_TextEditorPassedToShowCompletionWindowMethod()
{
HandlesImportKeyword();
Assert.AreSame(textEditor, codeCompletionBinding.TextEditorPassedToShowCompletionWindow);
}
[Test]
public void HandleKeyword_KeywordIsImport_CompletionProviderUsedWhenDisplayingCodeCompletionWindow()
{
HandlesImportKeyword();
Assert.AreSame(codeCompletionBinding.KeywordCompletionItemProviderCreated, codeCompletionBinding.CompletionItemProviderUsedWhenDisplayingCodeCompletionWindow);
}
[Test]
public void HandleKeyword_KeywordIsImport_KeywordCompletionDataProviderIsCodeCompletionItemProvider()
{
HandlesImportKeyword();
CodeCompletionItemProvider provider = codeCompletionBinding.KeywordCompletionItemProviderCreated as CodeCompletionItemProvider;
Assert.IsNotNull(provider);
}
[Test]
public void ShowCompletionWindow_FakeCompletionItemProviderAndTextEditorPassed_asdf()
{
CreateCompletionBinding();
FakeCompletionItemProvider provider = new FakeCompletionItemProvider();
codeCompletionBinding.CallBaseShowCodeCompletionWindow(provider, textEditor);
Assert.AreEqual(textEditor, provider.TextEditorPassedToShowCompletion);
}
}
}

10
src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/FromImportDotNetNamespaceCompletionTestFixture.cs → src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/FromImportDotNetNamespaceCompletionTests.cs

@ -12,7 +12,7 @@ using PythonBinding.Tests.Utils; @@ -12,7 +12,7 @@ using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Completion
{
[TestFixture]
public class FromImportDotNetNamespaceCompletionTestFixture
public class FromImportDotNetNamespaceCompletionTes
{
PythonImportCompletion completion;
MockProjectContent projectContent;
@ -33,20 +33,22 @@ namespace PythonBinding.Tests.Completion @@ -33,20 +33,22 @@ namespace PythonBinding.Tests.Completion
}
[Test]
public void FromDotNetSystemLibraryGetCompletionItemsReturnsAllClassesFromSystemNamespace()
public void GetCompletionItemsFromModule_DotNetSystemLibrary_ReturnsAllClassesFromSystemNamespaceAndAsteriskForImportAll()
{
List<ICompletionEntry> items = completion.GetCompletionItemsFromModule("System");
List<ICompletionEntry> expectedItems = new List<ICompletionEntry>();
expectedItems.Add(c);
expectedItems.Add(new NamespaceEntry("*"));
Assert.AreEqual(expectedItems, items);
}
[Test]
public void SystemNamespaceSearchedForWhenGetCompletionItemsMethodCalled()
public void GetCompletionItems_DotNetSystemLibrary_SystemNamespaceSearchedForWhenGetCompletionItemsMethodCalled()
{
completion.GetCompletionItemsFromModule("System");
Assert.AreEqual("System", projectContent.NamespacePassedToGetNamespaceContentsMethod);
string expectedNamespace = "System";
Assert.AreEqual(expectedNamespace, projectContent.NamespacePassedToGetNamespaceContentsMethod);
}
}
}

20
src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/FromImportPythonModuleCompletionTestFixture.cs → src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/FromImportPythonModuleCompletionTests.cs

@ -12,7 +12,7 @@ using PythonBinding.Tests.Utils; @@ -12,7 +12,7 @@ using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Completion
{
[TestFixture]
public class FromImportPythonModuleCompletionTestFixture
public class FromImportPythonModuleCompletionTests
{
PythonImportCompletion completion;
MockProjectContent projectContent;
@ -26,18 +26,30 @@ namespace PythonBinding.Tests.Completion @@ -26,18 +26,30 @@ namespace PythonBinding.Tests.Completion
}
[Test]
public void FromUnknownLibraryNoCompletionItemsReturned()
public void GetCompletionItemsFromModule_UnknownModule_OnlyImportAllItemsCompletionItemReturned()
{
List<ICompletionEntry> items = completion.GetCompletionItemsFromModule("unknown");
Assert.AreEqual(0, items.Count);
List<ICompletionEntry> expectedItems = new List<ICompletionEntry>();
expectedItems.Add(new NamespaceEntry("*"));
Assert.AreEqual(expectedItems, items);
}
[Test]
public void FromMathLibraryGetCompletionItemsReturnsPiField()
public void GetCompletionItemsFromModule_MathModule_ReturnsPiField()
{
List<ICompletionEntry> items = completion.GetCompletionItemsFromModule("math");
IField field = PythonCompletionItemsHelper.FindFieldFromCollection("pi", items);
Assert.IsNotNull(field);
}
[Test]
public void GetCompletionItemsFromModule_MathModule_LastCompletionItemIsAsterisk()
{
List<ICompletionEntry> items = completion.GetCompletionItemsFromModule("math");
int lastItem = items.Count - 1;
ICompletionEntry lastCompletionItem = items[lastItem];
NamespaceEntry expectedCompletionItem = new NamespaceEntry("*");
Assert.AreEqual(expectedCompletionItem, lastCompletionItem);
}
}
}

23
src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/PythonCodeCompletionItemProviderTests.cs

@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
// 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 ICSharpCode.PythonBinding;
using NUnit.Framework;
using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Completion
{
[TestFixture]
public class PythonCodeCompletionItemProviderTests
{
[Test]
public void CreateCompletionItemList_OverriddenInPythonCodeCompletionItemProvider_ReturnsPythonCompletionItemList()
{
TestablePythonCodeCompletionItemProvider provider = new TestablePythonCodeCompletionItemProvider();
PythonCompletionItemList list = provider.CallBaseCreateCompletionItemList() as PythonCompletionItemList;
Assert.IsNotNull(list);
}
}
}

41
src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/PythonCompletionItemListTests.cs

@ -0,0 +1,41 @@ @@ -0,0 +1,41 @@
// 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 ICSharpCode.PythonBinding;
using ICSharpCode.SharpDevelop.Editor.CodeCompletion;
using NUnit.Framework;
namespace PythonBinding.Tests.Completion
{
[TestFixture]
public class PythonCompletionItemListTests
{
PythonCompletionItemList completionItemList;
void CreatePythonCompletionItemList()
{
completionItemList = new PythonCompletionItemList();
}
[Test]
public void ProcessInput_KeyIsAsterisk_ReturnsNormalKey()
{
CreatePythonCompletionItemList();
CompletionItemListKeyResult result = completionItemList.ProcessInput('*');
CompletionItemListKeyResult expectedResult = CompletionItemListKeyResult.NormalKey;
Assert.AreEqual(expectedResult, result);
}
[Test]
public void ProcessInput_KeyIsAsterisk_InsertSpaceSetToFalseAfterMethodCalled()
{
CreatePythonCompletionItemList();
completionItemList.InsertSpace = true;
completionItemList.ProcessInput('*');
Assert.IsFalse(completionItemList.InsertSpace);
}
}
}

53
src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/PythonImportExpressionContextTestFixture.cs → src/AddIns/BackendBindings/Python/PythonBinding/Test/Completion/PythonImportExpressionContextTests.cs

@ -11,17 +11,18 @@ using PythonBinding.Tests.Utils; @@ -11,17 +11,18 @@ using PythonBinding.Tests.Utils;
namespace PythonBinding.Tests.Completion
{
[TestFixture]
public class PythonImportExpressionContextTestFixture
public class PythonImportExpressionContextTests
{
[Test]
public void ShowEntryReturnsTrueForIMethod()
public void ShowEntry_IMethodPassed_ReturnsTrue()
{
PythonImportExpressionContext context = new PythonImportExpressionContext();
context.HasFromAndImport = true;
IMethod method = CreateMethod();
bool result = context.ShowEntry(method);
Assert.IsTrue(context.ShowEntry(method));
Assert.IsTrue(result);
}
IMethod CreateMethod()
@ -37,36 +38,40 @@ namespace PythonBinding.Tests.Completion @@ -37,36 +38,40 @@ namespace PythonBinding.Tests.Completion
}
[Test]
public void ShowEntryReturnsFalseForNull()
public void ShowEntry_PassedNull_ReturnsFalse()
{
PythonImportExpressionContext context = new PythonImportExpressionContext();
context.HasFromAndImport = true;
Assert.IsFalse(context.ShowEntry(null));
bool result = context.ShowEntry(null);
Assert.IsFalse(result);
}
[Test]
public void ShowEntryReturnsFalseForIMethodWhenHasFromAndImportIsFalse()
public void ShowEntry_PassedIMethodWhenHasFromAndImportIsFalse_ReturnsFalse()
{
PythonImportExpressionContext context = new PythonImportExpressionContext();
IMethod method = CreateMethod();
Assert.IsFalse(context.ShowEntry(method));
bool result = context.ShowEntry(method);
Assert.IsFalse(result);
}
[Test]
public void PythonImportExpressionContextHasFromAndImportIsFalseByDefault()
public void HasFromAndImport_NewPythonImportExpressionContextInstance_IsFalseByDefault()
{
PythonImportExpressionContext context = new PythonImportExpressionContext();
Assert.IsFalse(context.HasFromAndImport);
bool result = context.HasFromAndImport;
Assert.IsFalse(result);
}
[Test]
public void ShowEntryReturnsTrueForIField()
public void ShowEntry_PassedIField_ReturnsTrue()
{
PythonImportExpressionContext context = new PythonImportExpressionContext();
context.HasFromAndImport = true;
IField field = CreateField();
bool result = context.ShowEntry(field);
Assert.IsTrue(context.ShowEntry(field));
Assert.IsTrue(result);
}
IField CreateField()
@ -76,31 +81,45 @@ namespace PythonBinding.Tests.Completion @@ -76,31 +81,45 @@ namespace PythonBinding.Tests.Completion
}
[Test]
public void ShowEntryReturnsFalseForIFieldWhenHasFromAndImportIsFalse()
public void ShowEntry_PassedIFieldWhenHasFromAndImportIsFalse_ReturnsFalse()
{
PythonImportExpressionContext context = new PythonImportExpressionContext();
IField field = CreateField();
bool result = context.ShowEntry(field);
Assert.IsFalse(context.ShowEntry(field));
Assert.IsFalse(result);
}
[Test]
public void ShowEntryReturnsTrueForIClass()
public void ShowEntry_PassedIClass_ReturnsTrue()
{
PythonImportExpressionContext context = new PythonImportExpressionContext();
context.HasFromAndImport = true;
IClass c = CreateClass();
bool result = context.ShowEntry(c);
Assert.IsTrue(context.ShowEntry(c));
Assert.IsTrue(result);
}
[Test]
public void ShowEntryReturnsFalseForIClassWhenHasFromAndImportIsFalse()
public void ShowEntry_PassedIClassWhenHasFromAndImportIsFalse_ReturnsFalse()
{
PythonImportExpressionContext context = new PythonImportExpressionContext();
IClass c = CreateClass();
bool result = context.ShowEntry(c);
Assert.IsFalse(context.ShowEntry(c));
Assert.IsFalse(result);
}
[Test]
public void ShowEntry_PassedImportAllNamespaceEntryWhenHasFromAndImportIsTrue_ReturnsTrue()
{
PythonImportExpressionContext context = new PythonImportExpressionContext();
context.HasFromAndImport = true;
NamespaceEntry entry = new NamespaceEntry("*");
bool result = context.ShowEntry(entry);
Assert.IsTrue(result);
}
}
}

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

@ -80,11 +80,11 @@ @@ -80,11 +80,11 @@
</ItemGroup>
<ItemGroup>
<Compile Include="AssemblyInfo.cs" />
<Compile Include="Completion\CodeCompletionBindingFromImportCompletionTestFixture.cs" />
<Compile Include="Completion\CodeCompletionBindingImportCompletionTestFixture.cs" />
<Compile Include="Completion\CodeCompletionBindingFromImportCompletionTests.cs" />
<Compile Include="Completion\CodeCompletionBindingImportCompletionTests.cs" />
<Compile Include="Completion\FromDateTimeImportCompletionTestFixture.cs" />
<Compile Include="Completion\FromImportDotNetNamespaceCompletionTestFixture.cs" />
<Compile Include="Completion\FromImportPythonModuleCompletionTestFixture.cs" />
<Compile Include="Completion\FromImportDotNetNamespaceCompletionTests.cs" />
<Compile Include="Completion\FromImportPythonModuleCompletionTests.cs" />
<Compile Include="Completion\FromMathLibraryImportCompletionTestFixture.cs" />
<Compile Include="Completion\FromMathLibraryImportCosMethodCompletionTestFixture.cs" />
<Compile Include="Completion\FromSysLibraryImportCompletionItemsTestFixture.cs" />
@ -97,7 +97,9 @@ @@ -97,7 +97,9 @@
<Compile Include="Completion\ImportSubNamespaceCompletionTestFixture.cs" />
<Compile Include="Completion\MathModuleMembersInPythonContextTestFixture.cs" />
<Compile Include="Completion\NamespaceContentsAddedToCtrlSpaceTestFixture.cs" />
<Compile Include="Completion\PythonImportExpressionContextTestFixture.cs" />
<Compile Include="Completion\PythonCodeCompletionItemProviderTests.cs" />
<Compile Include="Completion\PythonCompletionItemListTests.cs" />
<Compile Include="Completion\PythonImportExpressionContextTests.cs" />
<Compile Include="Completion\PythonSocketLibraryDocumentationTestFixture.cs" />
<Compile Include="Completion\SysModuleMembersInPythonContextTestFixture.cs" />
<Compile Include="Configuration\AddInOptionsTestFixture.cs" />
@ -405,10 +407,10 @@ @@ -405,10 +407,10 @@
<Compile Include="Utils\DerivedApplicationSettingsPanel.cs" />
<Compile Include="Utils\DerivedCompilingOptionsPanel.cs" />
<Compile Include="Utils\DerivedConvertProjectToPythonProjectCommand.cs" />
<Compile Include="Utils\DerivedPythonCodeCompletionBinding.cs" />
<Compile Include="Utils\DerivedPythonConsoleHost.cs" />
<Compile Include="Utils\DerivedPythonDesignerGenerator.cs" />
<Compile Include="Utils\DerivedPythonFormsDesignerDisplayBinding.cs" />
<Compile Include="Utils\FakeCompletionItemProvider.cs" />
<Compile Include="Utils\PythonCodeDomSerializerHelper.cs" />
<Compile Include="Utils\PythonComponentWalkerHelper.cs" />
<Compile Include="Utils\PythonMSBuildEngineHelper.cs" />
@ -420,6 +422,8 @@ @@ -420,6 +422,8 @@
<Compile Include="Utils\PythonBindingAddInFile.cs" />
<Compile Include="Utils\PythonCompletionItemsHelper.cs" />
<Compile Include="Utils\PythonParserHelper.cs" />
<Compile Include="Utils\TestablePythonCodeCompletionBinding.cs" />
<Compile Include="Utils\TestablePythonCodeCompletionItemProvider.cs" />
<Compile Include="Utils\Tests\PythonCompletionItemsHelperTests.cs" />
<Compile Include="Utils\Tests\PythonParserHelperTests.cs" />
<EmbeddedResource Include="Designer\App.ico" />

20
src/AddIns/BackendBindings/Python/PythonBinding/Test/Resolver/ImportModuleResolveResultTests.cs

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using ICSharpCode.PythonBinding;
using ICSharpCode.Scripting.Tests.Utils;
using ICSharpCode.SharpDevelop.Dom;
@ -14,30 +15,37 @@ namespace PythonBinding.Tests.Resolver @@ -14,30 +15,37 @@ namespace PythonBinding.Tests.Resolver
public class ImportModuleResolveResultTests
{
[Test]
public void NamePropertyMatchesTextPassedToConstructor()
public void Name_ExpressionIsImportFollowedByName_MatchesNameAfterImport()
{
PythonImportExpression expression = new PythonImportExpression("import abc");
PythonImportModuleResolveResult result = new PythonImportModuleResolveResult(expression);
Assert.AreEqual("abc", result.Name);
string expectedName = "abc";
Assert.AreEqual(expectedName, result.Name);
}
[Test]
public void GetCompletionDataReturnsStandardMathPythonModuleWhenImportNameIsEmptyString()
public void GetCompletionData_WhenImportNameIsEmptyString_ReturnsStandardMathPythonModule()
{
PythonImportExpression expression = new PythonImportExpression(String.Empty);
PythonImportModuleResolveResult result = new PythonImportModuleResolveResult(expression);
MockProjectContent projectContent = new MockProjectContent();
Assert.Contains(new NamespaceEntry("math"), result.GetCompletionData(projectContent));
List<ICompletionEntry> completionItems = result.GetCompletionData(projectContent);
NamespaceEntry mathNamespaceCompletionItem = new NamespaceEntry("math");
Assert.Contains(mathNamespaceCompletionItem, completionItems);
}
[Test]
public void ClonedPythonModuleResultReturnsSameCompletionItems()
public void GetCompletionData_ClonedPythonModuleResult_ReturnsSameCompletionItems()
{
PythonImportExpression expression = new PythonImportExpression(String.Empty);
PythonImportModuleResolveResult result = new PythonImportModuleResolveResult(expression);
ResolveResult clonedResult = result.Clone();
MockProjectContent projectContent = new MockProjectContent();
Assert.Contains(new NamespaceEntry("math"), clonedResult.GetCompletionData(projectContent));
List<ICompletionEntry> completionItems = clonedResult.GetCompletionData(projectContent);
NamespaceEntry mathNamespaceCompletionItem = new NamespaceEntry("math");
Assert.Contains(mathNamespaceCompletionItem, completionItems);
}
}
}

94
src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/DerivedPythonCodeCompletionBinding.cs

@ -1,94 +0,0 @@ @@ -1,94 +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 ICSharpCode.SharpDevelop.Editor.CodeCompletion;
using System;
using ICSharpCode.PythonBinding;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Editor;
namespace PythonBinding.Tests.Utils
{
/// <summary>
/// Derived PythonCodeCompletion class that gives us access to
/// various protected methods for testing.
/// </summary>
public class DerivedPythonCodeCompletionBinding : PythonCodeCompletionBinding
{
bool completionDataProviderCreated;
bool codeCompletionWindowDisplayed;
ICSharpCode.SharpDevelop.Editor.ITextEditor textEditorUsedToShowCompletionWindow;
AbstractCompletionItemProvider completionProviderUsedWhenDisplayingCodeCompletionWindow;
AbstractCompletionItemProvider completionDataProvider;
char completionCharacter = '\0';
public DerivedPythonCodeCompletionBinding()
{
}
/// <summary>
/// Gets whether the data provider was created by the
/// base class PythonCodeCompletionBinding.
/// </summary>
public bool IsCompletionDataProviderCreated {
get { return completionDataProviderCreated; }
}
/// <summary>
/// Gets whether the base class PythonCodeCompletionBinding
/// displayed the code completion window.
/// </summary>
public bool IsCodeCompletionWindowDisplayed {
get { return codeCompletionWindowDisplayed; }
}
public ICSharpCode.SharpDevelop.Editor.ITextEditor TextEditorUsedToShowCompletionWindow {
get { return textEditorUsedToShowCompletionWindow; }
}
public AbstractCompletionItemProvider CompletionProviderUsedWhenDisplayingCodeCompletionWindow {
get { return completionProviderUsedWhenDisplayingCodeCompletionWindow; }
}
/// <summary>
/// Gets the CompletionDataProvider created via the
/// CreateCompletionDataProvider method.
/// </summary>
public AbstractCompletionItemProvider CompletionDataProvider {
get { return completionDataProvider; }
}
/// <summary>
/// Gets the character used when calling the TextAreaControl's
/// ShowCompletionWindow method.
/// </summary>
public char CompletionCharacter {
get { return completionCharacter; }
}
/// <summary>
/// Overrides the completion data provider creation to make sure
/// it is called at the correct time.
/// </summary>
protected override AbstractCompletionItemProvider CreateCompletionDataProvider()
{
completionDataProviderCreated = true;
completionDataProvider = base.CreateCompletionDataProvider();
return completionDataProvider;
}
/// <summary>
/// Overrides the base class method so a code completion window is
/// not displayed but the fact that this method is called is
/// recorded.
/// </summary>
protected override void ShowCodeCompletionWindow(ICSharpCode.SharpDevelop.Editor.ITextEditor textEditor, AbstractCompletionItemProvider completionDataProvider, char ch)
{
textEditorUsedToShowCompletionWindow = textEditor;
codeCompletionWindowDisplayed = true;
completionCharacter = ch;
completionProviderUsedWhenDisplayingCodeCompletionWindow = completionDataProvider;
}
}
}

24
src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/FakeCompletionItemProvider.cs

@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
// 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 ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Editor.CodeCompletion;
namespace PythonBinding.Tests.Utils
{
public class FakeCompletionItemProvider : AbstractCompletionItemProvider
{
public ITextEditor TextEditorPassedToShowCompletion;
public override void ShowCompletion(ITextEditor editor)
{
TextEditorPassedToShowCompletion = editor;
}
public override ICompletionItemList GenerateCompletionList(ITextEditor editor)
{
throw new NotImplementedException();
}
}
}

51
src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/TestablePythonCodeCompletionBinding.cs

@ -0,0 +1,51 @@ @@ -0,0 +1,51 @@
// 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 ICSharpCode.SharpDevelop.Editor.CodeCompletion;
using System;
using ICSharpCode.PythonBinding;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Editor;
namespace PythonBinding.Tests.Utils
{
/// <summary>
/// Derived PythonCodeCompletion class that gives us access to
/// various protected methods for testing.
/// </summary>
public class TestablePythonCodeCompletionBinding : PythonCodeCompletionBinding
{
public bool IsCodeCompletionWindowDisplayed;
public ITextEditor TextEditorPassedToShowCompletionWindow;
public AbstractCompletionItemProvider CompletionItemProviderUsedWhenDisplayingCodeCompletionWindow;
public AbstractCompletionItemProvider KeywordCompletionItemProviderCreated;
/// <summary>
/// Overrides the completion data provider creation to make sure
/// it is called at the correct time.
/// </summary>
protected override AbstractCompletionItemProvider CreateKeywordCompletionItemProvider()
{
KeywordCompletionItemProviderCreated = base.CreateKeywordCompletionItemProvider();
return KeywordCompletionItemProviderCreated;
}
public void CallBaseShowCodeCompletionWindow(AbstractCompletionItemProvider completionItemProvider, ITextEditor textEditor)
{
base.ShowCodeCompletionWindow(completionItemProvider, textEditor);
}
/// <summary>
/// Overrides the base class method so a code completion window is
/// not displayed but the fact that this method is called is
/// recorded.
/// </summary>
protected override void ShowCodeCompletionWindow(AbstractCompletionItemProvider completionItemProvider, ITextEditor textEditor)
{
TextEditorPassedToShowCompletionWindow = textEditor;
IsCodeCompletionWindowDisplayed = true;
CompletionItemProviderUsedWhenDisplayingCodeCompletionWindow = completionItemProvider;
}
}
}

17
src/AddIns/BackendBindings/Python/PythonBinding/Test/Utils/TestablePythonCodeCompletionItemProvider.cs

@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
// 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 ICSharpCode.PythonBinding;
using ICSharpCode.SharpDevelop.Editor.CodeCompletion;
namespace PythonBinding.Tests.Utils
{
public class TestablePythonCodeCompletionItemProvider : PythonCodeCompletionItemProvider
{
public DefaultCompletionItemList CallBaseCreateCompletionItemList()
{
return base.CreateCompletionItemList();
}
}
}
Loading…
Cancel
Save