public void ShouldSerializeAndSerializeFileChange()
            {
                // Given
                var expected = new FileChange
                {
                    Buffer   = "buffer",
                    FileName = "fileName",
                    FromDisk = true
                };

                expected.LineChanges.Add(new LineChange
                {
                    StartColumn = 1,
                    EndColumn   = 2,
                    StartLine   = 3,
                    EndLine     = 4,
                    NewText     = "5"
                });

                // When
                FileChangeSerializer.Serialize(_fixture.Writer, expected);
                _fixture.ResetStreamPosition();
                var actual = FileChangeSerializer.Deserialize(_fixture.Reader);

                // Then
                Assert.NotNull(actual);
                Assert.Equal(expected.Buffer, actual.Buffer);
                Assert.Equal(expected.FileName, actual.FileName);
                Assert.Equal(expected.FromDisk, actual.FromDisk);
                Assert.Equal(expected.LineChanges, actual.LineChanges);
            }
            public void ShouldThrowIfCakeScriptIsNull()
            {
                // Given, When
                var exception = Record.Exception(() => FileChangeSerializer.Serialize(_fixture.Writer, null)) as ArgumentNullException;

                // Then
                Assert.NotNull(exception);
                Assert.Equal("fileChange", exception.ParamName);
            }
            public void ShouldThrowIfWriterIsNull()
            {
                // Given, When
                var exception = Record.Exception(() => FileChangeSerializer.Serialize(null, FileChange.Empty)) as ArgumentNullException;

                // Then
                Assert.NotNull(exception);
                Assert.Equal("writer", exception.ParamName);
            }
        public CakeScript Generate(FileChange fileChange)
        {
            _initializedEvent.WaitOne();

            lock (_sendReceiveLock)
            {
                // Send
                _logger.LogDebug("Sending request to server");
                FileChangeSerializer.Serialize(_writer, fileChange, Constants.Protocol.Latest);
                _writer.Flush();

                while (!_stream.DataAvailable)
                {
                    Task.Delay(10).Wait();
                }

                // Receive
                _logger.LogDebug("Received response from server");
                return(CakeScriptSerializer.Deserialize(_reader));
            }
        }
            public void ShouldSerializeNullLineChangeAsEmpty()
            {
                // Given
                var expected = new FileChange();

                expected.LineChanges.Add(new LineChange
                {
                    StartColumn = 1,
                    EndColumn   = 2,
                    StartLine   = 3,
                    EndLine     = 4,
                    NewText     = "5"
                });
                expected.LineChanges.Add(null);
                expected.LineChanges.Add(new LineChange
                {
                    StartColumn = 6,
                    EndColumn   = 7,
                    StartLine   = 8,
                    EndLine     = 9,
                    NewText     = "10"
                });

                // When
                FileChangeSerializer.Serialize(_fixture.Writer, expected, Constants.Protocol.Latest);
                _fixture.ResetStreamPosition();
                var actual = FileChangeSerializer.Deserialize(_fixture.Reader, out var version);

                // Then
                Assert.NotNull(actual);
                Assert.Equal(Constants.Protocol.V2, version);
                Assert.Equal(expected.LineChanges.ElementAt(0), actual.LineChanges.ElementAt(0));
                Assert.Equal(new LineChange {
                    NewText = string.Empty
                }, actual.LineChanges.ElementAt(1));
                Assert.Equal(expected.LineChanges.ElementAt(2), actual.LineChanges.ElementAt(2));
            }
            public void ShouldSerializeNewLine(string lineEnding)
            {
                // Given
                var expected = new FileChange();

                expected.LineChanges.Add(new LineChange
                {
                    StartColumn = 0,
                    EndColumn   = 0,
                    StartLine   = 0,
                    EndLine     = 0,
                    NewText     = lineEnding
                });

                // When
                FileChangeSerializer.Serialize(_fixture.Writer, expected, Constants.Protocol.Latest);
                _fixture.ResetStreamPosition();
                var actual = FileChangeSerializer.Deserialize(_fixture.Reader, out var version);

                // Then
                Assert.NotNull(actual);
                Assert.Equal(Constants.Protocol.V2, version);
                Assert.Equal(expected.LineChanges.ElementAt(0), actual.LineChanges.ElementAt(0));
            }