diff --git a/build/reports/problems/problems-report.html b/build/reports/problems/problems-report.html
new file mode 100644
index 00000000..04ae0129
--- /dev/null
+++ b/build/reports/problems/problems-report.html
@@ -0,0 +1,663 @@
+
+
+
+
+
+
+
Package org.jointheleague.features.student.second_feature
+
+
all > org.jointheleague.features.student.second_feature
+
+
+
+
+
+
+
+|
+
+ |
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+
+ |
+
+
+ |
+
+
+
+
+
+
+
Classes
+
+
+
+| Class |
+Tests |
+Failures |
+Ignored |
+Duration |
+Success rate |
+
+
+
+|
+FeatureTwoTest
+ |
+7 |
+0 |
+0 |
+1.490s |
+100% |
+
+
+
+
+
+
+
+
diff --git a/build/test-results/test/binary/output.bin b/build/test-results/test/binary/output.bin
new file mode 100644
index 00000000..e69de29b
diff --git a/build/test-results/test/binary/output.bin.idx b/build/test-results/test/binary/output.bin.idx
new file mode 100644
index 00000000..f76dd238
Binary files /dev/null and b/build/test-results/test/binary/output.bin.idx differ
diff --git a/build/test-results/test/binary/results.bin b/build/test-results/test/binary/results.bin
new file mode 100644
index 00000000..33fc0ff8
Binary files /dev/null and b/build/test-results/test/binary/results.bin differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/DiscordBot.class.uniqueId0 b/build/tmp/compileJava/compileTransaction/stash-dir/DiscordBot.class.uniqueId0
new file mode 100644
index 00000000..36c9b7dc
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/DiscordBot.class.uniqueId0 differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/FeatureTwo.class.uniqueId1 b/build/tmp/compileJava/compileTransaction/stash-dir/FeatureTwo.class.uniqueId1
new file mode 100644
index 00000000..a9834244
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/FeatureTwo.class.uniqueId1 differ
diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin
new file mode 100644
index 00000000..9b65b7cb
Binary files /dev/null and b/build/tmp/compileJava/previous-compilation-data.bin differ
diff --git a/build/tmp/compileTestJava/compileTransaction/stash-dir/FeatureTwoTest.class.uniqueId0 b/build/tmp/compileTestJava/compileTransaction/stash-dir/FeatureTwoTest.class.uniqueId0
new file mode 100644
index 00000000..52b99b2d
Binary files /dev/null and b/build/tmp/compileTestJava/compileTransaction/stash-dir/FeatureTwoTest.class.uniqueId0 differ
diff --git a/build/tmp/compileTestJava/previous-compilation-data.bin b/build/tmp/compileTestJava/previous-compilation-data.bin
new file mode 100644
index 00000000..034f42d5
Binary files /dev/null and b/build/tmp/compileTestJava/previous-compilation-data.bin differ
diff --git a/src/main/java/org/jointheleague/discord_bot/DiscordBot.java b/src/main/java/org/jointheleague/discord_bot/DiscordBot.java
index cefb5f79..a8bbfef1 100644
--- a/src/main/java/org/jointheleague/discord_bot/DiscordBot.java
+++ b/src/main/java/org/jointheleague/discord_bot/DiscordBot.java
@@ -14,6 +14,7 @@
import org.jointheleague.features.examples.first_features.RandomNumber;
import org.jointheleague.features.help_embed.HelpListener;
import org.jointheleague.features.student.first_feature.FeatureOne;
+import org.jointheleague.features.student.second_feature.FeatureTwo;
public class DiscordBot {
@@ -61,6 +62,7 @@ public void connect(boolean printInvite) throws InterruptedException {
addFeature(new HighLowGame(channelName));
addFeature(new NewsApi(channelName));
addFeature(new CatFactsApi(channelName));
+ addFeature(new FeatureTwo(channelName));
}
private void addFeature(Feature feature){
diff --git a/src/main/java/org/jointheleague/features/student/second_feature/FeatureTwo.java b/src/main/java/org/jointheleague/features/student/second_feature/FeatureTwo.java
new file mode 100644
index 00000000..cc65c9f1
--- /dev/null
+++ b/src/main/java/org/jointheleague/features/student/second_feature/FeatureTwo.java
@@ -0,0 +1,96 @@
+package org.jointheleague.features.student.second_feature;
+
+import org.jointheleague.api_wrapper.ReceivedMessage;
+import org.jointheleague.features.abstract_classes.Feature;
+import org.jointheleague.features.help_embed.plain_old_java_objects.help_embed.HelpEmbed;
+
+import java.util.Random;
+
+public class FeatureTwo extends Feature {
+
+ public final String COMMAND = "!unscramble";
+ Random rand = new Random();
+ boolean ready = false;
+ int levelCounter=0;
+ String[] responseScramble = null;
+
+
+ public String[][] words = {
+ {"six", "cat", "dog", "two","bye","man","fan","pan","zap", "hat","log","rug","pug","wet","net", "set","fix","and"},//l1
+ {"iron","wood","tree","tent","duck","king","high","gold","game","fire","hate","inch","deck","farm","dust","flow","food","halt"},//l2
+ {"eager", "eagle","cable", "cabin", "caddy", "apple","noise", "sound","wheel","hills","boxes","threw","chart","share","worth","chord","labor"},//l3
+ {"honest", "drawer","adieu","holder","govern","liquid","lonely","evolve", "excess","doctor","singer","easily","driven","fourth","friend","casino","canyon","combat"},//l4
+ {"abandon", "advisor","allured","ironed","anxious","babysat","backlit","advance","bargain","boombox","gallery","gallons","habitat","haircut","eagerly","soundly","eardrum","factory"},//l5
+ {"capacity", "engineer","aircraft","advanced","delivery","compound","exposure","original","northern","galactic","reaction","triangle","treasury","humanity","included","facility","everyday","equation"},//l6
+ {"beginning", "household","candidate","jewellery","deduction","important","marketing","governing","practical","judgement","breathing","combating","zealously","reconquer","normalize","objectify","quadratic"},//l7
+ {"puzzlingly", "highjacked","maximizing","texturized","laboringly","racetracks","nationhood","complexity","aquaphobia"},//l8
+ };
+
+ public FeatureTwo(String channelName) {
+ super(channelName);
+
+ //Create a help embed to describe feature when !help command is sent
+ helpEmbed = new HelpEmbed(
+ COMMAND,
+ "Starts a game of unscramble. You are given a series of scrambled letters, and have to guess the unscrambled word. " +
+ "This game starts easy and gets harder. Points are tracked."+"\n Reply/Answer using the command "+COMMAND
+ );
+ }
+
+ @Override
+ public void handle(ReceivedMessage event) {
+
+ String messageContent = event.getMessageContent();
+
+ if (messageContent.startsWith(COMMAND)&&!ready) {
+ int id = rand.nextInt(words[levelCounter].length);
+ getScrambled(levelCounter, id);
+ responseScramble = getScrambled(levelCounter, id);
+ if (levelCounter == 0) {
+ event.sendResponse("Alright, lets start a game of unscramble! \n" +
+ "Unscramble the letters and reply with: \n" + COMMAND + " followed by your guess.\nLevel " + (levelCounter + 1) + ": " + responseScramble[0]);
+ } else {
+ event.sendResponse("Level " + (levelCounter + 1) + ": " + responseScramble[0]);
+ }
+ ready = true;
+ }
+ if (messageContent.startsWith(COMMAND)&&ready) {
+ if (messageContent.length() > COMMAND.length()) {
+ if (responseScramble[1].equals(messageContent.substring(COMMAND.length() + 1))) {
+ if (levelCounter != 7) {
+ event.sendResponse("Nice, You unscrambled it correctly!\nThe word was " + responseScramble[1] + "\nType " + COMMAND + " to continue!");
+ ready = false;
+ levelCounter += 1;
+ } else {
+ event.sendResponse("WOW, You've beaten the game! Congrats on unscrambling all those words! \nType !help to find more commands!");
+ ready = false;
+ levelCounter = 0;
+ }
+ } else {
+ event.sendResponse("Not quite! Try again.");
+ }
+
+ }
+ }
+ }
+
+ public String[] getScrambled(int level, int num) {
+
+ String[] scrambled = new String[2];
+ String word = words[level][num];
+ char[] arrayofChars = word.toCharArray();
+ for (int i = 0; i < word.length(); i++) {
+ char c = arrayofChars[i];
+
+ int ran = rand.nextInt(word.length());
+
+ arrayofChars[i] = arrayofChars[ran];
+ arrayofChars[ran] = c;
+
+ }
+ scrambled[0] = new String(arrayofChars);
+ scrambled[1] = word;
+ return scrambled;
+ }
+
+}
diff --git a/src/test/java/org/jointheleague/features/student/second_feature/FeatureTwoTest.java b/src/test/java/org/jointheleague/features/student/second_feature/FeatureTwoTest.java
new file mode 100644
index 00000000..20c453f6
--- /dev/null
+++ b/src/test/java/org/jointheleague/features/student/second_feature/FeatureTwoTest.java
@@ -0,0 +1,172 @@
+package org.jointheleague.features.student.second_feature;
+
+import org.jointheleague.api_wrapper.ReceivedMessage;
+import org.jointheleague.features.abstract_classes.Feature;
+import org.jointheleague.features.help_embed.plain_old_java_objects.help_embed.HelpEmbed;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.*;
+
+public class FeatureTwoTest {
+ private final String testChannelName = "testing";
+ private final FeatureTwo featureTwo = new FeatureTwo(testChannelName);
+
+ private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
+ private final PrintStream originalOut = System.out;
+
+ @Mock
+ private ReceivedMessage receivedMessage;
+
+ @BeforeEach
+ void setUp() {
+ MockitoAnnotations.openMocks(this);
+ System.setOut(new PrintStream(outContent));
+ }
+
+ @AfterEach
+ public void itShouldNotPrintToSystemOut() {
+ String expected = "";
+ String actual = outContent.toString();
+
+ assertEquals(expected, actual);
+ System.setOut(originalOut);
+ }
+
+ @Test
+ void itShouldHaveACommand() {
+ //Given
+
+ //When
+ String command = featureTwo.COMMAND;
+
+ //Then
+
+ if(!(featureTwo instanceof Feature)){
+ assertNotEquals("!command", command);
+ }
+
+ assertNotEquals("", command);
+ assertNotEquals("!", command);
+ assertNotEquals("!command", command);
+ assertEquals('!', command.charAt(0));
+ assertNotNull(command);
+ }
+
+ @Test
+ void itShouldHandleMessagesWithCommand() {
+ //Given
+ HelpEmbed helpEmbed = new HelpEmbed(featureTwo.COMMAND, "test");
+ when(receivedMessage.getMessageContent()).thenReturn(featureTwo.COMMAND);
+
+ //When
+ featureTwo.handle(receivedMessage);
+
+ //Then
+ verify(receivedMessage, times(1)).sendResponse(anyString());
+ }
+
+ @Test
+ void itShouldNotHandleMessagesWithoutCommand() {
+ //Given
+ String command = "";
+ when(receivedMessage.getMessageContent()).thenReturn(command);
+
+ //When
+ featureTwo.handle(receivedMessage);
+
+ //Then
+ verify(receivedMessage, never()).sendResponse("");
+ }
+
+ @Test
+ void itShouldHaveAHelpEmbed() {
+ //Given
+
+ //When
+ HelpEmbed actualHelpEmbed = featureTwo.getHelpEmbed();
+
+ //Then
+ assertNotNull(actualHelpEmbed);
+ }
+
+ @Test
+ void itShouldHaveTheCommandAsTheTitleOfTheHelpEmbed() {
+ //Given
+
+ //When
+ String helpEmbedTitle = featureTwo.getHelpEmbed().getTitle();
+ String command = featureTwo.COMMAND;
+
+ //Then
+ assertEquals(command, helpEmbedTitle);
+ }
+
+ @Test
+ void itShouldCheckScramble() {
+ for (int i = 0; i < 7; i++) {
+ String[] testScram = featureTwo.getScrambled(i, 1);
+ assertNotEquals(testScram[0], testScram[1]);
+ }
+ }
+
+ @Test
+ void checkLevelsAdvance() {
+ featureTwo.levelCounter = 0;
+ featureTwo.ready = false;
+ when(receivedMessage.getMessageContent()).thenReturn(featureTwo.COMMAND);
+ featureTwo.handle(receivedMessage);
+ for (int i = 0; i <= 7; i++) {
+
+
+ if (i != 7) {
+ for (int j = 0; j < featureTwo.words[i].length - 1; j++) {
+ String word = featureTwo.words[i][j];
+ when(receivedMessage.getMessageContent()).thenReturn(featureTwo.COMMAND + " " + word);
+
+ featureTwo.handle(receivedMessage);
+ if (featureTwo.responseScramble[1].equals(word)) {
+ assertEquals(i + 1, featureTwo.levelCounter);
+ } else {
+ assertNotEquals(word, featureTwo.responseScramble[1]);
+ }
+ }
+
+
+ } else {
+ for (int j = 0; j < featureTwo.words[i].length; j++) {
+ String word = featureTwo.words[i][j];
+ when(receivedMessage.getMessageContent()).thenReturn(featureTwo.COMMAND + " " + word);
+
+ featureTwo.handle(receivedMessage);
+ if (i != 7) {
+ if (featureTwo.responseScramble[1].equals(word)) {
+ assertEquals(i + 1, featureTwo.levelCounter);
+ } else {
+ assertNotEquals(word, featureTwo.responseScramble[1]);
+ }
+ } else {
+ if (featureTwo.responseScramble[1].equals(word)) {
+ assertEquals(word, featureTwo.responseScramble[1]);
+ } else {
+ assertNotEquals(word, featureTwo.responseScramble[1]);
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+
+}