/* 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()); }