1use super::*; 2 3const STANDARD_SPACE: &str = " 4FILE \"Standard Space.bin\" BINARY 5 TRACK 01 MODE1/2352 6 INDEX 01 00:00:00 7 TRACK 02 AUDIO 8 PREGAP 00:02:00 9 INDEX 01 13:10:11 10 TRACK 03 AUDIO 11 INDEX 00 13:14:25 12 INDEX 01 13:16:25 13"; 14 15#[test] 16fn single_file_standard_space() { 17 let files = CueParser::new().parse(STANDARD_SPACE).unwrap(); 18 assert_eq!( 19 files, 20 vec![ParsedFile { 21 file_name: "Standard Space.bin".into(), 22 file_type: FileType::Binary, 23 tracks: vec![ 24 ParsedTrack { 25 number: 1, 26 mode: TrackMode::Mode1, 27 pregap_len: None, 28 pause_start: None, 29 postgap_len: None, 30 track_start: CdTime::new(0, 0, 0), 31 }, 32 ParsedTrack { 33 number: 2, 34 mode: TrackMode::Audio, 35 pregap_len: Some(CdTime::new(0, 2, 0)), 36 pause_start: None, 37 postgap_len: None, 38 track_start: CdTime::new(13, 10, 11), 39 }, 40 ParsedTrack { 41 number: 3, 42 mode: TrackMode::Audio, 43 pregap_len: None, 44 pause_start: Some(CdTime::new(13, 14, 25)), 45 postgap_len: None, 46 track_start: CdTime::new(13, 16, 25), 47 } 48 ] 49 }] 50 ) 51} 52 53const MORE_SPACE: &str = " 54FILE \"More Space.bin\" BINARY 55 TRACK 01 MODE1/2352 56 INDEX 01 00:00:00 57 TRACK 02 AUDIO 58 INDEX 00 01:31:14 59 INDEX 01 01:33:14 60 TRACK 03 AUDIO 61 INDEX 00 01:38:14 62 INDEX 01 01:40:14 63"; 64 65#[test] 66fn single_file_more_space() { 67 let files = CueParser::new().parse(MORE_SPACE).unwrap(); 68 assert_eq!( 69 files, 70 vec![ParsedFile { 71 file_name: "More Space.bin".into(), 72 file_type: FileType::Binary, 73 tracks: vec![ 74 ParsedTrack { 75 number: 1, 76 mode: TrackMode::Mode1, 77 pregap_len: None, 78 pause_start: None, 79 postgap_len: None, 80 track_start: CdTime::new(0, 0, 0), 81 }, 82 ParsedTrack { 83 number: 2, 84 mode: TrackMode::Audio, 85 pregap_len: None, 86 pause_start: Some(CdTime::new(1, 31, 14)), 87 postgap_len: None, 88 track_start: CdTime::new(1, 33, 14), 89 }, 90 ParsedTrack { 91 number: 3, 92 mode: TrackMode::Audio, 93 pregap_len: None, 94 pause_start: Some(CdTime::new(1, 38, 14)), 95 postgap_len: None, 96 track_start: CdTime::new(1, 40, 14), 97 } 98 ] 99 }] 100 ) 101} 102 103const MULTI_FILE: &str = " 104FILE \"Multi File (Track 01).bin\" BINARY 105 TRACK 01 MODE1/2352 106 INDEX 01 00:00:00 107FILE \"Multi File (Track 02).bin\" BINARY 108 TRACK 02 AUDIO 109 INDEX 00 00:00:00 110 INDEX 01 00:02:00 111FILE \"Multi File (Track 03).bin\" BINARY 112 TRACK 03 AUDIO 113 INDEX 00 00:00:00 114 INDEX 01 00:02:00 115"; 116 117#[test] 118fn multi_file() { 119 let files = CueParser::new().parse(MULTI_FILE).unwrap(); 120 assert_eq!(files.len(), 3); 121 122 assert_eq!( 123 files[0], 124 ParsedFile { 125 file_name: "Multi File (Track 01).bin".into(), 126 file_type: FileType::Binary, 127 tracks: vec![ParsedTrack { 128 number: 1, 129 mode: TrackMode::Mode1, 130 pregap_len: None, 131 pause_start: None, 132 postgap_len: None, 133 track_start: CdTime::new(0, 0, 0), 134 }] 135 } 136 ); 137 138 for i in [1, 2] { 139 let track_num = i + 1; 140 let file_name = format!("Multi File (Track {track_num:02}).bin"); 141 assert_eq!( 142 files[i], 143 ParsedFile { 144 file_name, 145 file_type: FileType::Binary, 146 tracks: vec![ParsedTrack { 147 number: track_num as u8, 148 mode: TrackMode::Audio, 149 pregap_len: None, 150 pause_start: Some(CdTime::new(0, 0, 0)), 151 postgap_len: None, 152 track_start: CdTime::new(0, 2, 0), 153 }] 154 } 155 ); 156 } 157} 158 159// Based on an image of Ys IV: The Dawn of Ys 160const PCE_SAMPLE: &str = r#" 161FILE "Test (Track 01).bin" BINARY 162 TRACK 01 AUDIO 163 INDEX 01 00:00:00 164FILE "Test (Track 02).bin" BINARY 165 TRACK 02 MODE1/2352 166 INDEX 00 00:00:00 167 INDEX 01 00:02:74 168FILE "Test (Track 03).bin" BINARY 169 TRACK 03 AUDIO 170 INDEX 00 00:00:00 171 INDEX 01 00:02:00 172FILE "Test (Track 04).bin" BINARY 173 TRACK 04 AUDIO 174 INDEX 01 00:00:00 175FILE "Test (Track 05).bin" BINARY 176 TRACK 05 AUDIO 177 INDEX 01 00:00:00 178FILE "Test (Track 06).bin" BINARY 179 TRACK 06 AUDIO 180 INDEX 01 00:00:00 181FILE "Test (Track 07).bin" BINARY 182 TRACK 07 AUDIO 183 INDEX 01 00:00:00 184FILE "Test (Track 08).bin" BINARY 185 TRACK 08 AUDIO 186 INDEX 01 00:00:00 187FILE "Test (Track 09).bin" BINARY 188 TRACK 09 AUDIO 189 INDEX 01 00:00:00 190FILE "Test (Track 10).bin" BINARY 191 TRACK 10 AUDIO 192 INDEX 01 00:00:00 193FILE "Test (Track 11).bin" BINARY 194 TRACK 11 AUDIO 195 INDEX 01 00:00:00 196FILE "Test (Track 12).bin" BINARY 197 TRACK 12 AUDIO 198 INDEX 01 00:00:00 199FILE "Test (Track 13).bin" BINARY 200 TRACK 13 AUDIO 201 INDEX 01 00:00:00 202FILE "Test (Track 14).bin" BINARY 203 TRACK 14 AUDIO 204 INDEX 01 00:00:00 205FILE "Test (Track 15).bin" BINARY 206 TRACK 15 AUDIO 207 INDEX 01 00:00:00 208FILE "Test (Track 16).bin" BINARY 209 TRACK 16 AUDIO 210 INDEX 01 00:00:00 211FILE "Test (Track 17).bin" BINARY 212 TRACK 17 AUDIO 213 INDEX 01 00:00:00 214FILE "Test (Track 18).bin" BINARY 215 TRACK 18 AUDIO 216 INDEX 01 00:00:00 217FILE "Test (Track 19).bin" BINARY 218 TRACK 19 AUDIO 219 INDEX 01 00:00:00 220FILE "Test (Track 20).bin" BINARY 221 TRACK 20 AUDIO 222 INDEX 01 00:00:00 223FILE "Test (Track 21).bin" BINARY 224 TRACK 21 AUDIO 225 INDEX 01 00:00:00 226FILE "Test (Track 22).bin" BINARY 227 TRACK 22 AUDIO 228 INDEX 01 00:00:00 229FILE "Test (Track 23).bin" BINARY 230 TRACK 23 AUDIO 231 INDEX 01 00:00:00 232FILE "Test (Track 24).bin" BINARY 233 TRACK 24 AUDIO 234 INDEX 01 00:00:00 235FILE "Test (Track 25).bin" BINARY 236 TRACK 25 AUDIO 237 INDEX 01 00:00:00 238FILE "Test (Track 26).bin" BINARY 239 TRACK 26 AUDIO 240 INDEX 01 00:00:00 241FILE "Test (Track 27).bin" BINARY 242 TRACK 27 AUDIO 243 INDEX 01 00:00:00 244FILE "Test (Track 28).bin" BINARY 245 TRACK 28 AUDIO 246 INDEX 01 00:00:00 247FILE "Test (Track 29).bin" BINARY 248 TRACK 29 AUDIO 249 INDEX 01 00:00:00 250FILE "Test (Track 30).bin" BINARY 251 TRACK 30 AUDIO 252 INDEX 01 00:00:00 253FILE "Test (Track 31).bin" BINARY 254 TRACK 31 AUDIO 255 INDEX 01 00:00:00 256FILE "Test (Track 32).bin" BINARY 257 TRACK 32 MODE1/2352 258 INDEX 00 00:00:00 259 INDEX 01 00:02:74 260"#; 261 262#[test] 263fn pce_cue() { 264 let files = CueParser::new().parse(PCE_SAMPLE).unwrap(); 265 assert_eq!(files.len(), 32); 266 267 assert_eq!( 268 files[0], 269 ParsedFile { 270 file_name: "Test (Track 01).bin".into(), 271 file_type: FileType::Binary, 272 tracks: vec![ParsedTrack { 273 number: 1, 274 mode: TrackMode::Audio, 275 pregap_len: None, 276 pause_start: None, 277 postgap_len: None, 278 track_start: CdTime::ZERO, 279 }] 280 }, 281 "Track 1 parsed" 282 ); 283 284 assert_eq!( 285 files[1], 286 ParsedFile { 287 file_name: "Test (Track 02).bin".into(), 288 file_type: FileType::Binary, 289 tracks: vec![ParsedTrack { 290 number: 2, 291 mode: TrackMode::Mode1, 292 pregap_len: None, 293 pause_start: Some(CdTime::ZERO), 294 postgap_len: None, 295 track_start: CdTime::new(0, 2, 74), 296 }], 297 }, 298 "Track 2 parsed" 299 ); 300 301 assert_eq!( 302 files[2], 303 ParsedFile { 304 file_name: "Test (Track 03).bin".into(), 305 file_type: FileType::Binary, 306 tracks: vec![ParsedTrack { 307 number: 3, 308 mode: TrackMode::Audio, 309 pregap_len: None, 310 pause_start: Some(CdTime::ZERO), 311 postgap_len: None, 312 track_start: CdTime::new(0, 2, 0), 313 }] 314 }, 315 "Track 3 parsed" 316 ); 317 318 for track in 4..=31 { 319 assert_eq!( 320 files[(track - 1) as usize], 321 ParsedFile { 322 file_name: format!("Test (Track {track:02}).bin"), 323 file_type: FileType::Binary, 324 tracks: vec![ParsedTrack { 325 number: track, 326 mode: TrackMode::Audio, 327 pregap_len: None, 328 pause_start: None, 329 postgap_len: None, 330 track_start: CdTime::ZERO, 331 }], 332 }, 333 "Track {track} parsed" 334 ); 335 } 336 337 assert_eq!( 338 files[31], 339 ParsedFile { 340 file_name: "Test (Track 32).bin".into(), 341 file_type: FileType::Binary, 342 tracks: vec![ParsedTrack { 343 number: 32, 344 mode: TrackMode::Mode1, 345 pregap_len: None, 346 pause_start: Some(CdTime::ZERO), 347 postgap_len: None, 348 track_start: CdTime::new(0, 2, 74), 349 }] 350 }, 351 "Track 32 parsed" 352 ); 353}