#![cfg(target_os = "macos")]
use std::path::PathBuf;
use moeflux::{Ctx, CheckpointError, DEFAULT_MAX_CHECKPOINTS};
fn model_root() -> PathBuf {
let default =
"/Volumes/Temp Backup/models/moeflux/qwen3-6-35b-a3b-root";
PathBuf::from(std::env::var("MOEFLUX_SMOKE_ROOT").unwrap_or(default.into()))
}
fn artifacts() -> PathBuf {
let default =
"/Volumes/Temp Backup/models/moeflux/qwen3-6-35b-a3b-artifacts";
PathBuf::from(
std::env::var("MOEFLUX_SMOKE_ARTIFACTS").unwrap_or(default.into()),
)
}
fn open_ctx() -> Ctx {
let art = artifacts();
let root = model_root();
Ctx::open(
&art.join("model_weights.bin"),
&art.join("model_weights.json"),
&art.join("vocab.bin"),
&root,
4,
false,
)
.expect("Ctx::open")
}
fn argmax(logits: &[f32]) -> i32 {
let mut best_id = 0i32;
let mut best_v = f32::NEG_INFINITY;
for (i, &v) in logits.iter().enumerate() {
if v > best_v {
best_v = v;
best_id = i as i32;
}
}
best_id
}
const PROMPT: &[i32] = &[1, 100, 500, 1000, 2000, 3000];
#[test]
#[ignore]
fn checkpoint_then_restore_round_trips() {
let mut ctx = open_ctx();
let mut logits = vec![0.0f32; ctx.n_vocab()];
ctx.eval_prompt(PROMPT, 0, 0, &mut logits).expect("eval_prompt");
ctx.checkpoint_pos(PROMPT.len() as i32)
.expect("checkpoint_pos");
let probe = argmax(&logits);
let probe_pos = PROMPT.len();
ctx.eval_token(probe, probe_pos, 0, &mut logits)
.expect("eval_token probe");
let logits_post_checkpoint = logits.clone();
ctx.restore_to(PROMPT.len() as i32).expect("restore_to");
ctx.eval_token(probe, probe_pos, 0, &mut logits)
.expect("eval_token probe (after restore)");
assert_eq!(
argmax(&logits_post_checkpoint),
argmax(&logits),
"argmax diverged across checkpoint/restore round-trip",
);
let max_abs = logits_post_checkpoint
.iter()
.zip(logits.iter())
.map(|(a, b)| (a - b).abs())
.fold(0.0f32, f32::max);
assert!(
max_abs < 1e-4,
"logits diverged across round-trip: max abs delta = {max_abs}",
);
}
#[test]
#[ignore]
fn restore_to_unknown_pos_errors() {
let mut ctx = open_ctx();
let mut logits = vec![0.0f32; ctx.n_vocab()];
ctx.eval_prompt(PROMPT, 0, 0, &mut logits).expect("eval_prompt");
match ctx.restore_to(9999) {
Err(CheckpointError::NoCheckpoint { pos }) => {
assert_eq!(pos, 9999);
}
other => panic!("expected NoCheckpoint(9999), got {other:?}"),
}
}
#[test]
#[ignore]
fn memory_clear_drops_snapshots() {
let mut ctx = open_ctx();
let mut logits = vec![0.0f32; ctx.n_vocab()];
ctx.eval_prompt(PROMPT, 0, 0, &mut logits).expect("eval_prompt");
ctx.checkpoint_pos(PROMPT.len() as i32)
.expect("checkpoint_pos");
assert_eq!(ctx.checkpoint_count(), 1);
ctx.memory_clear();
assert_eq!(ctx.checkpoint_count(), 0);
match ctx.restore_to(PROMPT.len() as i32) {
Err(CheckpointError::NoCheckpoint { .. }) => {}
other => panic!("expected NoCheckpoint after memory_clear, got {other:?}"),
}
}
#[test]
#[ignore]
fn lru_eviction_keeps_last_n() {
let mut ctx = open_ctx();
let mut logits = vec![0.0f32; ctx.n_vocab()];
ctx.eval_prompt(PROMPT, 0, 0, &mut logits).expect("eval_prompt");
assert_eq!(DEFAULT_MAX_CHECKPOINTS, 4, "test assumes default cap of 4");
for &pos in &[50, 100, 150, 200, 250] {
ctx.checkpoint_pos(pos).expect("checkpoint_pos");
}
assert_eq!(ctx.checkpoint_count(), 4);
assert!(matches!(ctx.restore_to(50), Err(CheckpointError::NoCheckpoint { .. })));
assert_eq!(ctx.checkpoint_count(), 4);
ctx.restore_to(250).expect("restore_to most-recent");
}
#[test]
#[ignore]
fn lru_protects_pos_zero() {
let mut ctx = open_ctx();
let mut logits = vec![0.0f32; ctx.n_vocab()];
ctx.eval_prompt(PROMPT, 0, 0, &mut logits).expect("eval_prompt");
for &pos in &[0, 50, 100, 150, 200] {
ctx.checkpoint_pos(pos).expect("checkpoint_pos");
}
assert_eq!(ctx.checkpoint_count(), 4);
ctx.restore_to(0).expect("pos=0 must remain restorable");
}
#[test]
#[ignore]
fn forget_pos_drops_one_entry() {
let mut ctx = open_ctx();
let mut logits = vec![0.0f32; ctx.n_vocab()];
ctx.eval_prompt(PROMPT, 0, 0, &mut logits).expect("eval_prompt");
for &pos in &[50, 100, 150] {
ctx.checkpoint_pos(pos).expect("checkpoint_pos");
}
assert_eq!(ctx.checkpoint_count(), 3);
ctx.forget_pos(100);
assert_eq!(ctx.checkpoint_count(), 2);
assert!(matches!(
ctx.restore_to(100),
Err(CheckpointError::NoCheckpoint { .. })
));
ctx.restore_to(150).expect("150 must survive forget_pos(100)");
ctx.restore_to(50).expect("50 must survive forget_pos(100)");
}
#[test]
#[ignore]
fn forget_pos_idempotent_on_missing() {
let mut ctx = open_ctx();
let mut logits = vec![0.0f32; ctx.n_vocab()];
ctx.eval_prompt(PROMPT, 0, 0, &mut logits).expect("eval_prompt");
ctx.checkpoint_pos(100).expect("checkpoint_pos");
assert_eq!(ctx.checkpoint_count(), 1);
ctx.forget_pos(9999);
assert_eq!(ctx.checkpoint_count(), 1);
ctx.forget_pos(100);
assert_eq!(ctx.checkpoint_count(), 0);
ctx.forget_pos(100);
assert_eq!(ctx.checkpoint_count(), 0);
}