-
Notifications
You must be signed in to change notification settings - Fork 71
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
1 parent
89fd340
commit 615982f
Showing
10 changed files
with
215 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
## Day 19: Loosing up dead weight. | ||
|
||
Today, you embark on the last few days of your journey. | ||
You have been warned a big storm is brewing your way but home you go. | ||
|
||
You will need to leave up extra weight and tighten up the ship | ||
for the days to come. | ||
|
||
The exercise of today deals with exception, again. | ||
|
||
You are starting to know the formula. No more exceptions. | ||
|
||
This time, the approach might be a bit different. | ||
|
||
> **Challenge of day 19: No more exception authorized - use a custom Error.** | ||
May your crafting journey continue! | ||
|
||
- <u>💡HINT:</u> What object can you return to get the error state? |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
xmlns="http://maven.apache.org/POM/4.0.0" | ||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||
<modelVersion>4.0.0</modelVersion> | ||
|
||
<parent> | ||
<groupId>com.advent-of-craft</groupId> | ||
<artifactId>advent-of-craft2023</artifactId> | ||
<version>1.0-SNAPSHOT</version> | ||
</parent> | ||
|
||
<artifactId>blog-part4</artifactId> | ||
<version>1.0-SNAPSHOT</version> | ||
<properties> | ||
<instancio-junit.version>3.0.0</instancio-junit.version> | ||
<vavr.version>0.10.4</vavr.version> | ||
</properties> | ||
|
||
<dependencies> | ||
<dependency> | ||
<groupId>org.instancio</groupId> | ||
<artifactId>instancio-junit</artifactId> | ||
<version>${instancio-junit.version}</version> | ||
<scope>test</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>io.vavr</groupId> | ||
<artifactId>vavr</artifactId> | ||
<version>${vavr.version}</version> | ||
</dependency> | ||
</dependencies> | ||
</project> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
package blog; | ||
|
||
import io.vavr.collection.Seq; | ||
|
||
import java.time.LocalDate; | ||
|
||
import static io.vavr.collection.List.of; | ||
|
||
public class Article { | ||
private final String name; | ||
private final String content; | ||
private final Seq<Comment> comments; | ||
|
||
public Article(String name, String content) { | ||
this(name, content, of()); | ||
} | ||
|
||
private Article(String name, String content, Seq<Comment> comments) { | ||
this.name = name; | ||
this.content = content; | ||
this.comments = comments; | ||
} | ||
|
||
private Article addComment( | ||
String text, | ||
String author, | ||
LocalDate creationDate) throws CommentAlreadyExistException { | ||
var comment = new Comment(text, author, creationDate); | ||
|
||
if (comments.contains(comment)) { | ||
throw new CommentAlreadyExistException(); | ||
} | ||
return new Article(name, content, comments.append(comment)); | ||
} | ||
|
||
public Article addComment(String text, String author) { | ||
return addComment(text, author, LocalDate.now()); | ||
} | ||
|
||
public Seq<Comment> getComments() { | ||
return comments; | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
package blog; | ||
|
||
import java.time.LocalDate; | ||
|
||
public record Comment(String text, String author, LocalDate creationDate) { | ||
} |
4 changes: 4 additions & 0 deletions
4
exercise/day19/src/main/java/blog/CommentAlreadyExistException.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
package blog; | ||
|
||
public class CommentAlreadyExistException extends RuntimeException { | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
package blog; | ||
|
||
import java.util.HashMap; | ||
|
||
import static org.instancio.Instancio.create; | ||
|
||
public class ArticleBuilder { | ||
public static final String AUTHOR = "Pablo Escobar"; | ||
public static final String COMMENT_TEXT = "Amazing article !!!"; | ||
private final HashMap<String, String> comments; | ||
|
||
public ArticleBuilder() { | ||
comments = new HashMap<>(); | ||
} | ||
|
||
public static ArticleBuilder anArticle() { | ||
return new ArticleBuilder(); | ||
} | ||
|
||
public ArticleBuilder commented() { | ||
this.comments.put(COMMENT_TEXT, AUTHOR); | ||
return this; | ||
} | ||
|
||
public Article build() { | ||
return comments.entrySet() | ||
.stream() | ||
.reduce(new Article( | ||
create(String.class), | ||
create(String.class) | ||
), (a, e) -> a.addComment(e.getKey(), e.getValue()), (p, n) -> p); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
package blog; | ||
|
||
import org.assertj.core.api.ThrowingConsumer; | ||
import org.junit.jupiter.api.Nested; | ||
import org.junit.jupiter.api.Test; | ||
|
||
import java.util.function.Function; | ||
|
||
import static blog.ArticleBuilder.*; | ||
import static org.assertj.core.api.Assertions.assertThat; | ||
import static org.assertj.core.api.Assertions.assertThatThrownBy; | ||
import static org.instancio.Instancio.create; | ||
|
||
class ArticleTests { | ||
private Article article; | ||
|
||
@Test | ||
void should_add_comment_in_an_article() { | ||
when(article -> article.addComment(COMMENT_TEXT, AUTHOR)); | ||
then(article -> { | ||
assertThat(article.getComments()).hasSize(1); | ||
assertComment(article.getComments().get(0), COMMENT_TEXT, AUTHOR); | ||
}); | ||
} | ||
|
||
@Test | ||
void should_add_comment_in_an_article_containing_already_a_comment() { | ||
final var newComment = create(String.class); | ||
final var newAuthor = create(String.class); | ||
|
||
when(ArticleBuilder::commented, article -> article.addComment(newComment, newAuthor)); | ||
then(article -> { | ||
assertThat(article.getComments()).hasSize(2); | ||
assertComment(article.getComments().last(), newComment, newAuthor); | ||
}); | ||
} | ||
|
||
private static void assertComment(Comment comment, String commentText, String author) { | ||
assertThat(comment.text()).isEqualTo(commentText); | ||
assertThat(comment.author()).isEqualTo(author); | ||
} | ||
|
||
private void when(ArticleBuilder articleBuilder, Function<Article, Article> act) throws CommentAlreadyExistException { | ||
article = act.apply( | ||
articleBuilder.build() | ||
); | ||
} | ||
|
||
private void when(Function<Article, Article> act) { | ||
when(anArticle(), act); | ||
} | ||
|
||
private void when(Function<ArticleBuilder, ArticleBuilder> options, Function<Article, Article> act) { | ||
when(options.apply(anArticle()), act); | ||
} | ||
|
||
private void then(ThrowingConsumer<Article> act) { | ||
act.accept(article); | ||
} | ||
|
||
@Nested | ||
class Fail { | ||
@Test | ||
void when__adding_an_existing_comment() { | ||
var article = anArticle() | ||
.commented() | ||
.build(); | ||
|
||
assertThatThrownBy(() -> { | ||
article.addComment(article.getComments().get(0).text(), article.getComments().get(0).author()); | ||
}).isInstanceOf(CommentAlreadyExistException.class); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters