public void ShouldIdentifyPositionsAtClassScope()
        {
            CodeNavigator navigator = new CodeNavigator(snapshot);
            Assert.IsFalse(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(1).End - 1));
            Assert.IsFalse(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(2).End - 1));
            Assert.IsFalse(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(3).End - 1));
            Assert.IsFalse(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(4).Start ));

            Assert.IsTrue(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(4).End - 1));
            Assert.IsTrue(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(5).End - 1));
            Assert.IsTrue(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(6).End - 1));

            Assert.IsFalse(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(7).End - 1));
            Assert.IsFalse(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(8).End - 1));
            Assert.IsFalse(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(9).End - 1));
            Assert.IsFalse(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(10).End - 1));
            Assert.IsFalse(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(11).End - 1));

            Assert.IsTrue(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(12).End - 1));
            Assert.IsTrue(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(13).Start));

            Assert.IsFalse(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(13).End - 1));
            Assert.IsFalse(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(14).End - 1));
            Assert.IsFalse(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(15).Start));

            Assert.IsTrue(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(15).End - 1));
            Assert.IsTrue(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(16).End - 1));
            Assert.IsTrue(navigator.IsInClassScope(snapshot.GetLineFromLineNumber(17).End - 1));
        }
        private int FindLineAfterWhichToInsertFieldDeclaration(ITextSnapshot snapshot, int p)
        {
            CodeNavigator navigator = new CodeNavigator(snapshot);

            foreach (int significantPoint in navigator.UpFrom(p))
            {
                if (navigator.IsInClassScope(significantPoint))
                {
                    return(snapshot.GetLineNumberFromPosition(significantPoint));
                }
            }
            return(-1);
        }
        private int FindLineBeforeWhichToInsertMethodStatement(ITextSnapshot snapshot, int p)
        {
            CodeNavigator navigator        = new CodeNavigator(snapshot);
            int           lastLineOfMethod = -1;

            foreach (int significantPoint in navigator.DownFrom(p))
            {
                lastLineOfMethod = significantPoint;
            }
            if (lastLineOfMethod > 0)
            {
                return(snapshot.GetLineNumberFromPosition(lastLineOfMethod));
            }
            return(-1);
        }
        private int FindLineAfterWhichToInsertDeclaration(ITextSnapshot snapshot, int p)
        {
            CodeNavigator     navigator = new CodeNavigator(snapshot);
            IEnumerator <int> point     = navigator.UpFrom(p).GetEnumerator();
            int  originalLine           = snapshot.GetLineNumberFromPosition(p);
            int  lineNumber             = -1;
            bool notEOF;

            do
            {
                notEOF     = point.MoveNext();
                lineNumber = snapshot.GetLineNumberFromPosition(point.Current);
            }while(lineNumber == originalLine && notEOF);
            if (lineNumber == originalLine)
            {
                lineNumber = -1;
            }
            return(lineNumber);
        }
 private int FindLineBeforeWhichToInsertMethodStatement(ITextSnapshot snapshot, int p)
 {
     CodeNavigator navigator = new CodeNavigator(snapshot);
     int lastLineOfMethod = -1;
     foreach (int significantPoint in navigator.DownFrom(p))
     {
         lastLineOfMethod = significantPoint;
     }
     if (lastLineOfMethod > 0) return snapshot.GetLineNumberFromPosition(lastLineOfMethod);
     return -1;
 }
 private int FindLineAfterWhichToInsertFieldDeclaration(ITextSnapshot snapshot, int p)
 {
     CodeNavigator navigator = new CodeNavigator(snapshot);
     foreach (int significantPoint in navigator.UpFrom(p))
     {
         if (navigator.IsInClassScope(significantPoint)) return snapshot.GetLineNumberFromPosition(significantPoint);
     }
     return -1;
 }
 private int FindLineAfterWhichToInsertDeclaration(ITextSnapshot snapshot, int p)
 {
     CodeNavigator navigator = new CodeNavigator(snapshot);
     IEnumerator<int> point = navigator.UpFrom(p).GetEnumerator();
     int originalLine = snapshot.GetLineNumberFromPosition(p);
     int lineNumber = -1;
     bool notEOF;
     do
     {
         notEOF = point.MoveNext();
         lineNumber = snapshot.GetLineNumberFromPosition(point.Current);
     }
     while( lineNumber == originalLine && notEOF) ;
     if (lineNumber == originalLine) lineNumber = -1;
     return lineNumber;
 }
        public void ShouldNavigateDownThroughCodeIgnoringCommentsAndStrings()
        {
            int p = snapshot.GetLineFromLineNumber(17).End - 1;
            CodeNavigator navigator = new CodeNavigator(snapshot);

            List<int> positions = new List<int>();
            foreach (int c in navigator.DownFrom(p))
            {
                positions.Add(c);
            }
            Assert.AreEqual(2, positions.Count);
            VerifyCharAndLineAtPosition(positions[0], '}', 23);
            VerifyCharAndLineAtPosition(positions[1], '}', 24);
        }
        public void ShouldNavigateUpThroughCodeIgnoringCommentsAndStrings()
        {
            int p = snapshot.GetLineFromLineNumber(10).End - 1;
            CodeNavigator navigator = new CodeNavigator(snapshot);

            Stack<int> positions = new Stack<int>();
            foreach (int c in navigator.UpFrom(p))
            {
                positions.Push(c);
            }

            Assert.AreEqual(0, positions.Pop());

            VerifyCharAndLineAtPosition(positions.Pop(), '{', 2);
            VerifyCharAndLineAtPosition(positions.Pop(), '{', 4);
            VerifyCharAndLineAtPosition(positions.Pop(), ';', 5);
            VerifyCharAndLineAtPosition(positions.Pop(), '{', 7);
            VerifyCharAndLineAtPosition(positions.Pop(), ';', 9);
            VerifyCharAndLineAtPosition(positions.Pop(), ';', 10);
        }
        public void ShouldNavigateUpThroughCodeIgnoringCodeAtDeeperScope()
        {
            int p = snapshot.GetLineFromLineNumber(21).End - 1;
            CodeNavigator navigator = new CodeNavigator(snapshot);

            Stack<int> positions = new Stack<int>();
            foreach (int c in navigator.UpFrom(p))
            {
                positions.Push(c);
            }

            Assert.AreEqual(0, positions.Pop());
            VerifyCharAndLineAtPosition(positions.Pop(), '{', 2);
            VerifyCharAndLineAtPosition(positions.Pop(), '{', 15);
            VerifyCharAndLineAtPosition(positions.Pop(), ';', 16);
            VerifyCharAndLineAtPosition(positions.Pop(), '{', 18);
            VerifyCharAndLineAtPosition(positions.Pop(), '{', 19);
            VerifyCharAndLineAtPosition(positions.Pop(), '{', 20);
            VerifyCharAndLineAtPosition(positions.Pop(), ';', 21);
        }
        public void ShouldNavigateUpOneLevel()
        {
            int p = snapshot.GetLineFromLineNumber(3).End - 1;
            CodeNavigator navigator = new CodeNavigator(snapshot);

            Stack<int> positions = new Stack<int>();
            foreach (int c in navigator.UpFrom(p))
            {
                positions.Push(c);
            }

            Assert.AreEqual(2, positions.Count);

            Assert.AreEqual(0, positions.Pop());

            VerifyCharAndLineAtPosition(positions.Pop(), '{', 2);
        }
        public void ShouldNavigateDownThroughCodeIncludingStatementsInSameScope()
        {
            int p = snapshot.GetLineFromLineNumber(6).End - 1;
            CodeNavigator navigator = new CodeNavigator(snapshot);

            List<int> positions = new List<int>();
            foreach (int c in navigator.DownFrom(p))
            {
                positions.Add(c);
            }
            Assert.AreEqual(5, positions.Count);
            VerifyCharAndLineAtPosition(positions[0], ';', 9);
            VerifyCharAndLineAtPosition(positions[1], ';', 10);
            VerifyCharAndLineAtPosition(positions[2], ';', 11);
            VerifyCharAndLineAtPosition(positions[3], ';', 11);
            VerifyCharAndLineAtPosition(positions[4], '}', 12);
        }