| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- module Tests;
- import Core.Test;
- import Core.ToString;
- import Core.Utility;
- import Core.Meta;
- import Core.Types;
- import Core.Std;
- static void testPopCount() {
- Core::test(4, Core::popCount(0xF));
- Core::test(0, Core::popCount(0x0));
- Core::test(2, Core::popCount(0x6));
- Core::test(7, Core::popCount(0x7F));
- Core::test(3, Core::popCount(0x2A));
- Core::test(32, Core::popCount(0xFFFF'FFFF));
- Core::test(64, Core::popCount(0xFFFF'FFFF'FFFF'FFFF));
- Core::test(44, Core::popCount(0xFFFF'0FFF'FFFF));
- }
- static void testIf() {
- Core::testTrue(Core::IsSame<Core::If<true, int, double>, int>);
- Core::testTrue(Core::IsSame<Core::If<false, int, double>, double>);
- }
- static void testZeroRellocate() {
- void* buffer = Core::reallocateRaw(nullptr, 16);
- Core::testNotNull(buffer);
- buffer = Core::reallocateRaw(buffer, 0);
- Core::testNull(buffer);
- }
- static void testMemoryInfoList() {
- void* a = Core::allocateRaw(8);
- void* b = Core::allocateRaw(8);
- void* c = Core::allocateRaw(8);
- void* d = Core::allocateRaw(8);
- Core::deallocateRaw(b); // remove middle element
- Core::deallocateRaw(a); // remove first
- Core::deallocateRaw(d); // remove last
- Core::deallocateRaw(c); // remove single
- Core::deallocateRaw(nullptr);
- }
- static void testZeroAllocate() {
- constexpr size_t n = 1024 * 1024;
- void* a = Core::allocateRaw(n);
- memset(a, 0, n);
- void* b = Core::zeroAllocateRaw(n);
- Core::testTrue(memcmp(a, b, n) == 0);
- Core::deallocateRaw(a);
- Core::deallocateRaw(b);
- }
- typedef struct {
- int i;
- i64 d;
- } SwapTest;
- static void testSwap() {
- SwapTest a = {3, 20};
- SwapTest b = {7, 30};
- Core::swap(a, b);
- Core::test(7, a.i);
- Core::test(3, b.i);
- Core::test(30l, a.d);
- Core::test(20l, b.d);
- }
- static void testSort() {
- size_t data[] = {9, 0, 3, 1, 8, 4, 6, 2, 5, 7};
- size_t n = 10;
- Core::bubbleSort(data, n);
- Core::bubbleSort(data, n);
- Core::bubbleSort(data, 0);
- for(size_t i = 0; i < n; i++) {
- Core::test(data[i], i);
- }
- }
- static void testToString() {
- char buffer[512];
- Core::StringBase b(buffer, sizeof(buffer));
- Core::test(10, b.format("a{}a#a", 1.0, 2, 3));
- Core::testString("a1.00a#a23", b);
- Core::test(5, b.format("aa#ab"));
- Core::testString("aa#ab", b);
- Core::test(7, b.format("{{a}{}{{b}", 1));
- Core::testString("{a}1{b}", b);
- b = Core::StringBase(buffer, 3);
- Core::test(6, b.format("aaaaaa"));
- Core::testString("aa", b);
- b = Core::StringBase(buffer, 4);
- Core::test(4, b.format("a{}", 456));
- Core::testString("a45", b);
- b = Core::StringBase(buffer, 4);
- Core::test(10, b.format("{} {} {}", 456, 567, 78));
- Core::testString("456", b);
- b = Core::StringBase(buffer, 1);
- Core::test(10, b.format("{} {} {}", 456, 567, 78));
- Core::testString("", b);
- b = Core::StringBase(nullptr, 0);
- Core::test(10, b.format("{} {} {}", 456ll, 567l, 78ull));
- char c = 'a';
- short s = -454;
- unsigned char cu = 'h';
- unsigned short su = 67;
- signed char cs = 'x';
- b = Core::StringBase(buffer, sizeof(buffer));
- Core::test(
- 24, b.format("{} {} {} {} {} {} {}", c, s, cu, su, cs, true, false));
- Core::testString("a -454 h 67 x true false", b);
- unsigned char text[] = "fgsdf";
- b.clear();
- Core::test(5, b.add(text));
- Core::testString("fgsdf", buffer);
- }
- static void testStringFormat() {
- char buffer[256];
- Core::StringBase s(buffer, sizeof(buffer));
- Core::test(3, s.format("X{}X", 5));
- Core::testString("X5X", s);
- Core::test(7, s.format("X{5}X", 5));
- Core::testString("X 5X", s);
- Core::test(7, s.format("X{r5}X", 5));
- Core::testString("X 5X", s);
- Core::test(7, s.format("X{l5}X", 5));
- Core::testString("X5 X", s);
- s = Core::StringBase(buffer, 0);
- Core::test(3, s.format("X{}X", 5));
- Core::testString("", s);
- Core::test(7, s.format("X{5}X", 5));
- Core::testString("", s);
- Core::test(7, s.format("X{r5}X", 5));
- Core::testString("", s);
- Core::test(7, s.format("X{l5}X", 5));
- Core::testString("", s);
- }
- static void testDefaultString() {
- Core::StringBase s;
- Core::test(3, s.format("X{}X", 5));
- Core::test(0, s.getCapacity());
- }
- void testUtility() {
- testPopCount();
- testIf();
- testZeroRellocate();
- testMemoryInfoList();
- testZeroAllocate();
- testSwap();
- testSort();
- testToString();
- testStringFormat();
- testDefaultString();
- }
- static void outOfMemory(void*) {
- Core::setOutOfMemoryHandler(nullptr, nullptr);
- }
- [[noreturn]] void testInvalidAllocate() {
- Core::setOutOfMemoryHandler(outOfMemory, nullptr);
- Core::allocateRaw(0xFFF'FFFF'FFFF);
- Core::testTrue(false);
- Core::finalizeTests();
- Core::exitWithHandler(0);
- }
- [[noreturn]] void testInvalidReallocate() {
- Core::setOutOfMemoryHandler(outOfMemory, nullptr);
- void* p = Core::allocateRaw(0xFF);
- Core::printMemoryReport();
- Core::reallocateRaw(p, 0xFFF'FFFF'FFFF);
- Core::testTrue(false);
- Core::finalizeTests();
- Core::exitWithHandler(0);
- }
- [[noreturn]] void testInvalidNew() {
- Core::setOutOfMemoryHandler(outOfMemory, nullptr);
- volatile char* p2 = new char[0xFF];
- p2[2] = 3;
- Core::printMemoryReport();
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wpragmas"
- #pragma GCC diagnostic ignored "-Wunknown-warning-option"
- #pragma GCC diagnostic error "-Wlarger-than=17592186044416"
- volatile char* p = Core::newWithSourceN<char>(0xFFF'FFFF'FFFF);
- p[3] = 3;
- #pragma GCC diagnostic pop
- Core::testTrue(false);
- Core::finalizeTests();
- Core::exitWithHandler(0);
- }
- [[noreturn]] void testPreCanary() {
- #ifdef CHECK_MEMORY
- char* p = static_cast<char*>(Core::allocateRaw(16));
- p[-1] = 0;
- Core::deallocateRaw(p);
- Core::testTrue(false);
- #endif
- Core::finalizeTests();
- Core::exitWithHandler(0);
- }
- [[noreturn]] void testPreCanaryNew() {
- #ifdef CHECK_MEMORY
- volatile char* p2 = new char[3];
- volatile char* p = Core::newWithSourceN<char>(16);
- delete[] p2;
- Core::deleteWithSourceN(p);
- p = Core::newWithSourceN<char>(16);
- p[-1] = 0;
- Core::deleteWithSourceN(p);
- Core::testTrue(false);
- #endif
- Core::finalizeTests();
- Core::exitWithHandler(0);
- }
- [[noreturn]] void testPreCanaryNewArray() {
- #ifdef CHECK_MEMORY
- volatile char* p = Core::newWithSource<char>();
- p[-1] = 0;
- Core::deleteWithSource(p);
- Core::testTrue(false);
- #endif
- Core::finalizeTests();
- Core::exitWithHandler(0);
- }
- [[noreturn]] void testPostCanary() {
- #ifdef CHECK_MEMORY
- char* p = static_cast<char*>(Core::allocateRaw(16));
- p[17] = 0;
- Core::deallocateRaw(p);
- Core::testTrue(false);
- #endif
- Core::finalizeTests();
- Core::exitWithHandler(0);
- }
|