emelex 1.1.1

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

#[test]
fn hub_reference_round_trips() {
	let reference = ModelRef::parse("mlx-community/Qwen3.5-4B-4bit").expect("valid");
	assert_eq!(reference.to_string(), "mlx-community/Qwen3.5-4B-4bit");

	let unnamespaced = ModelRef::parse("gpt2").expect("valid unnamespaced Hub ID");
	assert_eq!(unnamespaced.to_string(), "gpt2");
}

#[test]
fn local_reference_round_trips() {
	let reference = ModelRef::parse("local:experiment-1").expect("valid");
	assert_eq!(reference.to_string(), "local:experiment-1");
}

#[test]
fn path_like_local_name_is_rejected() {
	let error = ModelRef::parse("local:../outside").expect_err("unsafe");
	assert!(matches!(error, ModelRefError::InvalidLocal(_)));
}

#[test]
fn partial_revision_is_rejected() {
	let error = ResolvedRevision::parse("deadbeef").expect_err("partial");
	assert!(matches!(error, ModelRefError::InvalidRevision(_)));
}

#[test]
fn overlong_identity_components_are_rejected() {
	let id = format!("{}/repo", "a".repeat(97));
	assert!(matches!(
		HubModelId::parse(id),
		Err(ModelRefError::InvalidHub(_))
	));
	assert!(matches!(
		LocalModelName::parse("a".repeat(129)),
		Err(ModelRefError::InvalidLocal(_))
	));
}

#[test]
fn hub_reference_matches_hugging_face_repository_rules() {
	for valid in [
		"foo",
		"123",
		"_owner/_repo_",
		"mlx-community/Qwen3.5-4B-4bit",
		"owner.with-dots/repo_name",
		"owner/repo.GIT",
	] {
		assert!(HubModelId::parse(valid).is_ok(), "{valid}");
	}
	for invalid in [
		"",
		".repo_id",
		"foo.git",
		".owner/repo",
		"owner-/repo",
		"owner/repo.",
		"owner/foo--bar",
		"owner/foo..bar",
		"owner/repo.git",
		"datasets/foo/bar",
	] {
		assert!(
			matches!(
				HubModelId::parse(invalid),
				Err(ModelRefError::InvalidHub(_))
			),
			"{invalid}"
		);
	}
	let overlong_repo = format!("owner/{}", "r".repeat(97));
	assert!(matches!(
		HubModelId::parse(overlong_repo),
		Err(ModelRefError::InvalidHub(_))
	));
	let overlong_total = format!("{}/{}", "o".repeat(48), "r".repeat(48));
	assert!(matches!(
		HubModelId::parse(overlong_total),
		Err(ModelRefError::InvalidHub(_))
	));

	let namespaced = HubModelId::parse("owner/model").expect("namespaced ID");
	assert_eq!(namespaced.namespace(), Some("owner"));
	assert_eq!(namespaced.repo_name(), "model");
	let unnamespaced = HubModelId::parse("gpt2").expect("unnamespaced ID");
	assert_eq!(unnamespaced.namespace(), None);
	assert_eq!(unnamespaced.repo_name(), "gpt2");
}

#[test]
fn exact_hub_snapshot_round_trips() {
	let value = format!("owner/repo@{}", "a".repeat(40));
	let snapshot = ModelSnapshotId::parse(&value).expect("valid exact Hub snapshot");
	assert_eq!(snapshot.to_string(), value);

	let unnamespaced = format!("gpt2@{}", "b".repeat(40));
	let snapshot = ModelSnapshotId::parse(&unnamespaced).expect("valid unnamespaced Hub snapshot");
	assert_eq!(snapshot.to_string(), unnamespaced);
}

#[test]
fn exact_local_snapshot_round_trips() {
	let value = format!("local:work@{}", "b".repeat(64));
	let snapshot = ModelSnapshotId::parse(&value).expect("valid exact local snapshot");
	assert_eq!(snapshot.to_string(), value);
}