|
381 | 381 | (let [frames (doall (repeatedly 100 #(frame/llm-text-chunk "test")))] |
382 | 382 | (is (= 100 (count frames))) |
383 | 383 | (is (every? frame/llm-text-chunk? frames)))))) |
| 384 | + |
| 385 | +(deftest test-send-function |
| 386 | + "Test the frame/send function for routing frames to appropriate channels" |
| 387 | + (testing "empty input" |
| 388 | + (is (= {} (frame/send)))) |
| 389 | + |
| 390 | + (testing "single regular frame" |
| 391 | + (let [audio-frame (frame/audio-input-raw test-audio-data)] |
| 392 | + (is (= {:out [audio-frame]} |
| 393 | + (frame/send audio-frame))))) |
| 394 | + |
| 395 | + (testing "single system frame" |
| 396 | + (let [start-frame (frame/system-start true)] |
| 397 | + (is (= {:sys-out [start-frame]} |
| 398 | + (frame/send start-frame))))) |
| 399 | + |
| 400 | + (testing "mixed frame types" |
| 401 | + (let [audio-frame (frame/audio-input-raw test-audio-data) |
| 402 | + start-frame (frame/system-start true) |
| 403 | + text-frame (frame/text-input {:text "hello"})] |
| 404 | + (is (= {:out [audio-frame text-frame] |
| 405 | + :sys-out [start-frame]} |
| 406 | + (frame/send audio-frame start-frame text-frame))))) |
| 407 | + |
| 408 | + (testing "multiple system frames" |
| 409 | + (let [start-frame (frame/system-start true) |
| 410 | + stop-frame (frame/system-stop true)] |
| 411 | + (is (= {:sys-out [start-frame stop-frame]} |
| 412 | + (frame/send start-frame stop-frame))))) |
| 413 | + |
| 414 | + (testing "multiple regular frames" |
| 415 | + (let [audio-frame (frame/audio-input-raw test-audio-data) |
| 416 | + text-frame (frame/text-input {:text "hello"}) |
| 417 | + transcription-frame (frame/transcription {:text "world"})] |
| 418 | + (is (= {:out [audio-frame text-frame transcription-frame]} |
| 419 | + (frame/send audio-frame text-frame transcription-frame))))) |
| 420 | + |
| 421 | + (testing "nil frames are filtered out" |
| 422 | + (let [audio-frame (frame/audio-input-raw test-audio-data) |
| 423 | + start-frame (frame/system-start true)] |
| 424 | + (is (= {:out [audio-frame] |
| 425 | + :sys-out [start-frame]} |
| 426 | + (frame/send nil audio-frame nil start-frame nil))))) |
| 427 | + |
| 428 | + (testing "all nil frames" |
| 429 | + (is (= {} (frame/send nil nil nil)))) |
| 430 | + |
| 431 | + (testing "all system frame types are routed to sys-out" |
| 432 | + (let [frames [(frame/system-start true) |
| 433 | + (frame/system-stop true) |
| 434 | + (frame/system-config-change {:config {}}) |
| 435 | + (frame/user-speech-start true) |
| 436 | + (frame/user-speech-stop true) |
| 437 | + (frame/bot-speech-start true) |
| 438 | + (frame/bot-speech-stop true) |
| 439 | + (frame/vad-user-speech-start true) |
| 440 | + (frame/vad-user-speech-stop true) |
| 441 | + (frame/bot-interrupt true) |
| 442 | + (frame/control-interrupt-start true) |
| 443 | + (frame/control-interrupt-stop true)]] |
| 444 | + (is (= {:sys-out frames} |
| 445 | + (apply frame/send frames))))) |
| 446 | + |
| 447 | + (testing "all regular frame types are routed to out" |
| 448 | + (let [frames [(frame/audio-input-raw test-audio-data) |
| 449 | + (frame/audio-output-raw {:audio test-audio-data :sample-rate 16000}) |
| 450 | + (frame/audio-tts-raw test-audio-data) |
| 451 | + (frame/transcription {:text "hello"}) |
| 452 | + (frame/transcription-interim {:text "hello"}) |
| 453 | + (frame/llm-context {:messages []}) |
| 454 | + (frame/llm-text-chunk {:text "chunk"}) |
| 455 | + (frame/text-input {:text "input"})]] |
| 456 | + (is (= {:out frames} |
| 457 | + (apply frame/send frames))))) |
| 458 | + |
| 459 | + (testing "preserves frame order within channels" |
| 460 | + (let [frame1 (frame/audio-input-raw test-audio-data) |
| 461 | + frame2 (frame/text-input {:text "hello"}) |
| 462 | + frame3 (frame/transcription {:text "world"}) |
| 463 | + sys-frame1 (frame/system-start true) |
| 464 | + sys-frame2 (frame/system-stop true)] |
| 465 | + (is (= {:out [frame1 frame2 frame3] |
| 466 | + :sys-out [sys-frame1 sys-frame2]} |
| 467 | + (frame/send frame1 sys-frame1 frame2 sys-frame2 frame3))))) |
| 468 | + |
| 469 | + (testing "large number of frames" |
| 470 | + (let [regular-frames (repeatedly 100 #(frame/text-input {:text (str "message-" (rand-int 1000))})) |
| 471 | + system-frames (repeatedly 50 #(frame/system-start true))] |
| 472 | + (let [result (apply frame/send (concat regular-frames system-frames))] |
| 473 | + (is (= 100 (count (:out result)))) |
| 474 | + (is (= 50 (count (:sys-out result)))))))) |
0 commit comments