summaryrefslogtreecommitdiff
path: root/expression-test/expression_test_parser.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'expression-test/expression_test_parser.hpp')
-rw-r--r--expression-test/expression_test_parser.hpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/expression-test/expression_test_parser.hpp b/expression-test/expression_test_parser.hpp
new file mode 100644
index 0000000000..561ccd9647
--- /dev/null
+++ b/expression-test/expression_test_parser.hpp
@@ -0,0 +1,94 @@
+#pragma once
+
+#include "filesystem.hpp"
+
+#include <mbgl/style/expression/expression.hpp>
+#include <mbgl/util/feature.hpp>
+#include <mbgl/util/optional.hpp>
+#include <mbgl/util/rapidjson.hpp>
+
+#include <vector>
+#include <string>
+
+using namespace mbgl;
+
+struct Input {
+ Input(optional<float> zoom_, optional<double> heatmapDensity_, Feature feature_)
+ : zoom(std::move(zoom_)),
+ heatmapDensity(std::move(heatmapDensity_)),
+ feature(std::move(feature_)) {}
+ optional<float> zoom;
+ optional<double> heatmapDensity;
+ Feature feature;
+};
+
+struct Compiled {
+ bool operator==(const Compiled& other) const {
+ bool typeEqual = success == other.success &&
+ isFeatureConstant == other.isFeatureConstant &&
+ isZoomConstant == other.isZoomConstant &&
+ serializedType == other.serializedType &&
+ errors == other.errors;
+ return typeEqual;
+ }
+
+ bool success = false;
+ bool isFeatureConstant = false;
+ bool isZoomConstant = false;
+ std::string serializedType;
+ std::vector<Value> errors;
+};
+
+struct TestResult {
+ Compiled compiled;
+ optional<Value> expression;
+ optional<Value> outputs;
+ optional<Value> serialized;
+};
+
+struct PropertySpec {
+ std::string type;
+ std::string value;
+ std::size_t length = 0;
+ bool isDataDriven = false;
+ optional<Value> expression;
+};
+
+class TestData {
+public:
+ std::vector<Input> inputs;
+ TestResult expected;
+ TestResult result;
+ TestResult recompiled;
+ optional<PropertySpec> spec;
+ JSDocument document;
+};
+
+struct Ignore {
+ Ignore(std::string id_, std::string reason_)
+ : id(std::move(id_)),
+ reason(std::move(reason_)) {}
+
+ std::string id;
+ std::string reason;
+};
+
+using Arguments = std::tuple<filesystem::path, std::vector<filesystem::path>, bool, uint32_t>;
+Arguments parseArguments(int argc, char** argv);
+
+using Ignores = std::vector<Ignore>;
+Ignores parseExpressionIgnores();
+optional<TestData> parseTestData(const filesystem::path&);
+
+std::string toJSON(const Value& value, unsigned indent = 0, bool singleLine = false);
+JSDocument toDocument(const Value&);
+Value toValue(const Compiled&);
+optional<Value> toValue(const style::expression::Value&);
+
+std::unique_ptr<style::expression::Expression> parseExpression(const JSValue&,
+ optional<PropertySpec>&,
+ TestResult&);
+std::unique_ptr<style::expression::Expression> parseExpression(const optional<Value>&,
+ optional<PropertySpec>&,
+ TestResult&);
+