#![allow(
clippy::disallowed_methods,
clippy::needless_range_loop,
clippy::format_collect,
clippy::format_push_string,
clippy::manual_assert,
clippy::uninlined_format_args,
clippy::unnecessary_debug_formatting,
clippy::unwrap_or_default,
clippy::expect_fun_call,
clippy::manual_repeat_n,
clippy::unnecessary_map_or
)]
#![allow(clippy::unwrap_used)]
#![allow(deprecated)]
use assert_cmd::Command;
use predicates::prelude::*;
#[test]
fn falsify_chat_001_chatml_not_double_wrapped() {
let raw_prompt = "Fix the auth bug";
let templated = format!("<|im_start|>user\n{raw_prompt}<|im_end|>\n<|im_start|>assistant\n");
let user_starts = templated.matches("<|im_start|>user").count();
let assistant_starts = templated.matches("<|im_start|>assistant").count();
assert_eq!(
user_starts, 1,
"FALSIFY-CHAT-001: exactly one user im_start marker"
);
assert_eq!(
assistant_starts, 1,
"FALSIFY-CHAT-001: exactly one assistant im_start marker"
);
let content = templated.contains(raw_prompt);
assert!(
content,
"FALSIFY-CHAT-001: original prompt preserved in template"
);
}
#[test]
fn falsify_chat_003_message_serde_roundtrip() {
let msg_json = serde_json::json!({
"role": "user",
"content": "Hello, how are you?"
});
let serialized = serde_json::to_string(&msg_json).unwrap();
let parsed: serde_json::Value = serde_json::from_str(&serialized).unwrap();
assert_eq!(parsed["role"], "user", "FALSIFY-CHAT-003: role preserved");
assert_eq!(
parsed["content"], "Hello, how are you?",
"FALSIFY-CHAT-003: content preserved"
);
let special = serde_json::json!({
"role": "assistant",
"content": "Line1\nLine2\tTab \"quotes\" \u{1F600}"
});
let s = serde_json::to_string(&special).unwrap();
let p: serde_json::Value = serde_json::from_str(&s).unwrap();
assert_eq!(p["role"], "assistant", "FALSIFY-CHAT-003: role preserved");
assert!(
p["content"].as_str().unwrap().contains("Line1"),
"FALSIFY-CHAT-003: special chars preserved"
);
}
#[test]
fn falsify_chat_003b_tool_call_message_roundtrip() {
let msg = serde_json::json!({
"role": "assistant",
"content": null,
"tool_calls": [{
"id": "call_1",
"type": "function",
"function": {
"name": "file_read",
"arguments": "{\"path\": \"src/main.rs\"}"
}
}]
});
let json = serde_json::to_string(&msg).unwrap();
let parsed: serde_json::Value = serde_json::from_str(&json).unwrap();
assert_eq!(
parsed["role"], "assistant",
"FALSIFY-CHAT-003b: assistant role preserved"
);
assert!(
parsed["tool_calls"].is_array(),
"FALSIFY-CHAT-003b: tool_calls is array"
);
assert_eq!(
parsed["tool_calls"][0]["function"]["name"], "file_read",
"FALSIFY-CHAT-003b: tool name preserved"
);
}
#[test]
fn falsify_chat_005_history_append_only() {
let mut history: Vec<serde_json::Value> = vec![
serde_json::json!({"role": "user", "content": "Hello"}),
serde_json::json!({"role": "assistant", "content": "Hi there"}),
];
let snapshot = history.clone();
history.push(serde_json::json!({"role": "user", "content": "Follow up"}));
history.push(serde_json::json!({"role": "assistant", "content": "Sure"}));
assert_eq!(
history[0], snapshot[0],
"FALSIFY-CHAT-005: first message unchanged after append"
);
assert_eq!(
history[1], snapshot[1],
"FALSIFY-CHAT-005: second message unchanged after append"
);
assert_eq!(
history.len(),
4,
"FALSIFY-CHAT-005: history grew from 2 to 4"
);
}
#[test]
fn falsify_cli_001_dispatch_completeness_check() {
let subcommands = vec![
"check", "inspect", "validate", "lint", "explain", "export", "convert",
];
for cmd in subcommands {
let result = Command::cargo_bin("apr")
.expect("apr binary")
.args([cmd, "--help"])
.output();
match result {
Ok(output) => {
assert!(
output.status.success(),
"FALSIFY-CLI-001: `apr {} --help` must succeed (exit {})",
cmd,
output.status.code().unwrap_or(-1)
);
}
Err(e) => {
panic!("FALSIFY-CLI-001: `apr {cmd} --help` failed to run: {e}");
}
}
}
}
#[test]
fn falsify_cli_001b_extended_dispatch() {
let subcommands = vec!["chat", "bench", "eval", "qa", "hex", "tree", "flow"];
for cmd in subcommands {
let result = Command::cargo_bin("apr")
.expect("apr binary")
.args([cmd, "--help"])
.output();
match result {
Ok(output) => {
assert!(
output.status.success(),
"FALSIFY-CLI-001b: `apr {} --help` must succeed (exit {})",
cmd,
output.status.code().unwrap_or(-1)
);
}
Err(e) => {
panic!("FALSIFY-CLI-001b: `apr {cmd} --help` failed to run: {e}");
}
}
}
}
#[test]
fn falsify_cli_002_exit_code_file_not_found() {
let output = Command::cargo_bin("apr")
.expect("apr binary")
.args(["check", "/nonexistent/model.gguf"])
.output()
.expect("Failed to run apr");
let code = output.status.code().unwrap_or(-1);
assert_ne!(
code, 0,
"FALSIFY-CLI-002: nonexistent file must produce non-zero exit code"
);
}
#[test]
fn falsify_cli_002b_exit_code_invalid_subcommand() {
let output = Command::cargo_bin("apr")
.expect("apr binary")
.args(["nonexistent-subcommand"])
.output()
.expect("Failed to run apr");
assert!(
!output.status.success(),
"FALSIFY-CLI-002b: invalid subcommand must fail"
);
}
#[test]
fn falsify_cli_003_help_output() {
Command::cargo_bin("apr")
.expect("apr binary")
.args(["--help"])
.assert()
.success()
.stdout(predicate::str::contains("apr"))
.stdout(predicate::str::is_empty().not());
}
#[test]
fn falsify_cli_006_code_feature_gate() {
Command::cargo_bin("apr")
.expect("apr binary")
.args(["code", "--help"])
.assert()
.success()
.stdout(predicate::str::contains("model"))
.stdout(predicate::str::contains("project"));
}
#[test]
fn falsify_cli_006b_serve_dispatch() {
Command::cargo_bin("apr")
.expect("apr binary")
.args(["serve", "--help"])
.assert()
.success()
.stdout(predicate::str::contains("plan").or(predicate::str::contains("run")));
}
#[test]
fn falsify_cli_006c_chat_dispatch() {
Command::cargo_bin("apr")
.expect("apr binary")
.args(["chat", "--help"])
.assert()
.success()
.stdout(predicate::str::contains("temperature").or(predicate::str::contains("model")));
}
#[test]
fn falsify_chat_006_kv_cache_token_growth() {
let mut history: Vec<String> = Vec::new();
let mut cumulative_tokens = 0usize;
history.push("user: Hello".into());
history.push("assistant: Hi there!".into());
let tokens_t1: usize = history.iter().map(|m| m.split_whitespace().count()).sum();
assert!(
tokens_t1 > cumulative_tokens,
"FALSIFY-CHAT-006: tokens grow after turn 1"
);
cumulative_tokens = tokens_t1;
history.push("user: What is 2+2?".into());
history.push("assistant: 4".into());
let tokens_t2: usize = history.iter().map(|m| m.split_whitespace().count()).sum();
assert!(
tokens_t2 > cumulative_tokens,
"FALSIFY-CHAT-006: tokens grow after turn 2"
);
assert!(
tokens_t2 > tokens_t1,
"FALSIFY-CHAT-006: cumulative tokens monotonically increase"
);
}
#[test]
fn falsify_chat_007_session_jsonl_roundtrip() {
use std::io::{BufRead, Write};
let messages = vec![
serde_json::json!({"role": "system", "content": "You are a helpful assistant."}),
serde_json::json!({"role": "user", "content": "Hello"}),
serde_json::json!({"role": "assistant", "content": "Hi! How can I help?"}),
serde_json::json!({"role": "user", "content": "Fix the bug in auth.rs"}),
serde_json::json!({"role": "assistant", "content": null, "tool_calls": [{"id": "call_1", "type": "function", "function": {"name": "file_read", "arguments": "{\"path\":\"src/auth.rs\"}"}}]}),
];
let dir = tempfile::tempdir().expect("tempdir");
let path = dir.path().join("messages.jsonl");
{
let mut f = std::fs::File::create(&path).expect("create");
for msg in &messages {
writeln!(f, "{}", serde_json::to_string(msg).unwrap()).expect("write");
}
}
let file = std::fs::File::open(&path).expect("open");
let reader = std::io::BufReader::new(file);
let loaded: Vec<serde_json::Value> = reader
.lines()
.map(|l| serde_json::from_str(&l.unwrap()).unwrap())
.collect();
assert_eq!(
loaded.len(),
messages.len(),
"FALSIFY-CHAT-007: message count preserved"
);
for (i, (original, loaded)) in messages.iter().zip(loaded.iter()).enumerate() {
assert_eq!(
original["role"], loaded["role"],
"FALSIFY-CHAT-007: role preserved at index {i}"
);
assert_eq!(
original["content"], loaded["content"],
"FALSIFY-CHAT-007: content preserved at index {i}"
);
}
assert!(
loaded[4]["tool_calls"].is_array(),
"FALSIFY-CHAT-007: tool_calls preserved on assistant message"
);
assert_eq!(
loaded[4]["tool_calls"][0]["function"]["name"], "file_read",
"FALSIFY-CHAT-007: tool call function name preserved"
);
}
#[test]
fn falsify_chat_008_chatml_multiturn_ordering() {
let turns = vec![
("system", "You are helpful."),
("user", "Hello"),
("assistant", "Hi!"),
("user", "Fix auth.rs"),
("assistant", "I'll read the file first."),
];
let mut formatted = String::new();
for (role, content) in &turns {
formatted.push_str(&format!("<|im_start|>{role}\n{content}<|im_end|>\n"));
}
let mut last_pos = 0;
for (role, content) in &turns {
let marker = format!("<|im_start|>{role}\n{content}");
let pos = formatted[last_pos..]
.find(&marker)
.expect(&format!(
"FALSIFY-CHAT-008: {role} turn with '{content}' must be found after position {last_pos}"
));
last_pos += pos + marker.len();
}
}
#[test]
fn falsify_cli_004_idempotent_inspection() {
let dir = tempfile::tempdir().expect("tempdir");
let model = dir.path().join("test.gguf");
std::fs::write(
&model,
[b'G', b'G', b'U', b'F', 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
)
.expect("write model");
let run = |model_path: &std::path::Path| -> std::process::Output {
Command::cargo_bin("apr")
.expect("apr binary")
.args(["check", &model_path.display().to_string()])
.output()
.expect("run apr check")
};
let output1 = run(&model);
let output2 = run(&model);
assert_eq!(
output1.status.code(),
output2.status.code(),
"FALSIFY-CLI-004: exit code must be identical across runs"
);
assert_eq!(
output1.stdout, output2.stdout,
"FALSIFY-CLI-004: stdout must be identical across runs"
);
}
#[test]
fn falsify_cli_007_tokenize_dispatch() {
Command::cargo_bin("apr")
.expect("apr binary")
.args(["tokenize", "--help"])
.assert()
.success()
.stdout(predicate::str::contains("tokenize").or(predicate::str::contains("text")));
}
#[test]
fn falsify_cli_008_data_dispatch() {
Command::cargo_bin("apr")
.expect("apr binary")
.args(["data", "--help"])
.assert()
.success()
.stdout(predicate::str::is_empty().not());
}
#[test]
fn falsify_life_001_check_rejects_nonexistent() {
let output = Command::cargo_bin("apr")
.expect("apr binary")
.args(["check", "/nonexistent/model.gguf"])
.output()
.expect("run apr");
assert!(
!output.status.success(),
"FALSIFY-LIFE-001: check must fail for nonexistent file"
);
}
#[test]
fn falsify_life_002_check_rejects_invalid_gguf() {
let dir = tempfile::tempdir().expect("tempdir");
let path = dir.path().join("bad.gguf");
std::fs::write(&path, b"NOT_GGUF_MAGIC_BYTES").expect("write");
let output = Command::cargo_bin("apr")
.expect("apr binary")
.args(["check", &path.display().to_string()])
.output()
.expect("run apr");
assert!(
!output.status.success(),
"FALSIFY-LIFE-002: check must reject invalid GGUF"
);
}
#[test]
fn falsify_life_003_inspect_dispatch() {
Command::cargo_bin("apr")
.expect("apr binary")
.args(["inspect", "--help"])
.assert()
.success()
.stdout(predicate::str::is_empty().not());
}
#[test]
fn falsify_life_004_convert_dispatch() {
Command::cargo_bin("apr")
.expect("apr binary")
.args(["convert", "--help"])
.assert()
.success()
.stdout(predicate::str::contains("quantize").or(predicate::str::contains("compress")));
}
#[test]
fn falsify_life_005_run_dispatch() {
Command::cargo_bin("apr")
.expect("apr binary")
.args(["run", "--help"])
.assert()
.success()
.stdout(predicate::str::is_empty().not());
}
#[test]
fn falsify_life_006_validate_dispatch() {
Command::cargo_bin("apr")
.expect("apr binary")
.args(["validate", "--help"])
.assert()
.success()
.stdout(predicate::str::is_empty().not());
}
#[test]
fn falsify_life_007_export_dispatch() {
Command::cargo_bin("apr")
.expect("apr binary")
.args(["export", "--help"])
.assert()
.success()
.stdout(predicate::str::is_empty().not());
}
#[test]
fn falsify_life_008_import_dispatch() {
Command::cargo_bin("apr")
.expect("apr binary")
.args(["import", "--help"])
.assert()
.success()
.stdout(predicate::str::is_empty().not());
}