diff options
Diffstat (limited to 'test/unit/testCharClassify.cxx')
-rw-r--r-- | test/unit/testCharClassify.cxx | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/test/unit/testCharClassify.cxx b/test/unit/testCharClassify.cxx new file mode 100644 index 000000000..8ff98b302 --- /dev/null +++ b/test/unit/testCharClassify.cxx @@ -0,0 +1,110 @@ +// Unit Tests for Scintilla internal data structures + +#include <string.h> + +#include "Platform.h" + +#include "CharClassify.h" + +#include <gtest/gtest.h> + +// Test CharClassify. + +class CharClassifyTest : public::testing::Test { +protected: + virtual void SetUp() { + pcc = new CharClassify(); + for (int ch = 0; ch < 256; ch++) { + if (ch == '\r' || ch == '\n') + charClass[ch] = CharClassify::ccNewLine; + else if (ch < 0x20 || ch == ' ') + charClass[ch] = CharClassify::ccSpace; + else if (ch >= 0x80 || isalnum(ch) || ch == '_') + charClass[ch] = CharClassify::ccWord; + else + charClass[ch] = CharClassify::ccPunctuation; + } + } + + virtual void TearDown() { + delete pcc; + pcc = 0; + } + + CharClassify *pcc; + CharClassify::cc charClass[256]; + + static const char* GetClassName(CharClassify::cc charClass) { + switch(charClass) { + #define CASE(c) case CharClassify::c: return #c + CASE(ccSpace); + CASE(ccNewLine); + CASE(ccWord); + CASE(ccPunctuation); + #undef CASE + default: + return "<unknown>"; + } + } +}; + +TEST_F(CharClassifyTest, Defaults) { + for (int i = 0; i < 256; i++) { + EXPECT_EQ(charClass[i], pcc->GetClass(i)) + << "Character " << i + << " should be class " << GetClassName(charClass[i]) + << ", but got " << GetClassName(pcc->GetClass(i)); + } +} + +TEST_F(CharClassifyTest, Custom) { + unsigned char buf[2] = {0, 0}; + for (int i = 0; i < 256; i++) { + CharClassify::cc thisClass = CharClassify::cc(i % 4); + buf[0] = i; + pcc->SetCharClasses(buf, thisClass); + charClass[i] = thisClass; + } + for (int i = 0; i < 256; i++) { + EXPECT_EQ(charClass[i], pcc->GetClass(i)) + << "Character " << i + << " should be class " << GetClassName(charClass[i]) + << ", but got " << GetClassName(pcc->GetClass(i)); + } +} + +TEST_F(CharClassifyTest, CharsOfClass) { + unsigned char buf[2] = {0, 0}; + for (int i = 1; i < 256; i++) { + CharClassify::cc thisClass = CharClassify::cc(i % 4); + buf[0] = i; + pcc->SetCharClasses(buf, thisClass); + charClass[i] = thisClass; + } + for (int classVal = 0; classVal < 4; ++classVal) { + CharClassify::cc thisClass = CharClassify::cc(classVal % 4); + int size = pcc->GetCharsOfClass(thisClass, NULL); + unsigned char* buffer = reinterpret_cast<unsigned char*>(malloc(size + 1)); + ASSERT_TRUE(buffer); + buffer[size] = '\0'; + pcc->GetCharsOfClass(thisClass, buffer); + for (int i = 1; i < 256; i++) { + if (charClass[i] == thisClass) { + EXPECT_TRUE(memchr(reinterpret_cast<char*>(buffer), i, size)) + << "Character " << i + << " should be class " << GetClassName(thisClass) + << ", but was not in GetCharsOfClass;" + << " it is reported to be " + << GetClassName(pcc->GetClass(i)); + } else { + EXPECT_FALSE(memchr(reinterpret_cast<char*>(buffer), i, size)) + << "Character " << i + << " should not be class " << GetClassName(thisClass) + << ", but was in GetCharsOfClass" + << " it is reported to be " + << GetClassName(pcc->GetClass(i)); + } + } + free(buffer); + } +} |