diff --git a/core-java/pom.xml b/core-java/pom.xml
index 5766224b3a..3406bddda9 100644
--- a/core-java/pom.xml
+++ b/core-java/pom.xml
@@ -358,7 +358,7 @@
1.1.7
- 19.0
+ 21.0
3.5
1.55
1.10
diff --git a/core-java/src/test/java/com/baeldung/guava/GuavaBiMapTest.java b/core-java/src/test/java/com/baeldung/guava/GuavaBiMapTest.java
new file mode 100644
index 0000000000..c04cfb14fb
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/guava/GuavaBiMapTest.java
@@ -0,0 +1,122 @@
+package com.baeldung.guava;
+
+import static org.junit.Assert.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Test;
+import com.google.common.collect.BiMap;
+import com.google.common.collect.EnumHashBiMap;
+import com.google.common.collect.HashBiMap;
+import com.google.common.collect.ImmutableBiMap;
+
+public class GuavaBiMapTest {
+ @Test
+ public void whenQueryByValue_shouldReturnKey() {
+ final BiMap personCountryHeadBiMap = HashBiMap.create();
+ personCountryHeadBiMap.put("Modi", "India");
+ personCountryHeadBiMap.put("Obama", "USA");
+ personCountryHeadBiMap.put("Putin", "USSR");
+
+ final String countryHeadName = personCountryHeadBiMap.inverse().get("India");
+
+ assertEquals("Modi", countryHeadName);
+ }
+
+ @Test
+ public void whenCreateBiMapFromExistingMap_shouldReturnKey() {
+ final Map personCountryHeadMap = new HashMap<>();
+ personCountryHeadMap.put("Modi", "India");
+ personCountryHeadMap.put("Obama", "USA");
+ personCountryHeadMap.put("Putin", "USSR");
+ final BiMap personCountryHeadBiMap = HashBiMap.create(personCountryHeadMap);
+
+ final String countryHeadName = personCountryHeadBiMap.inverse().get("India");
+
+ assertEquals("Modi", countryHeadName);
+ }
+
+ @Test
+ public void whenQueryByKey_shouldReturnValue() {
+ final BiMap personCountryHeadBiMap = HashBiMap.create();
+
+ personCountryHeadBiMap.put("Modi", "India");
+ personCountryHeadBiMap.put("Obama", "USA");
+ personCountryHeadBiMap.put("Putin", "USSR");
+
+ assertEquals("USA", personCountryHeadBiMap.get("Obama"));
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void whenSameValueIsBeingPresent_shouldThrowException() {
+ final BiMap personCountryHeadBiMap = HashBiMap.create();
+
+ personCountryHeadBiMap.put("Modi", "India");
+ personCountryHeadBiMap.put("Obama", "USA");
+ personCountryHeadBiMap.put("Putin", "USSR");
+ personCountryHeadBiMap.put("Trump", "USA");
+ }
+
+ @Test
+ public void givenSameValueIsBeingPresent_whenForcePutIsUsed_shouldCompleteSuccessfully() {
+ final BiMap personCountryHeadBiMap = HashBiMap.create();
+
+ personCountryHeadBiMap.put("Modi", "India");
+ personCountryHeadBiMap.put("Obama", "USA");
+ personCountryHeadBiMap.put("Putin", "USSR");
+ personCountryHeadBiMap.forcePut("Trump", "USA");
+
+ assertEquals("USA", personCountryHeadBiMap.get("Trump"));
+ assertEquals("Trump", personCountryHeadBiMap.inverse().get("USA"));
+ }
+
+ @Test
+ public void whenSameKeyIsBeingPresent_shouldReplaceAlreadyPresent() {
+ final BiMap personCountryHeadBiMap = HashBiMap.create();
+
+ personCountryHeadBiMap.put("Modi", "India");
+ personCountryHeadBiMap.put("Obama", "USA");
+ personCountryHeadBiMap.put("Putin", "USSR");
+ personCountryHeadBiMap.put("Obama", "HongKong");
+
+ assertEquals("HongKong", personCountryHeadBiMap.get("Obama"));
+ }
+
+ @Test
+ public void whenUsingImmutableBiMap_shouldAllowPutSuccessfully() {
+ final BiMap personCountryHeadBiMap = new ImmutableBiMap.Builder().put("Modi", "India").put("Obama", "USA").put("Putin", "USSR").build();
+
+ assertEquals("USA", personCountryHeadBiMap.get("Obama"));
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void whenUsingImmutableBiMap_shouldNotAllowRemove() {
+ final BiMap personCountryHeadBiMap = new ImmutableBiMap.Builder().put("Modi", "India").put("Obama", "USA").put("Putin", "USSR").build();
+
+ personCountryHeadBiMap.remove("Modi");
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void whenUsingImmutableBiMap_shouldNotAllowPut() {
+ final BiMap personCountryHeadBiMap = new ImmutableBiMap.Builder().put("Modi", "India").put("Obama", "USA").put("Putin", "USSR").build();
+
+ personCountryHeadBiMap.put("Trump", "USA");
+ }
+
+ private enum Operation {
+ ADD, SUBTRACT, MULTIPLY, DIVIDE
+ }
+
+ @Test
+ public void whenUsingEnumAsKeyInMap_shouldReplaceAlreadyPresent() {
+ final BiMap operationStringBiMap = EnumHashBiMap.create(Operation.class);
+
+ operationStringBiMap.put(Operation.ADD, "Add");
+ operationStringBiMap.put(Operation.SUBTRACT, "Subtract");
+ operationStringBiMap.put(Operation.MULTIPLY, "Multiply");
+ operationStringBiMap.put(Operation.DIVIDE, "Divide");
+
+ assertEquals("Divide", operationStringBiMap.get(Operation.DIVIDE));
+ }
+}