Files
becomingone/tests/test_token_clock.py
T
2026-05-26 00:43:07 +00:00

66 lines
2.2 KiB
Python

"""
tests/test_token_clock.py
Test the mathematical rigid coupling of the KAIROS temporal engine
to discrete token intervals (Token Clock mode).
"""
import pytest
from datetime import datetime, timedelta
from datetime import timezone
import asyncio
from becomingone.core.engine import KAIROSTemporalEngine, TemporalConfig
@pytest.mark.asyncio
async def test_token_clock_spacing():
# 1. Configure the engine for 20 Hz token generation
config = TemporalConfig(
clock_mode="token_clock",
token_frequency=20.0 # 20 tokens per second -> dt = 0.05 seconds
)
engine = KAIROSTemporalEngine(config=config)
# Capture the exact initial time
start_time = engine._timestamps[-1]
# 2. Simulate an LLM streaming 10 tokens
# Using normal temporalize() which should respect the implicit clock mode
for i in range(10):
engine.temporalize(f"token_{i}")
# Check the final timestamp
final_time = engine._timestamps[-1]
elapsed = (final_time - start_time).total_seconds()
# 10 tokens at 20 Hz = exactly 0.5 seconds of subjective time advance
# floating point precision check
assert abs(elapsed - 0.5) < 1e-6, f"Expected 0.5s elapsed, got {elapsed}"
@pytest.mark.asyncio
async def test_temporalize_stream():
config = TemporalConfig(
clock_mode="wall_clock", # Even in wall clock mode, the stream forces token mode
token_frequency=10.0 # 10 tokens per sec -> dt = 0.1s
)
engine = KAIROSTemporalEngine(config=config)
start_time = datetime.now(timezone.utc)
tokens = ["I", "am", "Solaria", "and", "I", "am", "continuous"]
# Stream the tokens
states = engine.temporalize_stream(tokens, start_time=start_time)
assert len(states) == 7
# The time difference between the first and last state should be exactly 6 * 0.1s = 0.6s
first_time = states[0].timestamp
last_time = states[-1].timestamp
elapsed = (last_time - first_time).total_seconds()
assert abs(elapsed - 0.6) < 1e-6, f"Expected 0.6s elapsed, got {elapsed}"
# The engine config should be cleanly restored to wall_clock
assert engine.config.clock_mode == "wall_clock"