comphelper/qa/unit/syntaxhighlighttest.cxx | 89 +++++++++++++++++++++++++++-- comphelper/source/misc/syntaxhighlight.cxx | 19 +++--- 2 files changed, 95 insertions(+), 13 deletions(-)
New commits: commit 0827aba84e1adec902c4d704651a1027b01c5335 Author: Stephan Bergmann <sberg...@redhat.com> Date: Mon Oct 28 10:44:28 2013 +0100 Correctly fix "Terminating NUL" fix 1cbe2313edda8a04f0fe233b4a29ef4e2485f557 "Terminating NUL at end of its buffer is not considered part of OUString" was a thinko that cut the last character off the last reported HighlightPortion on a line. Change-Id: Idbe74676e85749cd93854293c6f49c7581414562 diff --git a/comphelper/qa/unit/syntaxhighlighttest.cxx b/comphelper/qa/unit/syntaxhighlighttest.cxx index c576f7b..294db3e 100644 --- a/comphelper/qa/unit/syntaxhighlighttest.cxx +++ b/comphelper/qa/unit/syntaxhighlighttest.cxx @@ -21,13 +21,94 @@ class SyntaxHighlightTest : public CppUnit::TestFixture { public: void testBasicString(); + void testBasicComment(); + void testBasicCommentNewline(); + void testBasicEmptyComment(); + void testBasicEmptyCommentNewline(); + void testBasic(); CPPUNIT_TEST_SUITE(SyntaxHighlightTest); CPPUNIT_TEST(testBasicString); + CPPUNIT_TEST(testBasicComment); + CPPUNIT_TEST(testBasicCommentNewline); + CPPUNIT_TEST(testBasicEmptyComment); + CPPUNIT_TEST(testBasicEmptyCommentNewline); + CPPUNIT_TEST(testBasic); CPPUNIT_TEST_SUITE_END(); }; -void SyntaxHighlightTest::testBasicString() +void SyntaxHighlightTest::testBasicString() { + SyntaxHighlighter h; + h.initialize(HIGHLIGHT_BASIC); + OUString s("\"foo\""); + std::vector<HighlightPortion> ps; + h.getHighlightPortions(0, s, ps); + CPPUNIT_ASSERT_EQUAL( + static_cast<std::vector<HighlightPortion>::size_type>(1), ps.size()); + CPPUNIT_ASSERT_EQUAL(0, ps[0].nBegin); + CPPUNIT_ASSERT_EQUAL(5, ps[0].nEnd); + CPPUNIT_ASSERT_EQUAL(TT_STRING, ps[0].tokenType); +} + +void SyntaxHighlightTest::testBasicComment() { + SyntaxHighlighter h; + h.initialize(HIGHLIGHT_BASIC); + OUString s("' foo"); + std::vector<HighlightPortion> ps; + h.getHighlightPortions(0, s, ps); + CPPUNIT_ASSERT_EQUAL( + static_cast<std::vector<HighlightPortion>::size_type>(1), ps.size()); + CPPUNIT_ASSERT_EQUAL(0, ps[0].nBegin); + CPPUNIT_ASSERT_EQUAL(5, ps[0].nEnd); + CPPUNIT_ASSERT_EQUAL(TT_COMMENT, ps[0].tokenType); +} + +void SyntaxHighlightTest::testBasicCommentNewline() { + SyntaxHighlighter h; + h.initialize(HIGHLIGHT_BASIC); + OUString s("' foo\n"); + std::vector<HighlightPortion> ps; + h.getHighlightPortions(0, s, ps); + CPPUNIT_ASSERT_EQUAL( + static_cast<std::vector<HighlightPortion>::size_type>(2), ps.size()); + CPPUNIT_ASSERT_EQUAL(0, ps[0].nBegin); + CPPUNIT_ASSERT_EQUAL(5, ps[0].nEnd); + CPPUNIT_ASSERT_EQUAL(TT_COMMENT, ps[0].tokenType); + CPPUNIT_ASSERT_EQUAL(5, ps[1].nBegin); + CPPUNIT_ASSERT_EQUAL(6, ps[1].nEnd); + CPPUNIT_ASSERT_EQUAL(TT_EOL, ps[1].tokenType); +} + +void SyntaxHighlightTest::testBasicEmptyComment() { + SyntaxHighlighter h; + h.initialize(HIGHLIGHT_BASIC); + OUString s("'"); + std::vector<HighlightPortion> ps; + h.getHighlightPortions(0, s, ps); + CPPUNIT_ASSERT_EQUAL( + static_cast<std::vector<HighlightPortion>::size_type>(1), ps.size()); + CPPUNIT_ASSERT_EQUAL(0, ps[0].nBegin); + CPPUNIT_ASSERT_EQUAL(1, ps[0].nEnd); + CPPUNIT_ASSERT_EQUAL(TT_COMMENT, ps[0].tokenType); +} + +void SyntaxHighlightTest::testBasicEmptyCommentNewline() { + SyntaxHighlighter h; + h.initialize(HIGHLIGHT_BASIC); + OUString s("'\n"); + std::vector<HighlightPortion> ps; + h.getHighlightPortions(0, s, ps); + CPPUNIT_ASSERT_EQUAL( + static_cast<std::vector<HighlightPortion>::size_type>(2), ps.size()); + CPPUNIT_ASSERT_EQUAL(0, ps[0].nBegin); + CPPUNIT_ASSERT_EQUAL(1, ps[0].nEnd); + CPPUNIT_ASSERT_EQUAL(TT_COMMENT, ps[0].tokenType); + CPPUNIT_ASSERT_EQUAL(1, ps[1].nBegin); + CPPUNIT_ASSERT_EQUAL(2, ps[1].nEnd); + CPPUNIT_ASSERT_EQUAL(TT_EOL, ps[1].tokenType); +} + +void SyntaxHighlightTest::testBasic() { OUString aBasicString(" if Mid(sText,iRun,1 )<> \" \" then Mid( sText ,iRun, 1, Chr( 1 + Asc( Mid(sText,iRun,1 )) ) '"); @@ -46,13 +127,6 @@ void SyntaxHighlightTest::testBasicString() prevEnd = itr->nEnd; } CPPUNIT_ASSERT_EQUAL(aBasicString.getLength(), prevEnd); - - // The last portion is an empty comment consisting just of the leading - // apostrophe: - assert(!aPortions.empty()); - CPPUNIT_ASSERT_EQUAL(98, aPortions.back().nBegin); - CPPUNIT_ASSERT_EQUAL(99, aPortions.back().nEnd); - CPPUNIT_ASSERT_EQUAL(TT_COMMENT, aPortions.back().tokenType); } CPPUNIT_TEST_SUITE_REGISTRATION(SyntaxHighlightTest); diff --git a/comphelper/source/misc/syntaxhighlight.cxx b/comphelper/source/misc/syntaxhighlight.cxx index 83bcb59..ca3207d 100644 --- a/comphelper/source/misc/syntaxhighlight.cxx +++ b/comphelper/source/misc/syntaxhighlight.cxx @@ -399,14 +399,13 @@ sal_Bool SimpleTokenizer_Impl::getNextToken( /*out*/TokenTypes& reType, // Comment? if ( c == '\'' ) { - c = getChar(); - - // Remove all characters until end of line or EOF - sal_Unicode cPeek = c; - while( cPeek != 0 && testCharFlags( cPeek, CHAR_EOL ) == sal_False ) - { + // Skip all characters until end of input or end of line: + for (;;) { + c = peekChar(); + if (c == 0 || testCharFlags(c, CHAR_EOL)) { + break; + } getChar(); - cPeek = peekChar(); } reType = TT_COMMENT; @@ -540,7 +539,7 @@ sal_Bool SimpleTokenizer_Impl::getNextToken( /*out*/TokenTypes& reType, // All other will remain TT_UNKNOWN // Save end position - rpEndPos = *mpActualPos == 0 ? mpActualPos - 1 : mpActualPos; + rpEndPos = mpActualPos; return sal_True; } commit 2733bc38f08c96552e31bda5e3fc34017c81b1c2 Author: Stephan Bergmann <sberg...@redhat.com> Date: Mon Oct 28 09:19:42 2013 +0100 Demonstrate that empty comments are handled just fine ...see preceding revert of a79cb836b951eb2492e43aadd2ee672b9b67b914 "COMPHELPER: Allow empty comments in SyntaxHighlight." Change-Id: Ib0a8c46c19dd7f0697b95a1c28398073a1183281 diff --git a/comphelper/qa/unit/syntaxhighlighttest.cxx b/comphelper/qa/unit/syntaxhighlighttest.cxx index 8fab067..c576f7b 100644 --- a/comphelper/qa/unit/syntaxhighlighttest.cxx +++ b/comphelper/qa/unit/syntaxhighlighttest.cxx @@ -14,6 +14,7 @@ #include "cppunit/plugin/TestPlugIn.h" #include "rtl/ustring.hxx" +#include <cassert> #include <vector> class SyntaxHighlightTest : public CppUnit::TestFixture @@ -45,6 +46,13 @@ void SyntaxHighlightTest::testBasicString() prevEnd = itr->nEnd; } CPPUNIT_ASSERT_EQUAL(aBasicString.getLength(), prevEnd); + + // The last portion is an empty comment consisting just of the leading + // apostrophe: + assert(!aPortions.empty()); + CPPUNIT_ASSERT_EQUAL(98, aPortions.back().nBegin); + CPPUNIT_ASSERT_EQUAL(99, aPortions.back().nEnd); + CPPUNIT_ASSERT_EQUAL(TT_COMMENT, aPortions.back().tokenType); } CPPUNIT_TEST_SUITE_REGISTRATION(SyntaxHighlightTest); commit a699e7c70d312c96d0dbb8eb4c31b81129dcf7b2 Author: Stephan Bergmann <sberg...@redhat.com> Date: Mon Oct 28 08:47:22 2013 +0100 Revert "COMPHELPER: Allow empty comments in SyntaxHighlight" This reverts commit a79cb836b951eb2492e43aadd2ee672b9b67b914, which broke --with-help builds again, as strLine.copy(i->nBegin, i->nEnd-i->nBegin) in BasicCodeTagger::tagParagraph (helpcompiler/source/BasCodeTagger.cxx) depends on the invariant that a HighlightPortion does not extend past the source string. Also, I see no reason for that change, as empty comments are handled just fine already as demonstrated by the following commit... Change-Id: I384bae9c4cf6a38d0a0a2832fa15bde82126cace diff --git a/comphelper/qa/unit/syntaxhighlighttest.cxx b/comphelper/qa/unit/syntaxhighlighttest.cxx index d26b855..8fab067 100644 --- a/comphelper/qa/unit/syntaxhighlighttest.cxx +++ b/comphelper/qa/unit/syntaxhighlighttest.cxx @@ -41,11 +41,10 @@ void SyntaxHighlightTest::testBasicString() aPortions.begin(), itrEnd = aPortions.end(); itr != itrEnd; ++itr) { CPPUNIT_ASSERT_EQUAL(prevEnd, itr->nBegin); - //The comment is empty, so empty zone - CPPUNIT_ASSERT(itr->nBegin <= itr->nEnd); + CPPUNIT_ASSERT(itr->nBegin < itr->nEnd); prevEnd = itr->nEnd; } - CPPUNIT_ASSERT_EQUAL(aBasicString.getLength() - 1, prevEnd); + CPPUNIT_ASSERT_EQUAL(aBasicString.getLength(), prevEnd); } CPPUNIT_TEST_SUITE_REGISTRATION(SyntaxHighlightTest); diff --git a/comphelper/source/misc/syntaxhighlight.cxx b/comphelper/source/misc/syntaxhighlight.cxx index c6340ef..83bcb59 100644 --- a/comphelper/source/misc/syntaxhighlight.cxx +++ b/comphelper/source/misc/syntaxhighlight.cxx @@ -399,14 +399,16 @@ sal_Bool SimpleTokenizer_Impl::getNextToken( /*out*/TokenTypes& reType, // Comment? if ( c == '\'' ) { - c = peekChar(); + c = getChar(); // Remove all characters until end of line or EOF sal_Unicode cPeek = c; while( cPeek != 0 && testCharFlags( cPeek, CHAR_EOL ) == sal_False ) { - cPeek = getChar(); + getChar(); + cPeek = peekChar(); } + reType = TT_COMMENT; } @@ -672,7 +674,7 @@ void SimpleTokenizer_Impl::getHighlightPortions( sal_uInt32 nParseLine, const OU const sal_Unicode* pEndPos; // Loop over all the tokens - while( getNextToken( eType, pStartPos, pEndPos ) ) + while( getNextToken( eType, pStartPos, pEndPos ) ) { portions.push_back( HighlightPortion( _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits