tests.rsannotatedtests.rssource353 lines · 9.4 KB · raw
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}