Initial commit

This commit is contained in:
2026-04-03 00:22:39 -05:00
commit eca1e8c458
945 changed files with 218160 additions and 0 deletions

View File

@@ -0,0 +1,660 @@
#include "ZUnitTest.hpp"
//Hijack the assert
#define ZSTL_ASSERT(condition, message) SST_OS_RuntimeAssert(condition, message)
#include <ZSTL/ZBasicString.hpp>
#include <SST/SST_Hash.h>
static const char* test_Constructors();
static const char* test_AbsoluteIndex();
static const char* test_Allocator();
static const char* test_Array();
static const char* test_At();
static const char* test_Back();
static const char* test_Capacity();
static const char* test_Clear();
static const char* test_Clear_With_Capacity();
static const char* test_Compare_To_Array();
static const char* test_Compare_To_ZString();
static const char* test_Copy();
static const char* test_Data();
static const char* test_Empty();
static const char* test_Equals_To_Array();
static const char* test_Equals_To_ZString();
static const char* test_Erase();
static const char* test_Erase_Substring();
static const char* test_Front();
static const char* test_Hash();
static const char* test_Insert();
static const char* test_Length();
static const char* test_OperatorPlus();
static const char* test_PopBack();
static const char* test_PopFront();
static const char* test_PushBack();
static const char* test_PushFront();
static const char* test_Reserve();
static const char* test_Resize();
static const char* test_Resize_With_Fill();
static const char* test_Swap();
ZUnitTest ZBasicStringUnitTests[] =
{
{ "ZBasicString: Constructors", test_Constructors },
{ "ZBasicString: AbsoluteIndex", test_AbsoluteIndex },
{ "ZBasicString: Allocator", test_Allocator },
{ "ZBasicString: Array", test_Array },
{ "ZBasicString: At", test_At },
{ "ZBasicString: Back", test_Back },
{ "ZBasicString: Capacity", test_Capacity },
{ "ZBasicString: Clear", test_Clear },
{ "ZBasicString: Clear with capacity", test_Clear_With_Capacity },
{ "ZBasicString: Compare to array", test_Compare_To_Array },
{ "ZBasicString: Compare to zstring", test_Compare_To_ZString },
{ "ZBasicString: Copy", test_Copy },
{ "ZBasicString: Data", test_Data },
{ "ZBasicString: Empty", test_Empty },
{ "ZBasicString: Equals to array", test_Equals_To_Array },
{ "ZBasicString: Equals to zstring", test_Equals_To_ZString },
{ "ZBasicString: Erase", test_Erase },
{ "ZBasicString: Erase substring", test_Erase_Substring },
{ "ZBasicString: Front", test_Front },
{ "ZBasicString: Hash", test_Hash },
{ "ZBasicString: Insert", test_Insert },
{ "ZBasicString: Length", test_Length },
{ "ZBasicString: OperatorPlus", test_OperatorPlus },
{ "ZBasicString: PopBack", test_PopBack },
{ "ZBasicString: PopFront", test_PopFront },
{ "ZBasicString: PushBack", test_PushBack },
{ "ZBasicString: PushFront", test_PushFront },
{ "ZBasicString: Reserve", test_Reserve },
{ "ZBasicString: Resize", test_Resize },
{ "ZBasicString: Resize with fill", test_Resize_With_Fill },
{ "ZBasicString: Swap", test_Swap }
};
DECLARE_ZTESTBLOCK(ZBasicString);
/*************************************************************************/
//We use this allocator to ensure that allocator-agnostic functions work correctly
class CharArrayAllocator
{
public:
char* Allocate(size_t _size)
{
return new (std::nothrow) char[_size];
}
void Deallocate(char* _ptr, size_t _size)
{
(void)_size;
delete[] _ptr;
}
};
/*************************************************************************/
static const char* test_Constructors()
{
const char* testData1 = "SuperAwesomeString";
const char* testData2 = "Super. Awesome. String.";
ZBasicString<> string1;
ZBasicString<> string2(testData1);
ZBasicString<> string3(&testData1[5], 7);
ZBasicString<> string4(string2);
ZBasicString<CharArrayAllocator> string5(testData2);
ZBasicString<> string6(string5);
TASSERT( strcmp(string1.Data(), "") == 0 &&
string1.Empty() == true &&
string1.Length() == 0,
"Default string initialized with incorrect string!\n");
TASSERT( strcmp(string2.Data(), testData1) == 0 &&
string2.Empty() == false &&
string2.Length() == 18,
"String initialized with incorrect string!\n");
TASSERT( strcmp(string3.Data(), "Awesome") == 0 &&
string3.Empty() == false &&
string3.Length() == 7,
"Copy substring constructor initialized with incorrect string!\n");
TASSERT( strcmp(string4.Data(), testData1) == 0 &&
string4.Empty() == false &&
string4.Length() == 18,
"Copy string constructor initialized with incorrect string!\n");
TASSERT( strcmp(string5.Data(), testData2) == 0 &&
string5.Empty() == false &&
string5.Length() == 23,
"String constructor with custom allocator initialized with incorrect string!\n");
TASSERT( strcmp(string6.Data(), testData2) == 0 &&
string6.Empty() == false &&
string6.Length() == 23,
"Copy string constructor with custom allocator initialized with incorrect string!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_AbsoluteIndex()
{
ZBasicString<> string("1235");
TASSERT( string.BoundsCheck(0, string.Length()) == 0, "AbsoluteIndex() mismaps 0!\n");
TASSERT( string.BoundsCheck(1, string.Length()) == 1, "AbsoluteIndex() mismaps 1!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Allocator()
{
// This is a pass-through for ZArray::Allocator(), so we don't need to do anything
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Array()
{
ZBasicString<> string("12345");
TASSERT( string.Array().Empty() == false, "Array() gave back empty backing array!\n");
TASSERT( string.Array().Back() == ZBASICSTRING_NULL_TERMINATOR, "Array() is not null terminated!\n");
TASSERT( string.Array().Size() == 6, "Array() gave back missized array!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_At()
{
ZBasicString<> string("12345");
TASSERT( string.At(0) == '1', "At() returned incorrect character!\n");
TASSERT( string.At(1) == '2', "At() returned incorrect character!\n");
TASSERT( string.At(2) == '3', "At() returned incorrect character!\n");
TASSERT( string.At(3) == '4', "At() returned incorrect character!\n");
TASSERT( string.At(4) == '5', "At() returned incorrect character!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Back()
{
ZBasicString<> string = ZBasicString<>("abcde");
ZBasicString<> string2 = ZBasicString<>("1");
ZBasicString<> string3 = ZBasicString<>();
TASSERT(string.Back() == 'e', "Back() returned wrong front character for string length > 2");
string.Back() = '!';
TASSERT(string.Back() == '!', "Back() returned the correct reference");
TASSERT(string2.Back() == '1', "Back() returned the wrong character for a string of length 1.");
// Uncomment to test if Back() raises an assert on an empty string.
// TASSERT(string3.Back() == '\0', "This should have asserted.");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Capacity()
{
ZBasicString<ZArrayAllocator<char, 32> > string("12435");
//NOTE: We can do this because (at the moment) constructing from a const char array
// and that will init the capacity to just enough to hold it.
TASSERT( string.Capacity() == 5, "Capacity() returned incorrect capacity!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Clear()
{
ZBasicString<> string("12435");
TASSERT( string.Length() == 5, "String initialized with incorrect size!\n");
string.Clear();
TASSERT( string.Length() == 0, "Clear() did not set string length to 0!\n");
TASSERT( string.Equals("") == true, "Clear() did not set string to empty string!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Clear_With_Capacity()
{
ZBasicString<> string("12435");
TASSERT( string.Length() == 5, "String initialized with incorrect size!\n");
string.Clear(16);
TASSERT( string.Length() == 0, "Clear() did not set string length to 0!\n");
TASSERT( string.Capacity() == 16, "Clear() did not properly set new capacity of string!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Compare_To_Array()
{
const char* str1 = "Hallo!";
const char* str2 = "Hello!";
const char* str3 = "Hullo!";
const char* str4 = "Goodbye!";
ZBasicString<> string("Hello!");
TASSERT( string.Compare(str3) < 0, "Compare() misclassified lexigraphically larger string!\n");
TASSERT( string.Compare(str2) == 0, "Compare() misclassified lexigraphically equal string!\n");
TASSERT( string.Compare(str1) > 0, "Compare() misclassified lexigraphically smaller string!\n");
TASSERT( string.Compare(str4) != 0, "Compare() misclassified different length different string!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Compare_To_ZString()
{
ZBasicString<> str1("Hallo!");
ZBasicString<> str2("Hello!");
ZBasicString<> str3("Hullo!");
ZBasicString<> str4("Goodbye!");
ZBasicString<> str5("HELLO!");
ZBasicString<> string("Hello!");
TASSERT( string.Compare(str3) < 0, "Compare() misclassified lexigraphically larger string!");
TASSERT( string.Compare(str2) == 0, "Compare() misclassified lexigraphically equal string!");
TASSERT( string.Compare(str1) > 0, "Compare() misclassified lexigraphically smaller string!");
TASSERT( string.Compare(str4) != 0, "Compare() misclassified different length different string!");
TASSERT( string.Compare(str5) != 0, "Compare() is case-insensitive!");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Data()
{
ZBasicString<> string("Hello!");
TASSERT ( string.Data() != NULL, "Data() returned null pointer for valid string!\n");
TASSERT ( strcmp(string.Data(),"Hello!") == 0, "Data() returned null pointer for valid string!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Equals_To_Array()
{
ZBasicString<> string("yes");
const char* yes = "yes";
const char* no = "no";
TASSERT( string.Equals(no) == false, "Equals() misclassified different char array string!\n");
TASSERT( string.Equals(yes) == true, "Equals() misclassified identical char array string!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Equals_To_ZString()
{
ZBasicString<> str1("Hallo!");
ZBasicString<> str2("Hello!");
ZBasicString<> str3("Hello!");
TASSERT( str3.Equals(str1) == false, "Equals() miscompared two different ZBasicStrings!\n");
TASSERT( str3.Equals(str2) == true, "Equals() miscompared two equivalent ZBasicStrings!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Copy()
{
ZBasicString<> emptyString("");
ZBasicString<> notEmptyString("notEmpty");
emptyString.Copy(notEmptyString);
TASSERT( emptyString.Equals(notEmptyString), "Copy() failed to move data!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Empty()
{
ZBasicString<> emptyString;
ZBasicString<> emptyString2("");
ZBasicString<> notEmptyString("notEmpty");
TASSERT( emptyString.Empty() == true, "Empty() returned false on empty string from default constructor!\n");
TASSERT( emptyString2.Empty() == true, "Empty() returned false on empty string from empty constructor!\n");
TASSERT( notEmptyString.Empty() == false, "Empty() returned true on nonempty string!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Erase()
{
ZBasicString<> string("abc");
ZBasicString<> string2("abc");
ZBasicString<> string3("abc");
ZBasicString<> string4("abc");
string.Erase(0);
TASSERT(string.Equals("bc"), "Erase() failed to remove first character!\n");
string2.Erase(2);
TASSERT(string2.Equals("ab"), "Erase() failed to remove last character!\n");
string3.Erase(1);
TASSERT(string3.Equals("ac"), "Erase() failed to remove middle character!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Erase_Substring()
{
ZBasicString<> string("abcde");
ZBasicString<> string2("abcde");
ZBasicString<> string3("abcde");
ZBasicString<> string4("abcde");
string.Erase(0,3);
TASSERT(string.Equals("de") == true, "Erase() failed to remove first 3 characters!\n");
string2.Erase(2,5);
TASSERT(string2.Equals("ab") == true, "Erase() failed to remove last 3 characters!\n");
string3.Erase(1,4);
TASSERT(string3.Equals("ae") == true, "Erase() failed to remove middle 3 characters!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Front()
{
ZBasicString<> string = ZBasicString<>("abcde");
ZBasicString<> string2 = ZBasicString<>("1");
ZBasicString<> string3 = ZBasicString<>();
TASSERT(string.Front() == 'a', "Front() returned wrong front character for string length > 2");
string.Front() = '!';
TASSERT(string.Front() == '!', "Front() returned the correct reference)");
TASSERT(string2.Front() == '1', "Front() returned the wrong character for a string of length 1.");
//Uncomment to see if Front() asserts as advertised.
//TASSERT(string3.Front() == '\0', "This should have asserted.");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Hash()
{
ZBasicString<> string("hashMe");
ZBasicString<> string2("hashMeToo");
TASSERT( string.Hash() == SST_Crypto_HashJ6("hashMe",6), "Hash() returned wrong hash on string!\n");
TASSERT( string.Hash() != string2.Hash(), "Hash() returned same hash on different strings!\n")
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Insert()
{
ZBasicString<> string1("hi");
ZBasicString<> string2("hi");
ZBasicString<> string3("hi");
ZBasicString<> string4("hi");
ZBasicString<> add("there");
string1.Insert(0,add);
TASSERT( string1.Equals("therehi"), "Insert() returned wrong string on insert front\n");
string2.Insert(2,add);
TASSERT( string2.Equals("hithere"), "Insert() returned wrong string on insert back\n");
string4.Insert(1,add);
TASSERT( string4.Equals("htherei"), "Insert() returned wrong string on insert middle\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Length()
{
ZBasicString<> emptyString1("");
ZBasicString<> emptyString2;
ZBasicString<> mystring("12345");
TASSERT( emptyString1.Length() == 0, "Length() reports nonempty on empty string!\n");
TASSERT( emptyString2.Length() == 0, "Length() reports nonempty on default string!\n");
TASSERT( mystring.Length() == 5, "Length() reports wrong length on string!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_OperatorPlus()
{
/*
ZBasicString<A> operator + (const char *_lhs, const ZBasicString<A>& _rhs)
ZBasicString<A> operator + (const ZBasicString<A>& _lhs, const char *_rhs)
*/
ZBasicString<> string = ZBasicString<>("abcde");
ZBasicString<> emptyString = ZBasicString<>();
const char cString[5] = "1234";
const char emptyCString[1] = "";
TASSERT(string + cString == "abcde1234", "Right add of a c-string failed.");
TASSERT(cString + string == "1234abcde", "Left add of a c-string failed");
TASSERT(cString + emptyString == "1234", "Right add of empty ZBasicString failed");
TASSERT(emptyString + cString == "1234", "Left add of empty ZBasicString failed");
TASSERT(string + emptyCString == "abcde", "Right add of empty c-string failed.");
TASSERT(emptyCString + string == "abcde", "Left add of empty c-string failed.");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_PopBack()
{
ZBasicString<> string("apple");
char back;
back = string.PopBack();
TASSERT ( (back == 'e') && string.Equals("appl"), "PopBack() returned incorrect character!\n");
back = string.PopBack();
TASSERT ( (back == 'l') && string.Equals("app"), "PopBack() returned incorrect character!\n");
back = string.PopBack();
TASSERT ( (back == 'p') && string.Equals("ap"), "PopBack() returned incorrect character!\n");
back = string.PopBack();
TASSERT ( (back == 'p') && string.Equals("a"), "PopBack() returned incorrect character!\n");
back = string.PopBack();
TASSERT ( (back == 'a') && string.Empty(), "PopBack() returned incorrect character!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_PopFront()
{
ZBasicString<> string("apple");
char front;
front = string.PopFront();
TASSERT ( (front == 'a') && string.Equals("pple"), "PopFront() returned incorrect character!\n");
front = string.PopFront();
TASSERT ( (front == 'p') && string.Equals("ple"), "PopFront() returned incorrect character!\n");
front = string.PopFront();
TASSERT ( (front == 'p') && string.Equals("le"), "PopFront() returned incorrect character!\n");
front = string.PopFront();
TASSERT ( (front == 'l') && string.Equals("e"), "PopFront() returned incorrect character!\n");
front = string.PopFront();
TASSERT ( (front == 'e') && string.Empty(), "PopFront() returned incorrect character!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_PushBack()
{
ZBasicString<> string("");
string.PushBack('a');
TASSERT ( string.Equals("a"), "PushBack() returned broken string!\n");
string.PushBack('p');
TASSERT ( string.Equals("ap"), "PushBack() returned broken string!\n");
string.PushBack('p');
TASSERT ( string.Equals("app"), "PushBack() returned broken string!\n");
string.PushBack('l');
TASSERT ( string.Equals("appl"), "PushBack() returned broken string!\n");
string.PushBack('e');
TASSERT ( string.Equals("apple"), "PushBack() returned broken string!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_PushFront()
{
ZBasicString<> string("");
string.PushFront('e');
TASSERT ( string.Equals("e"), "PushFront() returned broken string!\n");
string.PushFront('l');
TASSERT ( string.Equals("le"), "PushFront() returned broken string!\n");
string.PushFront('p');
TASSERT ( string.Equals("ple"), "PushFront() returned broken string!\n");
string.PushFront('p');
TASSERT ( string.Equals("pple"), "PushFront() returned broken string!\n");
string.PushFront('a');
TASSERT ( string.Equals("apple"), "PushFront() returned broken string!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Reserve()
{
ZBasicString<> str("wat");
str.Reserve(34);
TASSERT( str.Capacity() == 34, "Reserve() failed to set capacity to correct value!\n");
str.Reserve(43);
TASSERT( str.Capacity() == 43, "Reserve() failed to set capacity to correct value!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Resize()
{
ZBasicString<> str("wat");
TASSERT( str.Length() == 3, "Size() of string returned wrong size!\n");
str.Resize(2);
TASSERT( str.Length() == 2, "Size(2) of string returned wrong size!\n");
str.Resize(4);
TASSERT( str.Length() == 4, "Size(4) of string returned wrong size!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Resize_With_Fill()
{
ZBasicString<> str("");
str.Resize(4,'a');
TASSERT( str.Equals("aaaa"), "Resize() did not fill new string correctly!\n");
str.Resize(2,'b');
TASSERT( str.Equals("aa"), "Resize() did resize the string correctly!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/
static const char* test_Swap()
{
ZBasicString<> str("hi");
ZBasicString<> str2("there");
str.Swap(str2);
TASSERT( str.Equals("there") == true, "Swap did not replace first string!\n");
TASSERT( str2.Equals("hi") == true, "Swap did not replace second string!\n");
str.Swap(str2);
TASSERT( str.Equals("hi") == true, "Swap did not put back first string!\n");
TASSERT( str2.Equals("there") == true, "Swap did not put back second string!\n");
return ZTEST_SUCCESS;
}
/*************************************************************************/