From e66a6cc17f5de36e16d3b891d190d3a51a2e984c Mon Sep 17 00:00:00 2001 From: qwe5507 Date: Thu, 20 Apr 2023 13:52:10 +0900 Subject: [PATCH 1/5] =?UTF-8?q?=ED=95=99=EC=8A=B5=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20:=20String=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/study/StringTest.java | 73 +++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/src/test/java/study/StringTest.java b/src/test/java/study/StringTest.java index 43e47d90b..62de6f26f 100644 --- a/src/test/java/study/StringTest.java +++ b/src/test/java/study/StringTest.java @@ -1,8 +1,10 @@ package study; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class StringTest { @Test @@ -10,4 +12,75 @@ void replace() { String actual = "abc".replace("b", "d"); assertThat(actual).isEqualTo("adc"); } + + /** + * 학습테스트 - 요구사항 1 : split() + */ + @Test + void split_test1() { + // given + String givenStr = "1,2"; + + // when + String[] splitResult = givenStr.split(","); + + // then + assertThat(splitResult).containsExactly("1", "2"); + } + + @Test + void split_test2() { + // given + String givenStr = "1"; + + // when + String[] splitResult = givenStr.split(","); + + // then + assertThat(splitResult).containsExactly("1"); + } + /** + * 학습테스트 - 요구사항 2 : subString() + */ + @Test + void subString_test() { + // given + String givenStr = "(1,2)"; + + // when + String result = givenStr.substring(1, 4); + + // then + assertThat(result).isEqualTo("1,2"); + } + + /** + * 학습테스트 - 요구사항 3 : charAt() + */ + @Test + @DisplayName("Stirng클래스의 charAt() 메소드로 특정 위치의 문자를 가져온다.") + void charAt_success_test() { + // given + String givenStr = "abc"; + + // when + char result = givenStr.charAt(1); + + // then + assertThat(result).isEqualTo("b"); + } + @Test + @DisplayName("Stirng클래스의 charAt() 메소드로 특정 위치의 문자를 가져오다가, 위치 값을 벗어나면 StringIndexOutOfBoundsException이 발생한다.") + void charAt_fail_test() { + // given + String givenStr = "abc"; + + // when + // then + assertThatThrownBy(() -> { + givenStr.charAt(5); + }).isInstanceOf(IndexOutOfBoundsException.class) + .hasMessageContaining("String index out of range: 5"); + + } } From 8f06ab0499dee099670e3b6fcb72950a483d8536 Mon Sep 17 00:00:00 2001 From: qwe5507 Date: Thu, 20 Apr 2023 22:38:46 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=ED=95=99=EC=8A=B5=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20:=20set=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/study/SetTest.java | 62 ++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/test/java/study/SetTest.java diff --git a/src/test/java/study/SetTest.java b/src/test/java/study/SetTest.java new file mode 100644 index 000000000..a0d70e2da --- /dev/null +++ b/src/test/java/study/SetTest.java @@ -0,0 +1,62 @@ +package study; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; + +import java.util.HashSet; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; + +public class SetTest { + private Set numbers; + + @BeforeEach + void setUp() { + numbers = new HashSet<>(); + numbers.add(1); + numbers.add(1); + numbers.add(2); + numbers.add(3); + } + + // Test Case 구현 + /** + * 요구사항 1 : size() + */ + @Test + void size_test() { + // given + + // when + int result = numbers.size(); + + // then + assertThat(result).isEqualTo(3); + } + /** + * 요구사항 2 : contains() + */ + @ParameterizedTest + @ValueSource(ints = {1, 2, 3}) + void contains_test(int input) { + // given + // when + // then + assertThat(numbers.contains(input)).isTrue(); + } + /** + * 요구사항 3 : contains() + */ + @ParameterizedTest + @CsvSource(value = {"1:true", "2:true", "3:true", "4:false", "5:false"}, delimiter = ':') + void contains_test(int input, boolean result) { + // given + // when + // then + assertThat(numbers.contains(input)).isEqualTo(result); + } +} From 80665e5a3c446781dee6f25d118ad9b9e9c205aa Mon Sep 17 00:00:00 2001 From: qwe5507 Date: Sun, 7 May 2023 19:35:13 +0900 Subject: [PATCH 3/5] =?UTF-8?q?=EB=AC=B8=EC=9E=90=EC=97=B4=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=EA=B8=B0=20=EA=B5=AC=ED=98=84=201=EC=B0=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 14 ++++++++++ src/main/java/Operator.java | 33 ++++++++++++++++++++++++ src/main/java/StringCalc.java | 43 +++++++++++++++++++++++++++++++ src/test/java/StringCalcTest.java | 5 ++++ 4 files changed, 95 insertions(+) create mode 100644 src/main/java/Main.java create mode 100644 src/main/java/Operator.java create mode 100644 src/main/java/StringCalc.java create mode 100644 src/test/java/StringCalcTest.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 000000000..96f2ae142 --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,14 @@ +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + StringCalc stringCalc = new StringCalc(); + Scanner scanner = new Scanner(System.in); + + System.out.println("정수를 입력해주세요: "); + + int calcNumber = stringCalc.calc(scanner.nextLine()); + + System.out.println(String.format("연산된 값은 %d입니다.", calcNumber)); + } +} diff --git a/src/main/java/Operator.java b/src/main/java/Operator.java new file mode 100644 index 000000000..f4c4ad376 --- /dev/null +++ b/src/main/java/Operator.java @@ -0,0 +1,33 @@ +import java.util.*; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public enum Operator { + PLUS("+", (first, second) -> first + second), + MINUS("-", (first, second) -> first - second), + MULTIPLY("*", (first, second) -> first * second), + DIVIDE("/", (first, second) -> first / second); + + private String symbol; + private BiFunction operation; + + Operator(String symbol, BiFunction operation){ + this.symbol = symbol; + this.operation = operation; + } + + public String getSymbol() { + return symbol; + } + + public int operate(int first, int second){ + return operation.apply(first, second); + } + + private static final Map operatorMap = + Collections.unmodifiableMap(Stream.of(values()) + .collect(Collectors.toMap(Operator::getSymbol, Function.identity()))); + +} diff --git a/src/main/java/StringCalc.java b/src/main/java/StringCalc.java new file mode 100644 index 000000000..32a82411a --- /dev/null +++ b/src/main/java/StringCalc.java @@ -0,0 +1,43 @@ +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.regex.Pattern; + +public class StringCalc { + static final String NUMBER_REGEXP = "^[0-9]*$"; + public int calc(String calcString) { + String[] values = calcString.split(" "); + + int sum = Integer.valueOf(values[0]); + String symbol = "+"; + for (int i = 1; i < values.length; i++) { + + + if(Pattern.matches(NUMBER_REGEXP, values[i])){ + + } +// if (symbolMap.contains(values[i])) { +// symbol = values[i]; +// continue; +// } + + int targetNumber = Integer.valueOf(values[i]); + switch (symbol) { + case "+": + sum = sum + targetNumber; + break; + case "-": + sum = sum - targetNumber; + break; + case "*": + sum = sum * targetNumber; + break; + case "/": + sum = sum / targetNumber; + break; + } + + } + return sum; + } +} diff --git a/src/test/java/StringCalcTest.java b/src/test/java/StringCalcTest.java new file mode 100644 index 000000000..313e29411 --- /dev/null +++ b/src/test/java/StringCalcTest.java @@ -0,0 +1,5 @@ +import static org.junit.jupiter.api.Assertions.*; + +class StringCalcTest { + +} \ No newline at end of file From 04e5b2b198cb2c4f238cfba11dcf3a4a8bae457d Mon Sep 17 00:00:00 2001 From: qwe5507 Date: Sun, 7 May 2023 23:05:13 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=EB=AC=B8=EC=9E=90=EC=97=B4=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=EA=B8=B0=20=EA=B5=AC=ED=98=84=202=EC=B0=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 리뷰어 블로그 참고하여 내가 구현한 코드에도 적용 --- src/main/java/Formula.java | 14 +++++++++++ src/main/java/Main.java | 5 ++-- src/main/java/Operator.java | 37 +++++++++++++++++++---------- src/main/java/StringCalc.java | 44 +++++++++++------------------------ 4 files changed, 56 insertions(+), 44 deletions(-) create mode 100644 src/main/java/Formula.java diff --git a/src/main/java/Formula.java b/src/main/java/Formula.java new file mode 100644 index 000000000..eeaa5476d --- /dev/null +++ b/src/main/java/Formula.java @@ -0,0 +1,14 @@ +public class Formula { + private static final String FORMULA_DELIMITER = " "; + private final String[] formula; + + public Formula(String formula) { + this.formula = formula.split(FORMULA_DELIMITER); + } + + public String[] getFormula() { + return formula; + } +} + + diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 96f2ae142..db45f966d 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,13 +1,14 @@ import java.util.Scanner; public class Main { + public static void main(String[] args) { - StringCalc stringCalc = new StringCalc(); Scanner scanner = new Scanner(System.in); System.out.println("정수를 입력해주세요: "); + StringCalc stringCalc = new StringCalc(new Formula(scanner.nextLine())); - int calcNumber = stringCalc.calc(scanner.nextLine()); + int calcNumber = stringCalc.calc(); System.out.println(String.format("연산된 값은 %d입니다.", calcNumber)); } diff --git a/src/main/java/Operator.java b/src/main/java/Operator.java index f4c4ad376..ea21a1f03 100644 --- a/src/main/java/Operator.java +++ b/src/main/java/Operator.java @@ -1,6 +1,6 @@ -import java.util.*; +import java.util.Collections; +import java.util.Map; import java.util.function.BiFunction; -import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -8,26 +8,39 @@ public enum Operator { PLUS("+", (first, second) -> first + second), MINUS("-", (first, second) -> first - second), MULTIPLY("*", (first, second) -> first * second), - DIVIDE("/", (first, second) -> first / second); + DIVIDE("/", (first, second) -> { + if (second == 0) { + throw new IllegalArgumentException(); + } + return first / second; + }); - private String symbol; - private BiFunction operation; + private static final Map OPERATOR_MAP = + Collections.unmodifiableMap(Stream.of(values()) + .collect(Collectors.toMap(operator -> operator.getSymbol(), operator -> operator))); + private final String symbol; + private final BiFunction operation; - Operator(String symbol, BiFunction operation){ + Operator(String symbol, BiFunction operation) { this.symbol = symbol; this.operation = operation; } + public static Operator findOperator(String symbol) { + Operator operator = OPERATOR_MAP.get(symbol); + + if (operator == null) { + throw new IllegalArgumentException(); + } + + return operator; + } + public String getSymbol() { return symbol; } - public int operate(int first, int second){ + public int operate(int first, int second) { return operation.apply(first, second); } - - private static final Map operatorMap = - Collections.unmodifiableMap(Stream.of(values()) - .collect(Collectors.toMap(Operator::getSymbol, Function.identity()))); - } diff --git a/src/main/java/StringCalc.java b/src/main/java/StringCalc.java index 32a82411a..0abd8f925 100644 --- a/src/main/java/StringCalc.java +++ b/src/main/java/StringCalc.java @@ -1,43 +1,27 @@ -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; import java.util.regex.Pattern; public class StringCalc { - static final String NUMBER_REGEXP = "^[0-9]*$"; - public int calc(String calcString) { - String[] values = calcString.split(" "); - - int sum = Integer.valueOf(values[0]); - String symbol = "+"; - for (int i = 1; i < values.length; i++) { + private static final Pattern NUMBER_REGEXP = Pattern.compile("^[0-9]*$"); + private Formula formula; + public StringCalc(Formula formula) { + this.formula = formula; + } - if(Pattern.matches(NUMBER_REGEXP, values[i])){ + public int calc() { - } -// if (symbolMap.contains(values[i])) { -// symbol = values[i]; -// continue; -// } + int sum = 0; + Operator currentOperator = Operator.PLUS; - int targetNumber = Integer.valueOf(values[i]); - switch (symbol) { - case "+": - sum = sum + targetNumber; - break; - case "-": - sum = sum - targetNumber; - break; - case "*": - sum = sum * targetNumber; - break; - case "/": - sum = sum / targetNumber; - break; + for (String input : formula.getFormula()) { + if (NUMBER_REGEXP.matcher(input).find()) { + sum = currentOperator.operate(sum, Integer.valueOf(input)); + continue; } + currentOperator = Operator.findOperator(input); } + return sum; } } From 97389c1bd9e4e8acec55f662ca9213490f4d4f64 Mon Sep 17 00:00:00 2001 From: qwe5507 Date: Sun, 28 May 2023 23:03:49 +0900 Subject: [PATCH 5/5] =?UTF-8?q?=EB=AC=B8=EC=9E=90=EC=97=B4=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=EA=B8=B0=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/CalculatorTest.java | 42 ++++++++++++++++++++++++++++++ src/test/java/OperatorTest.java | 43 +++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 src/test/java/CalculatorTest.java create mode 100644 src/test/java/OperatorTest.java diff --git a/src/test/java/CalculatorTest.java b/src/test/java/CalculatorTest.java new file mode 100644 index 000000000..a715dbd38 --- /dev/null +++ b/src/test/java/CalculatorTest.java @@ -0,0 +1,42 @@ +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.*; + +public class CalculatorTest { + + @DisplayName("정상 입력시 의도대로 계산된 값이 나오는지 테스트") + @Test + void calculateTest(){ + StringCalc calculator = new StringCalc(new Formula("5 + 5 * 5 / 25")); + int result = calculator.calc(); + assertThat(2).isEqualTo(result); + } + + @DisplayName("0 으로 나눌 시 IllegalArgumentException 발생 하는지 테스트") + @Test + void divideZeroTest(){ + assertThatIllegalArgumentException().isThrownBy(() -> { + StringCalc calculator = new StringCalc(new Formula("2 + 2 * 10 / 0")); + int result = calculator.calc(); + assertThat(2).isEqualTo(result); + }); + } + + @DisplayName("입력 값이 null 이거나 빈 공백 문자일 경우 IllegalArgumentException 발생 하는지 테스트") + @Test + void inputNullOrEmptyTest(){ + assertThatIllegalArgumentException().isThrownBy(() -> { + StringCalc calculator = new StringCalc(new Formula("2 + * 2 / 2")); + int result = calculator.calc(); + }); + } + + @DisplayName("사칙연산 기호가 아닌 경우 IllegalArgumentException throw") + @Test + void checkPermittedOperator(){ + assertThatIllegalArgumentException().isThrownBy(() -> { + StringCalc calculator = new StringCalc(new Formula("2 $ 6 * 5 / 4")); + int result = calculator.calc(); + }); + } +} diff --git a/src/test/java/OperatorTest.java b/src/test/java/OperatorTest.java new file mode 100644 index 000000000..849b99731 --- /dev/null +++ b/src/test/java/OperatorTest.java @@ -0,0 +1,43 @@ +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; + +import static org.assertj.core.api.Assertions.*; + + +public class OperatorTest { + + @DisplayName("plus, minus, multiply, divide 테스트") + @ParameterizedTest + @CsvSource(value = {"+, 12", "-, 8", "*, 20", "/,5"}, delimiter = ',') + void operatorTest(String value, String result){ + + assertThat(Operator.findOperator(value).operate(10, 2)).isEqualTo(Integer.parseInt(result)); + + } + @Test + void operatorPlusTest(){ + int result = Operator.PLUS.operate(1,5); + assertThat(result).isEqualTo(6); + } + + @Test + void operatorMinusTest(){ + int result = Operator.MINUS.operate(5, 3); + assertThat(result).isEqualTo(2); + } + + @Test + void operatorMultiplyTest(){ + int result = Operator.MULTIPLY.operate(10, 2); + assertThat(result).isEqualTo(20); + } + + @Test + void operatorDivideTest(){ + int result = Operator.DIVIDE.operate(100, 10); + assertThat(result).isEqualTo(10); + } + +} \ No newline at end of file