solverforge-bridge 0.15.1

Public dynamic model bridge contracts for SolverForge host-language bindings
Documentation
use solverforge_core::score::{ParseableScore, Score};

use crate::{scoped_dynamic_score_family, DynamicScore, DynamicScoreFamily};

#[test]
fn dynamic_score_keeps_static_three_level_score_contract() {
    let score = DynamicScore::hard_medium_soft(-1, 2, 3);

    assert_eq!(DynamicScore::levels_count(), 3);
    assert!(!score.is_feasible());
    assert_eq!(score.to_level_numbers(), vec![-1, 2, 3]);
    assert_eq!(score.family_levels(DynamicScoreFamily::Soft), vec![3]);
    assert_eq!(
        score.family_levels(DynamicScoreFamily::HardSoft),
        vec![-1, 3]
    );
}

#[test]
fn dynamic_score_displays_declared_family() {
    assert_eq!(DynamicScore::soft(3).to_string(), "3");
    assert_eq!(DynamicScore::hard_soft(-1, 3).to_string(), "-1hard/3soft");
    assert_eq!(
        DynamicScore::hard_soft_decimal(-100_000, 150_500).to_string(),
        "-1hard/1.505soft"
    );
    assert_eq!(
        DynamicScore::hard_medium_soft(-1, 2, 3).to_string(),
        "-1hard/2medium/3soft"
    );
}

#[test]
fn dynamic_score_zero_uses_scoped_declared_family() {
    let score = scoped_dynamic_score_family(DynamicScoreFamily::HardSoftDecimal, || {
        <DynamicScore as Score>::zero()
    });

    assert_eq!(score.to_string(), "0hard/0soft");
}

#[test]
fn dynamic_score_parses_standard_score_strings() {
    assert_eq!(
        DynamicScore::parse("-1hard/2medium/3soft").unwrap(),
        DynamicScore::hard_medium_soft(-1, 2, 3)
    );
    assert_eq!(
        DynamicScore::parse("-1hard/3soft").unwrap(),
        DynamicScore::hard_soft(-1, 3)
    );
    assert_eq!(
        DynamicScore::parse("-1hard/1.505soft").unwrap(),
        DynamicScore::hard_soft_decimal(-100_000, 150_500)
    );
    assert_eq!(DynamicScore::parse("3").unwrap(), DynamicScore::soft(3));
}