Skip to content

Commit eb9c1af

Browse files
committed
Tests: Add TagLib OGG tests
1 parent 16f32e1 commit eb9c1af

File tree

2 files changed

+158
-1
lines changed

2 files changed

+158
-1
lines changed

tests/taglib/main.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ mod test_info;
1111
mod test_mp4;
1212
mod test_mpeg;
1313
mod test_ogaflac;
14+
mod test_ogg;
15+
mod test_opus;
1416
mod test_speex;
1517
mod test_wav;
1618
mod test_wavpack;
1719
mod test_xiphcomment;
18-
mod test_opus;

tests/taglib/test_ogg.rs

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
use crate::temp_file;
2+
use lofty::ogg::VorbisFile;
3+
use lofty::{Accessor, AudioFile, ParseOptions};
4+
5+
use std::io::{Read, Seek, SeekFrom};
6+
7+
use byteorder::{LittleEndian, ReadBytesExt};
8+
9+
#[test]
10+
fn test_simple() {
11+
let mut file = temp_file!("tests/taglib/data/empty.ogg");
12+
13+
{
14+
let mut f = VorbisFile::read_from(&mut file, ParseOptions::new()).unwrap();
15+
file.rewind().unwrap();
16+
17+
f.vorbis_comments_mut()
18+
.set_artist(String::from("The Artist"));
19+
f.save_to(&mut file).unwrap();
20+
}
21+
file.rewind().unwrap();
22+
{
23+
let f = VorbisFile::read_from(&mut file, ParseOptions::new()).unwrap();
24+
assert_eq!(f.vorbis_comments().artist().as_deref(), Some("The Artist"));
25+
}
26+
}
27+
28+
#[test]
29+
#[ignore]
30+
fn test_split_packets1() {
31+
// Marker test, Lofty doesn't retain packet information
32+
}
33+
34+
#[test]
35+
fn test_split_packets2() {
36+
let mut file = temp_file!("tests/taglib/data/empty.ogg");
37+
38+
let text = "X".repeat(60890);
39+
{
40+
let mut f = VorbisFile::read_from(&mut file, ParseOptions::new()).unwrap();
41+
file.rewind().unwrap();
42+
43+
f.vorbis_comments_mut().set_title(text.clone());
44+
f.save_to(&mut file).unwrap();
45+
}
46+
file.rewind().unwrap();
47+
{
48+
let mut f = VorbisFile::read_from(&mut file, ParseOptions::new()).unwrap();
49+
file.rewind().unwrap();
50+
51+
assert_eq!(f.vorbis_comments().title().as_deref(), Some(&*text));
52+
53+
f.vorbis_comments_mut().set_title(String::from("ABCDE"));
54+
f.save_to(&mut file).unwrap();
55+
}
56+
file.rewind().unwrap();
57+
{
58+
let f = VorbisFile::read_from(&mut file, ParseOptions::new()).unwrap();
59+
assert_eq!(f.vorbis_comments().title().as_deref(), Some("ABCDE"));
60+
}
61+
}
62+
63+
#[test]
64+
#[ignore]
65+
fn test_dict_interface1() {
66+
// Marker test, Lofty doesn't replicate the dictionary interface
67+
}
68+
69+
#[test]
70+
#[ignore]
71+
fn test_dict_interface2() {
72+
// Marker test, Lofty doesn't replicate the dictionary interface
73+
}
74+
75+
#[test]
76+
fn test_audio_properties() {
77+
let mut file = temp_file!("tests/taglib/data/empty.ogg");
78+
let f = VorbisFile::read_from(&mut file, ParseOptions::new()).unwrap();
79+
assert_eq!(f.properties().duration().as_secs(), 3);
80+
assert_eq!(f.properties().duration().as_millis(), 3685);
81+
assert_eq!(f.properties().audio_bitrate(), 1);
82+
assert_eq!(f.properties().channels(), 2);
83+
assert_eq!(f.properties().sample_rate(), 44100);
84+
assert_eq!(f.properties().version(), 0);
85+
assert_eq!(f.properties().bitrate_max(), 0);
86+
assert_eq!(f.properties().bitrate_nominal(), 112000);
87+
assert_eq!(f.properties().bitrate_min(), 0);
88+
}
89+
90+
#[test]
91+
fn test_page_checksum() {
92+
let mut file = temp_file!("tests/taglib/data/empty.ogg");
93+
94+
{
95+
let mut f = VorbisFile::read_from(&mut file, ParseOptions::new()).unwrap();
96+
file.rewind().unwrap();
97+
98+
f.vorbis_comments_mut()
99+
.set_title(String::from("The Artist"));
100+
f.save_to(&mut file).unwrap();
101+
102+
file.seek(SeekFrom::Start(0x50)).unwrap();
103+
assert_eq!(file.read_u32::<LittleEndian>().unwrap(), 0x3D3BD92D);
104+
}
105+
file.rewind().unwrap();
106+
{
107+
let mut f = VorbisFile::read_from(&mut file, ParseOptions::new()).unwrap();
108+
file.rewind().unwrap();
109+
110+
f.vorbis_comments_mut()
111+
.set_title(String::from("The Artist 2"));
112+
f.save_to(&mut file).unwrap();
113+
114+
file.seek(SeekFrom::Start(0x50)).unwrap();
115+
assert_eq!(file.read_u32::<LittleEndian>().unwrap(), 0xD985291C);
116+
}
117+
}
118+
119+
#[test]
120+
fn test_page_granule_position() {
121+
let mut file = temp_file!("tests/taglib/data/empty.ogg");
122+
123+
{
124+
let mut f = VorbisFile::read_from(&mut file, ParseOptions::new()).unwrap();
125+
file.rewind().unwrap();
126+
127+
// Force the Vorbis comment packet to span more than one page and
128+
// check if the granule position is -1 indicating that no packets
129+
// finish on this page.
130+
f.vorbis_comments_mut().set_comment("A".repeat(70000));
131+
f.save_to(&mut file).unwrap();
132+
133+
file.seek(SeekFrom::Start(0x3A)).unwrap();
134+
let mut buf = [0; 6];
135+
file.read_exact(&mut buf).unwrap();
136+
assert_eq!(buf, *b"OggS\0\0");
137+
assert_eq!(file.read_i64::<LittleEndian>().unwrap(), -1);
138+
}
139+
file.rewind().unwrap();
140+
{
141+
let mut f = VorbisFile::read_from(&mut file, ParseOptions::new()).unwrap();
142+
file.rewind().unwrap();
143+
144+
// Use a small Vorbis comment package which ends on the seconds page and
145+
// check if the granule position is zero.
146+
f.vorbis_comments_mut()
147+
.set_comment(String::from("A small comment"));
148+
f.save_to(&mut file).unwrap();
149+
150+
file.seek(SeekFrom::Start(0x3A)).unwrap();
151+
let mut buf = [0; 6];
152+
file.read_exact(&mut buf).unwrap();
153+
assert_eq!(buf, *b"OggS\0\0");
154+
assert_eq!(file.read_i64::<LittleEndian>().unwrap(), 0);
155+
}
156+
}

0 commit comments

Comments
 (0)