solverforge-core 0.8.6

Core types and traits for SolverForge constraint solver
Documentation
use std::any::TypeId;

use crate::domain::{ChainedVariableInfo, ShadowVariableKind, VariableType};

#[test]
fn test_variable_type_is_genuine() {
    assert!(VariableType::Genuine.is_genuine());
    assert!(VariableType::Chained.is_genuine());
    assert!(VariableType::List.is_genuine());
    assert!(!VariableType::Shadow(ShadowVariableKind::Custom).is_genuine());
}

#[test]
fn test_variable_type_is_shadow() {
    assert!(!VariableType::Genuine.is_shadow());
    assert!(!VariableType::Chained.is_shadow());
    assert!(!VariableType::List.is_shadow());
    assert!(VariableType::Shadow(ShadowVariableKind::Custom).is_shadow());
    assert!(VariableType::Shadow(ShadowVariableKind::InverseRelation).is_shadow());
}

#[test]
fn test_variable_type_is_chained() {
    assert!(!VariableType::Genuine.is_chained());
    assert!(VariableType::Chained.is_chained());
    assert!(!VariableType::List.is_chained());
    assert!(!VariableType::Shadow(ShadowVariableKind::Anchor).is_chained());
}

#[test]
fn test_variable_type_is_list() {
    assert!(!VariableType::Genuine.is_list());
    assert!(!VariableType::Chained.is_list());
    assert!(VariableType::List.is_list());
    assert!(!VariableType::Shadow(ShadowVariableKind::Index).is_list());
}

#[test]
fn test_variable_type_is_basic() {
    assert!(VariableType::Genuine.is_basic());
    assert!(!VariableType::Chained.is_basic());
    assert!(!VariableType::List.is_basic());
    assert!(!VariableType::Shadow(ShadowVariableKind::Custom).is_basic());
}

#[test]
fn test_shadow_variable_kind_requires_listener() {
    assert!(ShadowVariableKind::Custom.requires_listener());
    assert!(ShadowVariableKind::Cascading.requires_listener());
    assert!(!ShadowVariableKind::InverseRelation.requires_listener());
    assert!(!ShadowVariableKind::Index.requires_listener());
    assert!(!ShadowVariableKind::Anchor.requires_listener());
    assert!(!ShadowVariableKind::Piggyback.requires_listener());
}

#[test]
fn test_shadow_variable_kind_is_automatic() {
    assert!(!ShadowVariableKind::Custom.is_automatic());
    assert!(!ShadowVariableKind::Cascading.is_automatic());
    assert!(ShadowVariableKind::InverseRelation.is_automatic());
    assert!(ShadowVariableKind::Index.is_automatic());
    assert!(ShadowVariableKind::NextElement.is_automatic());
    assert!(ShadowVariableKind::PreviousElement.is_automatic());
    assert!(ShadowVariableKind::Anchor.is_automatic());
    assert!(!ShadowVariableKind::Piggyback.is_automatic());
}

#[test]
fn test_shadow_variable_kind_is_piggyback() {
    assert!(ShadowVariableKind::Piggyback.is_piggyback());
    assert!(!ShadowVariableKind::Custom.is_piggyback());
    assert!(!ShadowVariableKind::Anchor.is_piggyback());
}

struct TestAnchor;
struct TestEntity;

#[test]
fn test_chained_variable_info_new() {
    let info = ChainedVariableInfo::new::<TestAnchor, TestEntity>();

    assert_eq!(info.anchor_type_id, TypeId::of::<TestAnchor>());
    assert_eq!(info.entity_type_id, TypeId::of::<TestEntity>());
    assert!(!info.has_anchor_shadow);
}

#[test]
fn test_chained_variable_info_with_anchor_shadow() {
    let info = ChainedVariableInfo::with_anchor_shadow::<TestAnchor, TestEntity>();

    assert_eq!(info.anchor_type_id, TypeId::of::<TestAnchor>());
    assert_eq!(info.entity_type_id, TypeId::of::<TestEntity>());
    assert!(info.has_anchor_shadow);
}

#[test]
fn test_chained_variable_info_type_checks() {
    let info = ChainedVariableInfo::new::<TestAnchor, TestEntity>();

    assert!(info.is_anchor_type(TypeId::of::<TestAnchor>()));
    assert!(!info.is_anchor_type(TypeId::of::<TestEntity>()));

    assert!(info.is_entity_type(TypeId::of::<TestEntity>()));
    assert!(!info.is_entity_type(TypeId::of::<TestAnchor>()));
}