use std::path::{Path, PathBuf};

use shank_idl::{idl::Idl, parse_file, ParseIdlConfig};

fn fixtures_dir() -> PathBuf {
    let root_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
    root_dir.join("tests").join("fixtures").join("macros")
}

#[test]
fn macro_valid_program_id() {
    let file = fixtures_dir().join("program_id_valid.rs");
    let idl = parse_file(file, &ParseIdlConfig::default())
        .expect("Parsing should not fail")
        .expect("File contains IDL");

    let expected_idl: Idl = serde_json::from_str(include_str!(
        "./fixtures/macros/program_id_valid.json"
    ))
    .unwrap();

    assert_eq!(idl, expected_idl);
}

#[test]
fn macro_missing_program_id() {
    let file = fixtures_dir().join("program_id_missing.rs");
    let err = parse_file(file, &ParseIdlConfig::default())
        .expect_err("Should fail")
        .to_string();
    assert!(err.contains("Could not find"));
    assert!(err.contains("declare_id"));
}

#[test]
fn macro_missing_program_id_not_required() {
    let file = fixtures_dir().join("program_id_missing.rs");
    let idl = parse_file(file, &ParseIdlConfig::optional_program_address())
        .expect("Parsing should not fail")
        .expect("File contains IDL");

    let expected_idl: Idl = serde_json::from_str(include_str!(
        "./fixtures/macros/program_id_missing.json"
    ))
    .unwrap();

    assert_eq!(idl, expected_idl);
}