#include "FuzzingOperations.h" #include "FuzzingUtils.h" #include #include #include #include Q_LOGGING_CATEGORY(LOG_FuzzingOperations, "FuzzingOperations") namespace { struct CreateOperation : public IFuzzingOperation { bool canExecute(std::shared_ptr variable) const override { // A variable can be created only if it doesn't exist yet return variable == nullptr; } void execute(std::shared_ptr& variable, VariableController &variableController, const Properties &properties) const override{ // 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(); auto variableMetadata = RandomGenerator::instance().randomChoice(metaDataPool); // Retrieves provider auto variableProvider = properties.value(PROVIDER_PROPERTY).value>(); 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); } }; struct UnknownOperation : public IFuzzingOperation { bool canExecute(std::shared_ptr variable) const override { Q_UNUSED(variable); return false; } void execute(std::shared_ptr& variable, VariableController &variableController, const Properties &properties) const override{ Q_UNUSED(variable); Q_UNUSED(variableController); Q_UNUSED(properties); // Does nothing } }; } // namespace std::unique_ptr FuzzingOperationFactory::create(FuzzingOperationType type) { switch (type) { case FuzzingOperationType::CREATE: return std::make_unique(); default: // Default case returns unknown operation break; } return std::make_unique(); }