//
// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
// SPDX-License-Identifier: MIT
//

#define CATCH_CONFIG_MAIN
#include <catch.hpp>
#include <limits>

#include "AudioCapture.hpp"

TEST_CASE("Test capture of audio file")
{
    std::string testResources = TEST_RESOURCE_DIR;
    REQUIRE(testResources != "");
    std::string file =  testResources + "/" + "myVoiceIsMyPassportVerifyMe04.wav";
    asr::AudioCapture capture;
    std::vector<float> audioData = capture.LoadAudioFile(file);
    capture.InitSlidingWindow(audioData.data(), audioData.size(), 47712, 16000);

    std::vector<float> firstAudioBlock = capture.Next();
    float actual1 = firstAudioBlock.at(0);
    float actual2 = firstAudioBlock.at(47000);
    CHECK(std::to_string(actual1) == "0.000352");
    CHECK(std::to_string(actual2) == "-0.056441");
    CHECK(firstAudioBlock.size() == 47712);

    CHECK(capture.HasNext() == true);

    std::vector<float> secondAudioBlock = capture.Next();
    float actual3 = secondAudioBlock.at(0);
    float actual4 = secondAudioBlock.at(47000);
    CHECK(std::to_string(actual3) == "0.102077");
    CHECK(std::to_string(actual4) == "0.000194");
    CHECK(capture.HasNext() == true);

    std::vector<float> thirdAudioBlock = capture.Next();
    float actual5 = thirdAudioBlock.at(0);
    float actual6 = thirdAudioBlock.at(33500);
    float actual7 = thirdAudioBlock.at(33600);
    CHECK(std::to_string(actual5) == "-0.076416");
    CHECK(std::to_string(actual6) == "-0.000275");
    CHECK(std::to_string(actual7) == "0.000000");
    CHECK(capture.HasNext() == false);
}

TEST_CASE("Test sliding window of audio capture")
{
    std::string testResources = TEST_RESOURCE_DIR;
    REQUIRE(testResources != "");
    std::string file =  testResources + "/" + "myVoiceIsMyPassportVerifyMe04.wav";
    asr::AudioCapture capture;
    std::vector<float> audioData = capture.LoadAudioFile(file);
    capture.InitSlidingWindow(audioData.data(), audioData.size(), 47712, 16000);
    capture.Next();
    capture.Next();

    CHECK(capture.HasNext() == true);
    capture.Next();
    CHECK(capture.HasNext() == false);
}
