1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
5
using System.Collections.Generic;
6
using ICSharpCode.PackageManagement;
7
using ICSharpCode.PackageManagement.Design;
8
using ICSharpCode.PackageManagement.EnvDTE;
9
using ICSharpCode.PackageManagement.Scripting;
10
using ICSharpCode.Scripting;
11
using ICSharpCode.Scripting.Tests.Utils;
13
using NUnit.Framework;
14
using PackageManagement.Tests.Helpers;
16
namespace PackageManagement.Tests.Scripting
19
public class PackageManagementConsoleHostTests
21
TestablePackageManagementConsoleHost host;
22
FakeScriptingConsoleWithLinesToRead scriptingConsole;
23
FakePowerShellHost powerShellHost;
24
FakePackageManagementSolution fakeSolution;
25
FakeRegisteredPackageRepositories fakeRegisteredPackageRepositories;
29
host = new TestablePackageManagementConsoleHost();
30
fakeSolution = host.FakeSolution;
31
scriptingConsole = host.FakeScriptingConsole;
32
powerShellHost = host.FakePowerShellHostFactory.FakePowerShellHost;
33
fakeRegisteredPackageRepositories = host.FakeRegisteredPackageRepositories;
39
host.ThreadStartPassedToCreateThread.Invoke();
43
public void Dispose_ScriptingConsoleIsNotNull_ScriptingConsoleIsDisposed()
48
Assert.IsTrue(scriptingConsole.IsDisposeCalled);
52
public void Dispose_ScriptingConsoleIsNull_NullReferenceExceptionIsNotThrown()
55
host.ScriptingConsole = null;
57
Assert.DoesNotThrow(() => host.Dispose());
61
public void Run_ConsoleHostIsRun_StartsThreadToProcessCommandsEnteredIntoConsole()
66
Assert.IsTrue(host.FakeThread.IsStartCalled);
70
public void Dispose_ConsoleHostRunCalled_ThreadJoinIsCalledWithTimeout()
76
int timeout = host.FakeThread.TimeoutPassedToJoin;
77
int expectedTimeout = 100; //ms
79
Assert.AreEqual(expectedTimeout, timeout);
83
public void Dispose_DisposeCalledTwiceAfterConsoleHostIsRun_ThreadJoinIsCalledOnce()
88
host.FakeThread.IsJoinCalled = false;
92
Assert.IsFalse(host.FakeThread.IsJoinCalled);
96
public void Dispose_DisposeCalledTwiceAfterConsoleHostIsRunAndThreadDoesNotFinishOnFirstCall_ThreadJoinIsCalledTwice()
100
host.FakeThread.JoinReturnValue = false;
102
host.FakeThread.IsJoinCalled = false;
106
Assert.IsTrue(host.FakeThread.IsJoinCalled);
110
public void IsRunning_DisposedAndThreadFinishes_ReturnsFalse()
114
host.FakeThread.JoinReturnValue = true;
117
Assert.IsFalse(host.IsRunning);
121
public void IsRunning_DisposedButThreadDidNotFinish_ReturnsTrue()
125
host.FakeThread.JoinReturnValue = false;
128
Assert.IsTrue(host.IsRunning);
132
public void Run_ConsoleExitsOnFirstRead_PowerShellHostIsCreated()
137
IScriptingConsole scriptingConsole = host.FakePowerShellHostFactory.ScriptingConsolePassedToCreatePowerShellHost;
138
IScriptingConsole expectedScriptingConsole = scriptingConsole;
140
Assert.AreSame(expectedScriptingConsole, scriptingConsole);
144
public void Run_ConsoleExitsOnFirstRead_PrivateDataIsSetToClearConsoleHostCommandObject()
149
object privateDataObject = host.FakePowerShellHostFactory.PrivateDataPassedToCreatePowerShellHost;
151
Assert.IsInstanceOf(typeof(ClearPackageManagementConsoleHostCommand), privateDataObject);
155
public void Run_ConsoleExitsOnFirstRead_DteObjectIsSet()
160
object dte = host.FakePowerShellHostFactory.DtePassedToCreatePowerShellHost;
162
Assert.IsInstanceOf(typeof(DTE), dte);
166
public void Run_ConsoleExitsOnFirstRead_PowerShellVersionIsSetToNuGetVersion()
169
var expectedVersion = new Version("1.0.1.3");
170
host.NuGetVersionToReturn = expectedVersion;
173
Version version = host.FakePowerShellHostFactory.VersionPassedToCreatePowerShellHost;
175
Assert.AreEqual(expectedVersion, version);
179
public void Run_ConsoleExitsOnFirstRead_InitialPowerShellExecutionPolicySet()
184
Assert.IsTrue(powerShellHost.IsSetRemoteSignedExecutionPolicyCalled);
188
public void Run_ConsoleExitsOnFirstRead_ClearHostFunctionIsRedefined()
193
string expectedExecutedScript =
194
"function Clear-Host { $host.PrivateData.ClearHost() }";
196
bool executed = powerShellHost.AllCommandsPassedToExecuteCommand.Contains(expectedExecutedScript);
198
Assert.IsTrue(executed);
202
public void Run_ConsoleExitsOnFirstRead_PromptTextWrittenToConsole()
206
var expectedTextPassedToWrite = new String[] { "PM> "};
207
List<string> actualTextPassedToWrite = scriptingConsole.AllTextPassedToWrite;
209
CollectionAssert.AreEqual(expectedTextPassedToWrite, actualTextPassedToWrite);
213
public void Run_ConsoleExitsOnFirstRead_PromptTextWrittenWithPromptyStyleToConsole()
218
Assert.AreEqual(ScriptingStyle.Prompt, scriptingConsole.ScriptingStylePassedToWrite);
222
public void Run_OneCommandEntered_CommandExecutedByPowerShellHost()
225
scriptingConsole.AllTextToReturnFromReadLine.Add("RunThis");
228
Assert.AreEqual("RunThis", powerShellHost.CommandPassedToExecuteCommand);
232
public void Run_OneCommandEntered_CommandPromptDisplayedAgain()
235
scriptingConsole.AllTextToReturnFromReadLine.Add("RunThis");
238
var expectedTextPassedToWrite = new String[] { "PM> ", "PM> "};
239
List<string> actualTextPassedToWrite = scriptingConsole.AllTextPassedToWrite;
241
CollectionAssert.AreEqual(expectedTextPassedToWrite, actualTextPassedToWrite);
245
public void Run_TwoCommandsEnteredByUser_FirstCommandExecuted()
248
var commands = new string[] { "one", "two" };
249
scriptingConsole.AllTextToReturnFromReadLine.AddRange(commands);
251
host.ScriptingConsole = scriptingConsole;
254
bool executed = powerShellHost.AllCommandsPassedToExecuteCommand.Contains("one");
256
Assert.IsTrue(executed);
260
public void Run_TwoCommandsEnteredByUser_SecondCommandExecuted()
263
var commands = new string[] { "one", "two" };
264
scriptingConsole.AllTextToReturnFromReadLine.AddRange(commands);
266
host.ScriptingConsole = scriptingConsole;
269
bool executed = powerShellHost.AllCommandsPassedToExecuteCommand.Contains("two");
271
Assert.IsTrue(executed);
275
public void Run_PowerShellHostInitialization_CmdletsAreImported()
278
string cmdletsAssemblyFileName =
279
@"d:\program files\SharpDevelop\4.0\AddIns\PackageManagement\PackageManagement.Cmdlets.dll";
280
host.FakePackageManagementAddInPath.CmdletsAssemblyFileName = cmdletsAssemblyFileName;
283
var expectedModules = new string[] {
284
cmdletsAssemblyFileName
286
IList<string> actualModules = powerShellHost.ModulesToImport;
288
CollectionAssert.AreEqual(expectedModules, actualModules);
292
public void Run_TwoPowerShellFormattingConfigXmlFilesInAddInFolder_UpdateFormattingCalledWithTwoFormattingFiles()
295
var files = new string[] {
296
@"d:\program files\SharpDevelop\4.0\AddIns\PackageManagement\Scripting\Package.Format.ps1xml",
297
@"d:\temp\test\Format.ps1xml"
299
host.FakePackageManagementAddInPath.PowerShellFormattingFileNames.AddRange(files);
303
IEnumerable<string> actualFiles = powerShellHost.FormattingFilesPassedToUpdateFormatting;
305
CollectionAssert.AreEqual(files, actualFiles);
309
public void Run_TextDisplayedBeforeFirstPromptDisplayed_NuGetVersionDisplayed()
312
powerShellHost.Version = new Version("1.2.0.4");
315
string expected = "NuGet 1.2.0.4";
317
bool contains = scriptingConsole.AllTextPassedToWriteLine.Contains(expected);
319
Assert.IsTrue(contains);
323
public void Run_TextDisplayedBeforeFirstPromptDisplayed_HelpInfoDisplayed()
326
string expectedHelpMessage = "Type 'get-help NuGet' for more information.";
327
host.TextToReturnFromGetHelpInfo = expectedHelpMessage;
330
bool contains = scriptingConsole.AllTextPassedToWriteLine.Contains("Type 'get-help NuGet' for more information.");
332
Assert.IsTrue(contains);
336
public void Run_TextDisplayedBeforeFirstPromptDisplayed_BlankLineBeforePrompt()
339
host.TextToReturnFromGetHelpInfo = "abc";
342
string actualLastLine = scriptingConsole.LastLinePassedToWriteLine;
343
string expectedLastLine = String.Empty;
345
Assert.AreEqual(expectedLastLine, actualLastLine);
349
public void GetProject_ProjectNameAndPackageSourcePassed_ProjectNameUsedToGetProject()
352
string source = "http://sharpdevelop.net";
353
string expectedProjectName = "Test";
355
host.GetProject(source, expectedProjectName);
357
string actualProjectName = fakeSolution.ProjectNamePassedToGetProject;
359
Assert.AreEqual(expectedProjectName, actualProjectName);
363
public void GetProject_ProjectNameAndPackageSourcePassed_PackageSourceUsedToGetProject()
366
string expectedSource = "http://sharpdevelop.net";
368
host.GetProject(expectedSource, "Test");
370
string actualSource = fakeSolution.PackageSourcePassedToGetProject.Source;
372
Assert.AreEqual(expectedSource, actualSource);
376
public void GetProject_ProjectNameAndPackageSourcePassed_ReturnsProject()
379
string source = "http://sharpdevelop.net";
381
IPackageManagementProject project = host.GetProject(source, "Test");
383
FakePackageManagementProject expectedProject = fakeSolution.FakeProjectToReturnFromGetProject;
385
Assert.AreEqual(expectedProject, project);
389
public void GetProject_NullPackageSourcePassed_UsesDefaultSourceToCreateProject()
392
var expectedSource = new PackageSource("http://sharpdevelop.net");
393
host.ActivePackageSource = expectedSource;
394
string packageSource = null;
396
host.GetProject(packageSource, "Test");
398
PackageSource actualSource = fakeSolution.PackageSourcePassedToGetProject;
400
Assert.AreEqual(expectedSource, actualSource);
404
public void GetProject_NullProjectPassed_UsesDefaultProjectToCreateProject()
407
string source = "http://sharpdevelop.net";
408
TestableProject project = ProjectHelper.CreateTestProject("Test");
409
host.DefaultProject = project;
411
host.GetProject(source, null);
413
string projectName = fakeSolution.ProjectNamePassedToGetProject;
415
Assert.AreEqual("Test", projectName);
419
public void GetProject_ProjectNameAndRepositoryPassed_ProjectNameUsedToGetProject()
422
var repository = new FakePackageRepository();
423
string expectedProjectName = "Test";
425
host.GetProject(repository, expectedProjectName);
427
string actualProjectName = fakeSolution.ProjectNamePassedToGetProject;
429
Assert.AreEqual(expectedProjectName, actualProjectName);
433
public void GetProject_ProjectNameAndRepositoryPassed_RepositoryUsedToGetProject()
436
var repository = new FakePackageRepository();
438
host.GetProject(repository, "Test");
440
IPackageRepository actualRepository = fakeSolution.RepositoryPassedToGetProject;
442
Assert.AreEqual(repository, actualRepository);
446
public void GetProject_ProjectNameAndRepositoryPassed_ReturnsProject()
449
var repository = new FakePackageRepository();
451
IPackageManagementProject project = host.GetProject(repository, "Test");
453
FakePackageManagementProject expectedProject = fakeSolution.FakeProjectToReturnFromGetProject;
455
Assert.AreEqual(expectedProject, project);
459
public void GetProject_NullProjectNameAndNonNullRepositoryPassed_UsesDefaultProjectNameToCreateProject()
462
host.DefaultProject = ProjectHelper.CreateTestProject("MyProject");
463
var repository = new FakePackageRepository();
465
IPackageManagementProject project = host.GetProject(repository, null);
467
string projectName = fakeSolution.ProjectNamePassedToGetProject;
469
Assert.AreEqual("MyProject", projectName);
473
public void ActivePackageSource_ConsoleHostCreated_ReturnsRegisteredPackageSourcesActivePackageSource()
476
var expectedPackageSource = new PackageSource("Test");
477
fakeRegisteredPackageRepositories.ActivePackageSource = expectedPackageSource;
479
PackageSource actualPackageSource = host.ActivePackageSource;
481
Assert.AreEqual(expectedPackageSource, actualPackageSource);
485
public void ActivePackageSource_ActivePackageSourceChanged_RegisteredPackageSourcesActivePackageSourceIsUpdated()
488
var expectedPackageSource = new PackageSource("Test");
489
host.ActivePackageSource = expectedPackageSource;
491
PackageSource actualPackageSource = fakeRegisteredPackageRepositories.ActivePackageSource;
493
Assert.AreEqual(expectedPackageSource, actualPackageSource);
497
public void Clear_ConsoleWindowHasOutputText_ScriptingConsoleIsCleared()
502
bool cleared = scriptingConsole.IsClearCalled;
504
Assert.IsTrue(cleared);
508
public void WritePrompt_ConsoleWindowHasOutputText_PromptWritten()
514
var expectedTextPassedToWrite = new String[] { "PM> "};
515
List<string> actualTextPassedToWrite = scriptingConsole.AllTextPassedToWrite;
517
CollectionAssert.AreEqual(expectedTextPassedToWrite, actualTextPassedToWrite);
521
public void IsRunning_BeforeRunCalled_ReturnsFalse()
524
bool running = host.IsRunning;
526
Assert.IsFalse(running);
530
public void IsRunning_AfterRunCalled_ReturnsFalse()
534
bool running = host.IsRunning;
536
Assert.IsTrue(running);
540
public void Run_SolutionOpenWhenConsoleRun_InvokeInitializePackagesCmdletIsRun()
543
fakeSolution.IsOpen = true;
546
string expectedExecutedCommand = "Invoke-InitializePackages";
548
bool executed = powerShellHost.AllCommandsPassedToExecuteCommand.Contains(expectedExecutedCommand);
550
Assert.IsTrue(executed);
554
public void Run_SolutionIsNotOpenWhenConsoleRun_InvokeInitializePackagesCmdletIsNotRun()
557
fakeSolution.IsOpen = false;
560
string command = "Invoke-InitializePackages";
562
bool executed = powerShellHost.AllCommandsPassedToExecuteCommand.Contains(command);
564
Assert.IsFalse(executed);
568
public void Run_SolutionIsNotOpenWhenConsoleRun_PowerShellWorkingDirectoryIsUpdated()
571
fakeSolution.IsOpen = false;
574
string command = "Invoke-UpdateWorkingDirectory";
576
bool executed = powerShellHost.AllCommandsPassedToExecuteCommand.Contains(command);
578
Assert.IsTrue(executed);
582
public void Run_SolutionIsOpenWhenConsoleRun_PowerShellWorkingDirectoryIsUpdated()
585
fakeSolution.IsOpen = true;
588
string command = "Invoke-UpdateWorkingDirectory";
590
bool executed = powerShellHost.AllCommandsPassedToExecuteCommand.Contains(command);
592
Assert.IsTrue(executed);
596
public void ShutdownConsole_ScriptingConsoleCreated_DisposesScriptingConsole()
599
host.ShutdownConsole();
601
bool disposed = host.FakeScriptingConsole.IsDisposeCalled;
603
Assert.IsTrue(disposed);
607
public void ShutdownConsole_ScriptingConsoleIsNull_NullReferenceExceptionIsNotThrown()
610
host.ScriptingConsole = null;
612
Assert.DoesNotThrow(() => host.ShutdownConsole());
616
public void ExecuteCommand_ScriptingConsoleCreated_SendsCommandToScriptingConsole()
619
host.ExecuteCommand("test");
621
string text = host.FakeScriptingConsole.TextPassedToSendLine;
622
string expectedText = "test";
624
Assert.AreEqual(expectedText, text);
628
public void GetPackageRepository_PackageSourceSpecified_ReturnsPackageRepositoryFromRegisteredRepositories()
632
var packageSource = new PackageSource("Test");
633
IPackageRepository repository = host.GetPackageRepository(packageSource);
634
FakePackageRepository expectedRepository = fakeRegisteredPackageRepositories.FakePackageRepository;
636
Assert.AreEqual(expectedRepository, repository);
640
public void GetPackageRepository_PackageSourceSpecified_PackagSourceUsedToGetRepository()
644
var expectedPackageSource = new PackageSource("Test");
645
IPackageRepository repository = host.GetPackageRepository(expectedPackageSource);
646
PackageSource packageSource = fakeRegisteredPackageRepositories.PackageSourcePassedToCreateRepository;
648
Assert.AreEqual(expectedPackageSource, packageSource);