#include "c_utf8_file.h" #include #include #define RUN_TEST(test_case, name) \ do { \ printf("[RUN] %s... ", name); \ if (test_case) { \ printf("\033[32mPASSED\033[0m\n"); \ } else { \ printf("\033[31mFAILED\033[0m (%s:%d)\n", __FILE__, __LINE__); \ return C_ERR_FAIL; \ } \ } while(0) static c_err_t c_utf8_file_test(void) { printf("==================================================\n"); printf(" STARTING C_UTF8_FILE UNIT TESTING \n"); printf("==================================================\n"); /* 26. UTF-8 File I/O Operations Verification */ c_StringBuffer_t write_sb; c_StringBuffer_t read_sb; const char* test_filename = "nlp_utf8_test.txt"; const char* payload = "NLP大模型_2026_🚀"; c_StringBuffer_Init(&write_sb, 32, 0); c_StringBuffer_Init(&read_sb, 32, 0); c_StringBuffer_AppendStr(&write_sb, payload); // Test Point 1: Parameter checks protection RUN_TEST(c_utf8_file_read(NULL, &read_sb) == C_ERR_PARAM, "File read handles NULL filepath strings"); RUN_TEST(c_utf8_file_write(test_filename, NULL, C_FALSE) == C_ERR_PARAM, "File write handles NULL buffer contexts"); // Test Point 2: Write text payload with explicit BOM injection enabled c_err_t err = c_utf8_file_write(test_filename, &write_sb, C_TRUE); RUN_TEST(err == C_ERR_OK, "UTF-8 data written to disk with BOM successfully"); // Test Point 3: Read text payload back from disk space err = c_utf8_file_read(test_filename, &read_sb); RUN_TEST(err == C_ERR_OK, "UTF-8 data read from disk successfully"); // Verify that the BOM was skipped and data size matches exactly RUN_TEST(read_sb.size == write_sb.size, "File reader successfully filtered out the 3 BOM byte footprints from data tracking metrics"); RUN_TEST(strcmp(read_sb.buffer, payload) == 0, "Reconstructed disk text payload holds proper string characters perfectly"); // Cleanup resources and temporary test files c_StringBuffer_Destroy(&write_sb); c_StringBuffer_Destroy(&read_sb); remove(test_filename); // Remove transient testing file assets from system layout /* ------------------------------------------------------------------------------------------------------------------ */ /* */ /* 27. UTF-8 File Logging Append & Streaming Line Read Verification */ c_StringBuffer_t io_sb; c_StringBuffer_t line_sb; const char* log_filename = "nlp_stream_test.txt"; c_StringBuffer_Init(&io_sb, 32, 0); c_StringBuffer_Init(&line_sb, 32, 0); // Test Point 1: Consecutive appends to evaluate new file vs exist rules c_StringBuffer_AppendStr(&io_sb, "First Line: 自然语言\n"); err = c_utf8_file_append(log_filename, &io_sb, C_TRUE); // Creates file with BOM RUN_TEST(err == C_ERR_OK, "Append created a new file with a BOM header successfully"); c_StringBuffer_Clear(&io_sb); c_StringBuffer_AppendStr(&io_sb, "Second Line: 大模型🚀\n"); err = c_utf8_file_append(log_filename, &io_sb, C_TRUE); // Appends to existing file (BOM skipped) RUN_TEST(err == C_ERR_OK, "Append safely added data to the existing file without duplicate BOM injections"); // Test Point 2: Streaming Line Reads via c_utf8_file_readline FILE* stream_in = fopen(log_filename, "rb"); RUN_TEST(stream_in != NULL, "Opened log test file for stream reading"); // Handle initial optional BOM detection before streaming lines unsigned char check_bom[3]; if (fread(check_bom, 1, 3, stream_in) == 3 && check_bom[0] == 0xEF && check_bom[1] == 0xBB && check_bom[2] == 0xBF) { // BOM detected and skipped successfully } else { fseek(stream_in, 0, SEEK_SET); } // Read Line 1 err = c_utf8_file_readline(stream_in, &line_sb); RUN_TEST(err == C_ERR_OK, "Read the first text line via streaming readline API"); RUN_TEST(strcmp(line_sb.buffer, "First Line: 自然语言") == 0, "Line 1 string matches, trailing newline stripped cleanly"); // Read Line 2 err = c_utf8_file_readline(stream_in, &line_sb); RUN_TEST(err == C_ERR_OK, "Read the second text line via streaming readline API"); RUN_TEST(strcmp(line_sb.buffer, "Second Line: 大模型🚀") == 0, "Line 2 string matches multi-byte characters and Emojis perfectly"); // Read Line 3 (Expect EOF termination failure status) err = c_utf8_file_readline(stream_in, &line_sb); RUN_TEST(err == C_ERR_FAIL, "Readline returns C_ERR_FAIL cleanly when hitting EOF boundaries"); // Cleanup resources fclose(stream_in); c_StringBuffer_Destroy(&io_sb); c_StringBuffer_Destroy(&line_sb); remove(log_filename); // Purge volatile testing file asset /* ------------------------------------------------------------------------------------------------------------------ */ /* */ printf("==================================================\n"); printf("\033[32mSUCCESS: ALL C_UTF8_FILE COMPATIBLE INTERFACES PASSED!\033[0m\n"); printf("==================================================\n"); return C_ERR_OK; } int main(int argc, char** argv){ return c_utf8_file_test(); }