| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- #include <iostream>
- #include <cstdlib> //for malloc, realloc, and free
- #include "TestSuite.h"
- #include "../../libjson.h"
- void DoTests(void);
- void DoTests(void){
- TestSuite::TestStreams();
- TestSuite::TestValidator();
- TestSuite::TestString();
- TestSuite::TestConverters();
- #ifdef JSON_BINARY
- TestSuite::TestBase64();
- #endif
- TestSuite::TestReferenceCounting();
- TestSuite::TestConstructors();
- TestSuite::TestAssigning();
- TestSuite::TestEquality();
- TestSuite::TestInequality();
- TestSuite::TestChildren();
- TestSuite::TestFunctions();
- TestSuite::TestIterators();
- TestSuite::TestInspectors();
- TestSuite::TestNamespace();
- #ifdef JSON_WRITE_PRIORITY
- TestSuite::TestWriter();
- #endif
- #ifdef JSON_COMMENTS
- TestSuite::TestComments();
- #endif
- #ifdef JSON_MUTEX_CALLBACKS
- TestSuite::TestMutex();
- TestSuite::TestThreading();
- #endif
- TestSuite::TestSharedString();
- TestSuite::TestFinal();
- }
- #ifdef JSON_MEMORY_CALLBACKS
- long mallocs = 0;
- long reallocs = 0;
- long frees = 0;
- long bytes = 0;
- //used to check load
- size_t maxBytes = 0;
- size_t currentBytes = 0;
- #ifdef JSON_LIBRARY
- #define MEMTYPE unsigned long
- #else
- #define MEMTYPE size_t
- #endif
- #include <map>
- #include <vector>
- std::map<void *, MEMTYPE> mem_mapping;
- std::vector<size_t> bytesallocated;
- void * testmal(MEMTYPE siz);
- void * testmal(MEMTYPE siz){
- ++mallocs;
- bytes += (long)siz;
- currentBytes += siz;
- if (currentBytes > maxBytes) maxBytes = currentBytes;
- bytesallocated.push_back(currentBytes);
- void * res = std::malloc(siz);
- mem_mapping[res] = siz;
- return res;
- }
- void testfree(void * ptr);
- void testfree(void * ptr){
- ++frees;
- std::map<void *, MEMTYPE>::iterator i = mem_mapping.find(ptr);
- if (i != mem_mapping.end()){ //globals
- currentBytes -= mem_mapping[ptr];
- mem_mapping.erase(ptr);
- }
-
- bytesallocated.push_back(currentBytes);
- std::free(ptr);
- }
- void * testreal(void * ptr, MEMTYPE siz);
- void * testreal(void * ptr, MEMTYPE siz){
- ++reallocs;
- std::map<void *, MEMTYPE>::iterator i = mem_mapping.find(ptr);
- if (i != mem_mapping.end()){ //globals
- currentBytes -= mem_mapping[ptr];
- mem_mapping.erase(ptr);
- }
- currentBytes += siz;
- if (currentBytes > maxBytes) maxBytes = currentBytes;
- bytesallocated.push_back(currentBytes);
-
- void * res = std::realloc(ptr, siz);
- mem_mapping[res] = siz;
- return res;
- }
- void doMemTests(void);
- void doMemTests(void){
- #ifdef JSON_LIBRARY
- json_register_memory_callbacks(testmal, testreal, testfree);
- #else
- libjson::register_memory_callbacks(testmal, testreal, testfree);
- #endif
- DoTests();
- echo("mallocs: " << mallocs);
- echo("frees: " << frees);
- echo("reallocs: " << reallocs);
- echo("bytes: " << bytes << " (" << (int)(bytes / 1024) << " KB)");
- echo("max bytes at once: " << maxBytes << " (" << (int)(maxBytes / 1024) << " KB)");
- std::vector<size_t>::iterator i = bytesallocated.begin();
- std::vector<size_t>::iterator e = bytesallocated.end();
- size_t bbytes = 0;
- for(; i != e; ++i){
- bbytes += *i;
- }
- bbytes = (size_t)(((double)bbytes) / ((double)bytesallocated.size()));
- echo("avg bytes at once: " << bbytes << " (" << (int)(bbytes / 1024) << " KB)");
- echo("still allocated: " << currentBytes << " (" << (int)(currentBytes / 1024) << " KB) (Global variables)");
- assertEquals(mallocs, frees);
- }
- #endif
- #include "RunTestSuite2.h"
- int main () {
- UnitTest::StartTime();
- TestSuite::TestSelf();
-
- DoTests();
- #ifdef JSON_MEMORY_CALLBACKS
- doMemTests();
- #endif
- RunTestSuite2::RunTests();
-
- UnitTest::SaveTo("out.html");
- return 0;
- }
|