Files
simple-multimidia-track-aud…/src/application/use_cases/generate_output.rs
T

70 lines
2.0 KiB
Rust

use crate::application::ports::MediaProcessorPort;
use crate::domain::entities::Project;
use anyhow::Result;
/// Constrói o comando FFmpeg a partir do Project e delega a execução ao MediaProcessorPort.
#[allow(dead_code)]
pub struct GenerateOutput;
impl GenerateOutput {
#[allow(dead_code)]
pub fn execute(project: &Project, port: &dyn MediaProcessorPort) -> Result<()> {
use crate::adapters::ffmpeg::command_builder::FfmpegCommandBuilder;
let args = FfmpegCommandBuilder::build(project);
port.execute(args)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::application::ports::MediaProcessorPort;
use crate::application::use_cases::add_audio_track::AddAudioTrack;
use crate::domain::entities::{MkvOutput, Project, VideoFile};
use crate::domain::value_objects::{FilePath, SyncOffset, TrackLanguage};
use anyhow::Result;
use std::cell::RefCell;
struct MockProcessor {
captured_args: RefCell<Vec<String>>,
}
impl MediaProcessorPort for MockProcessor {
fn execute(&self, args: Vec<String>) -> Result<()> {
*self.captured_args.borrow_mut() = args;
Ok(())
}
}
#[test]
fn sempre_inclui_c_copy() {
let mut project = Project::new(
VideoFile::new(FilePath::from("input.mkv")),
MkvOutput::new(FilePath::from("output.mkv")),
)
.unwrap();
AddAudioTrack::execute(
&mut project,
FilePath::from("audio_pt.aac"),
SyncOffset::from_ms(1200),
TrackLanguage::new("por").unwrap(),
false,
String::new(),
)
.unwrap();
let mock = MockProcessor {
captured_args: RefCell::new(vec![]),
};
GenerateOutput::execute(&project, &mock).unwrap();
let args = mock.captured_args.borrow();
assert!(
args.contains(&"-c".to_string()) && args.contains(&"copy".to_string()),
"Comando não continha '-c copy': {:?}",
args
);
}
}