* -------------------------------------------------------------------------
* This file is part of the MindStudio project.
* Copyright (c) 2025 Huawei Technologies Co.,Ltd.
*
* MindStudio is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*
* http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
* -------------------------------------------------------------------------
*/
#include <gtest/gtest.h>
#include <vector>
#include <string>
#include <limits>
#include "CurveContainer.h"
using namespace Dic::Module::Memory;
class CurveContainerTest : public ::testing::Test {
protected:
void SetUp() override { container = std::make_unique<CurveContainer>(); }
void TearDown() override { container->Clear(); }
std::unique_ptr<CurveContainer> container;
};
TEST_F(CurveContainerTest, Exist_WhenKeyMatches_ReturnsTrue) {
CurveView curve;
curve.title = "Test Curve";
curve.legends = {"X", "Y1", "Y2"};
curve.tempData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
container->PutCurve("test_key", curve);
EXPECT_TRUE(container->Exist("test_key"));
}
TEST_F(CurveContainerTest, Exist_WhenKeyDoesNotMatch_ReturnsFalse) {
CurveView curve;
curve.title = "Test Curve";
curve.legends = {"X", "Y1", "Y2"};
curve.tempData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
container->PutCurve("test_key", curve);
EXPECT_FALSE(container->Exist("different_key"));
}
TEST_F(CurveContainerTest, Exist_WhenContainerEmpty_ReturnsFalse) { EXPECT_FALSE(container->Exist("any_key")); }
TEST_F(CurveContainerTest, Clear_RemovesAllData) {
CurveView curve;
curve.title = "Test Curve";
curve.legends = {"X", "Y1", "Y2"};
curve.tempData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
container->PutCurve("test_key", curve);
container->Clear();
EXPECT_FALSE(container->Exist("test_key"));
}
TEST_F(CurveContainerTest, PutCurve_StoresDataCorrectly) {
CurveView curve;
curve.title = "Test Curve";
curve.legends = {"X", "Y1", "Y2"};
curve.tempData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
container->PutCurve("test_key", curve);
auto result = container->ComputeCurve(0.0, 10.0, "test_key");
EXPECT_EQ(result.title, "Test Curve");
EXPECT_EQ(result.legends.size(), 3);
}
TEST_F(CurveContainerTest, ComputeCurve_WhenKeyDoesNotMatch_ReturnsEmptyResult) {
CurveView curve;
curve.title = "Test Curve";
curve.legends = {"X", "Y1", "Y2"};
curve.tempData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
container->PutCurve("test_key", curve);
auto result = container->ComputeCurve(0.0, 10.0, "wrong_key");
EXPECT_TRUE(result.title.empty());
EXPECT_TRUE(result.legends.empty());
EXPECT_TRUE(result.dataLines.empty());
}
TEST_F(CurveContainerTest, ComputeCurve_WhenLegendsEmpty_ReturnsEmptyResult) {
CurveView curve;
curve.title = "Test Curve";
curve.legends = {};
curve.tempData = {};
container->PutCurve("test_key", curve);
auto result = container->ComputeCurve(0.0, 10.0, "test_key");
EXPECT_TRUE(result.dataLines.empty());
}
TEST_F(CurveContainerTest, ComputeCurve_WhenDataPointsLessThanBuckets_ReturnsAllPoints) {
CurveView curve;
curve.title = "Test Curve";
curve.legends = {"X", "Y"};
for (int i = 0; i < 500; ++i) {
curve.tempData.push_back(static_cast<double>(i));
curve.tempData.push_back(static_cast<double>(i * 2));
}
container->PutCurve("test_key", curve);
auto result = container->ComputeCurve(0.0, 500.0, "test_key");
EXPECT_EQ(result.dataLines.size(), 500);
}
TEST_F(CurveContainerTest, ComputeCurve_WhenDataPointsMoreThanBuckets_ReturnsDownsampledPoints) {
CurveView curve;
curve.title = "Test Curve";
curve.legends = {"X", "Y"};
for (int i = 0; i < 3000; ++i) {
curve.tempData.push_back(static_cast<double>(i));
curve.tempData.push_back(static_cast<double>(i * 2));
}
container->PutCurve("test_key", curve);
auto result = container->ComputeCurve(0.0, 3000.0, "test_key");
EXPECT_GT(result.dataLines.size(), 0);
EXPECT_LT(result.dataLines.size(), 3000);
}
TEST_F(CurveContainerTest, ComputeCurve_WhenRangeSpecified_FiltersPointsCorrectly) {
CurveView curve;
curve.title = "Test Curve";
curve.legends = {"X", "Y"};
for (int i = 0; i < 100; ++i) {
curve.tempData.push_back(static_cast<double>(i));
curve.tempData.push_back(static_cast<double>(i * 2));
}
container->PutCurve("test_key", curve);
auto result = container->ComputeCurve(20.0, 30.0, "test_key");
EXPECT_EQ(result.dataLines.size(), 11);
}
TEST_F(CurveContainerTest, ComputeCurve_WhenDataContainsNaN_HandlesCorrectly) {
CurveView curve;
curve.title = "Test Curve";
curve.legends = {"X", "Y"};
curve.tempData = {
1.0, 2.0,
2.0, std::numeric_limits<double>::quiet_NaN(),
3.0, 6.0
};
container->PutCurve("test_key", curve);
auto result = container->ComputeCurve(0.0, 5.0, "test_key");
EXPECT_EQ(result.dataLines.size(), 3);
EXPECT_EQ(result.dataLines[1][1], "NULL");
}
TEST_F(CurveContainerTest, ComputeCurve_WhenXMinXMaxZero_AdjustsRange) {
CurveView curve;
curve.title = "Test Curve";
curve.legends = {"X", "Y"};
curve.tempData = {0.0, 1.0, 5.0, 2.0, 10.0, 3.0};
container->PutCurve("test_key", curve);
auto result = container->ComputeCurve(0.0, 0.0, "test_key");
EXPECT_GT(result.dataLines.size(), 0);
}
TEST_F(CurveContainerTest, ComputeDataIndex_FindsMinMaxIndices) {
CurveView curve;
curve.title = "Test Curve";
curve.legends = {"X", "Y1", "Y2"};
std::vector<double> testData = {
1.0, 10.0, 100.0,
2.0, 5.0, 200.0,
3.0, 15.0, 50.0,
4.0, 20.0, 300.0
};
curve.tempData = testData;
container->PutCurve("test_key", curve);
auto result = container->ComputeCurve(1.0, 4.0, "test_key");
EXPECT_EQ(result.dataLines.size(), 4);
}
TEST_F(CurveContainerTest, ComputeCurve_WhenContainerEmpty_ReturnsEmpty) {
auto result = container->ComputeCurve(0.0, 10.0, "any_key");
EXPECT_TRUE(result.title.empty());
EXPECT_TRUE(result.legends.empty());
EXPECT_TRUE(result.dataLines.empty());
}
TEST_F(CurveContainerTest, ComputeCurve_WhenDataPointsEqualBuckets_ReturnsAllPoints) {
CurveView curve;
curve.title = "Test Curve";
curve.legends = {"X", "Y"};
for (int i = 0; i < 1000; ++i) {
curve.tempData.push_back(static_cast<double>(i));
curve.tempData.push_back(static_cast<double>(i * 2));
}
container->PutCurve("test_key", curve);
auto result = container->ComputeCurve(0.0, 1000.0, "test_key");
EXPECT_EQ(result.dataLines.size(), 1000);
}