Files

199 lines
6.8 KiB
V

import os
import metadata
// Проверка чтения id3v23
fn test_idv3v23() {
mut audio := os.open('./data/test_id3v23.mp3') or { panic(err) }
defer {
audio.close()
}
mut wav := metadata.Audio{}
wav.detect_tags(mut audio)
assert wav.id3v1.embedded == false, 'Тег показан true, а должен быть false'
assert wav.id3v23.embedded == true, 'Тег показан false, а должен быть true'
assert wav.id3v24.embedded == false, 'Тег показан true, а должен быть false'
wav.id3v23.get_full_size(mut audio)
wav.id3v23.fill_tags(mut audio)
assert wav.id3v23.tit2.data == 'Test Title'
assert wav.id3v23.tpe1.data == 'Test Author'
assert wav.id3v23.tpe2.data == 'Test Narator'
assert wav.id3v23.talb.data == 'Test Album'
assert wav.id3v23.tyer.data == '2026'
assert wav.id3v23.trck.data == '6/7'
assert wav.id3v23.tcon.data == 'Rock'
assert wav.id3v23.tcop.data == 'Test'
assert wav.id3v23.txxx.data == 'comment'
id3v1 := wav.id3v23.to_v1()
assert id3v1.genre == 'Rock'
assert id3v1.title == 'Test Title'
assert id3v1.artist == 'Test Narator'
assert id3v1.album == 'Test Album'
assert id3v1.track == '6'
assert id3v1.year == '2026'
assert id3v1.comment == 'comment'
}
fn test_writeidv3v23() {
mut audio := os.open('./data/test_id3v23.mp3') or { panic(err) }
defer {
audio.close()
}
mut wav := metadata.Audio{}
wav.detect_tags(mut audio)
assert wav.id3v1.embedded == false, 'Тег показан true, а должен быть false'
assert wav.id3v23.embedded == true, 'Тег показан false, а должен быть true'
assert wav.id3v24.embedded == false, 'Тег показан true, а должен быть false'
wav.id3v23.get_full_size(mut audio)
wav.id3v23.fill_tags(mut audio)
// Изменение значений тэга
wav.id3v23.tit2.set_data('Test Title2')
wav.id3v23.tpe1.set_data('Test Author2')
wav.id3v23.tpe2.set_data('Test Narator2')
wav.id3v23.talb.set_data('Test Album2')
wav.id3v23.tyer.set_data('2027')
wav.id3v23.trck.set_data('7/7')
wav.id3v23.tcon.set_data('Rock2')
wav.id3v23.tcop.set_data('Test2')
wav.id3v23.txxx.set_data('comment2')
wav.id3v23.encode_embed_tags()
wav.id3v23.insert_tags_into_audio(mut audio) or { panic(err) }
os.write_bytes('./data/temp_v23.mp3', wav.id3v23.encoded_header) or { panic(err) }
// Чтение файла и проверка записи
mut temp_audio := os.open('./data/temp_v23.mp3') or { panic(err) }
defer {
temp_audio.close()
}
mut temp_wav := metadata.Audio{}
temp_wav.detect_tags(mut temp_audio)
assert temp_wav.id3v1.embedded == false, 'Тег показан true, а должен быть false'
assert temp_wav.id3v23.embedded == true, 'Тег показан false, а должен быть true'
assert temp_wav.id3v24.embedded == false, 'Тег показан true, а должен быть false'
temp_wav.id3v23.get_full_size(mut temp_audio)
temp_wav.id3v23.fill_tags(mut temp_audio)
assert temp_wav.id3v23.tit2.data == 'Test Title2'
assert temp_wav.id3v23.tpe1.data == 'Test Author2'
assert temp_wav.id3v23.tpe2.data == 'Test Narator2'
assert temp_wav.id3v23.talb.data == 'Test Album2'
assert temp_wav.id3v23.tyer.data == '2027'
assert temp_wav.id3v23.trck.data == '7/7'
assert temp_wav.id3v23.tcon.data == 'Rock2'
assert temp_wav.id3v23.tcop.data == 'Test2'
assert temp_wav.id3v23.txxx.data == 'comment2'
// Проверяется прочитанный с диска тэг, а не тот, что в памяти
id3v1 := temp_wav.id3v23.to_v1()
assert id3v1.genre == 'Rock2'
assert id3v1.title == 'Test Title2'
assert id3v1.artist == 'Test Narator2'
assert id3v1.album == 'Test Album2'
assert id3v1.track == '7'
assert id3v1.year == '2027'
assert id3v1.comment == 'comment2'
}
// Проверка чтения id3v24
fn test_idv3v24() {
mut audio := os.open('./data/test_id3v24.mp3') or { panic(err) }
defer {
audio.close()
}
mut wav := metadata.Audio{}
wav.detect_tags(mut audio)
assert wav.id3v1.embedded == false, 'Тег показан true, а должен быть false'
assert wav.id3v23.embedded == false, 'Тег показан true, а должен быть false'
assert wav.id3v24.embedded == true, 'Тег показан false, а должен быть true'
wav.id3v24.get_full_size(mut audio)
wav.id3v24.fill_tags(mut audio)
assert wav.id3v24.tit2.data == 'Test Title'
assert wav.id3v24.tpe1.data == 'Test Author'
assert wav.id3v24.tpe2.data == 'Test Narator'
assert wav.id3v24.talb.data == 'Test Album'
assert wav.id3v24.tdrc.data == '2026'
assert wav.id3v24.trck.data == '6/7'
assert wav.id3v24.tcon.data == 'Rock'
assert wav.id3v24.tcop.data == 'Test'
assert wav.id3v24.txxx.data == 'comment'
id3v1 := wav.id3v24.to_v1()
assert id3v1.genre == 'Rock'
assert id3v1.title == 'Test Title'
assert id3v1.artist == 'Test Narator'
assert id3v1.album == 'Test Album'
assert id3v1.track == '6'
assert id3v1.year == '2026'
assert id3v1.comment == 'comment'
}
// Кириллица во фрейме с кодировкой ISO-8859-1 не должна превращаться в '?'
fn test_write_unicode_into_latin1_frame() {
mut audio := os.open('./data/test_id3v23.mp3') or { panic(err) }
defer {
audio.close()
}
mut wav := metadata.Audio{}
wav.detect_tags(mut audio)
wav.id3v23.get_full_size(mut audio)
wav.id3v23.fill_tags(mut audio)
old_size := int(wav.id3v23.size)
wav.id3v23.tit2.set_data('Глава 2')
wav.id3v23.encode_embed_tags()
wav.id3v23.insert_tags_into_audio(mut audio) or { panic(err) }
temp_path := os.join_path(os.temp_dir(), 'id3_editor_unicode_test.mp3')
os.write_bytes(temp_path, wav.id3v23.encoded_header) or { panic(err) }
defer {
os.rm(temp_path) or {}
}
mut temp_audio := os.open(temp_path) or { panic(err) }
defer {
temp_audio.close()
}
mut temp_wav := metadata.Audio{}
temp_wav.detect_tags(mut temp_audio)
temp_wav.id3v23.get_full_size(mut temp_audio)
temp_wav.id3v23.fill_tags(mut temp_audio)
assert temp_wav.id3v23.tit2.data == 'Глава 2'
// Нетронутые фреймы и аудио сохраняются без изменений
assert temp_wav.id3v23.tpe1.data == 'Test Author'
assert temp_wav.id3v23.others.len == 1
original := os.read_bytes('./data/test_id3v23.mp3') or { panic(err) }
written := os.read_bytes(temp_path) or { panic(err) }
assert written[int(temp_wav.id3v23.size) + 10..] == original[old_size + 10..]
}
// Вставка в файл без тэга ID3v2 возвращает ошибку, а не падает
fn test_insert_without_id3v2() {
mut audio := os.open('./data/test_id3v1.mp3') or { panic(err) }
defer {
audio.close()
}
mut wav := metadata.Audio{}
wav.id3v23.encode_embed_tags()
wav.id3v23.insert_tags_into_audio(mut audio) or {
assert err.msg() == 'в файле нет тэга ID3v2'
return
}
assert false, 'Ошибка не возвращена'
}