-
Notifications
You must be signed in to change notification settings - Fork 132
/
Copy pathNameValidationUtil.php
186 lines (160 loc) · 5.29 KB
/
NameValidationUtil.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\FunctionalTestingFramework\Util\Validation;
use Exception;
use Magento\FunctionalTestingFramework\Exceptions\XmlException;
use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil;
class NameValidationUtil
{
const PHP_CLASS_REGEX_PATTERN = '/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/';
const DATA_ENTITY_NAME = "data entity name";
const DATA_ENTITY_KEY = "data entity key";
const METADATA_OPERATION_NAME = "metadata operation name";
const PAGE = "Page";
const SECTION = "Section";
const SECTION_ELEMENT_NAME = "section element name";
const ACTION_GROUP_NAME = "action group name";
const TEST_NAME = "test name";
/**
* The number of violations this instance has detected.
*
* @var integer
*/
private $count;
/**
* NameValidationUtil constructor.
*
*/
public function __construct()
{
$this->count = 0;
}
/**
* Function which runs a validation against the blacklisted char defined in this class. Validation occurs to insure
* allure report does not error/future devOps builds do not error against illegal char.
*
* @param string $name
* @param string $type
* @return void
* @throws XmlException
*/
public static function validateName($name, $type)
{
$startingPos = 0;
$illegalCharArray = [];
$nameToEvaluate = $name;
while ($startingPos < strlen($nameToEvaluate)) {
$startingPos++;
$partialName = substr($nameToEvaluate, 0, $startingPos);
$valid = boolval(preg_match(self::PHP_CLASS_REGEX_PATTERN, $partialName));
if (!$valid) {
$illegalChar = str_split($partialName)[$startingPos -1];
$illegalCharArray[] = $illegalChar;
$nameToEvaluate = str_replace($illegalChar, "", $nameToEvaluate);
$startingPos--;
}
}
if (!empty($illegalCharArray)) {
$errorMessage = "{$type} name \"${name}\" contains illegal characters, please fix and re-run.";
foreach ($illegalCharArray as $diffChar) {
$errorMessage .= "\nTest names cannot contain '{$diffChar}'";
}
throw new XmlException($errorMessage);
}
}
/**
* Validates that the string is PascalCase.
*
* @param string $str
* @param string $type
* @param string $filename
* @throws Exception
* @return void
*/
public function validatePascalCase($str, $type, $filename = null)
{
if (!is_string($str) || !ctype_upper($str[0])) {
$message = "The {$type} {$str} should be PascalCase with an uppercase first letter.";
if ($filename !== null) {
$message .= " See file {$filename}.";
}
LoggingUtil::getInstance()->getLogger(self::class)->notification(
$message,
[],
false
);
$this->count++;
}
}
/**
* Validates that the string is camelCase.
*
* @param string $str
* @param string $type
* @param string $filename
* @throws Exception
* @return void
*/
public function validateCamelCase($str, $type, $filename = null)
{
if (!is_string($str) || !ctype_lower($str[0])) {
$message = "The {$type} {$str} should be camelCase with a lowercase first letter.";
if ($filename !== null) {
$message .= " See file {$filename}.";
}
LoggingUtil::getInstance()->getLogger(self::class)->notification(
$message,
[],
false
);
$this->count++;
}
}
/**
* Validates that the string is of the pattern {Admin or Storefront}{Description}{Type}.
*
* @param string $str
* @param string $type
* @param string $filename
* @throws Exception
* @return void
*/
public function validateAffixes($str, $type, $filename = null)
{
$isPrefixAdmin = substr($str, 0, 5) === "Admin";
$isPrefixStorefront = substr($str, 0, 10) === "Storefront";
$isSuffixType = substr($str, -strlen($type)) === $type;
if ((!$isPrefixAdmin && !$isPrefixStorefront) || !$isSuffixType) {
$message = "The {$type} name {$str} should follow the pattern {Admin or Storefront}{Description}{$type}.";
if ($filename !== null) {
$message .= " See file {$filename}.";
}
LoggingUtil::getInstance()->getLogger(self::class)->notification(
$message,
[],
false
);
$this->count++;
}
}
/**
* Outputs the number of validations detected by this instance.
*
* @param string $type
* @throws Exception
* @return void
*/
public function summarize($type)
{
if ($this->count > 0) {
LoggingUtil::getInstance()->getLogger(self::class)->notification(
"{$this->count} {$type} violations detected. See mftf.log for details.",
[],
true
);
}
}
}