|
29 | 29 | #include "test_fatfs_common.h" |
30 | 30 |
|
31 | 31 | const char* fatfs_test_hello_str = "Hello, World!\n"; |
| 32 | +const char* fatfs_test_hello_str_utf = "世界,你好!\n"; |
32 | 33 |
|
33 | 34 | void test_fatfs_create_file_with_text(const char* name, const char* text) |
34 | 35 | { |
@@ -84,6 +85,17 @@ void test_fatfs_read_file(const char* filename) |
84 | 85 | TEST_ASSERT_EQUAL(0, fclose(f)); |
85 | 86 | } |
86 | 87 |
|
| 88 | +void test_fatfs_read_file_utf_8(const char* filename) |
| 89 | +{ |
| 90 | + FILE* f = fopen(filename, "r"); |
| 91 | + TEST_ASSERT_NOT_NULL(f); |
| 92 | + char buf[64] = { 0 }; //Doubled buffer size to allow for longer UTF-8 strings |
| 93 | + int cb = fread(buf, 1, sizeof(buf), f); |
| 94 | + TEST_ASSERT_EQUAL(strlen(fatfs_test_hello_str_utf), cb); |
| 95 | + TEST_ASSERT_EQUAL(0, strcmp(fatfs_test_hello_str_utf, buf)); |
| 96 | + TEST_ASSERT_EQUAL(0, fclose(f)); |
| 97 | +} |
| 98 | + |
87 | 99 | void test_fatfs_open_max_files(const char* filename_prefix, size_t files_count) |
88 | 100 | { |
89 | 101 | FILE** files = calloc(files_count, sizeof(FILE*)); |
@@ -337,6 +349,85 @@ void test_fatfs_opendir_readdir_rewinddir(const char* dir_prefix) |
337 | 349 | TEST_ASSERT_EQUAL(0, closedir(dir)); |
338 | 350 | } |
339 | 351 |
|
| 352 | +void test_fatfs_opendir_readdir_rewinddir_utf_8(const char* dir_prefix) |
| 353 | +{ |
| 354 | + char name_dir_inner_file[64]; |
| 355 | + char name_dir_inner[64]; |
| 356 | + char name_dir_file3[64]; |
| 357 | + char name_dir_file2[64]; |
| 358 | + char name_dir_file1[64]; |
| 359 | + |
| 360 | + snprintf(name_dir_inner_file, sizeof(name_dir_inner_file), "%s/内部目录/内部文件.txt", dir_prefix); |
| 361 | + snprintf(name_dir_inner, sizeof(name_dir_inner), "%s/内部目录", dir_prefix); |
| 362 | + snprintf(name_dir_file3, sizeof(name_dir_file3), "%s/文件三.bin", dir_prefix); |
| 363 | + snprintf(name_dir_file2, sizeof(name_dir_file2), "%s/文件二.txt", dir_prefix); |
| 364 | + snprintf(name_dir_file1, sizeof(name_dir_file1), "%s/文件一.txt", dir_prefix); |
| 365 | + |
| 366 | + unlink(name_dir_inner_file); |
| 367 | + rmdir(name_dir_inner); |
| 368 | + unlink(name_dir_file1); |
| 369 | + unlink(name_dir_file2); |
| 370 | + unlink(name_dir_file3); |
| 371 | + rmdir(dir_prefix); |
| 372 | + |
| 373 | + TEST_ASSERT_EQUAL(0, mkdir(dir_prefix, 0755)); |
| 374 | + test_fatfs_create_file_with_text(name_dir_file1, "一号\n"); |
| 375 | + test_fatfs_create_file_with_text(name_dir_file2, "二号\n"); |
| 376 | + test_fatfs_create_file_with_text(name_dir_file3, "\0一\0二\0三"); |
| 377 | + TEST_ASSERT_EQUAL(0, mkdir(name_dir_inner, 0755)); |
| 378 | + test_fatfs_create_file_with_text(name_dir_inner_file, "三号\n"); |
| 379 | + |
| 380 | + DIR* dir = opendir(dir_prefix); |
| 381 | + TEST_ASSERT_NOT_NULL(dir); |
| 382 | + int count = 0; |
| 383 | + const char* names[4]; |
| 384 | + while(count < 4) { |
| 385 | + struct dirent* de = readdir(dir); |
| 386 | + if (!de) { |
| 387 | + break; |
| 388 | + } |
| 389 | + printf("found '%s'\n", de->d_name); |
| 390 | + if (strcasecmp(de->d_name, "文件一.txt") == 0) { |
| 391 | + TEST_ASSERT_TRUE(de->d_type == DT_REG); |
| 392 | + names[count] = "文件一.txt"; |
| 393 | + ++count; |
| 394 | + } else if (strcasecmp(de->d_name, "文件二.txt") == 0) { |
| 395 | + TEST_ASSERT_TRUE(de->d_type == DT_REG); |
| 396 | + names[count] = "文件二.txt"; |
| 397 | + ++count; |
| 398 | + } else if (strcasecmp(de->d_name, "内部目录") == 0) { |
| 399 | + TEST_ASSERT_TRUE(de->d_type == DT_DIR); |
| 400 | + names[count] = "内部目录"; |
| 401 | + ++count; |
| 402 | + } else if (strcasecmp(de->d_name, "文件三.bin") == 0) { |
| 403 | + TEST_ASSERT_TRUE(de->d_type == DT_REG); |
| 404 | + names[count] = "文件三.bin"; |
| 405 | + ++count; |
| 406 | + } else { |
| 407 | + TEST_FAIL_MESSAGE("unexpected directory entry"); |
| 408 | + } |
| 409 | + } |
| 410 | + TEST_ASSERT_EQUAL(count, 4); |
| 411 | + |
| 412 | + rewinddir(dir); |
| 413 | + struct dirent* de = readdir(dir); |
| 414 | + TEST_ASSERT_NOT_NULL(de); |
| 415 | + TEST_ASSERT_EQUAL(0, strcasecmp(de->d_name, names[0])); |
| 416 | + seekdir(dir, 3); |
| 417 | + de = readdir(dir); |
| 418 | + TEST_ASSERT_NOT_NULL(de); |
| 419 | + TEST_ASSERT_EQUAL(0, strcasecmp(de->d_name, names[3])); |
| 420 | + seekdir(dir, 1); |
| 421 | + de = readdir(dir); |
| 422 | + TEST_ASSERT_NOT_NULL(de); |
| 423 | + TEST_ASSERT_EQUAL(0, strcasecmp(de->d_name, names[1])); |
| 424 | + seekdir(dir, 2); |
| 425 | + de = readdir(dir); |
| 426 | + TEST_ASSERT_NOT_NULL(de); |
| 427 | + TEST_ASSERT_EQUAL(0, strcasecmp(de->d_name, names[2])); |
| 428 | + |
| 429 | + TEST_ASSERT_EQUAL(0, closedir(dir)); |
| 430 | +} |
340 | 431 |
|
341 | 432 | typedef struct { |
342 | 433 | const char* filename; |
@@ -452,7 +543,6 @@ void test_fatfs_concurrent(const char* filename_prefix) |
452 | 543 | vSemaphoreDelete(args4.done); |
453 | 544 | } |
454 | 545 |
|
455 | | - |
456 | 546 | void test_fatfs_rw_speed(const char* filename, void* buf, size_t buf_size, size_t file_size, bool write) |
457 | 547 | { |
458 | 548 | const size_t buf_count = file_size / buf_size; |
@@ -483,4 +573,3 @@ void test_fatfs_rw_speed(const char* filename, void* buf, size_t buf_size, size_ |
483 | 573 | (write)?"Wrote":"Read", file_size, buf_size, t_s * 1e3, |
484 | 574 | file_size / (1024.0f * 1024.0f * t_s)); |
485 | 575 | } |
486 | | - |
|
0 commit comments