Adds support for adding getters / setters for attributes in batch mode 59/164559/42
authorRadoslaw Cybulski <r.cybulski@partner.samsung.com>
Tue, 19 Dec 2017 15:56:16 +0000 (16:56 +0100)
committerRadoslaw Cybulski <r.cybulski@partner.samsung.com>
Thu, 18 Jan 2018 12:29:38 +0000 (13:29 +0100)
Change-Id: Ifa8eb9578b7b6d7df8eeb26c81d3ae3744ee81e8

src/batch/BatchRunner.cpp

index 79cae4a..a04ee01 100644 (file)
@@ -55,11 +55,23 @@ void executeOnMainThread(std::function<void()> fnc)
        if (tmp.failure) throw *tmp.failure;
 }
 
+namespace std
+{
+       template <> struct hash<std::pair<EvaluationValue::Kind, std::string>> {
+               size_t operator()(const std::pair<EvaluationValue::Kind, std::string> &p) const
+               {
+                       return std::hash<std::string>()(p.second) ^ (unsigned char)p.first;
+               }
+       };
+}
+
 struct TestExecutor : ExecutorInterface {
        NavigationInterface::CallbackHandle contextChangedHandle;
        std::shared_ptr<UIElement> root;
        std::shared_ptr<NavigationElement> navigationContext;
        std::unordered_map<std::string, EvaluationValue> variables;
+       std::unordered_map<std::pair<EvaluationValue::Kind, std::string>, std::function<EvaluationValue(const EvaluationValue &, EvaluationValue)>> setters;
+       std::unordered_map<std::pair<EvaluationValue::Kind, std::string>, std::function<EvaluationValue(const EvaluationValue &)>> getters;
        std::mutex mt;
        std::ostream &output;
 
@@ -127,6 +139,25 @@ struct TestExecutor : ExecutorInterface {
                        return it->second;
                throw EvaluationFailure{} << "unknown variable '" << name << "'";
        }
+
+       EvaluationValue setAttribute(const EvaluationValue &self, const std::string &name, EvaluationValue value)
+       {
+               auto it = setters.find({ self.kind(), name });
+               if (it != setters.end()) {
+                       return it->second(self, std::move(value));
+               }
+               return ExecutorInterface::setAttribute(self, name, std::move(value));
+       }
+
+       EvaluationValue getAttribute(const EvaluationValue &self, const std::string &name)
+       {
+               auto it = getters.find({ self.kind(), name });
+               if (it != getters.end()) {
+                       return it->second(self);
+               }
+               return ExecutorInterface::getAttribute(self, name);
+       }
+
        std::shared_ptr<UIElement> getVisibleRoot() override
        {
                std::lock_guard<std::mutex> lock(mt);