teamtalk 6.0.0

TeamTalk SDK for Rust
Documentation
#![cfg(feature = "mock")]

use teamtalk::client::EventData;
use teamtalk::events::Event;
use teamtalk::mock::MockMessage;
use teamtalk::types::UserId;
use teamtalk::utils::strings::ToTT;
use teamtalk_sys as ffi;

fn copy_tt(src: &str, dst: &mut [ffi::TTCHAR]) {
    let tt = src.tt();
    let len = tt.len().min(dst.len());
    dst[..len].copy_from_slice(&tt[..len]);
}

#[test]
fn file_event_exposes_remote_file_payload() {
    let mut raw = ffi::RemoteFile {
        nChannelID: 9,
        nFileID: 11,
        nFileSize: 512,
        ..Default::default()
    };
    copy_tt("clip.wav", &mut raw.szFileName);
    copy_tt("alice", &mut raw.szUsername);
    copy_tt("now", &mut raw.szUploadTime);

    let message = MockMessage::remote_file(Event::FileNew, raw);
    let file = message.try_as_remote_file().expect("remote file");
    assert_eq!(file.channel_id.0, 9);
    assert_eq!(file.id.0, 11);
    assert_eq!(file.name, "clip.wav");
    assert!(matches!(message.data(), Some(EventData::RemoteFile(_))));
}

#[test]
fn banned_user_event_exposes_banned_user_payload() {
    let mut raw = ffi::BannedUser {
        uBanTypes: 3,
        ..Default::default()
    };
    copy_tt("1.2.3.4", &mut raw.szIPAddress);
    copy_tt("moderator", &mut raw.szOwner);

    let message = MockMessage::banned_user(raw);
    let banned = message.try_as_banned_user().expect("banned user");
    assert_eq!(banned.ip, "1.2.3.4");
    assert_eq!(banned.owner, "moderator");
    assert!(matches!(message.data(), Some(EventData::BannedUser(_))));
}

#[test]
fn desktop_input_event_exposes_desktop_input_payload() {
    let raw = ffi::DesktopInput {
        uMousePosX: 12,
        uMousePosY: 34,
        uKeyCode: 0x41,
        uKeyState: ffi::DesktopKeyState::DESKTOPKEYSTATE_DOWN as u32,
    };

    let message = MockMessage::desktop_input(raw, 7);
    let input = message.try_as_desktop_input().expect("desktop input");
    assert_eq!(input.mouse_pos_x, 12);
    assert_eq!(input.mouse_pos_y, 34);
    assert_eq!(input.key_code, 0x41);
    assert!(matches!(message.data(), Some(EventData::DesktopInput(_))));
}

#[test]
fn media_file_event_exposes_media_file_info_payload() {
    let mut raw = ffi::MediaFileInfo {
        nStatus: ffi::MediaFileStatus::MFS_STARTED,
        ..Default::default()
    };
    raw.audioFmt.nSampleRate = 48_000;
    raw.videoFmt.nWidth = 640;
    raw.uDurationMSec = 999;
    copy_tt("movie.ogg", &mut raw.szFileName);

    let message = MockMessage::media_file_info(Event::StreamMediaFile, raw);
    let info = message.try_as_media_file_info().expect("media file info");
    assert_eq!(info.name, "movie.ogg");
    assert_eq!(info.audio_fmt.nSampleRate, 48_000);
    assert_eq!(info.video_fmt.nWidth, 640);
    assert!(matches!(message.data(), Some(EventData::MediaFileInfo(_))));
}

#[test]
fn audio_input_event_exposes_audio_input_progress_payload() {
    let raw = ffi::AudioInputProgress {
        nStreamID: 44,
        uQueueMSec: 55,
        uElapsedMSec: 66,
    };

    let message = MockMessage::audio_input_progress(raw, UserId(5).0);
    let progress = message
        .try_as_audio_input_progress()
        .expect("audio input progress");
    assert_eq!(progress.stream_id, 44);
    assert_eq!(progress.queue_ms, 55);
    assert_eq!(progress.elapsed_ms, 66);
    assert!(matches!(
        message.data(),
        Some(EventData::AudioInputProgress(_))
    ));
}