From 89dc7e3d1633bd810f6c81b38ccdd2f218c3b8ac Mon Sep 17 00:00:00 2001 From: Mats Kruskopf Eriksson Date: Wed, 7 Feb 2024 14:40:31 +0100 Subject: [PATCH 1/2] add increase method with command INCR --- src/main/java/org/fungover/haze/Command.java | 2 +- .../java/org/fungover/haze/HazeDatabase.java | 22 +++++++++++++++++++ src/main/java/org/fungover/haze/Main.java | 2 +- .../org/fungover/haze/HazeDatabaseTest.java | 17 ++++++++++++++ src/test/java/org/fungover/haze/MainTest.java | 7 ++++++ 5 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/fungover/haze/Command.java b/src/main/java/org/fungover/haze/Command.java index 43e3e166..9ecd560a 100644 --- a/src/main/java/org/fungover/haze/Command.java +++ b/src/main/java/org/fungover/haze/Command.java @@ -1,5 +1,5 @@ package org.fungover.haze; public enum Command { - SET, GET, DEL, PING, SETNX, EXISTS, SAVE, RPUSH, LPUSH, LPOP, RPOP, LLEN, LMOVE, LTRIM, AUTH + SET, GET, DEL, PING, SETNX, EXISTS, SAVE, RPUSH, LPUSH, LPOP, RPOP, LLEN, LMOVE, LTRIM, AUTH, INCR } diff --git a/src/main/java/org/fungover/haze/HazeDatabase.java b/src/main/java/org/fungover/haze/HazeDatabase.java index 75f6bcbf..45e6d5b7 100644 --- a/src/main/java/org/fungover/haze/HazeDatabase.java +++ b/src/main/java/org/fungover/haze/HazeDatabase.java @@ -143,4 +143,26 @@ public void addValue(String key, String value) { lock.unlock(); } } + + public String increaseValue(List inputList) { + lock.lock(); + String key = inputList.get(1); + try { + if (!database.containsKey(key)) { + return "-ERR no such key\r\n"; + } + String value = database.get(key); + try { + long longValue = Long.parseLong(value); + longValue++; + database.put(key, String.valueOf(longValue)); + return ":" + longValue + "\r\n"; + } catch (NumberFormatException e) { + return "-WRONGTYPE value is not an integer or out of range\r\n"; + } + } finally { + lock.unlock(); + } + } + } diff --git a/src/main/java/org/fungover/haze/Main.java b/src/main/java/org/fungover/haze/Main.java index 500e27d3..8945aa5e 100644 --- a/src/main/java/org/fungover/haze/Main.java +++ b/src/main/java/org/fungover/haze/Main.java @@ -121,7 +121,7 @@ public static String executeCommand(HazeDatabase hazeDatabase, List inpu case LMOVE -> hazeList.lMove(inputList); case LTRIM -> hazeList.callLtrim(inputList); case AUTH -> "+OK\r\n"; - + case INCR -> hazeDatabase.increaseValue(inputList); }; } diff --git a/src/test/java/org/fungover/haze/HazeDatabaseTest.java b/src/test/java/org/fungover/haze/HazeDatabaseTest.java index 89e1122a..650fc3d3 100644 --- a/src/test/java/org/fungover/haze/HazeDatabaseTest.java +++ b/src/test/java/org/fungover/haze/HazeDatabaseTest.java @@ -1,5 +1,6 @@ package org.fungover.haze; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.Arrays; @@ -159,5 +160,21 @@ void shouldShouldReturnTrue(){ assertThat(testDatabase.containsKey("key1")).isTrue(); } + @Test + void callingIncreaseWithKeyWithIntegerShouldIncreaseValueBy1(){ + testDatabase.addValue("key1", "1"); + + String increaseResult = testDatabase.increaseValue(List.of("INCR","key1")); + assertThat(increaseResult).isEqualTo(":2\r\n"); + assertThat(testDatabase.getValue("key1")).isEqualTo("2"); + + } + + @Test + void callingIncreaseWithKeyThatDoesNotContainIntegerShouldReturnErrorMessage() { + testDatabase.addValue("key1", "Gunnar"); + String increaseResult = testDatabase.increaseValue(List.of("INCR","key1")); + assertThat(increaseResult).isEqualTo("-WRONGTYPE value is not an integer or out of range\r\n"); + } } diff --git a/src/test/java/org/fungover/haze/MainTest.java b/src/test/java/org/fungover/haze/MainTest.java index 4e9c2c29..3199558a 100644 --- a/src/test/java/org/fungover/haze/MainTest.java +++ b/src/test/java/org/fungover/haze/MainTest.java @@ -1,5 +1,6 @@ package org.fungover.haze; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; @@ -108,6 +109,12 @@ void callExecuteCommandWithLTRIMShouldReturnErrorMessageWhenKeyDoesNotExist() { assertThat(Main.executeCommand(database, List.of("LTRIM", "key", "2", "3"), hazeList)).isEqualTo("-The key is not present in the database.\r\n"); } + @Test + void callExecuteCommandWithIncrShouldIncreaseTheValueOfTheKeyBy1() { + Main.executeCommand(database, List.of("SET", "key1", "1"), hazeList); + assertThat(Main.executeCommand(database, List.of("INCR", "key1"), hazeList)).isEqualTo(":2\r\n"); + } + @Test void testPrintThreadDebug() { ByteArrayOutputStream outContent = new ByteArrayOutputStream(); From be8c2da7e1d880614b81e6e7299d211f7cfd689f Mon Sep 17 00:00:00 2001 From: Mats Kruskopf Eriksson Date: Wed, 7 Feb 2024 14:44:41 +0100 Subject: [PATCH 2/2] add decrease method with command DECR --- src/main/java/org/fungover/haze/Command.java | 2 +- .../java/org/fungover/haze/HazeDatabase.java | 21 +++++++++++++++++++ src/main/java/org/fungover/haze/Main.java | 1 + .../org/fungover/haze/HazeDatabaseTest.java | 11 +++++++++- src/test/java/org/fungover/haze/MainTest.java | 7 ++++++- 5 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/fungover/haze/Command.java b/src/main/java/org/fungover/haze/Command.java index 9ecd560a..79dea119 100644 --- a/src/main/java/org/fungover/haze/Command.java +++ b/src/main/java/org/fungover/haze/Command.java @@ -1,5 +1,5 @@ package org.fungover.haze; public enum Command { - SET, GET, DEL, PING, SETNX, EXISTS, SAVE, RPUSH, LPUSH, LPOP, RPOP, LLEN, LMOVE, LTRIM, AUTH, INCR + SET, GET, DEL, PING, SETNX, EXISTS, SAVE, RPUSH, LPUSH, LPOP, RPOP, LLEN, LMOVE, LTRIM, AUTH, INCR, DECR } diff --git a/src/main/java/org/fungover/haze/HazeDatabase.java b/src/main/java/org/fungover/haze/HazeDatabase.java index 45e6d5b7..a62034ea 100644 --- a/src/main/java/org/fungover/haze/HazeDatabase.java +++ b/src/main/java/org/fungover/haze/HazeDatabase.java @@ -165,4 +165,25 @@ public String increaseValue(List inputList) { } } + public String decreaseValue(List inputList) { + lock.lock(); + String key = inputList.get(1); + try { + if (!database.containsKey(key)) { + return "-ERR no such key\r\n"; + } + String value = database.get(key); + try { + long longValue = Long.parseLong(value); + longValue--; + database.put(key, String.valueOf(longValue)); + return ":" + longValue + "\r\n"; + } catch (NumberFormatException e) { + return "-WRONGTYPE value is not an integer or out of range\r\n"; + } + } finally { + lock.unlock(); + } + } + } diff --git a/src/main/java/org/fungover/haze/Main.java b/src/main/java/org/fungover/haze/Main.java index 8945aa5e..3caf40e6 100644 --- a/src/main/java/org/fungover/haze/Main.java +++ b/src/main/java/org/fungover/haze/Main.java @@ -122,6 +122,7 @@ public static String executeCommand(HazeDatabase hazeDatabase, List inpu case LTRIM -> hazeList.callLtrim(inputList); case AUTH -> "+OK\r\n"; case INCR -> hazeDatabase.increaseValue(inputList); + case DECR -> hazeDatabase.decreaseValue(inputList); }; } diff --git a/src/test/java/org/fungover/haze/HazeDatabaseTest.java b/src/test/java/org/fungover/haze/HazeDatabaseTest.java index 650fc3d3..46e4aa2b 100644 --- a/src/test/java/org/fungover/haze/HazeDatabaseTest.java +++ b/src/test/java/org/fungover/haze/HazeDatabaseTest.java @@ -1,6 +1,5 @@ package org.fungover.haze; -import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.Arrays; @@ -176,5 +175,15 @@ void callingIncreaseWithKeyThatDoesNotContainIntegerShouldReturnErrorMessage() { String increaseResult = testDatabase.increaseValue(List.of("INCR","key1")); assertThat(increaseResult).isEqualTo("-WRONGTYPE value is not an integer or out of range\r\n"); } + @Test + void callingDecreaseWithKeyWithIntegerShouldDecreaseValueBy1(){ + testDatabase.addValue("key1", "1"); + + String increaseResult = testDatabase.decreaseValue(List.of("DECR","key1")); + assertThat(increaseResult).isEqualTo(":0\r\n"); + assertThat(testDatabase.getValue("key1")).isEqualTo("0"); + + } + } diff --git a/src/test/java/org/fungover/haze/MainTest.java b/src/test/java/org/fungover/haze/MainTest.java index 3199558a..9ccd9f25 100644 --- a/src/test/java/org/fungover/haze/MainTest.java +++ b/src/test/java/org/fungover/haze/MainTest.java @@ -1,6 +1,5 @@ package org.fungover.haze; -import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; @@ -115,6 +114,12 @@ void callExecuteCommandWithIncrShouldIncreaseTheValueOfTheKeyBy1() { assertThat(Main.executeCommand(database, List.of("INCR", "key1"), hazeList)).isEqualTo(":2\r\n"); } + @Test + void callExecuteCommandWithDecrShouldDecreaseTheValueOfTheKeyBy1(){ + Main.executeCommand(database, List.of("SET", "key1", "1"), hazeList); + assertThat(Main.executeCommand(database, List.of("DECR", "key1"), hazeList)).isEqualTo(":0\r\n"); + } + @Test void testPrintThreadDebug() { ByteArrayOutputStream outContent = new ByteArrayOutputStream();