Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 92 additions & 0 deletions logs/hippodrome.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
2023-01-23 20:26:39,509 DEBUG Horse Создание Horse, имя name, скорость 1.0
2023-01-23 20:26:39,666 DEBUG Horse Создание Horse, имя name, скорость 1.0
2023-01-23 20:26:39,700 DEBUG Horse Создание Horse, имя name, скорость 1.0
2023-01-23 20:27:48,062 DEBUG Horse Создание Horse, имя name, скорость 1.0
2023-01-23 20:27:48,162 DEBUG Horse Создание Horse, имя name, скорость 1.0
2023-01-23 20:27:48,185 DEBUG Horse Создание Horse, имя name, скорость 1.0
2023-01-23 20:29:33,579 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 20:40:19,243 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 20:42:34,775 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 20:43:20,722 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 20:46:15,850 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 20:47:33,457 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 20:50:05,310 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 20:52:06,591 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 20:55:32,274 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 20:56:30,748 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 20:57:14,309 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 21:09:05,605 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 21:09:45,544 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 21:11:07,629 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 21:16:01,626 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 21:17:22,602 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 21:18:00,968 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 21:19:02,925 DEBUG Hippodrome Создание Hippodrome, лошадей 5
2023-01-23 21:32:54,628 DEBUG Hippodrome Создание Hippodrome, лошадей 5
2023-01-23 21:34:55,961 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 21:35:19,952 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 21:36:33,614 DEBUG Hippodrome Создание Hippodrome, лошадей 50
2023-01-23 21:36:33,882 ERROR Hippodrome Horses list is null
2023-01-23 21:36:33,896 DEBUG Horse Создание Horse, имя Horse, скорость 0.6335314534697963
2023-01-23 21:36:33,896 DEBUG Horse Создание Horse, имя Horse, скорость 0.43009176892586454
2023-01-23 21:36:33,896 DEBUG Horse Создание Horse, имя Horse, скорость 0.507182091009049
2023-01-23 21:36:33,896 DEBUG Horse Создание Horse, имя Horse, скорость 0.9158620498480842
2023-01-23 21:36:33,897 DEBUG Horse Создание Horse, имя Horse, скорость 0.18568932867359256
2023-01-23 21:36:33,897 DEBUG Horse Создание Horse, имя Horse, скорость 0.31965021793605297
2023-01-23 21:36:33,897 DEBUG Horse Создание Horse, имя Horse, скорость 0.52078124036609
2023-01-23 21:36:33,897 DEBUG Horse Создание Horse, имя Horse, скорость 0.9981569725941888
2023-01-23 21:36:33,897 DEBUG Horse Создание Horse, имя Horse, скорость 0.9198946243355042
2023-01-23 21:36:33,898 DEBUG Horse Создание Horse, имя Horse, скорость 0.6006654666722108
2023-01-23 21:36:33,898 DEBUG Horse Создание Horse, имя Horse, скорость 0.8631358256598722
2023-01-23 21:36:33,898 DEBUG Horse Создание Horse, имя Horse, скорость 0.9946370795427241
2023-01-23 21:36:33,898 DEBUG Horse Создание Horse, имя Horse, скорость 0.14566065528860106
2023-01-23 21:36:33,898 DEBUG Horse Создание Horse, имя Horse, скорость 0.4645926180164245
2023-01-23 21:36:33,898 DEBUG Horse Создание Horse, имя Horse, скорость 0.8281699580072763
2023-01-23 21:36:33,899 DEBUG Horse Создание Horse, имя Horse, скорость 0.06980829103182662
2023-01-23 21:36:33,899 DEBUG Horse Создание Horse, имя Horse, скорость 0.004193813526336743
2023-01-23 21:36:33,899 DEBUG Horse Создание Horse, имя Horse, скорость 0.9379561101586087
2023-01-23 21:36:33,899 DEBUG Horse Создание Horse, имя Horse, скорость 0.40006395297439123
2023-01-23 21:36:33,899 DEBUG Horse Создание Horse, имя Horse, скорость 0.4446705315787328
2023-01-23 21:36:33,899 DEBUG Horse Создание Horse, имя Horse, скорость 0.5119509013102479
2023-01-23 21:36:33,899 DEBUG Horse Создание Horse, имя Horse, скорость 0.6831245388519113
2023-01-23 21:36:33,900 DEBUG Horse Создание Horse, имя Horse, скорость 0.4540684075608016
2023-01-23 21:36:33,900 DEBUG Horse Создание Horse, имя Horse, скорость 0.36305019132695915
2023-01-23 21:36:33,900 DEBUG Horse Создание Horse, имя Horse, скорость 0.9431244490655691
2023-01-23 21:36:33,900 DEBUG Horse Создание Horse, имя Horse, скорость 0.29523972353405015
2023-01-23 21:36:33,900 DEBUG Horse Создание Horse, имя Horse, скорость 0.8763249864233851
2023-01-23 21:36:33,900 DEBUG Horse Создание Horse, имя Horse, скорость 0.915415409127704
2023-01-23 21:36:33,900 DEBUG Horse Создание Horse, имя Horse, скорость 0.7737126148077987
2023-01-23 21:36:33,901 DEBUG Horse Создание Horse, имя Horse, скорость 0.8804573488711275
2023-01-23 21:36:33,901 DEBUG Hippodrome Создание Hippodrome, лошадей 30
2023-01-23 21:36:33,912 ERROR Hippodrome Horses list is empty
2023-01-23 21:36:33,924 DEBUG Horse Создание Horse, имя Horse, скорость 0.9503494505122779
2023-01-23 21:36:33,925 DEBUG Horse Создание Horse, имя Horse, скорость 0.6303306836602167
2023-01-23 21:36:33,925 DEBUG Horse Создание Horse, имя Horse, скорость 0.6598296844232557
2023-01-23 21:36:33,925 DEBUG Horse Создание Horse, имя Horse, скорость 0.9506544904478381
2023-01-23 21:36:33,926 DEBUG Horse Создание Horse, имя Horse, скорость 0.6078338359237819
2023-01-23 21:36:33,926 DEBUG Horse Создание Horse, имя Horse, скорость 0.9937066968724008
2023-01-23 21:36:33,926 DEBUG Horse Создание Horse, имя Horse, скорость 0.17291377699724453
2023-01-23 21:36:33,927 DEBUG Horse Создание Horse, имя Horse, скорость 0.9197608569717186
2023-01-23 21:36:33,927 DEBUG Horse Создание Horse, имя Horse, скорость 0.39142348750622524
2023-01-23 21:36:33,927 DEBUG Horse Создание Horse, имя Horse, скорость 0.30600190830046115
2023-01-23 21:36:33,927 DEBUG Horse Создание Horse, имя Horse, скорость 0.26448749884138545
2023-01-23 21:36:33,928 DEBUG Horse Создание Horse, имя Horse, скорость 0.7368698996309604
2023-01-23 21:36:33,928 DEBUG Horse Создание Horse, имя Horse, скорость 0.22712554954974662
2023-01-23 21:36:33,928 DEBUG Horse Создание Horse, имя Horse, скорость 0.5375320951215063
2023-01-23 21:36:33,929 DEBUG Horse Создание Horse, имя Horse, скорость 0.6831282174689517
2023-01-23 21:36:33,929 DEBUG Horse Создание Horse, имя Horse, скорость 0.44128564494737577
2023-01-23 21:36:33,929 DEBUG Horse Создание Horse, имя Horse, скорость 0.35400514708723596
2023-01-23 21:36:33,929 DEBUG Horse Создание Horse, имя Horse, скорость 0.09204394201249877
2023-01-23 21:36:33,929 DEBUG Horse Создание Horse, имя Horse, скорость 0.8163041089517054
2023-01-23 21:36:33,930 DEBUG Horse Создание Horse, имя Horse, скорость 0.6746622436796472
2023-01-23 21:36:33,930 DEBUG Horse Создание Horse, имя Horse, скорость 0.008825241739211953
2023-01-23 21:36:33,930 DEBUG Horse Создание Horse, имя Horse, скорость 0.638709086637461
2023-01-23 21:36:33,930 DEBUG Horse Создание Horse, имя Horse, скорость 0.6797320166077224
2023-01-23 21:36:33,930 DEBUG Horse Создание Horse, имя Horse, скорость 0.43539162273187204
2023-01-23 21:36:33,930 DEBUG Horse Создание Horse, имя Horse, скорость 0.713286581894386
2023-01-23 21:36:33,930 DEBUG Horse Создание Horse, имя Horse, скорость 0.42269491110084867
2023-01-23 21:36:33,930 DEBUG Horse Создание Horse, имя Horse, скорость 0.02691366933446837
2023-01-23 21:36:33,931 DEBUG Horse Создание Horse, имя Horse, скорость 0.610396284776596
2023-01-23 21:36:33,931 DEBUG Horse Создание Horse, имя Horse, скорость 0.26152427505107523
2023-01-23 21:36:33,931 DEBUG Horse Создание Horse, имя Horse, скорость 0.7144681052093862
2023-01-23 21:36:33,931 DEBUG Hippodrome Создание Hippodrome, лошадей 30
51 changes: 50 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,56 @@
</properties>

