You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
4.0 KiB
128 lines
4.0 KiB
use super::expression::Expression; |
|
use super::shell::{Bash, Fish, PowerShell, Shell, WinCmd, Zsh}; |
|
use indoc::writedoc; |
|
use std::fmt::Write; |
|
|
|
#[derive(Debug)] |
|
pub(crate) struct ExpectCommandOutput<S: Shell, Command: Expression<S>> { |
|
_shell: std::marker::PhantomData<S>, |
|
command: Command, |
|
expected_output: &'static str, |
|
message: &'static str, |
|
} |
|
|
|
impl<S: Shell, Command: Expression<S>> ExpectCommandOutput<S, Command> { |
|
pub(crate) fn new( |
|
command: Command, |
|
expected_output: &'static str, |
|
message: &'static str, |
|
) -> Self { |
|
Self { |
|
_shell: std::marker::PhantomData, |
|
command, |
|
expected_output, |
|
message, |
|
} |
|
} |
|
} |
|
|
|
impl<E: Expression<Bash>> Expression<Bash> for ExpectCommandOutput<Bash, E> { |
|
fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { |
|
let mut command = String::new(); |
|
self.command.write_shell(&mut command)?; |
|
|
|
writedoc!( |
|
writer, |
|
r#" |
|
if [ "$({command})" != "{expected_output}" ]; then |
|
echo 'Expected {message} to be {expected_output:?}, Got: '"$({command})" |
|
exit 1 |
|
fi |
|
"#, |
|
command = command, |
|
message = self.message, |
|
expected_output = self.expected_output, |
|
) |
|
} |
|
} |
|
|
|
impl<E: Expression<Zsh>> Expression<Zsh> for ExpectCommandOutput<Zsh, E> { |
|
fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { |
|
let mut command = String::new(); |
|
self.command.write_shell(&mut command)?; |
|
|
|
writedoc!( |
|
writer, |
|
r#" |
|
if [ "$({command})" != "{expected_output}" ]; then |
|
echo 'Expected {message} to be {expected_output:?}, Got: '"$({command})" |
|
exit 1 |
|
fi |
|
"#, |
|
command = command, |
|
message = self.message, |
|
expected_output = self.expected_output, |
|
) |
|
} |
|
} |
|
|
|
impl<E: Expression<Fish>> Expression<Fish> for ExpectCommandOutput<Fish, E> { |
|
fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { |
|
let mut command = String::new(); |
|
self.command.write_shell(&mut command)?; |
|
|
|
writedoc!( |
|
writer, |
|
r#" |
|
if test ({command}) != "{expected_output}" |
|
echo 'Expected {message} to be {expected_output:?}, Got: '({command}) |
|
exit 1 |
|
end |
|
"#, |
|
command = command, |
|
expected_output = self.expected_output, |
|
message = self.message, |
|
) |
|
} |
|
} |
|
|
|
impl<E: Expression<PowerShell>> Expression<PowerShell> for ExpectCommandOutput<PowerShell, E> { |
|
fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { |
|
let mut command = String::new(); |
|
self.command.write_shell(&mut command)?; |
|
|
|
writedoc!( |
|
writer, |
|
r#" |
|
If ("$({command})" -ne "{expected_output}") {{ |
|
Write-Output ('Expected {message} to be {expected_output:?}, Got: ' + $({command})) |
|
exit 1 |
|
}} |
|
"#, |
|
command = command, |
|
expected_output = self.expected_output, |
|
message = self.message, |
|
) |
|
} |
|
} |
|
|
|
impl<E: Expression<WinCmd>> Expression<WinCmd> for ExpectCommandOutput<WinCmd, E> { |
|
fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { |
|
let mut command = String::new(); |
|
self.command.write_shell(&mut command)?; |
|
|
|
writedoc!( |
|
writer, |
|
r#" |
|
{command} | findstr {expected_output} |
|
if %errorlevel% neq 0 ( |
|
echo {message} does not match {expected_output:?} |
|
exit 1 |
|
) |
|
"#, |
|
command = command, |
|
expected_output = WinCmd::shell_escape(self.expected_output), |
|
message = self.message, |
|
) |
|
} |
|
}
|
|
|