public void ExitStatus_ReturnsExitCodeIfProcessHasExitedButNotBeenDisposedOf()
        {
            Process dummyProcess = null;

            try
            {
                // Arrange
                dummyProcess = CreateProcess();
                NodeJSProcess testSubject = CreateNodeJSProcess(dummyProcess);

                // Act
                testSubject.Kill();
                dummyProcess.WaitForExit();
                string result = testSubject.ExitStatus;

                // Assert
                Assert.NotEmpty(result); // Can't gaurantee what exit code will be returned on all platforms
            }
            finally
            {
                try
                {
                    dummyProcess?.Kill();
                }
                catch
                {
                    // If Kill throws, process has already terminated
                }
                finally
                {
                    dummyProcess?.Dispose();
                }
            }
        }
        public void ExitStatus_ReturnsExitStatusNotExitedMessageIfProcessHasNotExited()
        {
            Process dummyProcess = null;

            try
            {
                // Arrange
                dummyProcess = CreateProcess();
                NodeJSProcess testSubject = CreateNodeJSProcess(dummyProcess);

                // Act
                string result = testSubject.ExitStatus;

                // Assert
                Assert.Equal(NodeJSProcess.EXIT_STATUS_NOT_EXITED, result);
            }
            finally
            {
                try
                {
                    dummyProcess?.Kill();
                }
                catch
                {
                    // If Kill throws, process has already terminated
                }
                finally
                {
                    dummyProcess?.Dispose();
                }
            }
        }
        public void ExitStatus_ReturnsExitStatusDisposedIfProcessHasBeenDisposed()
        {
            // Arrange
            using (NodeJSProcess testSubject = CreateNodeJSProcess())
            {
                // Act
                testSubject.Dispose();
                string result = testSubject.ExitStatus;

                // Assert
                Assert.Equal(NodeJSProcess.EXIT_STATUS_DISPOSED, result);
            }
        }
        public void TryCreateMessage_AppendsDataToStringBuilderAndReturnsFalseIfTheDataDoesNotEndWithANullTerminatingCharacter(string dummyData)
        {
            // Arrange
            var           dummyStringBuilder = new StringBuilder();
            NodeJSProcess testSubject        = CreateNodeJSProcess();

            // Act
            bool result = testSubject.TryCreateMessage(dummyStringBuilder, dummyData, out string resultMessage);

            // Assert
            Assert.False(result);
            Assert.Null(resultMessage);
            Assert.Equal(dummyData + "\n", dummyStringBuilder.ToString(), ignoreLineEndingDifferences: true);
        }
        public void TryCreateMessage_ResetsStringBuilderReturnsTrueAndAMessageIfTheDataEndsWithANullTerminatingCharacter()
        {
            // Arrange
            var           dummyStringBuilder = new StringBuilder();
            const string  dummyData          = "dummyData";
            string        dummyDataWithNullTerminatingCharacter = $"{dummyData}\0";
            NodeJSProcess testSubject = CreateNodeJSProcess();

            // Act
            bool result = testSubject.TryCreateMessage(dummyStringBuilder, dummyDataWithNullTerminatingCharacter, out string resultMessage);

            // Assert
            Assert.True(result);
            Assert.Equal(dummyData, resultMessage);
            Assert.Equal(0, dummyStringBuilder.Length);
        }
        public void ExitStatus_ReturnsExitStatusNotExitedMessageIfProcessHasNotExited()
        {
            // Arrange
            Process dummyProcess = CreateNodeJSProcess();
            Mock <NodeJSProcess> mockTestSubject = _mockRepository.Create <NodeJSProcess>(dummyProcess);

            mockTestSubject.CallBase = true;
            using (NodeJSProcess testSubject = mockTestSubject.Object)
            {
                // Act
                string result = mockTestSubject.Object.ExitStatus;

                // Assert
                Assert.Equal(NodeJSProcess.EXIT_STATUS_NOT_EXITED, result);
            }
        }
        public void ExitStatus_ReturnsExitStatusDisposedIfProcessHasBeenDisposed()
        {
            // Arrange
            Process dummyProcess = CreateNodeJSProcess();
            Mock <NodeJSProcess> mockTestSubject = _mockRepository.Create <NodeJSProcess>(dummyProcess);

            mockTestSubject.CallBase = true;
            using (NodeJSProcess testSubject = mockTestSubject.Object)
            {
                // Act
                testSubject.Dispose();
                string result = mockTestSubject.Object.ExitStatus;

                // Assert
                Assert.Equal(NodeJSProcess.EXIT_STATUS_DISPOSED, result);
            }
        }
        public void ExitStatus_ReturnsExitCodeIfProcessHasExitedButNotBeenDisposedOf()
        {
            // Arrange
            Process dummyProcess = CreateNodeJSProcess();
            Mock <NodeJSProcess> mockTestSubject = _mockRepository.Create <NodeJSProcess>(dummyProcess);

            mockTestSubject.CallBase = true;
            using (NodeJSProcess testSubject = mockTestSubject.Object)
            {
                // Act
                testSubject.Kill();
                dummyProcess.WaitForExit();
                string result = mockTestSubject.Object.ExitStatus;

                // Assert
                Assert.NotEmpty(result); // Can't gaurantee what exit code will be returned on all platforms
            }
        }