<dependencies>

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.11.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
</dependencies>

</project>
9 changes: 8 additions & 1 deletion src/main/java/Hippodrome.java
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
Expand All @@ -6,16 +9,20 @@

public class Hippodrome {

private static final Logger logger = LoggerFactory.getLogger(Hippodrome.class);

private final List<Horse> horses;

public Hippodrome(List<Horse> horses) {
if (isNull(horses)) {
logger.error("Horses list is null");
throw new IllegalArgumentException("Horses cannot be null.");
} else if (horses.isEmpty()) {
logger.error("Horses list is empty");
throw new IllegalArgumentException("Horses cannot be empty.");
}

this.horses = horses;
logger.debug("Создание Hippodrome, лошадей {}", horses.size());
}

public List<Horse> getHorses() {
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/Horse.java
Original file line number Diff line number Diff line change
@@ -1,27 +1,37 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import static java.util.Objects.isNull;

public class Horse {

private static final Logger logger = LoggerFactory.getLogger(Horse.class);

private final String name;
private final double speed;
private double distance;

public Horse(String name, double speed, double distance) {
if (isNull(name)) {
logger.error("Name is null");
throw new IllegalArgumentException("Name cannot be null.");
} else if (name.isBlank()) {
logger.error("Name is blank");
throw new IllegalArgumentException("Name cannot be blank.");
}
if (speed < 0) {
logger.error("Speed is negative");
throw new IllegalArgumentException("Speed cannot be negative.");
}
if (distance < 0) {
logger.error("Distance is negative");
throw new IllegalArgumentException("Distance cannot be negative.");
}

this.name = name;
this.speed = speed;
this.distance = distance;
logger.debug("Создание Horse, имя {}, скорость {}", name, speed);
}

public Horse(String name, double speed) {
Expand Down
9 changes: 8 additions & 1 deletion src/main/java/Main.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;
import java.util.concurrent.TimeUnit;

public class Main {

private static final Logger logger = LoggerFactory.getLogger(Main.class);

public static void main(String[] args) throws Exception {

List<Horse> horses = List.of(
new Horse("Буцефал", 2.4),
new Horse("Туз Пик", 2.5),
Expand All @@ -14,7 +20,7 @@ public static void main(String[] args) throws Exception {
new Horse("Вишня", 3)
);
Hippodrome hippodrome = new Hippodrome(horses);

logger.info("Начало скачек. Количество участников: {}", hippodrome.getHorses().size());
for (int i = 0; i < 100; i++) {
hippodrome.move();
watch(hippodrome);
Expand All @@ -23,6 +29,7 @@ public static void main(String[] args) throws Exception {

String winnerName = hippodrome.getWinner().getName();
System.out.println("Победил " + winnerName + "!");
logger.info("Окончание скачек. Победитель: {}", winnerName);
}

private static void watch(Hippodrome hippodrome) throws Exception {
Expand Down
29 changes: 29 additions & 0 deletions src/main/resources/log4j2.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<RollingFile name="LogToRollingFile" fileName="logs/hippodrome.log"
filePattern="logs/hippodrome.%d{yyyy-MM-dd}.log">
<PatternLayout>
<Pattern>%d %p %c{1.} %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="logs/" maxDepth="1">
<IfFileName glob="*.log"/>
<IfLastModified age="P7D"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="logs/hippodrome.log" level="debug" additivity="false">
<AppenderRef ref="LogToRollingFile"/>
</Logger>
<Root level="debug">
<AppenderRef ref="LogToRollingFile"/>
</Root>
</Loggers>
</Configuration>
78 changes: 78 additions & 0 deletions src/test/java/HippodromeTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

@ExtendWith(MockitoExtension.class)
class HippodromeTest {

@Test
void hippodromeConstructorParameterIsNullShouldTrowIllegalArgumentExceptionWithMessageHorsesCannotBeNull() {
String message = "Horses cannot be null.";
Throwable exception = assertThrows(
IllegalArgumentException.class,
() -> new Hippodrome(null)
);
String expected = message;
String actual = exception.getMessage();
assertEquals(expected, actual);

}

@Test
void hippodromeConstructorParameterIsEmptyShouldTrowIllegalArgumentExceptionWithMessageHorsesCannotBeEmpty() {
String message = "Horses cannot be empty.";
Throwable exception = assertThrows(
IllegalArgumentException.class,
() -> new Hippodrome(new ArrayList<>())
);
String expected = message;
String actual = exception.getMessage();
assertEquals(expected, actual);
}

@Test
void getHorsesShouldReturnListHorsesParameterOfConstructor() {
List<Horse> horses = new ArrayList<>();
for (int i = 0; i < 30; i++) {
horses.add(new Horse(Horse.class.getName(), Math.random(), Math.random()));
}
Hippodrome hippodrome = new Hippodrome(horses);
boolean expected = horses.equals(hippodrome.getHorses());
assertTrue(expected);
}

@Test
void moveShouldToBeCalledFromAllHorses() {
List<Horse> horses = new ArrayList<>();
for (int i = 0; i < 50; i++) {
horses.add(mock(Horse.class));
}
Hippodrome hippodrome = new Hippodrome(horses);
hippodrome.move();
for (Horse hors : horses) {
verify(hors).move();
}
}

@Test
void getWinnerShouldReturnHorseWithGreatestDistance() {
List<Horse> horses = new ArrayList<>();
for (int i = 0; i < 30; i++) {
horses.add(new Horse(Horse.class.getName(), Math.random(), Math.random()));
}
Hippodrome hippodrome = new Hippodrome(horses);
double expected = horses.stream().max(Comparator.comparingDouble(Horse::getDistance)).get().getDistance();
double actual = hippodrome.getWinner().getDistance();
assertEquals(expected, actual);
}
}
Loading