use anyhow::Result;
use vibelang::compiler::{codegen::CodeGenerator, parser::parse_source};
#[test]
fn test_joke_generation_payload() -> Result<()> {
let vibe_source = r#"
// Define a type for the generated joke text
type Joke = Meaning<String>("a short humorous line");
type Topic = Meaning<String>("topic for the joke");
fn tellJoke(topic: Topic) -> Joke {
prompt "Tell me a short joke about {topic}.";
}
"#;
let ast = parse_source(vibe_source)?;
let generated_code = CodeGenerator::new().generate(&ast, false)?;
assert!(generated_code.contains("pub type Joke = String;"), "Joke type alias is incorrect.");
assert!(generated_code.contains("pub type Topic = String;"), "Topic type alias is incorrect.");
assert!(
generated_code.contains("pub fn tellJoke(llm: &LlmClient, topic: Topic) -> Joke"),
"tellJoke function signature is incorrect."
);
assert!(
generated_code.contains(r#"let mut template = "Tell me a short joke about {topic}.".to_string();"#),
"Prompt template was not correctly generated."
);
assert!(
generated_code.contains(r#"let meaning = Some("a short humorous line");"#),
"Semantic meaning was not inherited from the return type."
);
assert!(
generated_code.contains("result.into_string()"),
"Incorrect return type conversion method was used."
);
Ok(())
}
#[test]
fn test_greeting_generation_payload_with_inline_meaning() -> Result<()> {
let vibe_source = r#"
type Greeting = Meaning<String>("a friendly greeting");
type Language = Meaning<String>("language name");
fn generateGreeting(name: Meaning<String>("person's name"),
language: Language) -> Greeting {
prompt "Generate a friendly greeting for a person named {name} in {language}.";
}
"#;
let ast = parse_source(vibe_source)?;
let generated_code = CodeGenerator::new().generate(&ast, false)?;
assert!(generated_code.contains("pub type Greeting = String;"));
assert!(generated_code.contains("pub type Language = String;"));
assert!(
generated_code.contains("pub fn generateGreeting(llm: &LlmClient, name: String, language: Language) -> Greeting"),
"generateGreeting function signature is incorrect. Check handling of inline Meaning parameter."
);
assert!(generated_code.contains(r#"template = template.replace("{name}", &name.to_string());"#));
assert!(generated_code.contains(r#"template = template.replace("{language}", &language.to_string());"#));
assert!(
generated_code.contains(r#"let meaning = Some("a friendly greeting");"#),
"Semantic meaning was not inherited correctly."
);
Ok(())
}