solverforge-macros 0.14.0

Derive macros for SolverForge constraint solver
Documentation
use quote::quote;

use super::{parse_serde_flag, parse_solution_flags};

#[test]
fn parse_solution_flags_accepts_current_arguments() {
    let flags = parse_solution_flags(quote! {
        serde,
        constraints = "constraints",
        config = "config",
        solver_toml = "solver.toml",
        search = "search::search",
        conflict_repairs = "repairs",
        scalar_groups = "groups"
    })
    .expect("current planning_solution arguments should parse");

    assert!(flags.has_serde);
    assert_eq!(flags.constraints_path.as_deref(), Some("constraints"));
    assert_eq!(flags.config_path.as_deref(), Some("config"));
    assert_eq!(flags.solver_toml_path.as_deref(), Some("solver.toml"));
    assert_eq!(flags.search_path.as_deref(), Some("search::search"));
    assert_eq!(flags.conflict_repairs_path.as_deref(), Some("repairs"));
    assert_eq!(flags.scalar_groups_path.as_deref(), Some("groups"));
}

#[test]
fn parse_solution_flags_rejects_unknown_arguments() {
    let error = parse_solution_flags(quote! { conflict_repair_providers = "repairs" })
        .expect_err("unknown planning_solution arguments should fail");

    assert!(error
        .to_string()
        .contains("unsupported planning_solution argument `conflict_repair_providers`"));
}

#[test]
fn parse_solution_flags_rejects_malformed_values() {
    let error = parse_solution_flags(quote! { conflict_repairs = repairs })
        .expect_err("non-string planning_solution values should fail");

    assert!(error
        .to_string()
        .contains("planning_solution argument `conflict_repairs` must be a string literal"));
}

#[test]
fn parse_solution_flags_rejects_invalid_search_path() {
    let error = parse_solution_flags(quote! { search = "search::" })
        .expect_err("invalid search path strings should fail");

    assert!(error
        .to_string()
        .contains("planning_solution argument `search` must be a valid Rust path string"));
}

#[test]
fn parse_serde_flag_rejects_unknown_top_level_arguments() {
    let error = parse_serde_flag(quote! { debug }, "planning_entity")
        .expect_err("unknown planning_entity arguments should fail");

    assert!(error
        .to_string()
        .contains("unsupported planning_entity argument `debug`"));
}