AmazonChimeSDK/AmazonChimeSDKTests/audiovideo/audio/ActiveSpeakerPolicyTests.swift (70 lines of code) (raw):
//
// ActiveSpeakerPolicyTests.swift
// AmazonChimeSDK
//
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
//
import Foundation
@testable import AmazonChimeSDK
import XCTest
class ActiveSpeakerPolicyTests: XCTestCase {
private var activeSpeakerPolicy: DefaultActiveSpeakerPolicy = DefaultActiveSpeakerPolicy(
speakerWeight: 0.9, cutoffThreshold: 0.01, takeoverRate: 0.2
)
private var attendeeA: AttendeeInfo = AttendeeInfo(
attendeeId: "fakeAttendeeIdA", externalUserId: "fakeExternalUserIdA"
)
private var attendeeB: AttendeeInfo = AttendeeInfo(
attendeeId: "fakeAttendeeIdB", externalUserId: "fakeExternalUserIdB"
)
private var speakerWeight = 0.9
private var cutoffThreshold = 0.01
private var takeoverRate = 0.2
override func setUp() {
super.setUp()
activeSpeakerPolicy = DefaultActiveSpeakerPolicy(
speakerWeight: speakerWeight,
cutoffThreshold: cutoffThreshold,
takeoverRate: takeoverRate
)
}
func testActiveSpeakerShouldGetBandwidthPriority() {
let prioritizeBandwidth = activeSpeakerPolicy.prioritizeVideoSendBandwidthForActiveSpeaker()
XCTAssertEqual(prioritizeBandwidth, true)
}
func testActiveSpeakerShouldCalculateScoreWhenNotSpeakingOrMuted() {
var score = activeSpeakerPolicy.calculateScore(attendeeInfo: attendeeA, volume: .muted)
XCTAssertEqual(score, 0.0)
score = activeSpeakerPolicy.calculateScore(attendeeInfo: attendeeA, volume: .notSpeaking)
XCTAssertEqual(score, 0.0)
}
func testScoreShouldIncreaseAtExpectedRate() {
let firstScore = activeSpeakerPolicy.calculateScore(attendeeInfo: attendeeA, volume: .medium)
XCTAssertEqual(firstScore, 1 - speakerWeight)
let secondScore = activeSpeakerPolicy.calculateScore(attendeeInfo: attendeeA, volume: .low)
XCTAssertEqual(secondScore, firstScore * speakerWeight + (1.0 - speakerWeight))
let thirdScore = activeSpeakerPolicy.calculateScore(attendeeInfo: attendeeA, volume: .high)
XCTAssertEqual(thirdScore, secondScore * speakerWeight + (1.0 - speakerWeight))
}
func testScoreShouldDecreaseAtExpectedRate() {
var previousScore = activeSpeakerPolicy.calculateScore(attendeeInfo: attendeeA, volume: .medium)
var score = activeSpeakerPolicy.calculateScore(attendeeInfo: attendeeA, volume: .muted)
XCTAssertEqual(score, previousScore * speakerWeight)
previousScore = activeSpeakerPolicy.calculateScore(attendeeInfo: attendeeA, volume: .medium)
score = activeSpeakerPolicy.calculateScore(attendeeInfo: attendeeA, volume: .notSpeaking)
XCTAssertEqual(score, previousScore * speakerWeight)
}
func testActiveSpeakerScoreShouldTakeOver() {
_ = activeSpeakerPolicy.calculateScore(attendeeInfo: attendeeA, volume: .medium)
_ = activeSpeakerPolicy.calculateScore(attendeeInfo: attendeeA, volume: .medium)
var scoreA = activeSpeakerPolicy.calculateScore(attendeeInfo: attendeeA, volume: .medium)
_ = activeSpeakerPolicy.calculateScore(attendeeInfo: attendeeB, volume: .medium)
scoreA -= takeoverRate
let score = activeSpeakerPolicy.calculateScore(attendeeInfo: attendeeA, volume: .muted)
XCTAssertEqual(score, scoreA * speakerWeight)
}
func testcutoffThresholdShouldDecreaseScoreToZero() {
cutoffThreshold = 0.1
activeSpeakerPolicy = DefaultActiveSpeakerPolicy(
speakerWeight: speakerWeight,
cutoffThreshold: cutoffThreshold,
takeoverRate: takeoverRate
)
let score = activeSpeakerPolicy.calculateScore(attendeeInfo: attendeeA, volume: .high)
XCTAssertEqual(score, 0.0)
}
}