Skip to content

Commit

Permalink
Add 'Mad Lib' solution
Browse files Browse the repository at this point in the history
  • Loading branch information
durimkryeziu committed Oct 7, 2024
1 parent 8df85dd commit 677afec
Show file tree
Hide file tree
Showing 6 changed files with 107 additions and 2 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Exercises for Programmers: 57 Challenges to Develop Your Coding Skills by Brian
- Exercise 1. [Saying Hello](https://github.com/durimkryeziu/exercises-for-programmers-java/tree/main/saying-hello)
- Exercise 2. [Counting the Number of Characters](https://github.com/durimkryeziu/exercises-for-programmers-java/tree/main/characters-count)
- Exercise 3. [Printing Quotes](https://github.com/durimkryeziu/exercises-for-programmers-java/tree/main/printing-quotes)
- Exercise 4. Mad Lib
- Exercise 4. [Mad Lib](https://github.com/durimkryeziu/exercises-for-programmers-java/tree/main/mad-lib)
- Exercise 5. Simple Math
- Exercise 6. Retirement Calculator

Expand Down
8 changes: 8 additions & 0 deletions mad-lib/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
plugins {
id 'com.craftsmanshipinsoftware.common-conventions'
}

dependencies {
testImplementation(libs.assertj.core)
testImplementation(libs.junit.jupiter)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.craftsmanshipinsoftware.madlib;

import java.io.InputStream;
import java.io.PrintStream;
import java.util.Objects;
import java.util.Scanner;

class MadLib {

private final InputStream inputStream;
private final PrintStream printStream;

MadLib(InputStream inputStream, PrintStream printStream) {
Objects.requireNonNull(inputStream, "inputStream cannot be null");
Objects.requireNonNull(printStream, "printStream cannot be null");
this.inputStream = inputStream;
this.printStream = printStream;
}

void printStory() {
try (Scanner scanner = new Scanner(inputStream)) {
String noun = promptForInput("Enter a noun: ", scanner);
if (noun == null) {
return;
}
String verb = promptForInput("Enter a verb: ", scanner);
if (verb == null) {
return;
}
String adjective = promptForInput("Enter an adjective: ", scanner);
if (adjective == null) {
return;
}
String adverb = promptForInput("Enter an adverb: ", scanner);
if (adverb == null) {
return;
}
this.printStream.println("Do you " + verb + " your " + adjective + " " + noun + " " + adverb + "? That's hilarious!");
}
}

@SuppressWarnings("PMD.SystemPrintln")
private String promptForInput(String prompt, Scanner scanner) {
System.out.print(prompt);
String input = readInput(scanner);
if (input == null || input.isBlank()) {
this.printStream.println("Please enter something as input!");
return null;
}
return input;
}

private String readInput(Scanner scanner) {
return scanner.hasNext() ? scanner.nextLine() : null;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.craftsmanshipinsoftware.madlib;

public class Main {

public static void main(String[] args) {
MadLib madLib = new MadLib(System.in, System.out);
madLib.printStory();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.craftsmanshipinsoftware.madlib;

import static org.assertj.core.api.Assertions.assertThat;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

class MadLibTest {

@ParameterizedTest(name = "Given input [{0}]")
@ValueSource(strings = {"", "dog", "dog\nwalk", "dog\nwalk\nblue"})
void printStory_GivenInputIsMissing_ShouldAskForMissingInput(String input) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
MadLib madLib = new MadLib(new ByteArrayInputStream(input.getBytes()), new PrintStream(outputStream));
madLib.printStory();
assertThat(outputStream).hasToString("Please enter something as input!" + System.lineSeparator());
}

@Test
void printStory_GivenAllNeededInput_ShouldPrintStory() {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
MadLib madLib = new MadLib(new ByteArrayInputStream("dog\nwalk\nblue\nquickly".getBytes()), new PrintStream(outputStream));
madLib.printStory();
assertThat(outputStream).hasToString("Do you walk your blue dog quickly? That's hilarious!" + System.lineSeparator());
}

}
2 changes: 1 addition & 1 deletion settings.gradle
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
rootProject.name = 'exercises-for-programmers-java'
include('saying-hello', 'characters-count', 'printing-quotes')
include('saying-hello', 'characters-count', 'printing-quotes', 'mad-lib')

0 comments on commit 677afec

Please sign in to comment.