hyperion.ng/test/TestConfigFile.cpp
Paulchen Panther 5bd020a570 JSON Auto correction + hyperion schema split for better readability (#452)
* revoke schema split

* add "getAutoCorrectedConfig" function

* revoke schema split

* revoke schema split

* revoke schema split

* Prevent compiler error if none grabber is available

* revoke schema split

* add "getAutoCorrectedConfig" function

* revoke schema split

* remove "configMigrator"

* remove "configMigrator"

* Change TestConfigFile to show how the autocorrection works

* revoke schema split

* revoke schema split

* remove "ConfigMigrator"

* remove "ConfigMigrator"

* remove "ConfigMigratorBase"

* remove "ConfigMigratorBase"

* Add QJsonUtils.h

* added ability "ignore-required"

It has been added the ability to correct the configuration without having to pay attention to the keyword "required" in the hyperion schema

* Allow Comments in Hyperion Schema

* add ability to ignore the "required" keyword in hyperion schema

* add ability to ignore the "required" keyword in hyperion schema

* add ability to ignore the "required" keyword in hyperion schema

* //Allow Comments in Hyperion Schema

* Update jsonschema.py to version 0.8.0 to support ...

references in json schema

* add RefResolver from jsonschema.py to resolve

references in hyperion schema

* remove dupe code

* split the hyperion schema in separatly files

For better readability

* add function "resolveReferences" to resolve

references in hyperion schema.

* remove CURRENT_CONFIG_VERSION

* remove CURRENT_CONFIG_VERSION

* split the hyperion schema in separatly files

For better readability

* Create schema-backgroundEffect.json

* Add the rest of the Hyperion schema via upload

* Remove Comments in config file

* Add return variable to function writeJson().

fix function resolveReferences().
edit function load() to handle QPair result from schemaChecker.

* edit function validate() to return QPair variable

* fit function loadEffectDefinition()

* fit function checkJson()

*  Expand error check by dividing

"_error" variable in "_error" and "_schemaError".
Replace variable "bool" in validate() in QPair

* Extend function "cmd_cfg_set" to handle auto correction

* Extend function "loadConfig" to handle auto correction

* fix function loadConfig()
2017-07-30 13:32:10 +02:00

112 lines
2.6 KiB
C++

// QT includes
#include <QResource>
#include <QDebug>
// JsonSchema includes
#include <utils/jsonschema/QJsonFactory.h>
// hyperion includes
#include <hyperion/LedString.h>
#include "HyperionConfig.h"
bool loadConfig(const QString & configFile, bool correct, bool ignore)
{
// make sure the resources are loaded (they may be left out after static linking)
Q_INIT_RESOURCE(resource);
////////////////////////////////////////////////////////////
// read and set the json schema from the resource
////////////////////////////////////////////////////////////
QJsonObject schemaJson;
try
{
schemaJson = QJsonFactory::readSchema(":/hyperion-schema");
}
catch(const std::runtime_error& error)
{
throw std::runtime_error(error.what());
}
QJsonSchemaChecker schemaChecker;
schemaChecker.setSchema(schemaJson);
////////////////////////////////////////////////////////////
// read and validate the configuration file from the command line
////////////////////////////////////////////////////////////
QJsonObject jsonConfig = QJsonFactory::readConfig(configFile);
if (!correct)
{
if (!schemaChecker.validate(jsonConfig).first)
{
QStringList schemaErrors = schemaChecker.getMessages();
foreach (auto & schemaError, schemaErrors)
{
qDebug() << "config write validation: " << schemaError;
}
qDebug() << "FAILED";
exit(1);
return false;
}
}
else
{
jsonConfig = schemaChecker.getAutoCorrectedConfig(jsonConfig, ignore); // The second parameter is to ignore the "required" keyword in hyperion schema
QJsonFactory::writeJson(configFile, jsonConfig);
}
return true;
}
void usage()
{
qDebug() << "Missing required configuration file to test";
qDebug() << "Usage: test_configfile <option> [configfile]";
qDebug() << "<option>:";
qDebug() << "\t--ac - for json auto correction";
qDebug() << "\t--ac-ignore-required - for json auto correction without paying attention 'required' keyword in hyperion schema";
}
int main(int argc, char** argv)
{
if (argc < 2)
{
usage();
return 0;
}
QString option = argv[1];
QString configFile;
if (option == "--ac" || option == "--ac-ignore-required")
if (argc > 2)
configFile = argv[2];
else
{
usage();
return 0;
}
else
configFile = argv[1];
qDebug() << "Configuration file selected: " << configFile;
qDebug() << "Attemp to load...";
try
{
if (loadConfig(configFile, (option == "--ac" || option == "--ac-ignore-required"), option == "--ac-ignore-required"))
qDebug() << "PASSED";
return 0;
}
catch (std::runtime_error exception)
{
qDebug() << "FAILED";
qDebug() << exception.what();
}
return 1;
}