diff --git a/internal/kbblock/kbblock_test.go b/internal/kbblock/kbblock_test.go index 2237561..326c924 100644 --- a/internal/kbblock/kbblock_test.go +++ b/internal/kbblock/kbblock_test.go @@ -5,6 +5,8 @@ import ( "path/filepath" "strings" "testing" + + sdkfade "git.hangman-lab.top/hzhang/Plexum-sdk-go/fade" ) func TestSessionDir(t *testing.T) { @@ -126,6 +128,73 @@ func TestRenderEmpty(t *testing.T) { } } +func TestAddPopulatesSeed(t *testing.T) { + b, _ := Open(t.TempDir(), "a", "s") + e := b.Add(1, "K", "t", "x", 0) + if e == nil || e.Seed == 0 { + t.Errorf("Seed should be non-zero, got %d", e.Seed) + } +} + +func TestRenderFadedDistanceZeroIsIdentity(t *testing.T) { + b, _ := Open(t.TempDir(), "a", "s") + b.Add(1, "K", "t", "hello world", 5) + plain := b.Render() + faded := b.RenderFaded(5, sdkfade.DefaultFadeParams()) + if plain != faded { + t.Errorf("d=0 should be no-op:\nplain=%q\nfaded=%q", plain, faded) + } +} + +func TestRenderFadedAppliesMaskOverTime(t *testing.T) { + b, _ := Open(t.TempDir(), "a", "s") + b.Add(1, "K", "t", "the quick brown fox jumps over the lazy dog", 0) + plain := b.Render() + faded := b.RenderFaded(20, sdkfade.DefaultFadeParams()) + if plain == faded { + t.Errorf("d=20 should mask, but identical: %q", plain) + } + if !strings.Contains(faded, "_") { + t.Errorf("expected underscore masking in faded output: %q", faded) + } +} + +func TestTickDropsHighlyFaded(t *testing.T) { + b, _ := Open(t.TempDir(), "a", "s") + b.Add(1, "K", "t", "short", 0) + b.Add(2, "K", "t", "this entry stays freshish", 100) + res := b.Tick(105, sdkfade.DefaultFadeParams()) + hasID1Dropped := false + for _, id := range res.FadedOut { + if id == 1 { + hasID1Dropped = true + } + } + if !hasID1Dropped { + t.Errorf("entry 1 (d=105) should have crossed drop threshold: faded=%v", res.FadedOut) + } + if !b.Has(2) { + t.Error("entry 2 (d=5) should still be present") + } +} + +func TestRefreshResetsClock(t *testing.T) { + b, _ := Open(t.TempDir(), "a", "s") + b.Add(1, "K", "t", "content", 0) + oldSeed := b.Lookup(1).Seed + got := b.Refresh([]int{1, 99}, 50) + if len(got) != 1 || got[0] != 1 { + t.Errorf("Refresh returned %v, want [1]", got) + } + e := b.Lookup(1) + if e.LastRefreshAtTurn != 50 { + t.Errorf("LastRefreshAtTurn = %d, want 50", e.LastRefreshAtTurn) + } + if e.Seed == oldSeed { + t.Error("Refresh should regenerate Seed") + } +} + func TestSaveEmptyNoFile(t *testing.T) { dir := t.TempDir() b, _ := Open(dir, "a", "s")