notepad-plus-plus/lexilla/test/unit/testSparseState.cxx
Christian Grasser a61b03ea88 Update Scintilla from v4.4.6 to v5.2.1 and add Lexilla v5.1.5
Update with https://www.scintilla.org/scintilla521.zip
            https://www.scintilla.org/lexilla515.zip

- fix setting to bring Scintilla::PositionCR from ScintillaStructures.h inline with Sci_Position.h Sci_PositionCR
- add workaround to enable lexer for searchResult
commented out SCI_SETILEXER call on searchResult to get one result which is correctly handled by the lexer,
added comment about the current problem with property @MarkingsStruct which seems to disappear after call to SCI_SETILEXER or CreateLexer
- corrected usage of ObjC lexer
- removed unnecessary filter stuff
- use own sections for scintilla and lexilla build targets and allow parallel builds
- as libscilex is no longer existing, changed to libscintilla
- adapt makefiles and cmake
- use VS2019
- started simple changes for createlexer adaptations, nullpointercheck missing on return of lexer name from deprecated LexerNameFromID -> undefined behaviour
- movement from id -> lexer name, mostly done via LexerNameFromID + switching off corresponding compiler warning
- changed to SCI_SETILEXER from SCI_SETLEXER, SCI_SETLEXERLANGUAGE needs to be corrected, see Scintilla5Migration.html
- just commented out: SCI_LOADLEXERLIBRARY

Fix #10504, close #11419
2022-03-27 17:12:53 +02:00

235 lines
4.9 KiB
C++

