From 262d4ee9841925b9e388ad40a26a2a384150117d Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 8 Oct 2021 13:22:35 +0300 Subject: [PATCH 1/2] HashMaps --- src/main/java/ghast/HashMaps.java | 156 ++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 src/main/java/ghast/HashMaps.java diff --git a/src/main/java/ghast/HashMaps.java b/src/main/java/ghast/HashMaps.java new file mode 100644 index 0000000..ae63bcf --- /dev/null +++ b/src/main/java/ghast/HashMaps.java @@ -0,0 +1,156 @@ +package ghast; + +import lombok.*; + +import java.util.HashMap; +import java.util.Map; + +/** + * Создание Map как в Java 9+. + */ +@SuppressWarnings("DuplicatedCode") +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class HashMaps { + + public static Map of() { + return new HashMap<>(0); + } + + public static Map of(K k1, V v1) { + return new HashMap() {{ + put(k1, v1); + }}; + } + + public static Map of(K k1, V v1, K k2, V v2) { + return new HashMap() {{ + put(k1, v1); + put(k2, v2); + }}; + } + + public static Map of(K k1, V v1, K k2, V v2, K k3, V v3) { + return new HashMap() {{ + put(k1, v1); + put(k2, v2); + put(k3, v3); + }}; + } + + public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) { + return new HashMap() {{ + put(k1, v1); + put(k2, v2); + put(k3, v3); + put(k4, v4); + }}; + } + + public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) { + return new HashMap() {{ + put(k1, v1); + put(k2, v2); + put(k3, v3); + put(k4, v4); + put(k5, v5); + }}; + } + + public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + K k6, V v6) { + return new HashMap() {{ + put(k1, v1); + put(k2, v2); + put(k3, v3); + put(k4, v4); + put(k5, v5); + put(k6, v6); + }}; + } + + public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + K k6, V v6, K k7, V v7) { + return new HashMap() {{ + put(k1, v1); + put(k2, v2); + put(k3, v3); + put(k4, v4); + put(k5, v5); + put(k6, v6); + put(k7, v7); + }}; + } + + public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + K k6, V v6, K k7, V v7, K k8, V v8) { + return new HashMap() {{ + put(k1, v1); + put(k2, v2); + put(k3, v3); + put(k4, v4); + put(k5, v5); + put(k6, v6); + put(k7, v7); + put(k8, v8); + }}; + } + + public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9) { + return new HashMap() {{ + put(k1, v1); + put(k2, v2); + put(k3, v3); + put(k4, v4); + put(k5, v5); + put(k6, v6); + put(k7, v7); + put(k8, v8); + put(k9, v9); + }}; + } + + public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10) { + return new HashMap() {{ + put(k1, v1); + put(k2, v2); + put(k3, v3); + put(k4, v4); + put(k5, v5); + put(k6, v6); + put(k7, v7); + put(k8, v8); + put(k9, v9); + put(k10, v10); + }}; + } + + @SafeVarargs + public static Map ofEntries(Map.Entry... entries) { + if (entries == null || entries.length == 0) { + return of(); + } + + Map map = new HashMap<>(entries.length); + for (Map.Entry entry : entries) { + map.put(entry.getKey(), entry.getValue()); + } + + return map; + } + + public static Map.Entry entry(K k, V v) { + return new SimpleEntry<>(k, v); + } + + @AllArgsConstructor + @Getter + @Setter + @EqualsAndHashCode + private static class SimpleEntry implements Map.Entry { + + private final K key; + private V value; + } +} From 26d6fee242366d6d6b9044efcb74b7b33db15bc9 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 8 Oct 2021 15:17:54 +0300 Subject: [PATCH 2/2] test: HashMaps --- build.gradle | 9 ++ src/main/java/ghast/HashMaps.java | 39 ++++-- src/test/java/ghast/HashMapsTest.java | 182 ++++++++++++++++++++++++++ 3 files changed, 218 insertions(+), 12 deletions(-) create mode 100644 src/test/java/ghast/HashMapsTest.java diff --git a/build.gradle b/build.gradle index f0a23cb..32ef767 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,6 @@ plugins { id 'java' + id 'jacoco' } project.group = 'ghast' @@ -49,3 +50,11 @@ dependencies { test { useJUnitPlatform() } + +jacoco { + toolVersion = '0.8.5' +} + +jacocoTestReport { + dependsOn test +} diff --git a/src/main/java/ghast/HashMaps.java b/src/main/java/ghast/HashMaps.java index ae63bcf..1da8d7d 100644 --- a/src/main/java/ghast/HashMaps.java +++ b/src/main/java/ghast/HashMaps.java @@ -17,20 +17,20 @@ public final class HashMaps { } public static Map of(K k1, V v1) { - return new HashMap() {{ + return new HashMap(1) {{ put(k1, v1); }}; } public static Map of(K k1, V v1, K k2, V v2) { - return new HashMap() {{ + return new HashMap(2) {{ put(k1, v1); put(k2, v2); }}; } public static Map of(K k1, V v1, K k2, V v2, K k3, V v3) { - return new HashMap() {{ + return new HashMap(3) {{ put(k1, v1); put(k2, v2); put(k3, v3); @@ -38,7 +38,7 @@ public final class HashMaps { } public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) { - return new HashMap() {{ + return new HashMap(4) {{ put(k1, v1); put(k2, v2); put(k3, v3); @@ -47,7 +47,7 @@ public final class HashMaps { } public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) { - return new HashMap() {{ + return new HashMap(5) {{ put(k1, v1); put(k2, v2); put(k3, v3); @@ -58,7 +58,7 @@ public final class HashMaps { public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) { - return new HashMap() {{ + return new HashMap(6) {{ put(k1, v1); put(k2, v2); put(k3, v3); @@ -70,7 +70,7 @@ public final class HashMaps { public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) { - return new HashMap() {{ + return new HashMap(7) {{ put(k1, v1); put(k2, v2); put(k3, v3); @@ -83,7 +83,7 @@ public final class HashMaps { public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8) { - return new HashMap() {{ + return new HashMap(8) {{ put(k1, v1); put(k2, v2); put(k3, v3); @@ -97,7 +97,7 @@ public final class HashMaps { public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9) { - return new HashMap() {{ + return new HashMap(9) {{ put(k1, v1); put(k2, v2); put(k3, v3); @@ -112,7 +112,7 @@ public final class HashMaps { public static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10) { - return new HashMap() {{ + return new HashMap(10) {{ put(k1, v1); put(k2, v2); put(k3, v3); @@ -145,12 +145,27 @@ public final class HashMaps { } @AllArgsConstructor - @Getter - @Setter @EqualsAndHashCode private static class SimpleEntry implements Map.Entry { private final K key; private V value; + + @Override + public K getKey() { + return key; + } + + @Override + public V getValue() { + return value; + } + + @Override + public V setValue(V value) { + V prev = this.value; + this.value = value; + return prev; + } } } diff --git a/src/test/java/ghast/HashMapsTest.java b/src/test/java/ghast/HashMapsTest.java new file mode 100644 index 0000000..92d5e3e --- /dev/null +++ b/src/test/java/ghast/HashMapsTest.java @@ -0,0 +1,182 @@ +package ghast; + +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class HashMapsTest { + + @Test + void of0() { + Map map = HashMaps.of(); + assertNotNull(map); + assertTrue(map instanceof HashMap); + assertTrue(map.isEmpty()); + } + + @Test + void of1() { + Map map = HashMaps.of("key1", "val1"); + assertNotNull(map); + assertTrue(map instanceof HashMap); + assertEquals(1, map.size()); + } + + @Test + void of2() { + Map map = HashMaps.of( + "key1", "val1", + "key2", "val2" + ); + assertNotNull(map); + assertTrue(map instanceof HashMap); + assertEquals(2, map.size()); + } + + @Test + void of3() { + Map map = HashMaps.of( + "key1", "val1", + "key2", "val2", + "key3", "val3" + ); + assertNotNull(map); + assertTrue(map instanceof HashMap); + assertEquals(3, map.size()); + } + + @Test + void of4() { + Map map = HashMaps.of( + "key1", "val1", + "key2", "val2", + "key3", "val3", + "key4", "val4" + ); + assertNotNull(map); + assertTrue(map instanceof HashMap); + assertEquals(4, map.size()); + } + + @Test + void of5() { + Map map = HashMaps.of( + "key1", "val1", + "key2", "val2", + "key3", "val3", + "key4", "val4", + "key5", "val5" + ); + assertNotNull(map); + assertTrue(map instanceof HashMap); + assertEquals(5, map.size()); + } + + @Test + void of6() { + Map map = HashMaps.of( + "key1", "val1", + "key2", "val2", + "key3", "val3", + "key4", "val4", + "key5", "val5", + "key6", "val6" + ); + assertNotNull(map); + assertTrue(map instanceof HashMap); + assertEquals(6, map.size()); + } + + @Test + void of7() { + Map map = HashMaps.of( + "key1", "val1", + "key2", "val2", + "key3", "val3", + "key4", "val4", + "key5", "val5", + "key6", "val6", + "key7", "val7" + ); + assertNotNull(map); + assertTrue(map instanceof HashMap); + assertEquals(7, map.size()); + } + + @Test + void of8() { + Map map = HashMaps.of( + "key1", "val1", + "key2", "val2", + "key3", "val3", + "key4", "val4", + "key5", "val5", + "key6", "val6", + "key7", "val7", + "key8", "val8" + ); + assertNotNull(map); + assertTrue(map instanceof HashMap); + assertEquals(8, map.size()); + } + + @Test + void of9() { + Map map = HashMaps.of( + "key1", "val1", + "key2", "val2", + "key3", "val3", + "key4", "val4", + "key5", "val5", + "key6", "val6", + "key7", "val7", + "key8", "val8", + "key9", "val9" + ); + assertNotNull(map); + assertTrue(map instanceof HashMap); + assertEquals(9, map.size()); + } + + @Test + void of10() { + Map map = HashMaps.of( + "key1", "val1", + "key2", "val2", + "key3", "val3", + "key4", "val4", + "key5", "val5", + "key6", "val6", + "key7", "val7", + "key8", "val8", + "key9", "val9", + "key10", "val10" + ); + assertNotNull(map); + assertTrue(map instanceof HashMap); + assertEquals(10, map.size()); + } + + @Test + void ofEntries() { + Map map = HashMaps.ofEntries( + HashMaps.entry("key1", "val1"), + HashMaps.entry("key2", "val2"), + HashMaps.entry("key3", "val3"), + HashMaps.entry("key4", "val4"), + HashMaps.entry("key5", "val5"), + HashMaps.entry("key6", "val6"), + HashMaps.entry("key7", "val7"), + HashMaps.entry("key8", "val8"), + HashMaps.entry("key9", "val9"), + HashMaps.entry("key10", "val10"), + HashMaps.entry("key11", "val11") + ); + assertNotNull(map); + assertTrue(map instanceof HashMap); + assertEquals(11, map.size()); + } +} \ No newline at end of file