ISIS App Testing Cookbook¶
Main.cpp Templates¶
Minimum¶
This is generally used when no logs are printed and special help GUI functionality is needed.
#include "Isis.h"
#include "Application.h"
#include "app_func.h" # replace with your new header
using namespace Isis;
void IsisMain() {
UserInterface &ui = Application::GetUserInterface();
app_func(ui);
}
Application with Logs¶
When the application expects to print PVL logs to standard output. Most common case.
#include "Isis.h"
#include "Application.h"
#include "Pvl.h"
#include "app_func.h" # replace with your new header
using namespace Isis;
void IsisMain() {
UserInterface &ui = Application::GetUserInterface();
Pvl appLog;
try {
app_func(ui, &appLog);
}
catch (...) {
for (auto grpIt = appLog.beginGroup(); grpIt!= appLog.endGroup(); grpIt++) {
Application::Log(*grpIt);
}
throw;
}
for (auto grpIt = appLog.beginGroup(); grpIt!= appLog.endGroup(); grpIt++) {
Application::Log(*grpIt);
}
}
Application with GuiLogs¶
Logs that are only to be printed to the GUI command line in interactive mode.
#include "Isis.h"
#include "Application.h"
#include "SessionLog.h"
#include "app_func.h" # replace with your new header
using namespace Isis;
void IsisMain() {
UserInterface &ui = Application::GetUserInterface();
Pvl appLog;
app_func(ui);
// in this case, output data are in a "Results" group.
PvlGroup results = appLog.findGroup("Results");
if( ui.WasEntered("TO") && ui.IsInteractive() ) {
Application::GuiLog(results);
}
SessionLog::TheLog().AddResults(results);
}
Application with GUIHELPERS¶
Some apps require a map with specialized GUIHELPERS, these are GUI tools and shouldn't be co-located with the app function.
#define GUIHELPERS
#include "Isis.h"
#include "Application.h"
#include "app_func.h" // replace with your new header
using namespace Isis;
using namespace std;
void helper();
// this map and function definitions are ripped directly from the old main.cpp
map <QString, void *> GuiHelpers() {
map <QString, void *> helper;
helper ["Helper"] = (void *) helper;
return helper;
}
void IsisMain() { // this may change depending on whether logs are needed or not
UserInterface &ui = Application::GetUserInterface();
app_func(ui);
}
void helper() {
// whatever
}
Application.h Template¶
This almost never changes between applications.
#ifndef app_name_h // Change this to your app name in all lower case suffixed with _h (e.g. campt_h, cam2map_h etc.)
#define app_name_h
#include "Cube.h"
#include "UserInterface.h"
namespace Isis{
extern void app_func(Cube *cube, UserInterface &ui, Pvl *log=nullptr);
extern void app_func(UserInterface &ui, Pvl *log=nullptr);
}
#endif
GTEST Templates¶
#include "Fixtures.h"
#include "Pvl.h"
#include "PvlGroup.h"
#include "TestUtilities.h"
#include "app.h"
#include "gtest/gtest.h"
using namespace Isis;
static QString APP_XML = FileName("$ISISROOT/bin/xml/app.xml").expanded();
TEST_F(SomeFixture, FunctionalTestAppName) {
// tempDir exists if the fixture subclasses TempTestingFiles, which most do
QString outCubeFileName = tempDir.path() + "/outTemp.cub";
QVector<QString> args = {"from="+ testCube->fileName(), "to="+outCubeFileName};
UserInterface options(APP_XML, args);
try {
appfoo_func(options);
}
catch (IException &e) {
FAIL() << "Unable to open image: " << e.what() << std::endl;
}
// Assert some stuff
}