forked from appium/java-client
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathComparisonResult.java
More file actions
119 lines (106 loc) · 4.04 KB
/
ComparisonResult.java
File metadata and controls
119 lines (106 loc) · 4.04 KB
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
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.appium.java_client.imagecomparison;
import org.openqa.selenium.Point;
import org.openqa.selenium.Rectangle;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Map;
public abstract class ComparisonResult {
private static final String VISUALIZATION = "visualization";
protected final Object commandResult;
public ComparisonResult(Object commandResult) {
this.commandResult = commandResult;
}
protected Map<String, Object> getResultAsMap() {
//noinspection unchecked
return (Map<String, Object>) commandResult;
}
/**
* Verifies if the corresponding property is present in the command result
* and throws an exception if not.
*
* @param propertyName the actual property name to be verified for presence
*/
protected void verifyPropertyPresence(String propertyName) {
if (!getResultAsMap().containsKey(propertyName)) {
throw new IllegalStateException(
String.format("There is no '%s' attribute in the resulting command output %s. "
+ "Did you set the options properly?", propertyName, commandResult));
}
}
/**
* Returns the visualization of the matching result.
*
* @return The visualization of the matching result represented as base64-encoded PNG image.
*/
public byte[] getVisualization() {
verifyPropertyPresence(VISUALIZATION);
return ((String) getResultAsMap().get(VISUALIZATION)).getBytes(StandardCharsets.UTF_8);
}
/**
* Stores visualization image into the given file.
*
* @param destination File path to save the image to.
* @throws IOException On file system I/O error.
*/
public void storeVisualization(File destination) throws IOException {
final byte[] data = Base64.getDecoder().decode(getVisualization());
try (OutputStream stream = new FileOutputStream(destination)) {
stream.write(data);
}
}
/**
* Converts float OpenCV coordinates to Selenium-compatible format.
*
* @param openCVCoordinate the original coordinate value
* @return The converted value
*/
private static int toSeleniumCoordinate(Object openCVCoordinate) {
if (openCVCoordinate instanceof Long) {
return ((Long) openCVCoordinate).intValue();
}
if (openCVCoordinate instanceof Double) {
return ((Double) openCVCoordinate).intValue();
}
return (int) openCVCoordinate;
}
/**
* Transforms a map into {@link Rectangle} object.
*
* @param map the source map.
* @return {@link Rectangle} object
*/
public static Rectangle mapToRect(Map<String, Object> map) {
return new Rectangle(toSeleniumCoordinate(map.get("x")),
toSeleniumCoordinate(map.get("y")),
toSeleniumCoordinate(map.get("height")),
toSeleniumCoordinate(map.get("width")));
}
/**
* Transforms a map into {@link Point} object.
*
* @param map the source map.
* @return {@link Point} object
*/
public static Point mapToPoint(Map<String, Object> map) {
return new Point(toSeleniumCoordinate(map.get("x")), toSeleniumCoordinate(map.get("y")));
}
}