多参数的测试用例——放样造体

// 验证CBrepBody体是否合法
static void TestBrepBody(CBrepBody *pBrep, int TestCaseNum, bool ExpectResult, ofstream &outFile)
{
    string wrongResult(" 组数据测试失败,用例参见 \\TestCase\\WhiteboxCase\\GGP_23537.txt");

    if(ExpectResult)
    {
        EXPECT_TRUE(pBrep != nullptr) << TestCaseNum << wrongResult;
        if(pBrep != nullptr)
        {
            EXPECT_TRUE(pBrep->IsStrictlyValid()) << TestCaseNum << wrongResult;

            // 将体的string写入到outFile 中
            bool isOpen = outFile.is_open();
            if(isOpen)
            {
                char *strBrep = pBrep->AsString();
                outFile<< TestCaseNum << endl << strBrep <<endl;
                delete []strBrep;
            }            
        }
    }
    else
        EXPECT_TRUE(pBrep == nullptr)<<TestCaseNum<< wrongResult;
}

// 读取数据,并造体验证。FilePath:测试用例数据;outFile:生成的体数据
static void TestLoftBody(string FilePath, ofstream &outFile)
{
    CPolygon* startPolygon;
    CPolygon* endPolygon;
    vector<CCurve3d*> spine;
    vector<vector<CVector2i> > verticesMap;

    int TestCaseNum = 0;             // FilePath中用例的标号
    bool ExpectResult = true;        // 期望结果是成功还是失败
    bool isSameCoordOrigin = true;   // 标架的原点是否与脊线的始末端点重合
    bool isCoordRightAngle = true;   // 标架的Z轴是否与路径的始末切矢的夹角theta<(90-g_angle)
    bool isUnitCoord = true;         // 标架是否单位化的标架
    bool isRightHandCoord = true;    // 标架是否为右手系标架

    ifstream infile(FilePath);
    if(!infile)
        return;

    string line;
    while(getline(infile, line))
    {
        if(line == "[TestCase]")
        {
            string s_TestCase;
            getline(infile, s_TestCase);
            TestCaseNum = atoi(s_TestCase.data());
        }

        if(line == "[startPolygon]")  // 放样首端polygon
        {
            string s_poly;
            getline(infile, s_poly);
            startPolygon = (CPolygon*)CGeometry::LoadFromStr((char*)s_poly.data());
        }

        if(line == "[endPolygon]")  // 放样末端polygon
        {
            string s_poly;
            getline(infile, s_poly);
            endPolygon = (CPolygon*)CGeometry::LoadFromStr((char*)s_poly.data());
        }

        if(line == "[spine]")  // 脊线
        {
            string s_path;
            while(getline(infile, s_path))
            {
                if(s_path == "[~spine]")
                    break;
                if(s_path == "")
                    continue;
                CCurve3d* pCurve = (CCurve3d*)CGeometry::LoadFromStr((char*)s_path.data());
                spine.push_back(pCurve);
            }
        }

        if(line == "[verticesMap]")  // 点对应关系
        {
            string s_map;
            while(getline(infile, s_map))
            {
                if(s_map == "[~verticesMap]")
                    break;
                string s_n1, s_n2;
                int n1, n2;
                vector<CVector2i> index;
                stringstream ss(s_map);
                while(ss>>s_n1 && ss>>s_n2)
                {
                    n1 = atoi(s_n1.data());
                    n2 = atoi(s_n2.data());
                    index.push_back(CVector2i(n1, n2));
                }
                if(!index.empty())
                    verticesMap.push_back(index);
            }
        }

        if(line == "[NotSameCoordOrigin]")
            isSameCoordOrigin = false;
        if(line == "[NotCoordRightAngle]")
            isCoordRightAngle = false;
        if(line == "[NotUnitCoord]")
            isUnitCoord = false;
        if(line == "[NotRightHandCoord]")
            isRightHandCoord = false;

        if(line == "[ExpectResult]")  // 期望结果,1-表示返回体指针,0-表示返回空
        {
            string s_ExpectResult;
            getline(infile, s_ExpectResult);
            ExpectResult = atoi(s_ExpectResult.c_str());
        }
                    
        if(line == "[~TestCase]")            // 代表这条用例读完了,造体、验证、释放内存
        {
            GBodyBuilder bd;

            CCoordinates3d coord0, coord1;
            CVector3d spineEndVt;
            if(!spine.empty())   // 设置 coord0, coord1 的值
            {
                coord0.ZAxisCoordinates(spine.front()->StartVt());//CVector3d(1.0, 0.0, 0.0)
                coord0.Origin = spine.front()->StartPoint();

                spineEndVt = spine.back()->EndVt();
                coord1.ZAxisCoordinates(spineEndVt);
                coord1.Origin = spine.back()->EndPoint();
            }

            if(!isSameCoordOrigin)
                coord0.Origin += CVector3d(1.0, 0.0, 0.0);
            if(!isCoordRightAngle)
            {
                spineEndVt = - spineEndVt;
                coord1.ZAxisCoordinates(spineEndVt);
            }
            if(!isUnitCoord)
                coord0.X = CVector3d(2.0, 2.0, 3.0);
            if(!isRightHandCoord)
                coord1.Z = - coord1.Z;

            if(TestCaseNum == 39) // 调试
                int o = 37;

            // 放样造体
            CBrepBody *pB0 =  bd.LoftBody(startPolygon, endPolygon, coord0, coord1, spine, verticesMap);

            if(isSameCoordOrigin && isCoordRightAngle && isUnitCoord && isRightHandCoord)
                TestBrepBody(pB0, TestCaseNum, ExpectResult, outFile);
            else
                TestBrepBody(pB0, TestCaseNum, false, outFile);

            // 释放内存
            FREE_PTR(pB0);
            FREE_PTR(startPolygon);
            FREE_PTR(endPolygon);
            for(int i=0; i<spine.size(); i++)
                FREE_PTR(spine[i]);
            spine.clear();
            verticesMap.clear();

            TestCaseNum = 0;
            ExpectResult = isSameCoordOrigin = isCoordRightAngle = isUnitCoord = isRightHandCoord = true;
        }
    }
    infile.close();
}

