aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2014-11-25 14:23:25 -0800
committerGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2014-11-25 14:23:37 -0800
commit64bf89ebdd0584a6951b68d815a3bb5abd4cdc1d (patch)
tree694a477754c4b29421513780860593337e9b34ba /src
parent940227a204c088179b1c42f4ccc985c1bced22c4 (diff)
Implemented unit tests for C++ platforms
Diffstat (limited to 'src')
-rw-r--r--src/core/basetypes/MCArray.cpp18
-rw-r--r--src/core/basetypes/MCArray.h3
-rw-r--r--src/core/basetypes/MCHashMap.cpp23
-rw-r--r--src/core/basetypes/MCHashMap.h3
-rw-r--r--src/core/basetypes/MCNull.cpp14
-rw-r--r--src/core/basetypes/MCString.cpp49
-rw-r--r--src/core/basetypes/MCString.h6
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);