use vyre_runtime::megakernel::{
protocol::{self, control, debug},
Megakernel,
};
use vyre_runtime::PipelineError;
fn write_word(bytes: &mut [u8], word_idx: usize, value: u32) {
let off = word_idx * 4;
bytes[off..off + 4].copy_from_slice(&value.to_le_bytes());
}
#[test]
fn try_encode_empty_ring_zero_slots_produces_empty_vec() {
let ring = protocol::try_encode_empty_ring(0).expect("zero slots must encode");
assert!(ring.is_empty(), "zero-slot ring must be empty");
}
#[test]
fn publish_slot_rejects_zero_slot_ring() {
let mut ring = protocol::encode_empty_ring(0).unwrap();
let err = Megakernel::publish_slot(&mut ring, 0, 0, protocol::opcode::NOP, &[])
.expect_err("empty ring must reject publish");
assert!(matches!(err, PipelineError::QueueFull { .. }));
}
#[test]
fn encode_control_zero_observables_exactly_min_words() {
let ctrl = Megakernel::encode_control(false, 0, 0).unwrap();
let expected = (protocol::CONTROL_MIN_WORDS as usize) * 4;
assert_eq!(
ctrl.len(),
expected,
"control with zero observables must equal CONTROL_MIN_WORDS * 4"
);
}
#[test]
fn try_read_observable_rejects_buffer_ending_exactly_at_observable_base() {
let buf = vec![0u8; (control::OBSERVABLE_BASE as usize) * 4];
let err = Megakernel::try_read_observable(&buf, 0)
.expect_err("buffer ending at observable base must reject index 0");
let msg = err.to_string();
assert!(msg.contains("Fix:"), "error must be actionable: {msg}");
}
#[test]
fn try_read_observable_accepts_boundary_when_buffer_has_one_extra_word() {
let mut buf = vec![0u8; (control::OBSERVABLE_BASE as usize + 1) * 4];
write_word(&mut buf, control::OBSERVABLE_BASE as usize, 0xCAFE_BABE);
let val = Megakernel::try_read_observable(&buf, 0)
.expect("observable 0 must be readable with exactly one word past base");
assert_eq!(val, 0xCAFE_BABE);
}
#[test]
fn try_read_debug_log_rejects_zero_byte_buffer() {
let err = Megakernel::try_read_debug_log(&[]).expect_err("zero-byte debug-log must reject");
let msg = err.to_string();
assert!(msg.contains("Fix:"), "error must be actionable: {msg}");
}
#[test]
fn try_encode_empty_debug_log_zero_capacity_roundtrips() {
let log = protocol::try_encode_empty_debug_log(0).expect("zero capacity must encode");
assert_eq!(log.len(), (debug::RECORDS_BASE as usize) * 4);
let records = Megakernel::try_read_debug_log(&log).expect("zero cursor must decode");
assert!(records.is_empty());
}
#[test]
fn read_metrics_on_empty_buffer_returns_empty() {
let metrics = Megakernel::read_metrics(&[]);
assert!(metrics.is_empty(), "empty buffer must yield empty metrics");
}
#[test]
fn try_read_metrics_rejects_buffer_ending_exactly_at_metrics_base() {
let buf = vec![0u8; (control::METRICS_BASE as usize) * 4];
let err =
Megakernel::try_read_metrics(&buf).expect_err("buffer ending at metrics base must reject");
let msg = err.to_string();
assert!(msg.contains("Fix:"), "error must be actionable: {msg}");
}
#[test]
fn read_observable_returns_zero_for_out_of_bounds_on_minimal_buffer() {
let ctrl = Megakernel::encode_control(false, 1, 0).unwrap();
assert_eq!(Megakernel::read_observable(&ctrl, 0), 0);
assert_eq!(Megakernel::read_observable(&ctrl, 99), 0);
}
#[test]
fn strict_metrics_window_exact_boundary_succeeds() {
let mut buf = vec![0u8; ((control::METRICS_BASE + control::METRICS_SLOTS) as usize) * 4];
write_word(&mut buf, (control::METRICS_BASE + 5) as usize, 42);
let metrics = Megakernel::try_read_metrics(&buf).expect("exact boundary must succeed");
assert_eq!(metrics, vec![(5, 42)]);
}