FuzzingOperations.cpp
64 lines
| 2.2 KiB
| text/x-c
|
CppLexer
|
r1171 | #include "FuzzingOperations.h" | ||
|
r1177 | #include "FuzzingUtils.h" | ||
#include <Data/IDataProvider.h> | ||||
|
r1171 | |||
#include <Variable/Variable.h> | ||||
#include <Variable/VariableController.h> | ||||
|
r1177 | #include <QUuid> | ||
|
r1171 | Q_LOGGING_CATEGORY(LOG_FuzzingOperations, "FuzzingOperations") | ||
namespace { | ||||
struct CreateOperation : public IFuzzingOperation { | ||||
bool canExecute(std::shared_ptr<Variable> variable) const override { | ||||
|
r1177 | // A variable can be created only if it doesn't exist yet | ||
return variable == nullptr; | ||||
|
r1171 | } | ||
void execute(std::shared_ptr<Variable>& variable, VariableController &variableController, const Properties &properties) const override{ | ||||
|
r1177 | // Retrieves metadata pool from properties, and choose one of the metadata entries to associate it with the variable | ||
auto metaDataPool = properties.value(METADATA_POOL_PROPERTY).value<MetadataPool>(); | ||||
auto variableMetadata = RandomGenerator::instance().randomChoice(metaDataPool); | ||||
// Retrieves provider | ||||
auto variableProvider = properties.value(PROVIDER_PROPERTY).value<std::shared_ptr<IDataProvider>>(); | ||||
auto variableName = QString{"Var_%1"}.arg(QUuid::createUuid().toString()); | ||||
qCInfo(LOG_FuzzingOperations()) << "Creating variable" << variableName << "(metadata:" << variableMetadata << ")"; | ||||
auto newVariable = variableController.createVariable(variableName, variableMetadata, variableProvider); | ||||
std::swap(variable, newVariable); | ||||
|
r1171 | } | ||
}; | ||||
struct UnknownOperation : public IFuzzingOperation { | ||||
bool canExecute(std::shared_ptr<Variable> variable) const override { | ||||
Q_UNUSED(variable); | ||||
return false; | ||||
} | ||||
void execute(std::shared_ptr<Variable>& variable, VariableController &variableController, const Properties &properties) const override{ | ||||
Q_UNUSED(variable); | ||||
Q_UNUSED(variableController); | ||||
Q_UNUSED(properties); | ||||
// Does nothing | ||||
} | ||||
}; | ||||
} // namespace | ||||
std::unique_ptr<IFuzzingOperation> FuzzingOperationFactory::create(FuzzingOperationType type) | ||||
{ | ||||
switch (type) { | ||||
case FuzzingOperationType::CREATE: | ||||
return std::make_unique<CreateOperation>(); | ||||
default: | ||||
// Default case returns unknown operation | ||||
break; | ||||
} | ||||
return std::make_unique<UnknownOperation>(); | ||||
} | ||||