Skip to content

Commit 220e35f

Browse files
committed
Reworking MutableCapabilities.merge(..) to return a new instance instead of modifying the current object in place to conform the behavior specified in Capabilities interface.
DesiredCapabilities continues to work as in version 3, it modifies itself. This class should be deprecated as soon as RemoteWebDriver builder is ready.
1 parent 48e5b6e commit 220e35f

File tree

5 files changed

+46
-24
lines changed

5 files changed

+46
-24
lines changed

java/client/src/org/openqa/selenium/Capabilities.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,7 @@ default boolean is(String capabilityName) {
107107
* {@code this}.
108108
*/
109109
default Capabilities merge(Capabilities other) {
110-
HashMap<String, Object> map = new HashMap<>(asMap());
111-
if (other != null) {
112-
map.putAll(other.asMap());
113-
}
114-
return new ImmutableCapabilities(map);
110+
return new ImmutableCapabilities(new MutableCapabilities(this).merge(other));
115111
}
116112

117113
default Set<String> getCapabilityNames() {

java/client/src/org/openqa/selenium/MutableCapabilities.java

+8-13
Original file line numberDiff line numberDiff line change
@@ -67,22 +67,17 @@ public MutableCapabilities(Map<String, ?> capabilities) {
6767
}
6868

6969
/**
70-
* Merge the extra capabilities provided into this DesiredCapabilities instance. If capabilities
71-
* with the same name exist in this instance, they will be overridden by the values from the
72-
* extraCapabilities object.
73-
*
74-
* @param extraCapabilities Additional capabilities to be added.
75-
* @return The DesiredCapabilities instance after the merge.
70+
* Merge two {@link Capabilities} together and return the union of the two as a new
71+
* {@link Capabilities} instance. Capabilities from {@code other} will override those in
72+
* {@code this}.
7673
*/
7774
@Override
78-
public MutableCapabilities merge(Capabilities extraCapabilities) {
79-
if (extraCapabilities == null) {
80-
return this;
75+
public MutableCapabilities merge(Capabilities other) {
76+
MutableCapabilities newInstance = new MutableCapabilities(this);
77+
if (other != null) {
78+
other.asMap().forEach(newInstance::setCapability);
8179
}
82-
83-
extraCapabilities.asMap().forEach(this::setCapability);
84-
85-
return this;
80+
return newInstance;
8681
}
8782

8883
public void setCapability(String capabilityName, boolean value) {

java/client/src/org/openqa/selenium/remote/DesiredCapabilities.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,9 @@ public void setAcceptInsecureCerts(boolean acceptInsecureCerts) {
104104
*/
105105
@Override
106106
public DesiredCapabilities merge(Capabilities extraCapabilities) {
107-
super.merge(extraCapabilities);
107+
if (extraCapabilities != null) {
108+
extraCapabilities.asMap().forEach(this::setCapability);
109+
}
108110
return this;
109111
}
110112

java/client/test/org/openqa/selenium/BUILD.bazel

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ SMALL_TESTS = [
77
"ByTest.java",
88
"CookieTest.java",
99
"DimensionTest.java",
10-
"ImmutableCapabilitiesTest.java",
10+
"CapabilitiesTest.java",
1111
"KeysTest.java",
1212
"OutputTypeTest.java",
1313
"PersistentCapabilitiesTest.java",

java/client/test/org/openqa/selenium/ImmutableCapabilitiesTest.java renamed to java/client/test/org/openqa/selenium/CapabilitiesTest.java

+33-4
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
import java.util.Map;
3131

3232
@Category(UnitTests.class)
33-
public class ImmutableCapabilitiesTest {
33+
public class CapabilitiesTest {
3434

3535
@Test
3636
public void canCreateEmptyCapabilities() {
@@ -60,14 +60,14 @@ public void canCreateThreePairCapabilities() {
6060
public void canCreateFourPairCapabilities() {
6161
Capabilities caps = new ImmutableCapabilities("c1", "v1", "c2", 2, "c3", true, "c4", "v4");
6262
assertThat(caps.asMap())
63-
.isEqualTo(ImmutableMap.of("c1", "v1", "c2", 2, "c3", true, "c4", "v4"));
63+
.isEqualTo(ImmutableMap.of("c1", "v1", "c2", 2, "c3", true, "c4", "v4"));
6464
}
6565

6666
@Test
6767
public void canCreateFivePairCapabilities() {
6868
Capabilities caps = new ImmutableCapabilities("c1", "v1", "c2", 2, "c3", true, "c4", "v4", "c5", "v5");
6969
assertThat(caps.asMap())
70-
.isEqualTo(ImmutableMap.of("c1", "v1", "c2", 2, "c3", true, "c4", "v4", "c5", "v5"));
70+
.isEqualTo(ImmutableMap.of("c1", "v1", "c2", 2, "c3", true, "c4", "v4", "c5", "v5"));
7171
}
7272

7373
@Test
@@ -88,7 +88,36 @@ public void shouldCheckKeyType() {
8888
Map<Object, Object> map = new HashMap<>();
8989
map.put(new Object(), new Object());
9090
assertThatExceptionOfType(IllegalArgumentException.class)
91-
.isThrownBy(() -> new ImmutableCapabilities(map));
91+
.isThrownBy(() -> new ImmutableCapabilities(map));
9292
}
9393

94+
@Test
95+
public void canMergeImmutableCapabilities() {
96+
Map<String, Object> map1 = ImmutableMap.of("c1", "v1", "c2", "v2");
97+
Map<String, Object> map2 = ImmutableMap.of("c1", "new value", "c3", "v3");
98+
Capabilities caps1 = new ImmutableCapabilities(map1);
99+
Capabilities caps2 = new ImmutableCapabilities(map2);
100+
Capabilities merged = caps1.merge(caps2);
101+
assertThat(merged).isNotSameAs(caps1).isNotSameAs(caps2);
102+
assertThat(merged.asMap()).containsExactlyEntriesOf(
103+
ImmutableMap.of(
104+
"c1", "new value", "c2", "v2", "c3", "v3"));
105+
assertThat(caps1.asMap()).containsExactlyEntriesOf(map1);
106+
assertThat(caps2.asMap()).containsExactlyEntriesOf(map2);
107+
}
108+
109+
@Test
110+
public void canMergeMutableCapabilities() {
111+
Map<String, Object> map1 = ImmutableMap.of("c1", "v1", "c2", "v2");
112+
Map<String, Object> map2 = ImmutableMap.of("c1", "new value", "c3", "v3");
113+
Capabilities caps1 = new MutableCapabilities(map1);
114+
Capabilities caps2 = new MutableCapabilities(map2);
115+
Capabilities merged = caps1.merge(caps2);
116+
assertThat(merged).isNotSameAs(caps1).isNotSameAs(caps2);
117+
assertThat(merged.asMap()).containsExactlyEntriesOf(
118+
ImmutableMap.of(
119+
"c1", "new value", "c2", "v2", "c3", "v3"));
120+
assertThat(caps1.asMap()).containsExactlyEntriesOf(map1);
121+
assertThat(caps2.asMap()).containsExactlyEntriesOf(map2);
122+
}
94123
}

0 commit comments

Comments
 (0)