// 自定义端面放样造体,测试用例在 GGP_23537.txt 中,共37组
TEST(GeometryBuilder_LoftBody, GGP_23537)
{
    string caseNo("GGP_23537");
    string FilePath = CFileHelper::GetFilePath(string(caseNo + ".txt"), g_WhiteboxCaseDir); 

    ofstream outFile;
    outFile.open("D:\\LoftBody.txt");     // 测试用例输出文件,调试用 ****提交时需要注释掉该行****

    TestLoftBody(FilePath, outFile);

    outFile.close();
}

关于测试用例的txt文档

第1组:polygon为三角形,spine为两端线段
[TestCase]
1
[startPolygon]
{TYPE=1309,LoopCount=1,DistEpsilon=0.00010000000000000000,BoxValid=1,Box2d=[(0.00000000000000000000 0.00000000000000000000),(1.00000000000000000000 1.00000000000000000000)],Loop0={TYPE=1304,DistEpsilon=0.00010000000000000000,CoedgeCount=3,BoxValid=1,Box2d=[(0.00000000000000000000 0.00000000000000000000),(1.00000000000000000000 1.00000000000000000000)]Coedge0={TYPE=1301,CurveData={TYPE=1,Pos=(0.00000000000000000000 0.00000000000000000000),Dir=(1.00000000000000000000 0.00000000000000000000),Range=[0.00000000000000000000 1.00000000000000000000]}}Coedge1={TYPE=1301,CurveData={TYPE=1,Pos=(1.00000000000000000000 0.00000000000000000000),Dir=(0.00000000000000000000 1.00000000000000000000),Range=[0.00000000000000000000 1.00000000000000000000]}}Coedge2={TYPE=1301,CurveData={TYPE=1,Pos=(1.00000000000000000000 1.00000000000000000000),Dir=(-0.70710678118654746000 -0.70710678118654746000),Range=[0.00000000000000000000 1.41421356237309510000]}}}}
[endPolygon]
{TYPE=1309,LoopCount=1,DistEpsilon=0.00010000000000000000,BoxValid=1,Box2d=[(0.00000000000000000000 0.00000000000000000000),(1.00000000000000000000 1.00000000000000000000)],Loop0={TYPE=1304,DistEpsilon=0.00010000000000000000,CoedgeCount=3,BoxValid=1,Box2d=[(0.00000000000000000000 0.00000000000000000000),(1.00000000000000000000 1.00000000000000000000)]Coedge0={TYPE=1301,CurveData={TYPE=1,Pos=(0.00000000000000000000 0.00000000000000000000),Dir=(1.00000000000000000000 0.00000000000000000000),Range=[0.00000000000000000000 1.00000000000000000000]}}Coedge1={TYPE=1301,CurveData={TYPE=1,Pos=(1.00000000000000000000 0.00000000000000000000),Dir=(0.00000000000000000000 1.00000000000000000000),Range=[0.00000000000000000000 1.00000000000000000000]}}Coedge2={TYPE=1301,CurveData={TYPE=1,Pos=(1.00000000000000000000 1.00000000000000000000),Dir=(-0.70710678118654746000 -0.70710678118654746000),Range=[0.00000000000000000000 1.41421356237309510000]}}}}
[spine]
{TYPE=100,Pos=(0.00000000000000000000 0.00000000000000000000 0.00000000000000000000),Dir=(1.00000000000000000000 0.00000000000000000000 0.00000000000000000000),Range=[0.00000000000000000000 10.00000000000000000000]}
{TYPE=100,Pos=(10.00000000000000000000 0.00000000000000000000 0.00000000000000000000),Dir=(0.00000000000000000000 0.44721359549995793000 0.89442719099991586000),Range=[0.00000000000000000000 22.36067977499789800000]}
[~spine]
[verticesMap]
0 0  1 1  2 2  0 0
[~verticesMap]
[ExpectResult]
1
[~TestCase]