/** @file testSparseState.cxx
** Unit Tests for Lexilla internal data structures
**/
#include <string>
#include <string_view>
#include <vector>
#include <algorithm>
#include <memory>
#include "Sci_Position.h"
#include "SparseState.h"
#include "catch.hpp"
using namespace Lexilla;
// Test SparseState.
TEST_CASE("SparseState") {
SparseState<int> ss;
SECTION("IsEmptyInitially") {
REQUIRE(0u == ss.size());
int val = ss.ValueAt(0);
REQUIRE(0 == val);
}
SECTION("SimpleSetAndGet") {
ss.Set(0, 22);
ss.Set(1, 23);
REQUIRE(2u == ss.size());
REQUIRE(0 == ss.ValueAt(-1));
REQUIRE(22 == ss.ValueAt(0));
REQUIRE(23 == ss.ValueAt(1));
REQUIRE(23 == ss.ValueAt(2));
}
SECTION("RetrieveBetween") {
ss.Set(0, 10);
ss.Set(2, 12);
REQUIRE(2u == ss.size());
REQUIRE(0 == ss.ValueAt(-1));
REQUIRE(10 == ss.ValueAt(0));
REQUIRE(10 == ss.ValueAt(1));
REQUIRE(12 == ss.ValueAt(2));
}
SECTION("RetrieveBefore") {
ss.Set(2, 12);
REQUIRE(1u == ss.size());
REQUIRE(0 == ss.ValueAt(-1));
REQUIRE(0 == ss.ValueAt(0));
REQUIRE(0 == ss.ValueAt(1));
REQUIRE(12 == ss.ValueAt(2));
}
SECTION("Delete") {
ss.Set(0, 30);
ss.Set(2, 32);
ss.Delete(2);
REQUIRE(1u == ss.size());
REQUIRE(0 == ss.ValueAt(-1));
REQUIRE(30 == ss.ValueAt(0));
REQUIRE(30 == ss.ValueAt(1));
REQUIRE(30 == ss.ValueAt(2));
}
SECTION("DeleteBetween") {
ss.Set(0, 30);
ss.Set(2, 32);
ss.Delete(1);
REQUIRE(1u == ss.size());
REQUIRE(0 == ss.ValueAt(-1));
REQUIRE(30 == ss.ValueAt(0));
REQUIRE(30 == ss.ValueAt(1));
REQUIRE(30 == ss.ValueAt(2));
}
SECTION("ReplaceLast") {
ss.Set(0, 30);
ss.Set(2, 31);
ss.Set(2, 32);
REQUIRE(2u == ss.size());
REQUIRE(0 == ss.ValueAt(-1));
REQUIRE(30 == ss.ValueAt(0));
REQUIRE(30 == ss.ValueAt(1));
REQUIRE(32 == ss.ValueAt(2));
REQUIRE(32 == ss.ValueAt(3));
}
SECTION("OnlyChangeAppended") {
ss.Set(0, 30);
ss.Set(2, 31);
ss.Set(3, 31);
REQUIRE(2u == ss.size());
}
SECTION("MergeBetween") {
ss.Set(0, 30);
ss.Set(2, 32);
ss.Set(4, 34);
REQUIRE(3u == ss.size());
SparseState<int> ssAdditions(3);
ssAdditions.Set(4, 34);
REQUIRE(1u == ssAdditions.size());
bool mergeChanged = ss.Merge(ssAdditions,5);
REQUIRE(false == mergeChanged);
ssAdditions.Set(4, 44);
REQUIRE(1u == ssAdditions.size());
mergeChanged = ss.Merge(ssAdditions,5);
REQUIRE(true == mergeChanged);
REQUIRE(3u == ss.size());
REQUIRE(44 == ss.ValueAt(4));
}
SECTION("MergeAtExisting") {
ss.Set(0, 30);
ss.Set(2, 32);
ss.Set(4, 34);
REQUIRE(3u == ss.size());
SparseState<int> ssAdditions(4);
ssAdditions.Set(4, 34);
REQUIRE(1u == ssAdditions.size());
bool mergeChanged = ss.Merge(ssAdditions,5);
REQUIRE(false == mergeChanged);
ssAdditions.Set(4, 44);
REQUIRE(1u == ssAdditions.size());
mergeChanged = ss.Merge(ssAdditions,5);
REQUIRE(true == mergeChanged);
REQUIRE(3u == ss.size());
REQUIRE(44 == ss.ValueAt(4));
}
SECTION("MergeWhichRemoves") {
ss.Set(0, 30);
ss.Set(2, 32);
ss.Set(4, 34);
REQUIRE(3u == ss.size());
SparseState<int> ssAdditions(2);
ssAdditions.Set(2, 22);
REQUIRE(1u == ssAdditions.size());
REQUIRE(22 == ssAdditions.ValueAt(2));
bool mergeChanged = ss.Merge(ssAdditions,5);
REQUIRE(true == mergeChanged);
REQUIRE(2u == ss.size());
REQUIRE(22 == ss.ValueAt(2));
}
SECTION("MergeIgnoreSome") {
ss.Set(0, 30);
ss.Set(2, 32);
ss.Set(4, 34);
SparseState<int> ssAdditions(2);
ssAdditions.Set(2, 32);
bool mergeChanged = ss.Merge(ssAdditions,3);
REQUIRE(false == mergeChanged);
REQUIRE(2u == ss.size());
REQUIRE(32 == ss.ValueAt(2));
}
SECTION("MergeIgnoreSomeStart") {
ss.Set(0, 30);
ss.Set(2, 32);
ss.Set(4, 34);
SparseState<int> ssAdditions(2);
ssAdditions.Set(2, 32);
bool mergeChanged = ss.Merge(ssAdditions,2);
REQUIRE(false == mergeChanged);
REQUIRE(2u == ss.size());
REQUIRE(32 == ss.ValueAt(2));
}
SECTION("MergeIgnoreRepeat") {
ss.Set(0, 30);
ss.Set(2, 32);
ss.Set(4, 34);
SparseState<int> ssAdditions(5);
// Appending same value as at end of pss.
ssAdditions.Set(5, 34);
bool mergeChanged = ss.Merge(ssAdditions,6);
REQUIRE(false == mergeChanged);
REQUIRE(3u == ss.size());
REQUIRE(34 == ss.ValueAt(4));
}
}
TEST_CASE("SparseStateString") {
SparseState<std::string> ss;
SECTION("IsEmptyInitially") {
REQUIRE(0u == ss.size());
std::string val = ss.ValueAt(0);
REQUIRE("" == val);
}
SECTION("SimpleSetAndGet") {
REQUIRE(0u == ss.size());
ss.Set(0, "22");
ss.Set(1, "23");
REQUIRE(2u == ss.size());
REQUIRE("" == ss.ValueAt(-1));
REQUIRE("22" == ss.ValueAt(0));
REQUIRE("23" == ss.ValueAt(1));
REQUIRE("23" == ss.ValueAt(2));
}
SECTION("DeleteBetween") {
ss.Set(0, "30");
ss.Set(2, "32");
ss.Delete(1);
REQUIRE(1u == ss.size());
REQUIRE("" == ss.ValueAt(-1));
REQUIRE("30" == ss.ValueAt(0));
REQUIRE("30" == ss.ValueAt(1));
REQUIRE("30" == ss.ValueAt(2));
}
}