// Copyright (c) .NET Foundation and contributors. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System; using System.IO; using System.Linq; using Microsoft.DotNet.Tools.Test.Utilities; using Xunit; namespace Microsoft.DotNet.Cli.Utils { public class BuiltInCommandTests : TestBase { /// /// Tests that BuiltInCommand.Execute returns the correct exit code and a /// valid StartInfo FileName and Arguments. /// [Fact] public void TestExecute() { Func testCommand = args => args.Length; string[] testCommandArgs = new[] { "1", "2" }; var builtInCommand = new BuiltInCommand("fakeCommand", testCommandArgs, testCommand); CommandResult result = builtInCommand.Execute(); Assert.Equal(testCommandArgs.Length, result.ExitCode); Assert.Equal(new Muxer().MuxerPath, result.StartInfo.FileName); Assert.Equal("fakeCommand 1 2", result.StartInfo.Arguments); } /// /// Tests that BuiltInCommand.Execute raises the OnOutputLine and OnErrorLine /// the correct number of times and with the correct content. /// [Fact] public void TestOnOutputLines() { const int exitCode = 29; TestBuiltInCommandEnvironment environment = new TestBuiltInCommandEnvironment(); Func testCommand = args => { TextWriter outWriter = environment.GetConsoleOut(); outWriter.Write("first"); outWriter.WriteLine("second"); outWriter.WriteLine("third"); TextWriter errorWriter = environment.GetConsoleError(); errorWriter.WriteLine("fourth"); errorWriter.WriteLine("fifth"); return exitCode; }; int onOutputLineCallCount = 0; int onErrorLineCallCount = 0; CommandResult result = new BuiltInCommand("fakeCommand", Enumerable.Empty(), testCommand, environment) .OnOutputLine(line => { onOutputLineCallCount++; if (onOutputLineCallCount == 1) { Assert.Equal($"firstsecond", line); } else { Assert.Equal($"third", line); } }) .OnErrorLine(line => { onErrorLineCallCount++; if (onErrorLineCallCount == 1) { Assert.Equal($"fourth", line); } else { Assert.Equal($"fifth", line); } }) .Execute(); Assert.Equal(exitCode, result.ExitCode); Assert.Equal(2, onOutputLineCallCount); Assert.Equal(2, onErrorLineCallCount); } private class TestBuiltInCommandEnvironment : IBuiltInCommandEnvironment { private TextWriter _consoleOut; private TextWriter _consoleError; public TextWriter GetConsoleOut() { return _consoleOut; } public void SetConsoleOut(TextWriter newOut) { _consoleOut = newOut; } public TextWriter GetConsoleError() { return _consoleError; } public void SetConsoleError(TextWriter newError) { _consoleError = newError; } public string GetWorkingDirectory() { return Directory.GetCurrentDirectory(); } public void SetWorkingDirectory(string path) { // no-op } } } }