第2组:polygon为圆,spine为两端线段
[TestCase]
2
[startPolygon]
{TYPE=1309,LoopCount=1,DistEpsilon=0.00010000000000000000,BoxValid=1,Box2d=[(-5.00000000000000000000 -5.00000000000000000000),(5.00000000000000000000 5.00000000000000000000)],Loop0={TYPE=1304,DistEpsilon=0.00010000000000000000,CoedgeCount=1,BoxValid=1,Box2d=[(-5.00000000000000000000 -5.00000000000000000000),(5.00000000000000000000 5.00000000000000000000)]Coedge0={TYPE=1301,CurveData={TYPE=2,CenterPt=[0.00000000000000000000 0.00000000000000000000],Radius=5.00000000000000000000,Range=[0.00000000000000000000 31.41592653589793100000],ClockSing=1}}}}
[endPolygon]
{TYPE=1309,LoopCount=1,DistEpsilon=0.00010000000000000000,BoxValid=1,Box2d=[(-5.00000000000000000000 -5.00000000000000000000),(5.00000000000000000000 5.00000000000000000000)],Loop0={TYPE=1304,DistEpsilon=0.00010000000000000000,CoedgeCount=1,BoxValid=1,Box2d=[(-5.00000000000000000000 -5.00000000000000000000),(5.00000000000000000000 5.00000000000000000000)]Coedge0={TYPE=1301,CurveData={TYPE=2,CenterPt=[0.00000000000000000000 0.00000000000000000000],Radius=5.00000000000000000000,Range=[0.00000000000000000000 31.41592653589793100000],ClockSing=1}}}}
[spine]
{TYPE=100,Pos=(0.00000000000000000000 0.00000000000000000000 0.00000000000000000000),Dir=(1.00000000000000000000 0.00000000000000000000 0.00000000000000000000),Range=[0.00000000000000000000 10.00000000000000000000]}
{TYPE=100,Pos=(10.00000000000000000000 0.00000000000000000000 0.00000000000000000000),Dir=(0.00000000000000000000 0.44721359549995793000 0.89442719099991586000),Range=[0.00000000000000000000 22.36067977499789800000]}
[~spine]
[verticesMap]
0 0  0 0
[~verticesMap]
[ExpectResult]
1
[~TestCase]
。。。。。。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值