CUEParser_test.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. #include "CUEParser.h"
  2. #include <stdio.h>
  3. #include <string.h>
  4. /* Unit test helpers */
  5. #define COMMENT(x) printf("\n----" x "----\n");
  6. #define TEST(x) \
  7. if (!(x)) { \
  8. fprintf(stderr, "\033[31;1mFAILED:\033[22;39m %s:%d %s\n", __FILE__, __LINE__, #x); \
  9. status = false; \
  10. } else { \
  11. printf("\033[32;1mOK:\033[22;39m %s\n", #x); \
  12. }
  13. bool test_basics()
  14. {
  15. bool status = true;
  16. const char *cue_sheet = R"(
  17. FILE "Image Name.bin" BINARY
  18. TRACK 01 MODE1/2048
  19. INDEX 01 00:00:00
  20. TRACK 02 AUDIO
  21. PREGAP 00:02:00
  22. INDEX 01 02:47:20
  23. TRACK 03 AUDIO
  24. INDEX 00 07:55:58
  25. INDEX 01 07:55:65
  26. FILE "Sound.wav" WAVE
  27. TRACK 11 AUDIO
  28. INDEX 00 00:00:00
  29. INDEX 01 00:02:00
  30. )";
  31. CUEParser parser(cue_sheet);
  32. COMMENT("test_basics()");
  33. COMMENT("Test TRACK 01 (data)");
  34. const CUETrackInfo *track = parser.next_track();
  35. TEST(track != NULL);
  36. if (track)
  37. {
  38. TEST(strcmp(track->filename, "Image Name.bin") == 0);
  39. TEST(track->file_mode == CUEFile_BINARY);
  40. TEST(track->file_offset == 0);
  41. TEST(track->track_number == 1);
  42. TEST(track->track_mode == CUETrack_MODE1_2048);
  43. TEST(track->sector_length == 2048);
  44. TEST(track->unstored_pregap_length == 0);
  45. TEST(track->data_start == 0);
  46. }
  47. COMMENT("Test TRACK 02 (audio with pregap)");
  48. track = parser.next_track();
  49. TEST(track != NULL);
  50. uint32_t start2 = ((2 * 60) + 47) * 75 + 20;
  51. if (track)
  52. {
  53. TEST(strcmp(track->filename, "Image Name.bin") == 0);
  54. TEST(track->file_mode == CUEFile_BINARY);
  55. TEST(track->file_offset == 2048 * start2);
  56. TEST(track->track_number == 2);
  57. TEST(track->track_mode == CUETrack_AUDIO);
  58. TEST(track->sector_length == 2352);
  59. TEST(track->unstored_pregap_length == 2 * 75);
  60. TEST(track->data_start == start2 + 2 * 75);
  61. }
  62. COMMENT("Test TRACK 03 (audio with index 0)");
  63. track = parser.next_track();
  64. TEST(track != NULL);
  65. uint32_t start3_i0 = ((7 * 60) + 55) * 75 + 58;
  66. uint32_t start3_i1 = ((7 * 60) + 55) * 75 + 65;
  67. if (track)
  68. {
  69. TEST(strcmp(track->filename, "Image Name.bin") == 0);
  70. TEST(track->file_mode == CUEFile_BINARY);
  71. TEST(track->file_offset == 2048 * start2 + 2352 * (start3_i0 - start2));
  72. TEST(track->track_number == 3);
  73. TEST(track->track_mode == CUETrack_AUDIO);
  74. TEST(track->sector_length == 2352);
  75. TEST(track->track_start == start3_i0);
  76. TEST(track->data_start == start3_i1);
  77. }
  78. COMMENT("Test TRACK 11 (audio from wav)");
  79. track = parser.next_track();
  80. TEST(track != NULL);
  81. if (track)
  82. {
  83. TEST(strcmp(track->filename, "Sound.wav") == 0);
  84. TEST(track->file_mode == CUEFile_WAVE);
  85. TEST(track->file_offset == 0);
  86. TEST(track->track_number == 11);
  87. TEST(track->track_mode == CUETrack_AUDIO);
  88. TEST(track->sector_length == 0);
  89. TEST(track->track_start == 0);
  90. TEST(track->data_start == 2 * 75);
  91. }
  92. COMMENT("Test end of file");
  93. track = parser.next_track();
  94. TEST(track == NULL);
  95. COMMENT("Test restart");
  96. parser.restart();
  97. track = parser.next_track();
  98. TEST(track != NULL && track->track_number == 1);
  99. return status;
  100. }
  101. bool test_datatracks()
  102. {
  103. bool status = true;
  104. const char *cue_sheet = R"(
  105. FILE "beos-5.0.3-professional-gobe.bin" BINARY
  106. TRACK 01 MODE1/2352
  107. INDEX 01 00:00:00
  108. TRACK 02 MODE1/2352
  109. INDEX 01 10:48:58
  110. TRACK 03 MODE1/2352
  111. INDEX 01 46:07:03
  112. )";
  113. CUEParser parser(cue_sheet);
  114. COMMENT("test_datatracks()");
  115. COMMENT("Test TRACK 01 (data)");
  116. const CUETrackInfo *track = parser.next_track();
  117. TEST(track != NULL);
  118. if (track)
  119. {
  120. TEST(strcmp(track->filename, "beos-5.0.3-professional-gobe.bin") == 0);
  121. TEST(track->file_mode == CUEFile_BINARY);
  122. TEST(track->file_offset == 0);
  123. TEST(track->track_number == 1);
  124. TEST(track->track_mode == CUETrack_MODE1_2352);
  125. TEST(track->sector_length == 2352);
  126. TEST(track->unstored_pregap_length == 0);
  127. TEST(track->data_start == 0);
  128. TEST(track->track_start == 0);
  129. }
  130. COMMENT("Test TRACK 02 (data)");
  131. track = parser.next_track();
  132. TEST(track != NULL);
  133. if (track)
  134. {
  135. TEST(track->file_mode == CUEFile_BINARY);
  136. TEST(track->file_offset == 0x6D24560);
  137. TEST(track->track_number == 2);
  138. TEST(track->track_mode == CUETrack_MODE1_2352);
  139. TEST(track->sector_length == 2352);
  140. TEST(track->unstored_pregap_length == 0);
  141. TEST(track->data_start == ((10 * 60) + 48) * 75 + 58);
  142. TEST(track->track_start == ((10 * 60) + 48) * 75 + 58);
  143. }
  144. COMMENT("Test TRACK 03 (data)");
  145. track = parser.next_track();
  146. TEST(track != NULL);
  147. if (track)
  148. {
  149. TEST(track->file_mode == CUEFile_BINARY);
  150. TEST(track->file_offset == 0x1D17E780);
  151. TEST(track->track_number == 3);
  152. TEST(track->track_mode == CUETrack_MODE1_2352);
  153. TEST(track->sector_length == 2352);
  154. TEST(track->unstored_pregap_length == 0);
  155. TEST(track->data_start == ((46 * 60) + 7) * 75 + 3);
  156. TEST(track->track_start == ((46 * 60) + 7) * 75 + 3);
  157. }
  158. track = parser.next_track();
  159. TEST(track == NULL);
  160. return status;
  161. }
  162. bool test_datatrackpregap()
  163. {
  164. bool status = true;
  165. const char *cue_sheet = R"(
  166. FILE "issue422.bin" BINARY
  167. TRACK 01 AUDIO
  168. INDEX 01 00:00:00
  169. TRACK 02 MODE1/2352
  170. PREGAP 00:02:00
  171. INDEX 01 01:06:19
  172. )";
  173. CUEParser parser(cue_sheet);
  174. COMMENT("test_datatrackpregap()");
  175. COMMENT("Test TRACK 01 (audio)");
  176. const CUETrackInfo *track = parser.next_track();
  177. TEST(track != NULL);
  178. if (track)
  179. {
  180. TEST(strcmp(track->filename, "issue422.bin") == 0);
  181. TEST(track->file_mode == CUEFile_BINARY);
  182. TEST(track->file_offset == 0);
  183. TEST(track->track_number == 1);
  184. TEST(track->track_mode == CUETrack_AUDIO);
  185. TEST(track->sector_length == 2352);
  186. TEST(track->unstored_pregap_length == 0);
  187. TEST(track->data_start == 0);
  188. TEST(track->track_start == 0);
  189. }
  190. COMMENT("Test TRACK 02 (data)");
  191. track = parser.next_track();
  192. TEST(track != NULL);
  193. if (track)
  194. {
  195. TEST(strcmp(track->filename, "issue422.bin") == 0);
  196. TEST(track->file_mode == CUEFile_BINARY);
  197. TEST(track->file_offset == 0xB254B0);
  198. TEST(track->track_number == 2);
  199. TEST(track->track_mode == CUETrack_MODE1_2352);
  200. TEST(track->sector_length == 2352);
  201. TEST(track->unstored_pregap_length == 75 * 2);
  202. TEST(track->data_start == (60 + 6 + 2) * 75 + 19);
  203. TEST(track->track_start == (60 + 6) * 75 + 19);
  204. }
  205. track = parser.next_track();
  206. TEST(track == NULL);
  207. return status;
  208. }
  209. int main()
  210. {
  211. if (test_basics() && test_datatracks() && test_datatrackpregap())
  212. {
  213. return 0;
  214. }
  215. else
  216. {
  217. printf("Some tests failed\n");
  218. return 1;
  219. }
  220. }