emelex 1.1.1

Apple Silicon local inference toolkit powered by MLX
use super::*;

#[test]
fn unknown_sizing_never_matches_numeric_predicates() {
	let traits = ModelTraits::default();
	for filter in [
		"weights_bytes<=0",
		"residency_bytes<=0",
		"context_tokens>=1",
		"max_context_tokens>=1",
	] {
		let filter = TraitFilter::parse(filter).expect("valid numeric predicate");
		assert!(!traits.satisfies(&filter), "{filter}");
	}
}

#[test]
fn numeric_predicates_use_typed_sizing_facts() {
	let traits = ModelTraits {
		sizing: Some(ModelSizing {
			weights_bytes: Some(2_000),
			estimated_residency_bytes: Some(4_000),
			evaluated_context_tokens: Some(8_192),
			max_context_tokens: Some(32_768),
		}),
		..ModelTraits::default()
	};
	for filter in [
		"weights_bytes<=2000",
		"residency_bytes<=4000",
		"context_tokens>=8192",
		"max_context_tokens>=32768",
	] {
		let filter = TraitFilter::parse(filter).expect("valid numeric predicate");
		assert!(traits.satisfies(&filter), "{filter}");
	}
}

#[test]
fn confidence_predicate_uses_underlying_capability_key() {
	let mut traits = ModelTraits {
		mlx: true,
		..ModelTraits::default()
	};
	traits
		.confidence
		.insert("acceleration:mlx".to_string(), TraitConfidence::Inferred);
	let inferred = TraitFilter::parse("confidence:inferred:acceleration:mlx")
		.expect("valid confidence predicate");
	let verified = TraitFilter::parse("confidence:runtime_verified:acceleration:mlx")
		.expect("valid confidence predicate");
	assert!(traits.satisfies(&inferred));
	assert!(!traits.satisfies(&verified));
	assert_eq!(
		traits.confidence(&inferred),
		Some(TraitConfidence::Inferred)
	);
}

#[test]
fn mtp_stage_predicate_preserves_progression() {
	let traits = ModelTraits {
		mtp: MtpSupport::Advertised,
		..ModelTraits::default()
	};
	let advertised = TraitFilter::parse("mtp_stage>=advertised").expect("valid MTP predicate");
	let verified = TraitFilter::parse("mtp_stage>=runtime_verified").expect("valid MTP predicate");
	assert!(traits.satisfies(&advertised));
	assert!(!traits.satisfies(&verified));
}

#[test]
fn filters_reject_typos_and_unsafe_extensions() {
	assert!(TraitFilter::parse("acceleration:mx").is_err());
	assert!(TraitFilter::parse("extension:../escape").is_err());
	assert!(TraitFilter::parse("weights_bytes<=many").is_err());
}

#[test]
fn unsupported_video_filters_are_rejected() {
	for value in ["input:video", "output:video"] {
		assert!(TraitFilter::parse(value).is_err(), "{value}");
	}
}

#[test]
fn task_translation_filter_matches_translation_task() {
	let filter = TraitFilter::parse("task:translation").expect("known capability");
	let mut traits = ModelTraits::default();
	assert!(!traits.satisfies(&filter));
	traits.tasks.insert(Task::Translation);
	assert!(traits.satisfies(&filter));
}