Пример #1
0
/* Test the method 'splitAt'*/
TEST_F(PositionVectorTest, test_method_splitAt) {
    PositionVector vec;
    vec.push_back(Position(0,0));
    vec.push_back(Position(2,0));
    vec.push_back(Position(5,0));
    SUMOReal smallDiff = POSITION_EPS / 2;
    std::pair<PositionVector, PositionVector> result;
    // split in first segment
    result = vec.splitAt(1);
    EXPECT_DOUBLE_EQ(2, result.first.size());
    EXPECT_DOUBLE_EQ(0, result.first[0].x());
    EXPECT_DOUBLE_EQ(1, result.first[1].x());
    EXPECT_DOUBLE_EQ(3, result.second.size());
    EXPECT_DOUBLE_EQ(1, result.second[0].x());
    EXPECT_DOUBLE_EQ(2, result.second[1].x());
    EXPECT_DOUBLE_EQ(5, result.second[2].x());
    // split in second segment
    result = vec.splitAt(4);
    EXPECT_DOUBLE_EQ(3, result.first.size());
    EXPECT_DOUBLE_EQ(0, result.first[0].x());
    EXPECT_DOUBLE_EQ(2, result.first[1].x());
    EXPECT_DOUBLE_EQ(4, result.first[2].x());
    EXPECT_DOUBLE_EQ(2, result.second.size());
    EXPECT_DOUBLE_EQ(4, result.second[0].x());
    EXPECT_DOUBLE_EQ(5, result.second[1].x());
    // split close before inner point
    result = vec.splitAt(2 - smallDiff);
    EXPECT_DOUBLE_EQ(2, result.first.size());
    EXPECT_DOUBLE_EQ(0, result.first[0].x());
    EXPECT_DOUBLE_EQ(2, result.first[1].x());
    EXPECT_DOUBLE_EQ(2, result.second.size());
    EXPECT_DOUBLE_EQ(2, result.second[0].x());
    EXPECT_DOUBLE_EQ(5 ,result.second[1].x());
    // split close after inner point
    result = vec.splitAt(2 + smallDiff);
    EXPECT_DOUBLE_EQ(2, result.first.size());
    EXPECT_DOUBLE_EQ(0, result.first[0].x());
    EXPECT_DOUBLE_EQ(2, result.first[1].x());
    EXPECT_DOUBLE_EQ(2, result.second.size());
    EXPECT_DOUBLE_EQ(2, result.second[0].x());
    EXPECT_DOUBLE_EQ(5 ,result.second[1].x());

    // catch a bug
    vec.push_back(Position(6,0));
    vec.push_back(Position(8,0));
    // split at inner point
    result = vec.splitAt(5);
    EXPECT_DOUBLE_EQ(3, result.first.size());
    EXPECT_DOUBLE_EQ(0, result.first[0].x());
    EXPECT_DOUBLE_EQ(2, result.first[1].x());
    EXPECT_DOUBLE_EQ(5, result.first[2].x());
    EXPECT_DOUBLE_EQ(3, result.second.size());
    EXPECT_DOUBLE_EQ(5, result.second[0].x());
    EXPECT_DOUBLE_EQ(6 ,result.second[1].x());
    EXPECT_DOUBLE_EQ(8 ,result.second[2].x());

    // split short vector
    PositionVector vec2;
    vec2.push_back(Position(0,0));
    vec2.push_back(Position(2,0));
    result = vec2.splitAt(1);
    EXPECT_DOUBLE_EQ(2, result.first.size());
    EXPECT_DOUBLE_EQ(0, result.first[0].x());
    EXPECT_DOUBLE_EQ(1, result.first[1].x());
    EXPECT_DOUBLE_EQ(2, result.second.size());
    EXPECT_DOUBLE_EQ(1, result.second[0].x());
    EXPECT_DOUBLE_EQ(2 ,result.second[1].x());

    // split very short vector
    PositionVector vec3;
    vec3.push_back(Position(0,0));
    vec3.push_back(Position(POSITION_EPS,0));
    // supress expected warning
    MsgHandler::getWarningInstance()->removeRetriever(&OutputDevice::getDevice("stderr"));
    result = vec3.splitAt(smallDiff);
    MsgHandler::getWarningInstance()->addRetriever(&OutputDevice::getDevice("stderr"));

    EXPECT_DOUBLE_EQ(2, result.first.size());
    EXPECT_DOUBLE_EQ(0, result.first[0].x());
    EXPECT_DOUBLE_EQ(smallDiff, result.first[1].x());
    EXPECT_DOUBLE_EQ(2, result.second.size());
    EXPECT_DOUBLE_EQ(smallDiff, result.second[0].x());
    EXPECT_DOUBLE_EQ(POSITION_EPS ,result.second[1].x());
}