use super::*;
#[test]
fn test_generic_result_alias_supplies_real_error_type() {
let source = r#"
pub struct ConversionError;
pub struct ConversionResult;
pub type Result<T> = std::result::Result<T, ConversionError>;
pub fn convert(html: &str) -> Result<ConversionResult> {
unimplemented!()
}
"#;
let surface = extract_from_source(source);
let convert = surface.functions.iter().find(|f| f.name == "convert").unwrap();
assert_eq!(
convert.error_type.as_deref(),
Some("ConversionError"),
"generic Result<T> alias must resolve error_type from its own definition, got: {:?}",
convert.error_type
);
}
#[test]
fn test_generic_result_alias_supplies_real_error_type_for_method() {
let source = r#"
pub struct ConversionError;
pub struct ConversionResult;
pub type Result<T> = std::result::Result<T, ConversionError>;
pub struct Converter;
impl Converter {
pub fn convert(&self, html: &str) -> Result<ConversionResult> {
unimplemented!()
}
}
"#;
let surface = extract_from_source(source);
let converter = surface.types.iter().find(|t| t.name == "Converter").unwrap();
let convert = converter.methods.iter().find(|m| m.name == "convert").unwrap();
assert_eq!(
convert.error_type.as_deref(),
Some("ConversionError"),
"generic Result<T> alias must resolve error_type from its own definition, got: {:?}",
convert.error_type
);
}
#[test]
fn test_result_alias_resolves_when_declared_in_a_different_module() {
let source = r#"
pub struct ConversionError;
pub struct ConversionResult;
pub type Result<T> = std::result::Result<T, ConversionError>;
pub mod convert_api {
use super::{ConversionResult, Result};
pub fn convert(html: &str) -> Result<ConversionResult> {
unimplemented!()
}
}
"#;
let surface = extract_from_source(source);
let convert = surface.functions.iter().find(|f| f.name == "convert").unwrap();
assert_eq!(
convert.error_type.as_deref(),
Some("ConversionError"),
"alias declared in a sibling module must still supply the error type, got: {:?}",
convert.error_type
);
}