private string Rename(string buffer, string renameTo)
        {
            var location = TestHelpers.GetLineAndColumnFromDollar(buffer);

            buffer = buffer.Replace("$", "");

            var solution = new FakeSolutionBuilder()
                           .AddFile(buffer)
                           .Build();

            var bufferParser  = new BufferParser(solution);
            var renameHandler = new RenameHandler(solution, bufferParser);
            var request       = new RenameRequest
            {
                Buffer   = buffer,
                Column   = location.Column - 1,
                Line     = location.Line,
                RenameTo = renameTo,
                FileName = "myfile"
            };

            var response = renameHandler.Rename(request);

            if (response.Changes.Any())
            {
                return(response.Changes.First().Buffer);
            }
            return(buffer);
        }
        private IEnumerable<ModifiedFileResponse> Rename(string renameTo, params Buffer[] buffers)
        {
            RenameRequest request = null;
            var solutionBuilder = new FakeSolutionBuilder();
            foreach (var buffer in buffers)
            {
                if (buffer.Text.Contains("$"))
                {
                    var location = TestHelpers.GetLineAndColumnFromDollar(buffer.Text);
                    buffer.Text = buffer.Text.Replace("$", "");
                    request = new RenameRequest
                    {
                        Buffer = buffer.Text,
                        Column = location.Column - 1,
                        Line = location.Line,
                        RenameTo = renameTo,
                        FileName = buffer.Filename
                    };
                }
                //solutionBuilder = solutionBuilder.AddProject();
                solutionBuilder = solutionBuilder.AddFile(buffer.Text, buffer.Filename);
            }
            var solution = solutionBuilder.Build();
            var bufferParser = new BufferParser(solution);
            var renameHandler = new RenameHandler(solution, bufferParser, new OmniSharpConfiguration());

            var response = renameHandler.Rename(request);
            return response.Changes;
        }
        public void Should_insert_stub_method_override()
        {
            var buffer = 
@"
public class WeirdString : String
{
$
}";
            var location = TestHelpers.GetLineAndColumnFromDollar(buffer);
            buffer = buffer.Replace("$","");
            var request = new RunOverrideTargetRequest { Buffer = buffer, FileName = "myfile.cs", Line = location.Line, Column = location.Column };
            var solution = new FakeSolutionBuilder().AddFile(buffer, "myfile.cs").Build();
            var parser = new BufferParser(solution);
            var handler = new OverrideHandler (parser, new OmniSharpConfiguration ());
            request.OverrideTargetName = "public virtual string ToString ();";
            var response = handler.RunOverrideTarget (request);
            string expected = 
@"
public class WeirdString : String
{

    public override string ToString()
    {
        throw new System.NotImplementedException();
    }
}";
            string result = response.Buffer.Replace ("\r\n", "\n");
            result.ShouldEqual(expected);
        }
        private IEnumerable <ModifiedFileResponse> Rename(string renameTo, params Buffer[] buffers)
        {
            RenameRequest request         = null;
            var           solutionBuilder = new FakeSolutionBuilder();

            foreach (var buffer in buffers)
            {
                if (buffer.Text.Contains("$"))
                {
                    var location = TestHelpers.GetLineAndColumnFromDollar(buffer.Text);
                    buffer.Text = buffer.Text.Replace("$", "");
                    request     = new RenameRequest
                    {
                        Buffer   = buffer.Text,
                        Column   = location.Column - 1,
                        Line     = location.Line,
                        RenameTo = renameTo,
                        FileName = buffer.Filename
                    };
                }
                //solutionBuilder = solutionBuilder.AddProject();
                solutionBuilder = solutionBuilder.AddFile(buffer.Text, buffer.Filename);
            }
            var solution      = solutionBuilder.Build();
            var bufferParser  = new BufferParser(solution);
            var renameHandler = new RenameHandler(solution, bufferParser, new OmniSharpConfiguration(), new FindUsagesHandler(bufferParser, solution, new ProjectFinder(solution)));

            var response = renameHandler.Rename(request);

            return(response.Changes);
        }
        private string Rename(string buffer, string renameTo)
        {
            var location = TestHelpers.GetLineAndColumnFromDollar(buffer);
            buffer = buffer.Replace("$", "");
            
            var solution = new FakeSolutionBuilder()
                .AddFile(buffer)
                .Build();
            
            var bufferParser = new BufferParser(solution);
            var renameHandler = new RenameHandler(solution, bufferParser, new OmniSharpConfiguration(), new FindUsagesHandler(bufferParser, solution, new ProjectFinder(solution)));
            var request = new RenameRequest
                {
                    Buffer = buffer,
                    Column = location.Column - 1,
                    Line = location.Line,
                    RenameTo = renameTo,
                    FileName = "myfile"
                };

            var response = renameHandler.Rename(request);
            if(response.Changes.Any())
                return response.Changes.First().Buffer;
            return buffer;
        }
        public void Should_find_type_implementations_in_all_files()
        {
            const string editorText1 =
                @"
public abstract class BaseClass {}
public class DerivedClassA : BaseClass {}
";
            var fileName1 = "base.cs";

            const string editorText2 =
                @"
public class DerivedClassB : BaseClass {}
";
            var fileName2 = "derived.cs";

            var solution = new FakeSolutionBuilder()
                           .AddFile(editorText1, fileName1)
                           .AddFile(editorText2, fileName2)
                           .Build();

            var gotoImplementationResponse = FindDerivedMembersAsQuickFixes(solution, new GotoImplementationRequest
                {
                    Buffer = editorText1,
                    Line = 2,
                    Column = 23, // At word 'BaseClass'
                    FileName = fileName1
                });

            var quickFixes = gotoImplementationResponse.QuickFixes.ToArray();
            Assert.AreEqual(2, quickFixes.Length);
            quickFixes[0].Text.Trim().ShouldEqual("public class DerivedClassA : BaseClass {}");
            quickFixes[1].Text.Trim().ShouldEqual("public class DerivedClassB : BaseClass {}");
        }
        public void Should_find_type_implementations_in_same_file()
        {
            const string editorText =
                @"
public class BaseClass {}
public class DerivedClassA : BaseClass {}
public class DerivedClassB : BaseClass {}
public class DerivedClassC : BaseClass {}
";
            var fileName = "test.cs";
            
            var solution = new FakeSolutionBuilder()
                .AddFile(editorText, fileName)
                .Build();
            
            var gotoImplementationResponse = FindDerivedMembersAsQuickFixes(solution, new GotoImplementationRequest
                {
                    Buffer = editorText,
                    Line = 2,
                    Column = 14, // At word 'BaseClass'
                    FileName = fileName
                });

            var quickFixes = gotoImplementationResponse.QuickFixes.ToArray();
            Assert.AreEqual(3, quickFixes.Length);
            quickFixes[0].Text.Trim().ShouldEqual("public class DerivedClassA : BaseClass {}");
            quickFixes[1].Text.Trim().ShouldEqual("public class DerivedClassB : BaseClass {}");
            quickFixes[2].Text.Trim().ShouldEqual("public class DerivedClassC : BaseClass {}");
        }
        public void Should_not_offer_already_overridden_method()
        {
            var buffer = @"
public class WeirdString : String
{
    public override string ToString()
    {
        return ""weird"";
    }
$
}";
            var location = TestHelpers.GetLineAndColumnFromDollar(buffer);
            var request = new Request { Buffer = buffer, FileName = "myfile.cs", Line = location.Line, Column = location.Column };
            var solution = new FakeSolutionBuilder().AddFile(buffer, "myfile.cs").Build();
            var parser = new BufferParser(solution);
           
            var context = new OverrideContext(request, parser);
            var overrides = context.OverrideTargets.Select(m => m.OverrideTargetName).ToArray();
            overrides.ShouldNotContain("public virtual string ToString ();");

        }
 public static FixUsingsResponse GetFixUsingsResponse(this string buffer)
 {
     var solution = new FakeSolutionBuilder().AddFile(buffer).Build();
     var bufferParser = new BufferParser(solution);
     var handler = new FixUsingsHandler(bufferParser, new Logger(Verbosity.Quiet), new OmniSharpConfiguration());
     var request = new Request();
     request.Buffer = buffer;
     request.FileName = "myfile";
     // line number should be irrelevant
     request.Line = int.MaxValue;
     var response = handler.FixUsings(request);
     return response;
 }
        public void Should_find_member_implementations_in_all_projects()
        {
            const string editorText1 =
                @"
public interface IBase 
{
void Test();
}
public class ImplementationA : IBase
{ 
public void Test() {} //ImplementationA
}
";
            var fileName1 = "base.cs";

            const string editorText2 =
                @"
public class ImplementationB : IBase 
{ 
public void Test() {} //ImplementationB
}
";
            var fileName2 = "derived.cs";

            var solution = new FakeSolutionBuilder()
                           .AddFile(editorText1, fileName1)
                           .AddProject()
                           .AddFile(editorText2, fileName2)
                           .Build();

            var gotoImplementationResponse = FindDerivedMembersAsQuickFixes(solution, new GotoImplementationRequest
                {
                    Buffer = editorText1,
                    Line = 4,
                    Column = 6, // IBase Test
                    FileName = fileName1
                });

            var quickFixes = gotoImplementationResponse.QuickFixes.ToArray();
            Assert.AreEqual(2, quickFixes.Length);
            quickFixes[0].Text.Trim().ShouldEqual("public void Test() {} //ImplementationA");
            quickFixes[1].Text.Trim().ShouldEqual("public void Test() {} //ImplementationB");
        }
        public void Should_find_member_implementations_in_same_file()
        {
            const string editorText =
                @"
public class BaseClass { public virtual void Test() {} }
public class DerivedClassA : BaseClass 
{ 
public override void Test() {} //DerivedClassA impl
}
public class DerivedClassB : BaseClass 
{ 
public override void Test() {} //DerivedClassB impl
}
";
            var fileName = "test.cs";

            var solution = new FakeSolutionBuilder()
                .AddFile(editorText, fileName)
                .Build();

            var gotoImplementationResponse = FindDerivedMembersAsQuickFixes(solution, new GotoImplementationRequest
                {
                    Buffer = editorText,
                    Line = 2,
                    Column = 46, //BaseClass Test
                    FileName = fileName
                });

            var quickFixes = gotoImplementationResponse.QuickFixes.ToArray();
            Assert.AreEqual(2, quickFixes.Length);
            quickFixes[0].Text.Trim().ShouldEqual("public override void Test() {} //DerivedClassA impl");
            quickFixes[1].Text.Trim().ShouldEqual("public override void Test() {} //DerivedClassB impl");
        }