// Created on: 2002-05-21 // Created by: QA Admin // Copyright (c) 2002-2012 OPEN CASCADE SAS // // The content of this file is subject to the Open CASCADE Technology Public // License Version 6.5 (the "License"). You may not use the content of this file // except in compliance with the License. Please obtain a copy of the License // at http://www.opencascade.org and read it completely before using this file. // // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France. // // The Original Code and all software distributed under the License is // distributed on an "AS IS" basis, without warranty of any kind, and the // Initial Developer hereby disclaims all such warranties, including without // limitation, any warranties of merchantability, fitness for a particular // purpose or non-infringement. Please see the License for the specific terms // and conditions governing the rights and limitations under the License. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static Standard_Integer OCC230 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv) { if ( argc != 4) { di << "ERROR OCC230: Usage : " << argv[0] << " TrimmedCurve Pnt2d Pnt2d" << "\n"; return 1; } gp_Pnt2d P1, P2; if ( !DrawTrSurf::GetPoint2d(argv[2],P1)) { di << "ERROR OCC230: " << argv[2] << " is not Pnt2d" << "\n"; return 1; } if ( !DrawTrSurf::GetPoint2d(argv[3],P2)) { di << "ERROR OCC230: " << argv[3] << " is not Pnt2d" << "\n"; return 1; } GCE2d_MakeSegment MakeSegment(P1,P2); Handle(Geom2d_TrimmedCurve) TrimmedCurve = MakeSegment.Value(); DrawTrSurf::Set(argv[1], TrimmedCurve); return 0; } static Standard_Integer OCC142 (Draw_Interpretor& di, Standard_Integer /*argc*/, const char ** /*argv*/) { for(Standard_Integer i= 0;i <= 20;i++){ Handle(PCollection_HAsciiString) pstr = new PCollection_HAsciiString("TEST"); pstr->Clear(); } di << "OCC142: OK" << "\n"; return 0; } static Standard_Integer OCC23361 (Draw_Interpretor& di, Standard_Integer /*argc*/, const char ** /*argv*/) { gp_Pnt p(0, 0, 2); gp_Trsf t1, t2; t1.SetRotation(gp_Ax1(p, gp_Dir(0, 1, 0)), -0.49328285294022267); t2.SetRotation(gp_Ax1(p, gp_Dir(0, 0, 1)), 0.87538474718473880); gp_Trsf tComp = t2 * t1; gp_Pnt p1(10, 3, 4); gp_Pnt p2 = p1.Transformed(tComp); gp_Pnt p3 = p1.Transformed(t1); p3.Transform(t2); // points must be equal if ( ! p2.IsEqual(p3, Precision::Confusion()) ) di << "ERROR OCC23361: equivalent transformations does not produce equal points" << "\n"; else di << "OCC23361: OK" << "\n"; return 0; } static Standard_Integer OCC23237 (Draw_Interpretor& di, Standard_Integer /*argc*/, const char** /*argv*/) { OSD_PerfMeter aPM("TestMeter",0); OSD_Timer aTM; // run some operation in cycle for about 2 seconds to have good values of times to compare int count = 0; printf("OSD_PerfMeter test.\nRunning Boolean operation on solids in loop.\n"); for (; aTM.ElapsedTime() < 2.; count++) { aPM.Start(); aTM.Start(); // do some operation that will take considerable time compared with time or starting / stopping timers BRepPrimAPI_MakeBox aBox (10., 10., 10.); BRepPrimAPI_MakeSphere aSphere (10.); BRepAlgo_Cut (aBox.Shape(), aSphere.Shape()); aTM.Stop(); aPM.Stop(); } int aNbEnters = 0; Standard_Real aPerfMeter_CPUtime = 0., aTimer_ElapsedTime = aTM.ElapsedTime(); perf_get_meter("TestMeter", &aNbEnters, &aPerfMeter_CPUtime); Standard_Real aTimeDiff = (fabs(aTimer_ElapsedTime - aPerfMeter_CPUtime) / aTimer_ElapsedTime); printf("\nMeasurement results (%d cycles):\n", count); printf("\nOSD_PerfMeter CPU time: %lf\nOSD_Timer elapsed time: %lf\n", aPerfMeter_CPUtime, aTimer_ElapsedTime); printf("Time delta is: %.3lf %%\n", aTimeDiff * 100); if (aTimeDiff > 0.2) di << "OCC23237: Error: too much difference between CPU and elapsed times"; else if (aNbEnters != count) di << "OCC23237: Error: counter reported by PerfMeter (" << aNbEnters << ") does not correspond to actual number of cycles"; else di << "OCC23237: OK"; return 0; } #ifdef HAVE_TBB #include #include #include class IncrementerDecrementer { public: IncrementerDecrementer (Standard_Integer* theVal, Standard_Boolean thePositive) : myVal (theVal), myPositive (thePositive) {} void operator() (const tbb::blocked_range& r) const { if (myPositive) for (size_t i = r.begin(); i != r.end(); ++i) Standard_Atomic_Increment (myVal); else for (size_t i = r.begin(); i != r.end(); ++i) Standard_Atomic_Decrement (myVal); } private: Standard_Integer* myVal; Standard_Boolean myPositive; }; #endif #define QCOMPARE(val1, val2) \ di << "Checking " #val1 " == " #val2 << \ ((val1) == (val2) ? ": OK\n" : ": Error\n") #ifdef HAVE_TBB static Standard_Integer OCC22980 (Draw_Interpretor& di, Standard_Integer /*argc*/, const char ** /*argv*/) { int aSum = 0; //check returned value QCOMPARE (Standard_Atomic_Decrement (&aSum), -1); QCOMPARE (Standard_Atomic_Increment (&aSum), 0); QCOMPARE (Standard_Atomic_Increment (&aSum), 1); QCOMPARE (Standard_Atomic_Increment (&aSum), 2); // QCOMPARE (Standard_Atomic_DecrementTest (&aSum), 0); // QCOMPARE (Standard_Atomic_DecrementTest (&aSum), 1); //check atomicity aSum = 0; const int N = 1 << 24; //big enough to ensure concurrency //increment tbb::parallel_for (tbb::blocked_range (0, N), IncrementerDecrementer (&aSum, true)); QCOMPARE (aSum, N); //decrement tbb::parallel_for (tbb::blocked_range (0, N), IncrementerDecrementer (&aSum, false)); QCOMPARE (aSum, 0); return 0; } #else /* HAVE_TBB */ static Standard_Integer OCC22980 (Draw_Interpretor& di, Standard_Integer /*argc*/, const char **argv) { di << "Test skipped: command " << argv[0] << " requires TBB library\n"; return 0; } #endif /* HAVE_TBB */ #include #include #include #include #include #include #include static Standard_Integer OCC23595 (Draw_Interpretor& di, Standard_Integer /*argc*/, const char **argv) { const Handle(TDocStd_Application)& anApp = XCAFApp_Application::GetApplication(); Handle(TDocStd_Document) aDoc; anApp->NewDocument ("XmlXCAF", aDoc); QCOMPARE (!aDoc.IsNull(), Standard_True); Handle(XCAFDoc_ShapeTool) aShTool = XCAFDoc_DocumentTool::ShapeTool (aDoc->Main()); //check default value Standard_Boolean aValue = XCAFDoc_ShapeTool::AutoNaming(); QCOMPARE (aValue, Standard_True); //true XCAFDoc_ShapeTool::SetAutoNaming (Standard_True); TopoDS_Shape aShape = BRepPrimAPI_MakeBox (100., 200., 300.).Shape(); TDF_Label aLabel = aShTool->AddShape (aShape); Handle(TDataStd_Name) anAttr; QCOMPARE (aLabel.FindAttribute (TDataStd_Name::GetID(), anAttr), Standard_True); //false XCAFDoc_ShapeTool::SetAutoNaming (Standard_False); aShape = BRepPrimAPI_MakeBox (300., 200., 100.).Shape(); aLabel = aShTool->AddShape (aShape); QCOMPARE (!aLabel.FindAttribute (TDataStd_Name::GetID(), anAttr), Standard_True); //restore XCAFDoc_ShapeTool::SetAutoNaming (aValue); return 0; } #include Standard_Integer OCC22611 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv) { if (argc != 3) { di << "Usage : " << argv[0] << " string nb\n"; return 1; } TCollection_AsciiString aToken = argv[1]; Standard_Integer aNb = atoi(argv[2]); Handle(ExprIntrp_GenExp) aGen = ExprIntrp_GenExp::Create(); for (Standard_Integer i=0; i < aNb; i++) { aGen->Process(aToken); Handle(Expr_GeneralExpression) aExpr = aGen->Expression(); } return 0; } Standard_Integer OCC22595 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv) { gp_Mat M0; di << "M0 = " << " {" << M0(1,1) << "} {" << M0(1,2) << "} {" << M0(1,3) <<"}" << " {" << M0(2,1) << "} {" << M0(2,2) << "} {" << M0(2,3) <<"}" << " {" << M0(1,1) << "} {" << M0(1,2) << "} {" << M0(1,3) <<"}"; return 0; } #include #include #include #include #include #include Standard_Boolean static OCC23774Test(const TopoDS_Face& grossPlateFace, const TopoDS_Shape& originalWire, Draw_Interpretor& di) { BRepExtrema_DistShapeShape distShapeShape(grossPlateFace,originalWire,Extrema_ExtFlag_MIN); if(!distShapeShape.IsDone()) { di <<"Distance ShapeShape is Not Done\n"; return Standard_False; } if(distShapeShape.Value() > 0.01) { di << "Wrong Dist = " < 0.01) { di << "Dist = " < 0.01) { di << "Wrong Dist2 = " < #include #include #include static void GeomConvertTest (Draw_Interpretor& di, Standard_Integer theTargetNbUPoles, Standard_CString theFileName) { Handle(Geom_Surface) aSurf = DrawTrSurf::GetSurface(theFileName); GeomConvert_ApproxSurface aGAS (aSurf, 1e-4, GeomAbs_C1, GeomAbs_C1, 9, 9, 100, 1); if (!aGAS.IsDone()) { di << "ApproxSurface is not done!" << "\n"; return; } const Handle(Geom_BSplineSurface)& aBSurf = aGAS.Surface(); if (aBSurf.IsNull()) { di << "BSplineSurface is not created!" << "\n"; return; } di << "Number of UPoles:" << aBSurf->NbUPoles() << "\n"; QCOMPARE (aBSurf->NbUPoles(), theTargetNbUPoles); } struct aData { Draw_Interpretor* di; Standard_Integer nbupoles; Standard_CString filename; }; Standard_EXPORT Standard_Address convert(Standard_Address data) { aData* info = (aData*) data; GeomConvertTest(*(info->di),info->nbupoles,info->filename); return NULL; } static Standard_Integer OCC23952sweep (Draw_Interpretor& di, Standard_Integer argc, const char ** argv) { if (argc != 3) { di << "Usage: " << argv[0] << " invalid number of arguments" << "\n"; return 1; } struct aData aStorage; aStorage.di = &di; aStorage.nbupoles = Draw::Atoi(argv[1]); aStorage.filename = argv[2]; OSD_Thread aThread1(convert); aThread1.Run(&aStorage); GeomConvertTest(di,aStorage.nbupoles,aStorage.filename); cout << "result of thread: " << aThread1.Wait() << endl; return 0; } #include static void GeomIntSSTest (Draw_Interpretor& di, Standard_Integer theNbSol, Standard_CString theFileName1, Standard_CString theFileName2) { Handle(Geom_Surface) aSurf1 = DrawTrSurf::GetSurface(theFileName1); Handle(Geom_Surface) aSurf2 = DrawTrSurf::GetSurface(theFileName2); GeomInt_IntSS anInter; anInter.Perform(aSurf1, aSurf2, Precision::Confusion(), Standard_True); if (!anInter.IsDone()) { di << "An intersection is not done!" << "\n"; return; } di << "Number of Lines:" << anInter.NbLines() << "\n"; QCOMPARE (anInter.NbLines(), theNbSol); } struct aNewData { Draw_Interpretor* di; Standard_Integer nbsol; Standard_CString filename1; Standard_CString filename2; }; Standard_EXPORT Standard_Address convert_inter(Standard_Address data) { aNewData* info = (aNewData*) data; GeomIntSSTest(*(info->di),info->nbsol,info->filename1,info->filename2); return NULL; } static Standard_Integer OCC23952intersect (Draw_Interpretor& di, Standard_Integer argc, const char ** argv) { if (argc != 4) { di << "Usage: " << argv[0] << " invalid number of arguments" << "\n"; return 1; } struct aNewData aStorage; aStorage.di = &di; aStorage.nbsol = Draw::Atoi(argv[1]); aStorage.filename1 = argv[2]; aStorage.filename2 = argv[3]; OSD_Thread aThread1(convert_inter); aThread1.Run(&aStorage); GeomIntSSTest(di,aStorage.nbsol,aStorage.filename1,aStorage.filename2); cout << "result of thread: " << aThread1.Wait() << endl; return 0; } #include static Standard_Integer OCC23683 (Draw_Interpretor& di, Standard_Integer argc,const char ** argv) { if (argc < 2) { di<<"Usage: " << argv[0] << " invalid number of arguments"<<"\n"; return 1; } Standard_Integer ucontinuity = 1; Standard_Integer vcontinuity = 1; Standard_Boolean iscnu = false; Standard_Boolean iscnv = false; Handle(Geom_Surface) aSurf = DrawTrSurf::GetSurface(argv[1]); QCOMPARE (aSurf->IsCNu (ucontinuity), iscnu); QCOMPARE (aSurf->IsCNv (vcontinuity), iscnv); return 0; } #include #include #include #include #include #include #include #include static int test_offset(Draw_Interpretor& di, Standard_Integer argc, const char** argv) { // Check the command arguments if ( argc != 1 ) { di << "Error: " << argv[0] << " - invalid number of arguments" << "\n"; di << "Usage: type help " << argv[0] << "\n"; return 1; // TCL_ERROR } gp_Ax1 RotoAx( gp::Origin(), gp::DZ() ); gp_Ax22d Ax2( gp::Origin2d(), gp::DY2d(), gp::DX2d() ); Handle(Geom_Surface) Plane = new Geom_Plane( gp::YOZ() ); di << "<<<< Preparing sample surface of revolution based on trimmed curve >>>>" << "\n"; di << "-----------------------------------------------------------------------" << "\n"; Handle(Geom2d_Circle) C2d1 = new Geom2d_Circle(Ax2, 1.0); Handle(Geom2d_TrimmedCurve) C2d1Trimmed = new Geom2d_TrimmedCurve(C2d1, 0.0, M_PI/2.0); TopoDS_Edge E1 = BRepBuilderAPI_MakeEdge(C2d1Trimmed, Plane); DBRep::Set("e1", E1); BRepPrimAPI_MakeRevol aRevolBuilder1(E1, RotoAx); TopoDS_Face F1 = TopoDS::Face( aRevolBuilder1.Shape() ); DBRep::Set("f1", F1); di << "Result: f1" << "\n"; di << "<<<< Preparing sample surface of revolution based on offset curve >>>>" << "\n"; di << "-----------------------------------------------------------------------" << "\n"; Handle(Geom2d_OffsetCurve) C2d2Offset = new Geom2d_OffsetCurve(C2d1Trimmed, -0.5); TopoDS_Edge E2 = BRepBuilderAPI_MakeEdge(C2d2Offset, Plane); DBRep::Set("e2", E2); BRepPrimAPI_MakeRevol aRevolBuilder2(E2, RotoAx); TopoDS_Face F2 = TopoDS::Face( aRevolBuilder2.Shape() ); DBRep::Set("f2", F2); di << "Result: f2" << "\n"; return 0; } #include #include //======================================================================= //function : OCC23945 //purpose : //======================================================================= static Standard_Integer OCC23945 (Draw_Interpretor& di,Standard_Integer n, const char** a) { if (n < 5) return 1; Handle(Geom_Surface) aS = DrawTrSurf::GetSurface(a[1]); if (aS.IsNull()) return 1; GeomAdaptor_Surface GS(aS); Standard_Real U = Draw::Atof(a[2]); Standard_Real V = Draw::Atof(a[3]); Standard_Boolean DrawPoint = ( n%3 == 2); if ( DrawPoint) n--; gp_Pnt P; if (n >= 13) { gp_Vec DU,DV; if (n >= 22) { gp_Vec D2U,D2V,D2UV; GS.D2(U,V,P,DU,DV,D2U,D2V,D2UV); Draw::Set(a[13],D2U.X()); Draw::Set(a[14],D2U.Y()); Draw::Set(a[15],D2U.Z()); Draw::Set(a[16],D2V.X()); Draw::Set(a[17],D2V.Y()); Draw::Set(a[18],D2V.Z()); Draw::Set(a[19],D2UV.X()); Draw::Set(a[20],D2UV.Y()); Draw::Set(a[21],D2UV.Z()); } else GS.D1(U,V,P,DU,DV); Draw::Set(a[7],DU.X()); Draw::Set(a[8],DU.Y()); Draw::Set(a[9],DU.Z()); Draw::Set(a[10],DV.X()); Draw::Set(a[11],DV.Y()); Draw::Set(a[12],DV.Z()); } else GS.D0(U,V,P); if ( n > 6) { Draw::Set(a[4],P.X()); Draw::Set(a[5],P.Y()); Draw::Set(a[6],P.Z()); } if ( DrawPoint) { DrawTrSurf::Set(a[n],P); } return 0; } void QABugs::Commands_19(Draw_Interpretor& theCommands) { const char *group = "QABugs"; theCommands.Add ("OCC230", "OCC230 TrimmedCurve Pnt2d Pnt2d", __FILE__, OCC230, group); theCommands.Add ("OCC142", "OCC142", __FILE__, OCC142, group); theCommands.Add ("OCC23361", "OCC23361", __FILE__, OCC23361, group); theCommands.Add ("OCC23237", "OCC23237", __FILE__, OCC23237, group); theCommands.Add ("OCC22980", "OCC22980", __FILE__, OCC22980, group); theCommands.Add ("OCC23595", "OCC23595", __FILE__, OCC23595, group); theCommands.Add ("OCC22611", "OCC22611 string nb", __FILE__, OCC22611, group); theCommands.Add ("OCC22595", "OCC22595", __FILE__, OCC22595, group); theCommands.Add ("OCC23774", "OCC23774 shape1 shape2", __FILE__, OCC23774, group); theCommands.Add ("OCC23683", "OCC23683 shape", __FILE__, OCC23683, group); theCommands.Add ("OCC23952sweep", "OCC23952sweep nbupoles shape", __FILE__, OCC23952sweep, group); theCommands.Add ("OCC23952intersect", "OCC23952intersect nbsol shape1 shape2", __FILE__, OCC23952intersect, group); theCommands.Add ("test_offset", "test_offset", __FILE__, test_offset, group); theCommands.Add("OCC23945", "OCC23945 surfname U V X Y Z [DUX DUY DUZ DVX DVY DVZ [D2UX D2UY D2UZ D2VX D2VY D2VZ D2UVX D2UVY D2UVZ]]", __FILE__, OCC23945,group); return; }