diff options
author | Hoa V. DINH <dinh.viet.hoa@gmail.com> | 2014-11-25 14:23:25 -0800 |
---|---|---|
committer | Hoa V. DINH <dinh.viet.hoa@gmail.com> | 2014-11-25 14:23:37 -0800 |
commit | 64bf89ebdd0584a6951b68d815a3bb5abd4cdc1d (patch) | |
tree | 694a477754c4b29421513780860593337e9b34ba /src | |
parent | 940227a204c088179b1c42f4ccc985c1bced22c4 (diff) |
Implemented unit tests for C++ platforms
Diffstat (limited to 'src')
-rw-r--r-- | src/core/basetypes/MCArray.cpp | 18 | ||||
-rw-r--r-- | src/core/basetypes/MCArray.h | 3 | ||||
-rw-r--r-- | src/core/basetypes/MCHashMap.cpp | 23 | ||||
-rw-r--r-- | src/core/basetypes/MCHashMap.h | 3 | ||||
-rw-r--r-- | src/core/basetypes/MCNull.cpp | 14 | ||||
-rw-r--r-- | src/core/basetypes/MCString.cpp | 49 | ||||
-rw-r--r-- | src/core/basetypes/MCString.h | 6 |
7 files changed, 104 insertions, 12 deletions
diff --git a/src/core/basetypes/MCArray.cpp b/src/core/basetypes/MCArray.cpp index 787dd0ba..9fa69ccb 100644 --- a/src/core/basetypes/MCArray.cpp +++ b/src/core/basetypes/MCArray.cpp @@ -253,6 +253,24 @@ String * Array::componentsJoinedByString(String * delimiter) return result; } +bool Array::isEqual(Object * otherObject) +{ + Array * otherArray = (Array *) otherObject; + if (otherArray->count() != count()) { + return false; + } + bool result = true; + mc_foreacharrayIndex(i, Object, value, this) { + Object * otherValue = otherArray->objectAtIndex(i); + if (!value->isEqual(otherValue)) { + result = false; + break; + } + } + + return result; +} + HashMap * Array::serializable() { HashMap * result = Object::serializable(); diff --git a/src/core/basetypes/MCArray.h b/src/core/basetypes/MCArray.h index 7e82ad9e..655eee5f 100644 --- a/src/core/basetypes/MCArray.h +++ b/src/core/basetypes/MCArray.h @@ -45,7 +45,8 @@ namespace mailcore { virtual Object * copy(); virtual HashMap * serializable(); virtual void importSerializable(HashMap * serializable); - + virtual bool isEqual(Object * otherObject); + private: carray * mArray; void init(); diff --git a/src/core/basetypes/MCHashMap.cpp b/src/core/basetypes/MCHashMap.cpp index 046aad90..486707e9 100644 --- a/src/core/basetypes/MCHashMap.cpp +++ b/src/core/basetypes/MCHashMap.cpp @@ -281,6 +281,29 @@ void HashMap::removeAllObjects() mCount = 0; } +bool HashMap::isEqual(Object * otherObject) +{ + HashMap * otherMap = (HashMap *) otherObject; + if (otherMap->count() != count()) { + return false; + } + bool result = true; + mc_foreachhashmapKeyAndValue(Object, key, Object, value, this) { + Object * otherValue = otherMap->objectForKey(key); + if (otherValue == NULL) { + result = false; + break; + } + if (!value->isEqual(otherValue)) { + fprintf(stderr, "%s: %s %s\n", MCUTF8(key), MCUTF8(value), MCUTF8(otherValue)); + result = false; + break; + } + } + + return result; +} + HashMap * HashMap::serializable() { HashMap * result = Object::serializable(); diff --git a/src/core/basetypes/MCHashMap.h b/src/core/basetypes/MCHashMap.h index 93938383..b6ac6d2f 100644 --- a/src/core/basetypes/MCHashMap.h +++ b/src/core/basetypes/MCHashMap.h @@ -34,7 +34,8 @@ namespace mailcore { virtual Object * copy(); virtual HashMap * serializable(); virtual void importSerializable(HashMap * serializable); - + virtual bool isEqual(Object * otherObject); + private: unsigned int mAllocated; unsigned int mCount; diff --git a/src/core/basetypes/MCNull.cpp b/src/core/basetypes/MCNull.cpp index cdb8335f..53d50622 100644 --- a/src/core/basetypes/MCNull.cpp +++ b/src/core/basetypes/MCNull.cpp @@ -10,10 +10,16 @@ using namespace mailcore; -Null * Null::null() +static Null * s_null = NULL; +static pthread_once_t s_once; + +static void init_null(void) { - Null * result = new Null(); - result->autorelease(); - return result; + s_null = new Null(); } +Null * Null::null() +{ + pthread_once(&s_once, init_null); + return s_null; +} diff --git a/src/core/basetypes/MCString.cpp b/src/core/basetypes/MCString.cpp index c17c7074..b3beeb40 100644 --- a/src/core/basetypes/MCString.cpp +++ b/src/core/basetypes/MCString.cpp @@ -1184,6 +1184,9 @@ Data * String::encodedMIMEHeaderValueForSubject() int String::compareWithCaseSensitive(String * otherString, bool caseSensitive) { + if ((length() == 0) && (otherString->length() == 0)) { + return 0; + } if ((unicodeCharacters() == NULL) && (otherString->unicodeCharacters() != NULL)) { return 0; } @@ -1486,6 +1489,17 @@ int String::locationOfString(String * occurrence) return (int) (location - mUnicodeChars); } +int String::lastLocationOfString(String * occurrence) +{ + UChar * location; + location = u_strrstr(mUnicodeChars, occurrence->unicodeCharacters()); + if (location == NULL) { + return -1; + } + + return (int) (location - mUnicodeChars); +} + #pragma mark strip HTML struct parserState { @@ -2143,10 +2157,37 @@ String * String::stringByAppendingPathComponent(String * component) String * String::stringByDeletingLastPathComponent() { - String * component = lastPathComponent(); - String * result = (String *) this->copy()->autorelease(); - result->deleteCharactersInRange(RangeMake(result->length() - component->length(), component->length())); - return result; + String * currentString = this; + if (currentString->isEqual(MCSTR("/"))) { + return currentString; + } + if (currentString->length() == 0) { + return currentString; + } + if (currentString->unicodeCharacters()[currentString->length() - 1] == '/') { + currentString = currentString->substringToIndex(currentString->length() - 1); + } + String * component = currentString->lastPathComponent(); + currentString = currentString->substringToIndex(currentString->length() - component->length()); + if (currentString->isEqual(MCSTR("/"))) { + return currentString; + } + if (currentString->length() == 0) { + return currentString; + } + if (currentString->unicodeCharacters()[currentString->length() - 1] == '/') { + currentString = currentString->substringToIndex(currentString->length() - 1); + } + return currentString; +} + +String * String::stringByDeletingPathExtension() +{ + int location = lastLocationOfString(MCSTR(".")); + if ((location == -1) || (location == 0)) { + return this; + } + return substringToIndex(location); } Array * String::componentsSeparatedByString(String * separator) diff --git a/src/core/basetypes/MCString.h b/src/core/basetypes/MCString.h index 842ff5b8..cbe5538b 100644 --- a/src/core/basetypes/MCString.h +++ b/src/core/basetypes/MCString.h @@ -52,7 +52,8 @@ namespace mailcore { virtual String * stringByAppendingCharacters(const UChar * unicodeCharacters); virtual String * stringByAppendingPathComponent(String * component); virtual String * stringByDeletingLastPathComponent(); - + virtual String * stringByDeletingPathExtension(); + virtual int compare(String * otherString); virtual int caseInsensitiveCompare(String * otherString); virtual String * lowercaseString(); @@ -62,7 +63,8 @@ namespace mailcore { virtual void deleteCharactersInRange(Range range); virtual unsigned int replaceOccurrencesOfString(String * occurrence, String * replacement); virtual int locationOfString(String * occurrence); - + virtual int lastLocationOfString(String * occurrence); + virtual Array * componentsSeparatedByString(String * separator); virtual bool isEqualCaseInsensitive(String * otherString); |