feat(api): add record_winner, record_draw, intern, lookup on History
Spec Section 4 "three-tier event ingestion" tier 2: one-off match convenience. Spec open question 3: expose Index + intern/lookup for power users. History and HistoryBuilder gain a 4th generic parameter K: Eq + Hash + Clone = &'static str. The default ensures existing tests using Index-based add_events compile unchanged. History internally owns a KeyTable<K>. intern(&Q) creates or returns an Index for the given key; lookup(&Q) returns Option<Index> without creating. record_winner and record_draw are thin 1v1 wrappers around the internal add_events_with_prior. Part of T2 of docs/superpowers/specs/2026-04-23-trueskill-engine-redesign-design.md. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
54
tests/record_winner.rs
Normal file
54
tests/record_winner.rs
Normal file
@@ -0,0 +1,54 @@
|
||||
use trueskill_tt::{ConstantDrift, ConvergenceOptions, History};
|
||||
|
||||
#[test]
|
||||
fn record_winner_builds_history() {
|
||||
let mut h = History::builder()
|
||||
.mu(25.0)
|
||||
.sigma(25.0 / 3.0)
|
||||
.beta(25.0 / 6.0)
|
||||
.drift(ConstantDrift(25.0 / 300.0))
|
||||
.convergence(ConvergenceOptions {
|
||||
max_iter: 30,
|
||||
epsilon: 1e-6,
|
||||
})
|
||||
.build();
|
||||
|
||||
h.record_winner(&"alice", &"bob", 1).unwrap();
|
||||
h.converge().unwrap();
|
||||
|
||||
let a_idx = h.lookup(&"alice").unwrap();
|
||||
let b_idx = h.lookup(&"bob").unwrap();
|
||||
|
||||
assert_ne!(a_idx, b_idx);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn intern_is_idempotent() {
|
||||
let mut h: History = History::builder().build();
|
||||
let a1 = h.intern(&"alice");
|
||||
let a2 = h.intern(&"alice");
|
||||
assert_eq!(a1, a2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lookup_returns_none_for_missing() {
|
||||
let h: History = History::builder().build();
|
||||
assert!(h.lookup(&"nobody").is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn record_draw_with_p_draw_set() {
|
||||
let mut h = History::builder()
|
||||
.mu(25.0)
|
||||
.sigma(25.0 / 3.0)
|
||||
.beta(25.0 / 6.0)
|
||||
.drift(ConstantDrift(25.0 / 300.0))
|
||||
.p_draw(0.25)
|
||||
.build();
|
||||
|
||||
h.record_draw(&"alice", &"bob", 1).unwrap();
|
||||
h.converge().unwrap();
|
||||
|
||||
assert!(h.lookup(&"alice").is_some());
|
||||
assert!(h.lookup(&"bob").is_some());
|
||||
}
|
||||
Reference in New Issue
Block a user