#include "test_utils.h"
#include "../runtime/methodcache.h"
UnittestTestResult_t* test_create_destroy(void) {
UNITTEST_BEGIN_TEST("TestMethodCache", "test_create_destroy");
MethodCache_t* cache = rava_methodcache_create();
UNITTEST_ASSERT_NOT_NULL(_unittest_result, cache, "cache should not be NULL");
rava_methodcache_destroy(cache);
UNITTEST_END_TEST();
}
UnittestTestResult_t* test_insert_lookup(void) {
UNITTEST_BEGIN_TEST("TestMethodCache", "test_insert_lookup");
MethodCache_t* cache = rava_methodcache_create();
UNITTEST_ASSERT_NOT_NULL(_unittest_result, cache, "cache should not be NULL");
int dummy_method = 42;
RavaMethod_t* method = (RavaMethod_t*)&dummy_method;
rava_methodcache_insert(cache, "TestClass", "testMethod", method);
RavaMethod_t* found = rava_methodcache_lookup(cache, "TestClass", "testMethod");
UNITTEST_ASSERT_TRUE(_unittest_result, found == method, "found method should match inserted");
rava_methodcache_destroy(cache);
UNITTEST_END_TEST();
}
UnittestTestResult_t* test_lookup_miss(void) {
UNITTEST_BEGIN_TEST("TestMethodCache", "test_lookup_miss");
MethodCache_t* cache = rava_methodcache_create();
UNITTEST_ASSERT_NOT_NULL(_unittest_result, cache, "cache should not be NULL");
RavaMethod_t* found = rava_methodcache_lookup(cache, "NonExistent", "method");
UNITTEST_ASSERT_NULL(_unittest_result, found, "lookup miss should return NULL");
rava_methodcache_destroy(cache);
UNITTEST_END_TEST();
}
UnittestTestResult_t* test_multiple_methods(void) {
UNITTEST_BEGIN_TEST("TestMethodCache", "test_multiple_methods");
MethodCache_t* cache = rava_methodcache_create();
UNITTEST_ASSERT_NOT_NULL(_unittest_result, cache, "cache should not be NULL");
int m1 = 1, m2 = 2;
RavaMethod_t* method1 = (RavaMethod_t*)&m1;
RavaMethod_t* method2 = (RavaMethod_t*)&m2;
rava_methodcache_insert(cache, "TestClass", "methodA", method1);
RavaMethod_t* found1 = rava_methodcache_lookup(cache, "TestClass", "methodA");
UNITTEST_ASSERT_TRUE(_unittest_result, found1 == method1, "found1 should match method1");
rava_methodcache_insert(cache, "OtherClass", "methodB", method2);
RavaMethod_t* found2 = rava_methodcache_lookup(cache, "OtherClass", "methodB");
UNITTEST_ASSERT_TRUE(_unittest_result, found2 == method2, "found2 should match method2");
rava_methodcache_destroy(cache);
UNITTEST_END_TEST();
}
UnittestTestResult_t* test_clear(void) {
UNITTEST_BEGIN_TEST("TestMethodCache", "test_clear");
MethodCache_t* cache = rava_methodcache_create();
UNITTEST_ASSERT_NOT_NULL(_unittest_result, cache, "cache should not be NULL");
int dummy = 42;
RavaMethod_t* method = (RavaMethod_t*)&dummy;
rava_methodcache_insert(cache, "TestClass", "testMethod", method);
UNITTEST_ASSERT_TRUE(_unittest_result, rava_methodcache_lookup(cache, "TestClass", "testMethod") == method, "should find method before clear");
rava_methodcache_clear(cache);
UNITTEST_ASSERT_NULL(_unittest_result, rava_methodcache_lookup(cache, "TestClass", "testMethod"), "should not find method after clear");
rava_methodcache_destroy(cache);
UNITTEST_END_TEST();
}
UnittestTestResult_t* test_null_params(void) {
UNITTEST_BEGIN_TEST("TestMethodCache", "test_null_params");
MethodCache_t* cache = rava_methodcache_create();
rava_methodcache_insert(NULL, "Class", "method", NULL);
rava_methodcache_insert(cache, NULL, "method", NULL);
rava_methodcache_insert(cache, "Class", NULL, NULL);
UNITTEST_ASSERT_NULL(_unittest_result, rava_methodcache_lookup(NULL, "Class", "method"), "NULL cache should return NULL");
UNITTEST_ASSERT_NULL(_unittest_result, rava_methodcache_lookup(cache, NULL, "method"), "NULL class should return NULL");
UNITTEST_ASSERT_NULL(_unittest_result, rava_methodcache_lookup(cache, "Class", NULL), "NULL method should return NULL");
rava_methodcache_destroy(cache);
UNITTEST_END_TEST();
}
UnittestTestResult_t* test_hash_function(void) {
UNITTEST_BEGIN_TEST("TestMethodCache", "test_hash_function");
uint32_t h1 = rava_methodcache_hash("hello");
uint32_t h2 = rava_methodcache_hash("hello");
uint32_t h3 = rava_methodcache_hash("world");
UNITTEST_ASSERT_EQUAL(_unittest_result, h1, h2, "same string should produce same hash");
UNITTEST_ASSERT_TRUE(_unittest_result, h1 != h3, "different strings should produce different hashes");
UNITTEST_ASSERT_TRUE(_unittest_result, h1 != 0, "hash should not be 0");
UNITTEST_ASSERT_TRUE(_unittest_result, h3 != 0, "hash should not be 0");
UNITTEST_END_TEST();
}
int main(int argc, char **argv) {
UnittestConfig_t *config = unittest_config_create();
config->verbosity = 2;
if (argc > 1 && strcmp(argv[1], "--json") == 0) {
config->output_format = UNITTEST_FORMAT_JSON;
config->use_colors = false;
}
UnittestTestSuite_t *suite = unittest_test_suite_create("Method Cache Tests");
UnittestTestCase_t *tc = unittest_test_case_create("TestMethodCache");
unittest_test_case_add_result(tc, test_create_destroy());
unittest_test_case_add_result(tc, test_insert_lookup());
unittest_test_case_add_result(tc, test_lookup_miss());
unittest_test_case_add_result(tc, test_multiple_methods());
unittest_test_case_add_result(tc, test_clear());
unittest_test_case_add_result(tc, test_null_params());
unittest_test_case_add_result(tc, test_hash_function());
unittest_test_suite_add_test_case(suite, tc);
unittest_generate_report(suite, config);
int failures = suite->total_failed + suite->total_errors;
unittest_test_suite_destroy(suite);
unittest_config_destroy(config);
return failures > 0 ? 1 : 0;
}