1886da342Sopenharmony_ci/*
2886da342Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3886da342Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4886da342Sopenharmony_ci * you may not use this file except in compliance with the License.
5886da342Sopenharmony_ci * You may obtain a copy of the License at
6886da342Sopenharmony_ci *
7886da342Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8886da342Sopenharmony_ci *
9886da342Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10886da342Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11886da342Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12886da342Sopenharmony_ci * See the License for the specific language governing permissions and
13886da342Sopenharmony_ci * limitations under the License.
14886da342Sopenharmony_ci */
15886da342Sopenharmony_ci
16886da342Sopenharmony_ci#include <algorithm>
17886da342Sopenharmony_ci#include "ui_model.h"
18886da342Sopenharmony_ci
19886da342Sopenharmony_cinamespace OHOS::uitest {
20886da342Sopenharmony_ci    using namespace std;
21886da342Sopenharmony_ci    using namespace nlohmann;
22886da342Sopenharmony_ci
23886da342Sopenharmony_ci    void Widget::SetBounds(const Rect &bounds)
24886da342Sopenharmony_ci    {
25886da342Sopenharmony_ci        bounds_ = bounds;
26886da342Sopenharmony_ci    }
27886da342Sopenharmony_ci
28886da342Sopenharmony_ci    string Widget::ToStr() const
29886da342Sopenharmony_ci    {
30886da342Sopenharmony_ci        stringstream os;
31886da342Sopenharmony_ci        os << "Widget{";
32886da342Sopenharmony_ci        for (int i = 0; i < UiAttr::MAX; i++) {
33886da342Sopenharmony_ci            os << ATTR_NAMES[i] << "='" << attributeVec_[i] << "',";
34886da342Sopenharmony_ci        }
35886da342Sopenharmony_ci        os << "}";
36886da342Sopenharmony_ci        return os.str();
37886da342Sopenharmony_ci    }
38886da342Sopenharmony_ci
39886da342Sopenharmony_ci    unique_ptr<Widget> Widget::Clone(string_view hierarchy) const
40886da342Sopenharmony_ci    {
41886da342Sopenharmony_ci        auto clone = make_unique<Widget>(hierarchy);
42886da342Sopenharmony_ci        clone->bounds_ = this->bounds_;
43886da342Sopenharmony_ci        clone->attributeVec_ = attributeVec_;
44886da342Sopenharmony_ci        return clone;
45886da342Sopenharmony_ci    }
46886da342Sopenharmony_ci
47886da342Sopenharmony_ci    std::vector<std::string> Widget::GetAttrVec() const
48886da342Sopenharmony_ci    {
49886da342Sopenharmony_ci        std::vector<std::string> retVec = attributeVec_;
50886da342Sopenharmony_ci        if (attributeVec_[UiAttr::BOUNDS].empty()) {
51886da342Sopenharmony_ci            stringstream boundStream;
52886da342Sopenharmony_ci            boundStream << "[" << bounds_.left_ << "," << bounds_.top_ << "][" << bounds_.right_ << ","
53886da342Sopenharmony_ci                        << bounds_.bottom_ << "]";
54886da342Sopenharmony_ci            retVec[UiAttr::BOUNDS] = boundStream.str();
55886da342Sopenharmony_ci        }
56886da342Sopenharmony_ci        return retVec;
57886da342Sopenharmony_ci    }
58886da342Sopenharmony_ci
59886da342Sopenharmony_ci    void Widget::SetAttr(UiAttr attrId, string value)
60886da342Sopenharmony_ci    {
61886da342Sopenharmony_ci        if (attrId >= UiAttr::MAX) {
62886da342Sopenharmony_ci            LOG_E("Error attrId %{public}d, check it", attrId);
63886da342Sopenharmony_ci            return;
64886da342Sopenharmony_ci        }
65886da342Sopenharmony_ci        attributeVec_[attrId] = value;
66886da342Sopenharmony_ci    }
67886da342Sopenharmony_ci
68886da342Sopenharmony_ci    std::string Widget::GetAttr(UiAttr attrId) const
69886da342Sopenharmony_ci    {
70886da342Sopenharmony_ci        if (attrId >= UiAttr::MAX) {
71886da342Sopenharmony_ci            return "none";
72886da342Sopenharmony_ci        }
73886da342Sopenharmony_ci        if (attrId == UiAttr::BOUNDS && attributeVec_[UiAttr::BOUNDS].empty()) {
74886da342Sopenharmony_ci            stringstream boundStream;
75886da342Sopenharmony_ci            boundStream << "[" << bounds_.left_ << "," << bounds_.top_ << "][" << bounds_.right_ << ","
76886da342Sopenharmony_ci                        << bounds_.bottom_ << "]";
77886da342Sopenharmony_ci            return boundStream.str();
78886da342Sopenharmony_ci        }
79886da342Sopenharmony_ci        return attributeVec_[attrId];
80886da342Sopenharmony_ci    }
81886da342Sopenharmony_ci
82886da342Sopenharmony_ci    bool Widget::MatchAttr(const WidgetMatchModel& matchModel) const
83886da342Sopenharmony_ci    {
84886da342Sopenharmony_ci        UiAttr attr = matchModel.attrName;
85886da342Sopenharmony_ci        std::string_view value = matchModel.attrValue;
86886da342Sopenharmony_ci        ValueMatchPattern pattern = matchModel.pattern;
87886da342Sopenharmony_ci        std::string_view attrValue = attributeVec_[attr];
88886da342Sopenharmony_ci        switch (pattern) {
89886da342Sopenharmony_ci            case ValueMatchPattern::EQ:
90886da342Sopenharmony_ci                return attrValue == value;
91886da342Sopenharmony_ci            case ValueMatchPattern::CONTAINS:
92886da342Sopenharmony_ci                return attrValue.find(value) != std::string_view::npos;
93886da342Sopenharmony_ci            case ValueMatchPattern::STARTS_WITH:
94886da342Sopenharmony_ci                return attrValue.find(value) == 0;
95886da342Sopenharmony_ci            case ValueMatchPattern::ENDS_WITH:
96886da342Sopenharmony_ci                if (attrValue.length() < value.length()) {
97886da342Sopenharmony_ci                    return false;
98886da342Sopenharmony_ci                }
99886da342Sopenharmony_ci                return attrValue.substr(attrValue.length() - value.length()) == value;
100886da342Sopenharmony_ci            default:
101886da342Sopenharmony_ci                break;
102886da342Sopenharmony_ci        }
103886da342Sopenharmony_ci        return false;
104886da342Sopenharmony_ci    }
105886da342Sopenharmony_ci
106886da342Sopenharmony_ci    void Widget::SetHierarchy(const std::string &hierarch)
107886da342Sopenharmony_ci    {
108886da342Sopenharmony_ci        hierarchy_ = hierarch;
109886da342Sopenharmony_ci        attributeVec_[UiAttr::HIERARCHY] = hierarch;
110886da342Sopenharmony_ci    }
111886da342Sopenharmony_ci
112886da342Sopenharmony_ci    void Widget::WrapperWidgetToJson(nlohmann::json &out)
113886da342Sopenharmony_ci    {
114886da342Sopenharmony_ci        for (int i = 0; i < UiAttr::HIERARCHY + 1; ++i) {
115886da342Sopenharmony_ci            if (i == UiAttr::BOUNDS && attributeVec_[UiAttr::BOUNDS].empty()) {
116886da342Sopenharmony_ci                stringstream boundStream;
117886da342Sopenharmony_ci                boundStream << "[" << bounds_.left_ << "," << bounds_.top_ << "][" << bounds_.right_ << ","
118886da342Sopenharmony_ci                            << bounds_.bottom_ << "]";
119886da342Sopenharmony_ci                attributeVec_[i] = boundStream.str();
120886da342Sopenharmony_ci            }
121886da342Sopenharmony_ci            out[ATTR_NAMES[i].data()] = attributeVec_[i];
122886da342Sopenharmony_ci        }
123886da342Sopenharmony_ci        out[ATTR_NAMES[UiAttr::VISIBLE].data()] = attributeVec_[UiAttr::VISIBLE];
124886da342Sopenharmony_ci        out[ATTR_NAMES[UiAttr::HASHCODE].data()] = attributeVec_[UiAttr::HASHCODE];
125886da342Sopenharmony_ci        out[ATTR_NAMES[UiAttr::HINT].data()] = attributeVec_[UiAttr::HINT];
126886da342Sopenharmony_ci    }
127886da342Sopenharmony_ci
128886da342Sopenharmony_ci    string WidgetHierarchyBuilder::Build(string_view parentWidgetHierarchy, uint32_t childIndex)
129886da342Sopenharmony_ci    {
130886da342Sopenharmony_ci        return string(parentWidgetHierarchy) + string(HIERARCHY_SEPARATOR) + to_string(childIndex);
131886da342Sopenharmony_ci    }
132886da342Sopenharmony_ci
133886da342Sopenharmony_ci    string WidgetHierarchyBuilder::GetParentWidgetHierarchy(string_view hierarchy)
134886da342Sopenharmony_ci    {
135886da342Sopenharmony_ci        if (hierarchy == ROOT_HIERARCHY) {
136886da342Sopenharmony_ci            // no parent for root widget
137886da342Sopenharmony_ci            return "";
138886da342Sopenharmony_ci        }
139886da342Sopenharmony_ci
140886da342Sopenharmony_ci        if (hierarchy.find(HIERARCHY_SEPARATOR) == std::string::npos) {
141886da342Sopenharmony_ci            return "";
142886da342Sopenharmony_ci        }
143886da342Sopenharmony_ci
144886da342Sopenharmony_ci        auto findRoot = hierarchy.find(ROOT_HIERARCHY);
145886da342Sopenharmony_ci        if (findRoot != 0) {
146886da342Sopenharmony_ci            // invalid hierarchy string
147886da342Sopenharmony_ci            return "";
148886da342Sopenharmony_ci        }
149886da342Sopenharmony_ci        auto findLastSeparator = hierarchy.find_last_of(HIERARCHY_SEPARATOR);
150886da342Sopenharmony_ci        if (findLastSeparator <= 0 || findLastSeparator == string::npos) {
151886da342Sopenharmony_ci            return "";
152886da342Sopenharmony_ci        }
153886da342Sopenharmony_ci        return string(hierarchy).substr(0, findLastSeparator);
154886da342Sopenharmony_ci    }
155886da342Sopenharmony_ci
156886da342Sopenharmony_ci    string WidgetHierarchyBuilder::GetChildHierarchy(string_view hierarchy, uint32_t childIndex)
157886da342Sopenharmony_ci    {
158886da342Sopenharmony_ci        if (hierarchy.find(ROOT_HIERARCHY) != 0) {
159886da342Sopenharmony_ci            // invalid hierarchy string
160886da342Sopenharmony_ci            return "";
161886da342Sopenharmony_ci        }
162886da342Sopenharmony_ci        return string(hierarchy) + string(HIERARCHY_SEPARATOR) + to_string(childIndex);
163886da342Sopenharmony_ci    }
164886da342Sopenharmony_ci} // namespace OHOS::uitest
165