Salome HOME
additional tests
[modules/hydro.git] / src / HYDRO_tests / TestViewer.cxx
index 7f891922ce71ed235ff56c2de38143bdea297d17..1a5e0bf983efc645354aa5aa12cafc2bec062280 100644 (file)
@@ -1,17 +1,35 @@
 
 #include <TestViewer.h>
+#include <random.h>
 #include <OCCViewer_ViewManager.h>
+#ifdef WIN32
+  #pragma warning ( disable: 4251 )
+#endif
 #include <OCCViewer_ViewModel.h>
+#ifdef WIN32
+  #pragma warning ( disable: 4251 )
+#endif
 #include <OCCViewer_ViewWindow.h>
+#ifdef WIN32
+  #pragma warning ( disable: 4251 )
+#endif
 #include <AIS_InteractiveContext.hxx>
 #include <AIS_Shape.hxx>
 #include <TopoDS_Iterator.hxx>
+
 #include <QDir>
 #include <QPainter>
+#include <QHash>
+
+#ifdef WIN32
+  #pragma warning ( default: 4251 )
+#endif
+
 #include <cppunit/TestAssert.h>
 
 OCCViewer_ViewManager* TestViewer::myViewManager = 0;
 OCCViewer_ViewWindow* TestViewer::myViewWindow = 0;
+QString TestViewer::myKey = "";
 
 OCCViewer_ViewManager* TestViewer::viewManager()
 {
@@ -47,41 +65,51 @@ Handle(AIS_InteractiveContext) context()
   return TestViewer::viewer()->getAISContext();
 }
 
-void TestViewer::show( const TopoDS_Shape& theShape, const QColor& theColor, int theMode )
+QColor randomColor()
 {
-  QColor aColor = theColor;
-  if( !aColor.isValid() )
-  {
-    // random color
-    int aHue = rand()%255;
-    aColor = QColor::fromHsl( aHue, 255, 128 );
-  }
+  int aHue = rand()%255;
+  QColor aColor = QColor::fromHsl( aHue, 255, 128 );
+  return aColor;
+}
 
-  double r = aColor.red() / 255.0;
-  double g = aColor.green() / 255.0;
-  double b = aColor.blue() / 255.0;
+void TestViewer::show( const TopoDS_Shape& theShape, int theMode, bool isFitAll, const QColor& theColor )
+{
+  double r = theColor.red() / 255.0;
+  double g = theColor.green() / 255.0;
+  double b = theColor.blue() / 255.0;
 
   Handle(AIS_Shape) aShape = new AIS_Shape( theShape );
   aShape->SetMaterial( Graphic3d_NOM_PLASTIC );
   aShape->SetColor( Quantity_Color( r, g, b, Quantity_TOC_RGB ) );
   context()->Display( aShape, theMode, 0, Standard_False );
+
+  if( isFitAll )
+  {
+    viewWindow()->onTopView();
+    viewWindow()->onFitAll();
+  }
 }
 
-void TestViewer::show( const TopoDS_Shape& theShape, int theMode, bool isFitAll )
+void TestViewer::show( const TopoDS_Shape& theShape, int theMode, bool isFitAll, char* theKey )
 {
   context()->EraseAll();
   
+  myKey = theKey;
+  test_srand( qHash( theKey ) );
   if( theShape.ShapeType()==TopAbs_COMPOUND )
   {
     TopoDS_Iterator anIt( theShape );
     for( ; anIt.More(); anIt.Next() )
-      show( anIt.Value(), QColor(), theMode );
+      show( anIt.Value(), theMode, false, randomColor() );
   }
   else
-    show( theShape, QColor(), theMode );
+    show( theShape, theMode, false, randomColor() );
 
-  viewWindow()->onTopView();
-  viewWindow()->onFitAll();
+  if( isFitAll )
+  {
+    viewWindow()->onTopView();
+    viewWindow()->onFitAll();
+  }
 }
 
 bool AreImagesEqual( const QImage& theImage1, const QImage& theImage2, double theTolerance )
@@ -106,21 +134,24 @@ bool AreImagesEqual( const QImage& theImage1, const QImage& theImage2, double th
   return true;
 }
 
-bool TestViewer::AssertEqual( const QString& theUseCaseName )
+bool TestViewer::AssertImages( QString& theMessage )
 {
   QImage anActualImage = viewWindow()->dumpView();
 
   QString anExpectedRefFilePath = qgetenv( "HYDRO_REFERENCE_DATA" );
-  anExpectedRefFilePath += "/" + theUseCaseName + ".png";
+  anExpectedRefFilePath += "/" + myKey + ".png";
   QImage anExpectedRefImage; 
   anExpectedRefImage.load( anExpectedRefFilePath );
 
-  if( AreImagesEqual( anActualImage, anExpectedRefImage, 0.2 ) )
+  if( AreImagesEqual( anActualImage, anExpectedRefImage, 0.001 ) )
+  {
+    theMessage = "";
     return true;
+  }
 
-  QString aPath = QDir::tempPath() + "/" + theUseCaseName + ".png";
+  QString aPath = QDir::tempPath() + "/" + myKey + ".png";
   anActualImage.save( aPath );
-  std::string aMessage = "The viewer contents does not correspond to the reference image: " + theUseCaseName.toStdString();
+  theMessage = "The viewer contents does not correspond to the reference image: " + myKey;
   
   QImage aDiff( anExpectedRefImage.width(), anExpectedRefImage.height(), QImage::Format_ARGB32 );
   QPainter aPainter( &aDiff );
@@ -128,9 +159,8 @@ bool TestViewer::AssertEqual( const QString& theUseCaseName )
   aPainter.setCompositionMode( QPainter::RasterOp_SourceXorDestination );
   aPainter.drawImage( 0, 0, anActualImage );
 
-  QString aDiffFilePath = QDir::tempPath() + "/" + theUseCaseName + "_diff.png";
+  QString aDiffFilePath = QDir::tempPath() + "/" + myKey + "_diff.png";
   aDiff.save( aDiffFilePath );
-  CPPUNIT_FAIL( aMessage.c_str() );
 
   return false;
 }