142 lines
4.6 KiB
C++
142 lines
4.6 KiB
C++
#include "RuntimeParameterUtils.h"
|
|
|
|
#include <cmath>
|
|
#include <iostream>
|
|
#include <string>
|
|
|
|
namespace
|
|
{
|
|
int gFailures = 0;
|
|
|
|
void Expect(bool condition, const char* message)
|
|
{
|
|
if (condition)
|
|
return;
|
|
|
|
std::cerr << "FAIL: " << message << "\n";
|
|
++gFailures;
|
|
}
|
|
|
|
ShaderParameterDefinition MakeFloatDefinition()
|
|
{
|
|
ShaderParameterDefinition definition;
|
|
definition.id = "gain";
|
|
definition.type = ShaderParameterType::Float;
|
|
definition.defaultNumbers = { 0.5 };
|
|
definition.minNumbers = { 0.0 };
|
|
definition.maxNumbers = { 1.0 };
|
|
return definition;
|
|
}
|
|
|
|
void TestSafePresetFileStems()
|
|
{
|
|
Expect(MakeSafePresetFileStem(" Show Look 01 ") == "show-look-01", "preset names are trimmed and dashed");
|
|
Expect(MakeSafePresetFileStem("A__B---C") == "a-b-c", "duplicate separators collapse");
|
|
Expect(MakeSafePresetFileStem("../Unsafe Name!") == "unsafe-name", "unsafe punctuation is dropped");
|
|
Expect(MakeSafePresetFileStem("!!!") == "", "names without alphanumeric characters become empty");
|
|
}
|
|
|
|
void TestFloatNormalization()
|
|
{
|
|
ShaderParameterDefinition definition = MakeFloatDefinition();
|
|
ShaderParameterValue value;
|
|
std::string error;
|
|
|
|
Expect(NormalizeAndValidateParameterValue(definition, JsonValue(2.0), value, error), "float parameter accepts numeric values");
|
|
Expect(value.numberValues.size() == 1 && value.numberValues.front() == 1.0, "float parameter clamps to max");
|
|
|
|
error.clear();
|
|
Expect(NormalizeAndValidateParameterValue(definition, JsonValue(-10.0), value, error), "float parameter accepts low numeric values");
|
|
Expect(value.numberValues.size() == 1 && value.numberValues.front() == 0.0, "float parameter clamps to min");
|
|
|
|
error.clear();
|
|
Expect(!NormalizeAndValidateParameterValue(definition, JsonValue("bad"), value, error), "float parameter rejects non-numeric values");
|
|
Expect(!error.empty(), "float rejection includes an error");
|
|
}
|
|
|
|
void TestVectorNormalization()
|
|
{
|
|
ShaderParameterDefinition definition;
|
|
definition.id = "offset";
|
|
definition.type = ShaderParameterType::Vec2;
|
|
definition.defaultNumbers = { 0.0, 0.0 };
|
|
definition.minNumbers = { -1.0, -2.0 };
|
|
definition.maxNumbers = { 1.0, 2.0 };
|
|
|
|
JsonValue input = JsonValue::MakeArray();
|
|
input.pushBack(JsonValue(5.0));
|
|
input.pushBack(JsonValue(-5.0));
|
|
|
|
ShaderParameterValue value;
|
|
std::string error;
|
|
Expect(NormalizeAndValidateParameterValue(definition, input, value, error), "vec2 parameter accepts arrays");
|
|
Expect(value.numberValues.size() == 2 && value.numberValues[0] == 1.0 && value.numberValues[1] == -2.0, "vec2 parameter clamps each component");
|
|
|
|
JsonValue shortInput = JsonValue::MakeArray();
|
|
shortInput.pushBack(JsonValue(0.0));
|
|
error.clear();
|
|
Expect(!NormalizeAndValidateParameterValue(definition, shortInput, value, error), "vec2 parameter rejects wrong component count");
|
|
}
|
|
|
|
void TestEnumAndDefaults()
|
|
{
|
|
ShaderParameterDefinition definition;
|
|
definition.id = "mode";
|
|
definition.type = ShaderParameterType::Enum;
|
|
definition.defaultEnumValue = "soft";
|
|
definition.enumOptions = {
|
|
{ "soft", "Soft" },
|
|
{ "hard", "Hard" }
|
|
};
|
|
|
|
ShaderParameterValue defaultValue = DefaultValueForDefinition(definition);
|
|
Expect(defaultValue.enumValue == "soft", "enum default is copied from definition");
|
|
|
|
ShaderParameterValue value;
|
|
std::string error;
|
|
Expect(NormalizeAndValidateParameterValue(definition, JsonValue("hard"), value, error), "enum accepts listed options");
|
|
Expect(value.enumValue == "hard", "enum stores selected option");
|
|
|
|
error.clear();
|
|
Expect(!NormalizeAndValidateParameterValue(definition, JsonValue("other"), value, error), "enum rejects unknown options");
|
|
}
|
|
|
|
void TestTextNormalization()
|
|
{
|
|
ShaderParameterDefinition definition;
|
|
definition.id = "titleText";
|
|
definition.type = ShaderParameterType::Text;
|
|
definition.defaultTextValue = "DEFAULT";
|
|
definition.maxLength = 6;
|
|
|
|
ShaderParameterValue defaultValue = DefaultValueForDefinition(definition);
|
|
Expect(defaultValue.textValue == "DEFAUL", "text default is clamped to max length");
|
|
|
|
ShaderParameterValue value;
|
|
std::string error;
|
|
Expect(NormalizeAndValidateParameterValue(definition, JsonValue("ABC\tDEF\x01GHI"), value, error), "text accepts string values");
|
|
Expect(value.textValue == "ABCDEF", "text drops non-printable characters and clamps length");
|
|
|
|
error.clear();
|
|
Expect(!NormalizeAndValidateParameterValue(definition, JsonValue(12.0), value, error), "text rejects non-string values");
|
|
}
|
|
}
|
|
|
|
int main()
|
|
{
|
|
TestSafePresetFileStems();
|
|
TestFloatNormalization();
|
|
TestVectorNormalization();
|
|
TestEnumAndDefaults();
|
|
TestTextNormalization();
|
|
|
|
if (gFailures != 0)
|
|
{
|
|
std::cerr << gFailures << " RuntimeParameterUtils test failure(s).\n";
|
|
return 1;
|
|
}
|
|
|
|
std::cout << "RuntimeParameterUtils tests passed.\n";
|
|
return 0;
|
|
}
|