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