##// END OF EJS Templates
Implements validation of variable's data (1)...
Implements validation of variable's data (1) Creates helper used to validate data, depending on the server set at compile time

File last commit:

r1192:96867eb9a6ed
r1198:077a4fb03e91
Show More
FuzzingOperations.cpp
210 lines | 8.1 KiB | text/x-c | CppLexer
/ plugins / amda / tests / FuzzingOperations.cpp
Alexandre Leroux
Defines fuzzing operations...
r1171 #include "FuzzingOperations.h"
Alexandre Leroux
Implements "Variable creation" operation (2)
r1177 #include "FuzzingUtils.h"
#include <Data/IDataProvider.h>
Alexandre Leroux
Defines fuzzing operations...
r1171
#include <Variable/Variable.h>
#include <Variable/VariableController.h>
Alexandre Leroux
Implements "Variable creation" operation (2)
r1177 #include <QUuid>
Alexandre Leroux
Implements move operations (1)...
r1184 #include <functional>
Alexandre Leroux
Defines fuzzing operations...
r1171 Q_LOGGING_CATEGORY(LOG_FuzzingOperations, "FuzzingOperations")
namespace {
struct CreateOperation : public IFuzzingOperation {
Alexandre Leroux
Defines VariableState struct (2)...
r1188 bool canExecute(const VariableState &variableState) const override
Alexandre Leroux
Fixes clang-format for resource files
r1180 {
Alexandre Leroux
Implements "Variable creation" operation (2)
r1177 // A variable can be created only if it doesn't exist yet
Alexandre Leroux
Defines VariableState struct (2)...
r1188 return variableState.m_Variable == nullptr;
Alexandre Leroux
Defines fuzzing operations...
r1171 }
Alexandre Leroux
Defines VariableState struct (2)...
r1188 void execute(VariableState &variableState, VariableController &variableController,
Alexandre Leroux
Fixes clang-format for resource files
r1180 const Properties &properties) const override
{
// Retrieves metadata pool from properties, and choose one of the metadata entries to
// associate it with the variable
Alexandre Leroux
Implements "Variable creation" operation (2)
r1177 auto metaDataPool = properties.value(METADATA_POOL_PROPERTY).value<MetadataPool>();
auto variableMetadata = RandomGenerator::instance().randomChoice(metaDataPool);
// Retrieves provider
Alexandre Leroux
Fixes clang-format for resource files
r1180 auto variableProvider
= properties.value(PROVIDER_PROPERTY).value<std::shared_ptr<IDataProvider> >();
Alexandre Leroux
Implements "Variable creation" operation (2)
r1177
auto variableName = QString{"Var_%1"}.arg(QUuid::createUuid().toString());
Alexandre Leroux
Some fixes...
r1190 qCInfo(LOG_FuzzingOperations()).noquote()
Alexandre Leroux
Adds delete operation
r1192 << "Creating variable" << variableName << "(metadata:" << variableMetadata << ")...";
Alexandre Leroux
Implements "Variable creation" operation (2)
r1177
Alexandre Leroux
Fixes clang-format for resource files
r1180 auto newVariable
= variableController.createVariable(variableName, variableMetadata, variableProvider);
Alexandre Leroux
Some fixes...
r1190
// Updates variable's state
variableState.m_Range = properties.value(INITIAL_RANGE_PROPERTY).value<SqpRange>();
Alexandre Leroux
Defines VariableState struct (2)...
r1188 std::swap(variableState.m_Variable, newVariable);
Alexandre Leroux
Defines fuzzing operations...
r1171 }
};
Alexandre Leroux
Adds delete operation
r1192 struct DeleteOperation : public IFuzzingOperation {
bool canExecute(const VariableState &variableState) const override
{
// A variable can be delete only if it exists
return variableState.m_Variable != nullptr;
}
void execute(VariableState &variableState, VariableController &variableController,
const Properties &properties) const override
{
Q_UNUSED(properties);
qCInfo(LOG_FuzzingOperations()).noquote()
<< "Deleting variable" << variableState.m_Variable->name() << "...";
variableController.deleteVariable(variableState.m_Variable);
// Updates variable's state
variableState.m_Range = INVALID_RANGE;
variableState.m_Variable = nullptr;
}
};
Alexandre Leroux
Implements move operations (1)...
r1184 /**
* Defines a move operation through a range.
*
* A move operation is determined by three functions:
* - Two 'move' functions, used to indicate in which direction the beginning and the end of a range
* are going during the operation. These functions will be:
* -- {<- / <-} for pan left
* -- {-> / ->} for pan right
* -- {-> / <-} for zoom in
* -- {<- / ->} for zoom out
* - One 'max move' functions, used to compute the max delta at which the operation can move a
* range, according to a max range. For exemple, for a range of {1, 5} and a max range of {0, 10},
* max deltas will be:
* -- {0, 4} for pan left
* -- {6, 10} for pan right
* -- {3, 3} for zoom in
* -- {0, 6} for zoom out (same spacing left and right)
*/
struct MoveOperation : public IFuzzingOperation {
using MoveFunction = std::function<double(double currentValue, double maxValue)>;
using MaxMoveFunction = std::function<double(const SqpRange &range, const SqpRange &maxRange)>;
explicit MoveOperation(MoveFunction rangeStartMoveFun, MoveFunction rangeEndMoveFun,
MaxMoveFunction maxMoveFun,
const QString &label = QStringLiteral("Move operation"))
: m_RangeStartMoveFun{std::move(rangeStartMoveFun)},
m_RangeEndMoveFun{std::move(rangeEndMoveFun)},
m_MaxMoveFun{std::move(maxMoveFun)},
m_Label{label}
{
}
Alexandre Leroux
Defines VariableState struct (2)...
r1188 bool canExecute(const VariableState &variableState) const override
Alexandre Leroux
Implements move operations (1)...
r1184 {
Alexandre Leroux
Defines VariableState struct (2)...
r1188 return variableState.m_Variable != nullptr;
Alexandre Leroux
Implements move operations (1)...
r1184 }
Alexandre Leroux
Defines VariableState struct (2)...
r1188 void execute(VariableState &variableState, VariableController &variableController,
Alexandre Leroux
Implements move operations (1)...
r1184 const Properties &properties) const override
{
Alexandre Leroux
Defines VariableState struct (2)...
r1188 auto variable = variableState.m_Variable;
Alexandre Leroux
Implements move operations (2)...
r1185 // Gets the max range defined
auto maxRange = properties.value(MAX_RANGE_PROPERTY, QVariant::fromValue(INVALID_RANGE))
.value<SqpRange>();
auto variableRange = variable->range();
if (maxRange == INVALID_RANGE || variableRange.m_TStart < maxRange.m_TStart
|| variableRange.m_TEnd > maxRange.m_TEnd) {
qCWarning(LOG_FuzzingOperations()) << "Can't execute operation: invalid max range";
return;
}
// Computes the max delta at which the variable can move, up to the limits of the max range
auto deltaMax = m_MaxMoveFun(variable->range(), maxRange);
// Generates random delta that will be used to move variable
auto delta = RandomGenerator::instance().generateDouble(0, deltaMax);
// Moves variable to its new range
auto newVariableRange = SqpRange{m_RangeStartMoveFun(variableRange.m_TStart, delta),
m_RangeEndMoveFun(variableRange.m_TEnd, delta)};
Alexandre Leroux
Some fixes...
r1190 qCInfo(LOG_FuzzingOperations()).noquote()
Alexandre Leroux
Implements move operations (2)...
r1185 << "Performing" << m_Label << "on" << variable->name() << "(from" << variableRange
<< "to" << newVariableRange << ")...";
variableController.onRequestDataLoading({variable}, newVariableRange, false);
Alexandre Leroux
Defines VariableState struct (2)...
r1188
// Updates variable's state
variableState.m_Range = newVariableRange;
Alexandre Leroux
Implements move operations (1)...
r1184 }
MoveFunction m_RangeStartMoveFun;
MoveFunction m_RangeEndMoveFun;
MaxMoveFunction m_MaxMoveFun;
QString m_Label;
};
Alexandre Leroux
Defines fuzzing operations...
r1171 struct UnknownOperation : public IFuzzingOperation {
Alexandre Leroux
Defines VariableState struct (2)...
r1188 bool canExecute(const VariableState &variableState) const override
Alexandre Leroux
Fixes clang-format for resource files
r1180 {
Alexandre Leroux
Defines VariableState struct (2)...
r1188 Q_UNUSED(variableState);
Alexandre Leroux
Defines fuzzing operations...
r1171 return false;
}
Alexandre Leroux
Defines VariableState struct (2)...
r1188 void execute(VariableState &variableState, VariableController &variableController,
Alexandre Leroux
Fixes clang-format for resource files
r1180 const Properties &properties) const override
{
Alexandre Leroux
Defines VariableState struct (2)...
r1188 Q_UNUSED(variableState);
Alexandre Leroux
Defines fuzzing operations...
r1171 Q_UNUSED(variableController);
Q_UNUSED(properties);
// Does nothing
}
};
} // namespace
std::unique_ptr<IFuzzingOperation> FuzzingOperationFactory::create(FuzzingOperationType type)
{
switch (type) {
Alexandre Leroux
Fixes clang-format for resource files
r1180 case FuzzingOperationType::CREATE:
return std::make_unique<CreateOperation>();
Alexandre Leroux
Adds delete operation
r1192 case FuzzingOperationType::DELETE:
return std::make_unique<DeleteOperation>();
Alexandre Leroux
Implements move operations (1)...
r1184 case FuzzingOperationType::PAN_LEFT:
return std::make_unique<MoveOperation>(
std::minus<double>(), std::minus<double>(),
[](const SqpRange &range, const SqpRange &maxRange) {
return range.m_TStart - maxRange.m_TStart;
},
QStringLiteral("Pan left operation"));
case FuzzingOperationType::PAN_RIGHT:
return std::make_unique<MoveOperation>(
std::plus<double>(), std::plus<double>(),
[](const SqpRange &range, const SqpRange &maxRange) {
return maxRange.m_TEnd - range.m_TEnd;
},
QStringLiteral("Pan right operation"));
case FuzzingOperationType::ZOOM_IN:
return std::make_unique<MoveOperation>(
std::plus<double>(), std::minus<double>(),
[](const SqpRange &range, const SqpRange &maxRange) {
Q_UNUSED(maxRange)
return range.m_TEnd - (range.m_TStart + range.m_TEnd) / 2.;
},
QStringLiteral("Zoom in operation"));
case FuzzingOperationType::ZOOM_OUT:
return std::make_unique<MoveOperation>(
std::minus<double>(), std::plus<double>(),
[](const SqpRange &range, const SqpRange &maxRange) {
return std::min(range.m_TStart - maxRange.m_TStart,
maxRange.m_TEnd - range.m_TEnd);
},
QStringLiteral("Zoom out operation"));
Alexandre Leroux
Fixes clang-format for resource files
r1180 default:
// Default case returns unknown operation
break;
Alexandre Leroux
Defines fuzzing operations...
r1171 }
return std::make_unique<UnknownOperation>();
}