diff --git a/frontend/index.html b/frontend/index.html index c84ca3c..7ca2f9e 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -10,31 +10,43 @@ <article class="container align-content-center"> <div class="row"> <div class="col-md-2 m-2 p-0"> - <select class="form-control" id="operation"> - <option value="doExp" selected>Возведение в квадрат</option> - <option value="doSin">Вычисление синуса</option> - <option value="doAbs">Модуль числа</option> - <option value="doRand">Случайное число</option> + <select class="form-control" id="type"> + <option value="int" selected>Числа</option> + <option value="str">Строки</option> </select> </div> <div class="col-md-2 m-2 p-0"> - <input type="number" class="form-control" id="num"> + <select class="form-control" id="calc"> + <option value="sum" selected>Сумма</option> + <option value="sub">Вычитание</option> + <option value="mult">Умножение</option> + <option value="div">Деление</option> + </select> + </div> + <div class="col-md-2 m-2 p-0"> + <input type="text" class="form-control" id="item1"> + </div> + <div class="col-md-2 m-2 p-0"> + <input type="text" class="form-control" id="item2"> </div> <div class="col-md-3 m-2 p-0"> - <button type="button" class="form-control btn btn-info" onclick="manipulation()">Вывести результат</button> - </div> - <div class="col-md-2 m-2 p-0 align-middle"> - <p class="h4" id="result"></p> + <button type="button" class="form-control btn btn-info" onclick="calculator()">Вывести результат</button> </div> </div> + <div class="col-md-5 m-2 p-0 align-middle"> + <p class="h4" id="result"></p> + </div> </article> -<script> - async function manipulation() { - const num = document.getElementById("num").value - const oper = document.getElementById("operation").value - var url = `http://127.0.0.1:8080/${oper}?val=${num}` +<script> + async function calculator() { + const calc = document.getElementById("calc").value + const item1 = document.getElementById("item1").value + const item2 = document.getElementById("item2").value + const type = document.getElementById("type").value + + var url = `http://127.0.0.1:8080/${calc}?item1=${item1}&item2=${item2}&type=${type}` const responce = await fetch(url) const resout = await responce.text() diff --git a/src/main/java/com/labs/LabWork/Calculator/Configuration/CalculatorConfiguration.java b/src/main/java/com/labs/LabWork/Calculator/Configuration/CalculatorConfiguration.java new file mode 100644 index 0000000..cfdb6cb --- /dev/null +++ b/src/main/java/com/labs/LabWork/Calculator/Configuration/CalculatorConfiguration.java @@ -0,0 +1,21 @@ +package com.labs.LabWork.Calculator.Configuration; + +import com.labs.LabWork.Calculator.Domain.IntCalculator; +import com.labs.LabWork.Calculator.Domain.StringCalculator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; + +public class CalculatorConfiguration { + private final Logger log = LoggerFactory.getLogger(CalculatorConfiguration.class); + + @Bean(value="int") + public IntCalculator createIntCalculator(){ + return new IntCalculator(); + } + + @Bean(value="string") + public StringCalculator createStringCalculator(){ + return new StringCalculator(); + } +} diff --git a/src/main/java/com/labs/LabWork/Calculator/Controller/CalculatorController.java b/src/main/java/com/labs/LabWork/Calculator/Controller/CalculatorController.java new file mode 100644 index 0000000..05fea69 --- /dev/null +++ b/src/main/java/com/labs/LabWork/Calculator/Controller/CalculatorController.java @@ -0,0 +1,40 @@ +package com.labs.LabWork.Calculator.Controller; +import com.labs.LabWork.Calculator.Service.CalculatorService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +public class CalculatorController { + private final CalculatorService calculatorService; + + public CalculatorController(CalculatorService calculatorService) { + this.calculatorService = calculatorService; + } + + @GetMapping("/sum") + public Object sum(@RequestParam(value = "item1", defaultValue = "null objects") Object item1, + @RequestParam(value = "item2", defaultValue = "provided") Object item2, + @RequestParam(value = "type", defaultValue = "string") String type){ + return calculatorService.sum(item1, item2, type); + } + + @GetMapping("/sub") + public Object sub(@RequestParam(value = "item1", defaultValue = "null objects") Object item1, + @RequestParam(value = "item2", defaultValue = "provided") Object item2, + @RequestParam(value = "type", defaultValue = "string") String type){ + return calculatorService.subtraction(item1, item2, type); + } + + @GetMapping("/mult") + public Object mult(@RequestParam(value = "item1", defaultValue = "null objects") Object item1, + @RequestParam(value = "item2", defaultValue = "provided") Object item2, + @RequestParam(value = "type", defaultValue = "string") String type){ + return calculatorService.multiplication(item1, item2, type); + } + + @GetMapping("/div") + public Object div(@RequestParam(value = "item1", defaultValue = "null objects") Object item1, + @RequestParam(value = "item2", defaultValue = "provided") Object item2, + @RequestParam(value = "type", defaultValue = "string") String type){ + return calculatorService.division(item1, item2, type); + } +} diff --git a/src/main/java/com/labs/LabWork/Calculator/Domain/ICalculator.java b/src/main/java/com/labs/LabWork/Calculator/Domain/ICalculator.java new file mode 100644 index 0000000..6bbda73 --- /dev/null +++ b/src/main/java/com/labs/LabWork/Calculator/Domain/ICalculator.java @@ -0,0 +1,8 @@ +package com.labs.LabWork.Calculator.Domain; + +public interface ICalculator<T> { + T sum(T item1, T item2); + T subtraction(T item1, T item2); + T multiplication(T item1, T item2); + T division(T item1, T item2); +} \ No newline at end of file diff --git a/src/main/java/com/labs/LabWork/Calculator/Domain/IntCalculator.java b/src/main/java/com/labs/LabWork/Calculator/Domain/IntCalculator.java new file mode 100644 index 0000000..4ec36ff --- /dev/null +++ b/src/main/java/com/labs/LabWork/Calculator/Domain/IntCalculator.java @@ -0,0 +1,31 @@ +package com.labs.LabWork.Calculator.Domain; + +import org.springframework.stereotype.Component; + +@Component(value = "int") +public class IntCalculator implements ICalculator<Integer>{ + @Override + public Integer sum(Integer num1, Integer num2) { + return num1 + num2; + } + + @Override + public Integer subtraction(Integer num1, Integer num2) { + return num1 - num2; + } + + @Override + public Integer multiplication(Integer num1, Integer num2) { + return num1*num2; + } + + @Override + public Integer division(Integer num1, Integer num2) { + try { + return num1 / num2; + } + catch (ArithmeticException ex){ + return 0; + } + } +} diff --git a/src/main/java/com/labs/LabWork/Calculator/Domain/StringCalculator.java b/src/main/java/com/labs/LabWork/Calculator/Domain/StringCalculator.java new file mode 100644 index 0000000..03f92e7 --- /dev/null +++ b/src/main/java/com/labs/LabWork/Calculator/Domain/StringCalculator.java @@ -0,0 +1,55 @@ +package com.labs.LabWork.Calculator.Domain; + +public class StringCalculator implements ICalculator<String> { + @Override + public String sum(String s1, String s2) { + return s1 + s2; + } + + @Override + public String subtraction(String s1, String s2) { + String res = ""; + for (char c : s1.toCharArray()){ + boolean foundInOther = false; + for (int i = 0; i < s2.length(); i++){ + if (c == s2.charAt(i)) { + foundInOther = true; + break; + } + } + if (!foundInOther) res += c; + } + return res; + } + + @Override + public String multiplication(String s1, String s2) { + String res = ""; + for (char c : s1.toCharArray()){ + boolean foundInOther = false; + for (int i = 0; i < s2.length(); i++){ + if (c == s2.charAt(i)) { + foundInOther = true; + break; + } + } + if (foundInOther) res += c; + } + return res; + } + + @Override + public String division(String s1, String s2) { + StringBuilder res = new StringBuilder(); + int maxLength = Integer.max(s1.length(), s2.length()); + for (int i = 0; i < maxLength; i++){ + if (i < s1.length()){ + res.append(s1.charAt(i)); + } + if (i < s2.length()){ + res.append(s2.charAt(i)); + } + } + return res.toString(); + } +} diff --git a/src/main/java/com/labs/LabWork/Calculator/Service/CalculatorService.java b/src/main/java/com/labs/LabWork/Calculator/Service/CalculatorService.java new file mode 100644 index 0000000..f5fcd6e --- /dev/null +++ b/src/main/java/com/labs/LabWork/Calculator/Service/CalculatorService.java @@ -0,0 +1,34 @@ +package com.labs.LabWork.Calculator.Service; + +import com.labs.LabWork.Calculator.Domain.ICalculator; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Service; + +@Service +public class CalculatorService { + private final ApplicationContext applicationContext; + public CalculatorService(ApplicationContext applicationContext){ + this.applicationContext = applicationContext; + } + + public Object sum(Object item1, Object item2, String type){ + final ICalculator calculator = (ICalculator) applicationContext.getBean(type); + if (type.startsWith("int")) return calculator.sum(Integer.parseInt(item1.toString()), Integer.parseInt(item2.toString())); + return calculator.sum(item1, item2); + } + public Object subtraction(Object item1, Object item2, String type){ + final ICalculator calculator = (ICalculator) applicationContext.getBean(type); + if (type.startsWith("int")) return calculator.subtraction(Integer.parseInt(item1.toString()), Integer.parseInt(item2.toString())); + return calculator.subtraction(item1, item2); + } + public Object multiplication(Object item1, Object item2, String type){ + final ICalculator calculator = (ICalculator) applicationContext.getBean(type); + if (type.startsWith("int")) return calculator.multiplication(Integer.parseInt(item1.toString()), Integer.parseInt(item2.toString())); + return calculator.multiplication(item1, item2); + } + public Object division(Object item1, Object item2, String type){ + final ICalculator calculator = (ICalculator) applicationContext.getBean(type); + if (type.startsWith("int")) return calculator.division(Integer.parseInt(item1.toString()), Integer.parseInt(item2.toString())); + return calculator.subtraction(item1, item2); + } +} \ No newline at end of file diff --git a/src/test/java/com/labs/LabWork/LabWorkApplicationTests.java b/src/test/java/com/labs/LabWork/LabWorkApplicationTests.java index f41b59b..74c058f 100644 --- a/src/test/java/com/labs/LabWork/LabWorkApplicationTests.java +++ b/src/test/java/com/labs/LabWork/LabWorkApplicationTests.java @@ -1,13 +1,73 @@ package com.labs.LabWork; +import com.labs.LabWork.Calculator.Service.CalculatorService; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class LabWorkApplicationTests { + @Autowired + CalculatorService calculatorService; + @Test - void contextLoads() { + void testIntegerSum() { + final Object res = calculatorService.sum(5, 2, "int"); + Assertions.assertEquals("7", res.toString()); + } + @Test + void testIntegerSub() { + final Object res = calculatorService.subtraction(4, 2, "int"); + Assertions.assertEquals("2", res.toString()); + } + + @Test + void testIntegerMult() { + final Object res = calculatorService.multiplication(10, 3, "int"); + Assertions.assertEquals("30", res.toString()); + } + @Test + void testIntegerDiv() { + final Object res = calculatorService.division(4, 2, "int"); + Assertions.assertEquals("2", res.toString()); + } + + @Test + void testIntegerDivBy0() { + final Object res = calculatorService.division(4, 0, "int"); + Assertions.assertEquals("0", res.toString()); + } + + @Test + void testStringSum(){ + final Object res = calculatorService.sum("2", "2", "string"); + Assertions.assertEquals("22", res.toString()); + } + + @Test + void testStringSub(){ + final Object res = calculatorService.subtraction("53", "3", "string"); + Assertions.assertEquals("5", res.toString()); + } + + @Test + void testStringMult(){ + final Object res = calculatorService.multiplication("523", "215", "string"); + Assertions.assertEquals("52", res.toString()); + } + + @Test + void testStringDiv(){ + final Object res = calculatorService.division("15", "24", "string"); + Assertions.assertEquals("1245", res.toString()); + } + + @Test + void testSpeakerErrorWiredInt() { + Assertions.assertThrows(NoSuchBeanDefinitionException.class, () -> calculatorService.sum("1", "1", "integer")); } }