Skip to content

GitLab

  • Menu
    • Projects Groups Snippets
      Help
Projects Groups Snippets
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
  • Sign in
  • P project02
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 0
    • Issues 0
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • cs2-19wi
  • project02
  • Merge requests
  • !4

Merged
Created 6 years ago by Johanna S. Karras@jkarrasDeveloper

Swapped GuesserTests and ChooserTests

  • Overview 0
  • Commits 4
  • Changes 5
  • Johanna S. Karras @jkarras added 1 commit 6 years ago

    added 1 commit

    • 058df7b3 - Fixed HangmanGame to only print win message when guessesRemaining is greater than zero.

    Compare with previous version

  • Adam Blank @blank added 3 commits 6 years ago

    added 3 commits

    • 058df7b3...b35e36b1 - 2 commits from branch master
    • 4aa80002 - Merge branch 'master' into 'jkarras2'

    Compare with previous version

  • Adam Blank @blank merged 6 years ago

    merged

  • Adam Blank @blank mentioned in commit 0830c612 6 years ago

    mentioned in commit 0830c612

  • You're only seeing other activity in the feed. To add a comment, switch to one of the following options.
Please register or sign in to reply
Compare
  • version 2
    058df7b3
    6 years ago

  • version 1
    b3c06ceb
    6 years ago

  • master (base)

and
  • latest version
    4aa80002
    4 commits, 6 years ago

  • version 2
    058df7b3
    3 commits, 6 years ago

  • version 1
    b3c06ceb
    2 commits, 6 years ago

4 files
+ 321
- 370

    Preferences

    File browser
    Compare changes
.i‎dea‎
misc‎.xml‎ +1 -1
worksp‎ace.xml‎ +46 -95
tests/edu/calte‎ch/cs2/project02‎
ChooserT‎ests.java‎ +234 -39
GuesserT‎ests.java‎ +40 -235
.idea/misc.xml
+ 1
- 1
  • View file @ b3c06ceb

  • Edit in single-file editor

  • Edit in Web IDE


Show all unchanged lines Show 20 lines
<component name="PreferredVcsStorage">
<component name="PreferredVcsStorage">
<preferredVcsName>ApexVCS</preferredVcsName>
<preferredVcsName>ApexVCS</preferredVcsName>
</component>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11.0.1" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
<output url="file://$PROJECT_DIR$/out" />
</component>
</component>
</project>
</project>
 
\ No newline at end of file
.idea/workspace.xml
+ 46
- 95
  • View file @ b3c06ceb

  • Edit in single-file editor

  • Edit in Web IDE


Show all unchanged lines Show 20 lines
<project version="4">
<project version="4">
<component name="ChangeListManager">
<component name="ChangeListManager">
<list default="true" id="241d48ef-642b-434c-8a58-a60cbd226800" name="Default Changelist" comment="">
<list default="true" id="241d48ef-642b-434c-8a58-a60cbd226800" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/.idea/vcs.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/tests/edu/caltech/cs2/project02/GuesserTests.java" beforeDir="false" afterPath="$PROJECT_DIR$/tests/edu/caltech/cs2/project02/GuesserTests.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/edu/caltech/cs2/project02/choosers/EvilHangmanChooser.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/edu/caltech/cs2/project02/choosers/EvilHangmanChooser.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/edu/caltech/cs2/project02/guessers/AIHangmanGuesser.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/edu/caltech/cs2/project02/guessers/AIHangmanGuesser.java" afterDir="false" />
</list>
</list>
<ignored path="$PROJECT_DIR$/out/" />
<ignored path="$PROJECT_DIR$/out/" />
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
Show 20 lines Show all unchanged lines Show 20 lines
<file pinned="false" current-in-tab="false">
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/tests/edu/caltech/cs2/project02/ChooserTests.java">
<entry file="file://$PROJECT_DIR$/tests/edu/caltech/cs2/project02/ChooserTests.java">
<provider selected="true" editor-type-id="text-editor">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="55">
<state relative-caret-position="90">
<caret line="10" column="21" selection-start-line="10" selection-start-column="21" selection-end-line="10" selection-end-column="21" />
<caret line="6" selection-start-line="6" selection-end-line="6" />
 
</state>
 
</provider>
 
</entry>
 
</file>
 
<file pinned="false" current-in-tab="false">
 
<entry file="file://$PROJECT_DIR$/src/edu/caltech/cs2/project02/guessers/AIHangmanGuesser.java">
 
<provider selected="true" editor-type-id="text-editor">
 
<state relative-caret-position="165">
 
<caret line="13" selection-start-line="13" selection-end-line="13" />
<folding>
<folding>
<element signature="e#1104#1105#0" expanded="true" />
<element signature="imports" expanded="true" />
<element signature="e#1189#1190#0" expanded="true" />
</folding>
</folding>
</state>
</state>
</provider>
</provider>
</entry>
</entry>
</file>
</file>
<file pinned="false" current-in-tab="true">
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/src/edu/caltech/cs2/project02/guessers/AIHangmanGuesser.java">
<entry file="file://$PROJECT_DIR$/tests/edu/caltech/cs2/project02/GuesserTests.java">
<provider selected="true" editor-type-id="text-editor">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="195">
<state relative-caret-position="241">
<caret line="13" column="12" selection-start-line="13" selection-start-column="12" selection-end-line="13" selection-end-column="12" />
<caret line="206" column="64" selection-start-line="206" selection-start-column="64" selection-end-line="206" selection-end-column="64" />
<folding>
<folding>
<element signature="imports" expanded="true" />
<element signature="imports" expanded="true" />
<element signature="e#393#394#0" expanded="true" />
<element signature="e#411#412#0" expanded="true" />
</folding>
</folding>
</state>
</state>
</provider>
</provider>
Show 20 lines Show all unchanged lines Show 20 lines
<option value="$PROJECT_DIR$/tests/data/trace5-.txt" />
<option value="$PROJECT_DIR$/tests/data/trace5-.txt" />
<option value="$PROJECT_DIR$/tests/data/trace7-.txt" />
<option value="$PROJECT_DIR$/tests/data/trace7-.txt" />
<option value="$PROJECT_DIR$/tests/data/trace3-.txt" />
<option value="$PROJECT_DIR$/tests/data/trace3-.txt" />
<option value="$PROJECT_DIR$/tests/edu/caltech/cs2/project02/GuesserTests.java" />
<option value="$PROJECT_DIR$/tests/edu/caltech/cs2/project02/ChooserTests.java" />
<option value="$PROJECT_DIR$/tests/edu/caltech/cs2/project02/ChooserTests.java" />
<option value="$PROJECT_DIR$/src/edu/caltech/cs2/project02/choosers/EvilHangmanChooser.java" />
<option value="$PROJECT_DIR$/src/edu/caltech/cs2/project02/choosers/EvilHangmanChooser.java" />
<option value="$PROJECT_DIR$/src/edu/caltech/cs2/project02/guessers/AIHangmanGuesser.java" />
<option value="$PROJECT_DIR$/src/edu/caltech/cs2/project02/guessers/AIHangmanGuesser.java" />
 
<option value="$PROJECT_DIR$/tests/edu/caltech/cs2/project02/GuesserTests.java" />
</list>
</list>
</option>
</option>
</component>
</component>
Show 20 lines Show all unchanged lines Show 20 lines
</navigator>
</navigator>
<panes>
<panes>
<pane id="PackagesPane" />
<pane id="PackagesPane" />
 
<pane id="Scope" />
<pane id="ProjectPane">
<pane id="ProjectPane">
<subPane>
<subPane>
<expand>
<expand>
<path>
<path>
<item name="project02-hangman" type="b2602c69:ProjectViewProjectNode" />
<item name="project02" type="b2602c69:ProjectViewProjectNode" />
<item name="project02-hangman" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="project02-hangman" type="b2602c69:ProjectViewProjectNode" />
<item name="project02-hangman" type="462c0819:PsiDirectoryNode" />
<item name="dictionaries" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="project02-hangman" type="b2602c69:ProjectViewProjectNode" />
<item name="project02-hangman" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="project02-hangman" type="b2602c69:ProjectViewProjectNode" />
<item name="project02-hangman" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="project02" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="project02-hangman" type="b2602c69:ProjectViewProjectNode" />
<item name="project02-hangman" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="project02" type="462c0819:PsiDirectoryNode" />
<item name="project02" type="462c0819:PsiDirectoryNode" />
<item name="choosers" type="462c0819:PsiDirectoryNode" />
</path>
</path>
<path>
<path>
<item name="project02-hangman" type="b2602c69:ProjectViewProjectNode" />
<item name="project02" type="b2602c69:ProjectViewProjectNode" />
<item name="project02-hangman" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="project02" type="462c0819:PsiDirectoryNode" />
<item name="project02" type="462c0819:PsiDirectoryNode" />
<item name="guessers" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="project02-hangman" type="b2602c69:ProjectViewProjectNode" />
<item name="project02-hangman" type="462c0819:PsiDirectoryNode" />
<item name="tests" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="project02-hangman" type="b2602c69:ProjectViewProjectNode" />
<item name="project02-hangman" type="462c0819:PsiDirectoryNode" />
<item name="tests" type="462c0819:PsiDirectoryNode" />
<item name="cs2" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="project02-hangman" type="b2602c69:ProjectViewProjectNode" />
<item name="project02-hangman" type="462c0819:PsiDirectoryNode" />
<item name="tests" type="462c0819:PsiDirectoryNode" />
<item name="tests" type="462c0819:PsiDirectoryNode" />
<item name="cs2" type="462c0819:PsiDirectoryNode" />
<item name="project02" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="project02-hangman" type="b2602c69:ProjectViewProjectNode" />
<item name="External Libraries" type="cb654da1:ExternalLibrariesNode" />
</path>
</path>
</expand>
</expand>
<select />
<select />
</subPane>
</subPane>
</pane>
</pane>
<pane id="Scope" />
<pane id="Course" />
<pane id="Course" />
</panes>
</panes>
</component>
</component>
Show 20 lines Show all unchanged lines Show 20 lines
<property name="Repository.Attach.Sources" value="false" />
<property name="Repository.Attach.Sources" value="false" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="aspect.path.notification.shown" value="true" />
<property name="aspect.path.notification.shown" value="true" />
<property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1546278838996" />
<property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1546733305518" />
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
<property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
<property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
<property name="nodejs_npm_path_reset_for_default_project" value="true" />
<property name="nodejs_npm_path_reset_for_default_project" value="true" />
Show 20 lines Show all unchanged lines Show 20 lines
<workItem from="1543693596812" duration="7275000" />
<workItem from="1543693596812" duration="7275000" />
<workItem from="1546215922673" duration="6323000" />
<workItem from="1546215922673" duration="6323000" />
<workItem from="1546233295504" duration="5341000" />
<workItem from="1546233295504" duration="5341000" />
 
<workItem from="1546732182963" duration="108000" />
</task>
</task>
<task id="LOCAL-00001" summary="Updated formatting for trace files.">
<task id="LOCAL-00001" summary="Updated formatting for trace files.">
<created>1546216813510</created>
<created>1546216813510</created>
Show 20 lines Show all unchanged lines Show 20 lines
</history-entry>
</history-entry>
</component>
</component>
<component name="TimeTrackingManager">
<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="18939000" />
<option name="totallyTimeSpent" value="19047000" />
</component>
</component>
<component name="ToolWindowManager">
<component name="ToolWindowManager">
<frame x="0" y="23" width="1440" height="877" extended-state="0" />
<frame x="0" y="0" width="1280" height="800" extended-state="0" />
<editor active="true" />
<layout>
<layout>
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.2761087" />
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.28029078" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info id="Designer" order="2" />
<window_info id="Designer" order="2" />
<window_info id="Image Layers" order="3" />
<window_info id="Image Layers" order="3" />
Show 20 lines Show all unchanged lines Show 20 lines
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry file="file://$USER_HOME$/CS2/project01/tests/edu/caltech/cs2/project01/BodyTests.java" />
<entry file="file://$PROJECT_DIR$/../CS2/project01/tests/edu/caltech/cs2/project01/BodyTests.java" />
<entry file="file://$PROJECT_DIR$/tests/edu/caltech/cs2/project02/GuesserTests.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="245">
<caret line="96" lean-forward="true" selection-start-line="96" selection-end-line="96" />
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/tests/edu/caltech/cs2/helpers/Reflection.java">
<entry file="file://$PROJECT_DIR$/tests/edu/caltech/cs2/helpers/Reflection.java">
<provider selected="true" editor-type-id="text-editor">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="166">
<state relative-caret-position="166">
Show 20 lines Show all unchanged lines Show 20 lines
</state>
</state>
</provider>
</provider>
</entry>
</entry>
<entry file="file://$PROJECT_DIR$/tests/edu/caltech/cs2/project02/ChooserTests.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="55">
<caret line="10" column="21" selection-start-line="10" selection-start-column="21" selection-end-line="10" selection-end-column="21" />
<folding>
<element signature="e#1104#1105#0" expanded="true" />
<element signature="e#1189#1190#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/edu/caltech/cs2/project02/choosers/EvilHangmanChooser.java">
<entry file="file://$PROJECT_DIR$/src/edu/caltech/cs2/project02/choosers/EvilHangmanChooser.java">
<provider selected="true" editor-type-id="text-editor">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="120">
<state relative-caret-position="120">
Show 20 lines Show all unchanged lines Show 20 lines
</state>
</state>
</provider>
</provider>
</entry>
</entry>
 
<entry file="file://$PROJECT_DIR$/tests/edu/caltech/cs2/project02/ChooserTests.java">
 
<provider selected="true" editor-type-id="text-editor">
 
<state relative-caret-position="90">
 
<caret line="6" selection-start-line="6" selection-end-line="6" />
 
</state>
 
</provider>
 
</entry>
<entry file="file://$PROJECT_DIR$/src/edu/caltech/cs2/project02/guessers/AIHangmanGuesser.java">
<entry file="file://$PROJECT_DIR$/src/edu/caltech/cs2/project02/guessers/AIHangmanGuesser.java">
<provider selected="true" editor-type-id="text-editor">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="195">
<state relative-caret-position="165">
<caret line="13" column="12" selection-start-line="13" selection-start-column="12" selection-end-line="13" selection-end-column="12" />
<caret line="13" selection-start-line="13" selection-end-line="13" />
 
<folding>
 
<element signature="imports" expanded="true" />
 
</folding>
 
</state>
 
</provider>
 
</entry>
 
<entry file="file://$PROJECT_DIR$/tests/edu/caltech/cs2/project02/GuesserTests.java">
 
<provider selected="true" editor-type-id="text-editor">
 
<state relative-caret-position="241">
 
<caret line="206" column="64" selection-start-line="206" selection-start-column="64" selection-end-line="206" selection-end-column="64" />
<folding>
<folding>
<element signature="imports" expanded="true" />
<element signature="imports" expanded="true" />
<element signature="e#393#394#0" expanded="true" />
<element signature="e#411#412#0" expanded="true" />
</folding>
</folding>
</state>
</state>
</provider>
</provider>
Show 20 lines Show all unchanged lines
tests/edu/caltech/cs2/project02/ChooserTests.java
+ 234
- 39
  • View file @ b3c06ceb

  • Edit in single-file editor

  • Edit in Web IDE

package edu.caltech.cs2.project02;
package edu.caltech.cs2.project02;
 
import edu.caltech.cs2.helpers.CaptureSystemOutput;
 
import edu.caltech.cs2.helpers.FileSource;
import edu.caltech.cs2.helpers.Inspection;
import edu.caltech.cs2.helpers.Inspection;
import edu.caltech.cs2.helpers.Reflection;
import edu.caltech.cs2.helpers.Reflection;
import edu.caltech.cs2.project02.guessers.AIHangmanGuesser;
import edu.caltech.cs2.project02.choosers.EvilHangmanChooser;
 
import edu.caltech.cs2.project02.choosers.RandomHangmanChooser;
 
import edu.caltech.cs2.project02.guessers.ConsoleHangmanGuesser;
 
import edu.caltech.cs2.project02.interfaces.IHangmanChooser;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.*;
 
import org.junit.jupiter.params.ParameterizedTest;
import java.lang.reflect.Constructor;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Method;
import java.util.List;
import java.util.*;
import java.util.Set;
import java.util.stream.IntStream;
import java.util.HashSet;
import java.util.Arrays;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;
 
@CaptureSystemOutput
public class ChooserTests {
public class ChooserTests {
private static String GUESSER_SOURCE = "src/edu/caltech/cs2/project02/guessers/AIHangmanGuesser.java";
private static String RANDOM_SOURCE = "src/edu/caltech/cs2/project02/choosers/RandomHangmanChooser.java";
 
private static String EVIL_SOURCE = "src/edu/caltech/cs2/project02/choosers/EvilHangmanChooser.java";
@Order(1)
@Order(3)
@Tag("A")
@Tag("C")
@DisplayName("Does not use or import disallowed classes")
@DisplayName("Does not use or import disallowed classes")
@Test
@Test
public void testForInvalidClasses() {
public void testForInvalidClasses() {
List<String> regexps = List.of("java.lang.reflect", "Arrays");
List<String> regexps = List.of("java.lang.reflect", "Arrays");
Inspection.assertNoImportsOf(GUESSER_SOURCE, regexps);
Inspection.assertNoImportsOf(RANDOM_SOURCE, regexps);
Inspection.assertNoUsageOf(GUESSER_SOURCE, regexps);
Inspection.assertNoUsageOf(RANDOM_SOURCE, regexps);
 
Inspection.assertNoImportsOf(EVIL_SOURCE, regexps);
 
Inspection.assertNoUsageOf(EVIL_SOURCE, regexps);
 
}
 
 
@Order(3)
 
@Tag("C")
 
@DisplayName("The overall number of fields in RandomHangmanChooser is small")
 
@Test
 
public void testSmallNumberOfFieldsRHC() {
 
Reflection.assertFieldsLessThan(RandomHangmanChooser.class, "private", 5);
 
}
 
 
@Order(3)
 
@Tag("C")
 
@DisplayName("There are no public fields in RandomHangmanChooser")
 
@Test
 
public void testNoPublicFieldsRHC() {
 
Reflection.assertNoPublicFields(RandomHangmanChooser.class);
 
}
 
 
@Order(3)
 
@Tag("C")
 
@DisplayName("Chosen word is the only final field")
 
@Test
 
public void testChosenWordFinal() {
 
Field chosenWord = Reflection.getFieldByModifiers(RandomHangmanChooser.class, "final");
 
Reflection.checkFieldModifiers(chosenWord, List.of("private", "final"));
 
assertEquals(String.class, chosenWord.getType());
}
}
@Order(1)
@Order(3)
@Tag("A")
@Tag("C")
@DisplayName("AIHangmanGuesser has no instance fields")
@DisplayName("Random is a static field")
@Test
@Test
public void testNoFields() {
public void testRandomStatic() {
Reflection.assertFieldsLessThan(AIHangmanGuesser.class, "private", 1);
Field rand = Reflection.getFieldByType(RandomHangmanChooser.class, Random.class);
 
Reflection.checkFieldModifiers(rand, List.of("private", "static"));
}
}
@Order(1)
@Tag("A")
@Order(3)
@DisplayName("Test that the dictionary is static")
@Tag("C")
 
@DisplayName("Expected constructor exceptions for RandomHangmanChooser")
@Test
@Test
public void testDictionaryModifiers() {
public void testExceptionsViolatedInRandomConstructor() {
Field dictField = Reflection.getFieldByType(AIHangmanGuesser.class, String.class);
Constructor c = Reflection.getConstructor(RandomHangmanChooser.class, int.class, int.class);
Reflection.checkFieldModifiers(dictField, List.of("private", "static"));
assertThrows(IllegalArgumentException.class, () -> Reflection.newInstance(c, -1, 3));
 
assertThrows(IllegalArgumentException.class, () -> Reflection.newInstance(c, 3, -1));
 
assertThrows(IllegalStateException.class, () -> Reflection.newInstance(c, Integer.MAX_VALUE, 3));
}
}
@Order(1)
@Order(3)
@Tag("A")
@Tag("C")
@DisplayName("Test getGuess Method in AIHangmanGuesser")
@DisplayName("Expected makeGuess() exceptions for characters that aren't lower case for RandomHangmanChooser")
@Test
@Test
public void testGetGuess() {
public void testMakeGuessExceptionsInRandom() {
Constructor c = Reflection.getConstructor(AIHangmanGuesser.class);
Constructor c = Reflection.getConstructor(RandomHangmanChooser.class, int.class, int.class);
AIHangmanGuesser instance = Reflection.newInstance(c);
RandomHangmanChooser chooser = Reflection.newInstance(c, 3, 1);
Method m = Reflection.getMethod(AIHangmanGuesser.class,"getGuess", String.class, Set.class);
Method m = Reflection.getMethod(RandomHangmanChooser.class, "makeGuess", char.class);
IntStream.range(0, 20).forEach(i -> assertThrows(IllegalArgumentException.class, () -> m.invoke(chooser, (char) ('a' - (i + 1)))));
// test character with most occurrences is chosen
IntStream.range(0, 20).forEach(i -> assertThrows(IllegalArgumentException.class, () -> m.invoke(chooser, (char) ('z' + (i + 1)))));
assertEquals('e', (char)Reflection.invoke(m,instance, "---", new HashSet<>(Arrays.asList('a'))));
assertEquals('i', (char)Reflection.invoke(m, instance, "---", new HashSet<>(Arrays.asList('a', 'e', 'o'))));
assertEquals('e', (char)Reflection.invoke(m, instance, "sc--nc-", new HashSet<>(Arrays.asList('s', 'n', 'c'))));
// test first character in alphabetical order is chosen
assertEquals('b', (char)Reflection.invoke(m, instance, "-ee", new HashSet<>(Arrays.asList('e'))));
assertEquals('a', (char)Reflection.invoke(m, instance, "-ppl-", new HashSet<>(Arrays.asList('p', 'l'))));
// test only correct letter is chosen
assertEquals('g', (char)Reflection.invoke(m, instance, "en-ineerin-", new HashSet<>(Arrays.asList('e', 'n', 'i', 'r'))));
}
}
 
 
public void runTestGame(Class<? extends IHangmanChooser> clazz, int wordLength, int wrongAnswersAllowed, String guesses) {
 
Constructor<? extends IHangmanChooser> constructor = Reflection.getConstructor(clazz, int.class, int.class);
 
HangmanGame.playGame(
 
Reflection.newInstance(constructor, wordLength, wrongAnswersAllowed),
 
new ConsoleHangmanGuesser(new Scanner(String.join("\n", guesses.split(""))))
 
);
 
}
 
 
@Order(3)
 
@Tag("C")
 
@DisplayName("Test RandomHangmanChooser Full Game")
 
@ParameterizedTest(name = "{0}")
 
@FileSource(
 
inputs = {
 
"{seed = 1337, word length = 3, max wrong guesses = 26, guesses = abcdefghijklmnopqrstuvwxyz}",
 
"{seed = 1337, word length = 3, max wrong guesses = 10, guesses = abcdefghijklmnopqrstuvwxyz}",
 
"{seed = 2, word length = 3, max wrong guesses = 10, guesses = abcdefghijklmnopqrstuvwxyz}",
 
"{seed = 44, word length = 7, max wrong guesses = 6, guesses = debats}",
 
"{seed = 6, word length = 20, max wrong guesses = 16, guesses = aeioubcdfghjklmnpqrstvwxyz}",
 
"{seed = 19, word length = 14, max wrong guesses = 1, guesses = aeiou}",
 
"{seed = 19, word length = 14, max wrong guesses = 26, guesses = abcdefghijklmnopqrstuvwxyz}",
 
"{seed = 239, word length = 9, max wrong guesses = 7, guesses = gsnreou}",
 
"{seed = 77, word length = 21, max wrong guesses = 4, guesses = iqzyx}",
 
"{seed = 1288, word length = 7, max wrong guesses = 1, guesses = negator}",
 
"{seed = 1972, word length = 5, max wrong guesses = 8, guesses = computer}",
 
"{seed = 1972, word length = 19, max wrong guesses = 3, guesses = xvcounterz}",
 
"{seed = 2019, word length = 8, max wrong guesses = 26, guesses = abcdefghijklmnopqrstuvwxyz}",
 
"{seed = 2019, word length = 8, max wrong guesses = 7, guesses = redfqin}",
 
"{seed = 2019, word length = 8, max wrong guesses = 2, guesses = redfqin}",
 
},
 
outputFiles = {
 
"trace0.txt",
 
"trace1.txt",
 
"trace2.txt",
 
"trace3.txt",
 
"trace4.txt",
 
"trace5.txt",
 
"trace6.txt",
 
"trace7.txt",
 
"trace8.txt",
 
"trace9.txt",
 
"trace10.txt",
 
"trace11.txt",
 
"trace12.txt",
 
"trace13.txt",
 
"trace14.txt",
 
}
 
)
 
public void testPlayGameWithRandomChooser(Map<String, String> arguments, String expectedOutput, CaptureSystemOutput.OutputCapture capture) {
 
// Parse arguments
 
int seed = Integer.parseInt(arguments.get("seed"));
 
int length = Integer.parseInt(arguments.get("word length"));
 
int wrongAllowed = Integer.parseInt(arguments.get("max wrong guesses"));
 
String guesses = arguments.get("guesses");
 
 
// Set Random field to correct seed
 
Field rand = Reflection.getFieldByType(RandomHangmanChooser.class, Random.class);
 
Reflection.setFieldValue(RandomHangmanChooser.class, rand.getName(), null, new Random(seed));
 
 
// Run the actual game
 
runTestGame(RandomHangmanChooser.class, length, wrongAllowed, guesses);
 
 
assertEquals(expectedOutput.replace("\r\n", "\n").strip(), capture.toString().replace("\r\n", "\n").strip());
 
}
 
 
 
@Order(2)
 
@Tag("B")
 
@DisplayName("The overall number of fields in EvilHangmanChooser is small")
 
@Test
 
public void testSmallNumberOfFieldsEHC() {
 
Reflection.assertFieldsLessThan(EvilHangmanChooser.class, "private", 5);
 
}
 
 
@Order(2)
 
@Tag("B")
 
@DisplayName("There are no public fields in EvilHangmanChooser")
 
@Test
 
public void testNoPublicFieldsEHC() {
 
Reflection.assertNoPublicFields(EvilHangmanChooser.class);
 
}
 
 
@Order(2)
 
@Tag("B")
 
@DisplayName("There is no map field in EvilHangmanChooser")
 
@Test
 
public void testNoMapField() {
 
if (Reflection.getFields(EvilHangmanChooser.class).filter(Reflection.hasType(Map.class)).findAny().isPresent()) {
 
fail("You should not be storing a map as a field! Think about if the map is used in more than one method.");
 
}
 
}
 
 
@Order(2)
 
@Tag("B")
 
@DisplayName("Expected constructor exceptions for EvilHangmanChooser")
 
@Test
 
public void testExceptionsViolatedInEvilConstructor() {
 
Constructor c = Reflection.getConstructor(EvilHangmanChooser.class, int.class, int.class);
 
assertThrows(IllegalArgumentException.class, () -> Reflection.newInstance(c, -1, 3));
 
assertThrows(IllegalArgumentException.class, () -> Reflection.newInstance(c, 3, -1));
 
assertThrows(IllegalStateException.class, () -> Reflection.newInstance(c, Integer.MAX_VALUE, 3));
 
}
 
 
@Order(2)
 
@Tag("B")
 
@DisplayName("Expected makeGuess() exceptions for characters that aren't lower case for EvilHangmanChooser")
 
@Test
 
public void testMakeGuessExceptionsInEvil() {
 
Constructor c = Reflection.getConstructor(EvilHangmanChooser.class, int.class, int.class);
 
EvilHangmanChooser chooser = Reflection.newInstance(c, 3, 1);
 
Method m = Reflection.getMethod(EvilHangmanChooser.class, "makeGuess", char.class);
 
IntStream.range(0, 20).forEach(i -> assertThrows(IllegalArgumentException.class, () -> m.invoke(chooser, (char) ('a' - (i + 1)))));
 
IntStream.range(0, 20).forEach(i -> assertThrows(IllegalArgumentException.class, () -> m.invoke(chooser, (char) ('z' + (i + 1)))));
 
}
 
 
@Order(2)
 
@Tag("B")
 
@DisplayName("Test EvilHangmanChooser Full Game")
 
@ParameterizedTest(name = "{0}")
 
@FileSource(
 
inputs = {
 
"{word length = 3, max wrong guesses = 10, guesses = abcdefghijklmnopqrstuvwxyz}",
 
"{word length = 3, max wrong guesses = 26, guesses = abcdefghijklmnopqrstuvwxyz}",
 
"{word length = 5, max wrong guesses = 26, guesses = abcdefghijklmnopqrstuvwxyz}",
 
"{word length = 5, max wrong guesses = 1, guesses = a}",
 
"{word length = 5, max wrong guesses = 10, guesses = abcdefghijklmnopqrstuvwxyz}",
 
"{word length = 15, max wrong guesses = 15, guesses = aeioubcdfghjklmnpqrstvwxyz}",
 
"{word length = 20, max wrong guesses = 15, guesses = aeioubcdfghjklmnpqrstvwxyz}",
 
"{word length = 8, max wrong guesses = 14, guesses = aeioubcdfghjklmnpqrstvwxyz}",
 
"{word length = 20, max wrong guesses = 1, guesses = u}",
 
"{word length = 7, max wrong guesses = 26, guesses = abcdefghijklmnopqrstuvwxyz}",
 
"{word length = 7, max wrong guesses = 5, guesses = tusor}",
 
"{word length = 7, max wrong guesses = 8, guesses = tusoraeiz}",
 
"{word length = 7, max wrong guesses = 7, guesses = ziearosut}",
 
"{word length = 4, max wrong guesses = 11, guesses = etaoinshrlud}",
 
"{word length = 12, max wrong guesses = 7, guesses = etaoinshrlud}",
 
},
 
outputFiles = {
 
"trace0-evil.txt",
 
"trace1-evil.txt",
 
"trace2-evil.txt",
 
"trace3-evil.txt",
 
"trace4-evil.txt",
 
"trace5-evil.txt",
 
"trace6-evil.txt",
 
"trace7-evil.txt",
 
"trace8-evil.txt",
 
"trace9-evil.txt",
 
"trace10-evil.txt",
 
"trace11-evil.txt",
 
"trace12-evil.txt",
 
"trace13-evil.txt",
 
"trace14-evil.txt",
 
}
 
)
 
public void testPlayGameWithEvilChooser(Map<String, String> arguments, String expectedOutput, CaptureSystemOutput.OutputCapture capture) {
 
// Parse arguments
 
int length = Integer.parseInt(arguments.get("word length"));
 
int wrongAllowed = Integer.parseInt(arguments.get("max wrong guesses"));
 
String guesses = arguments.get("guesses");
 
 
// Run the actual game
 
runTestGame(EvilHangmanChooser.class, length, wrongAllowed, guesses);
 
 
assertEquals(expectedOutput.replace("\r\n", "\n").strip(), capture.toString().replace("\r\n", "\n").strip());
 
}
}
}
tests/edu/caltech/cs2/project02/GuesserTests.java
+ 40
- 235
  • View file @ b3c06ceb

  • Edit in single-file editor

  • Edit in Web IDE

package edu.caltech.cs2.project02;
package edu.caltech.cs2.project02;
import edu.caltech.cs2.helpers.CaptureSystemOutput;
import edu.caltech.cs2.helpers.FileSource;
import edu.caltech.cs2.helpers.Inspection;
import edu.caltech.cs2.helpers.Inspection;
import edu.caltech.cs2.helpers.Reflection;
import edu.caltech.cs2.helpers.Reflection;
import edu.caltech.cs2.project02.choosers.EvilHangmanChooser;
import edu.caltech.cs2.project02.guessers.AIHangmanGuesser;
import edu.caltech.cs2.project02.choosers.RandomHangmanChooser;
import edu.caltech.cs2.project02.guessers.ConsoleHangmanGuesser;
import edu.caltech.cs2.project02.interfaces.IHangmanChooser;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import java.lang.reflect.Constructor;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Method;
import java.util.*;
import java.util.List;
import java.util.stream.IntStream;
import java.util.Set;
 
import java.util.HashSet;
 
import java.util.Arrays;
 
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;
@CaptureSystemOutput
public class GuesserTests {
public class GuesserTests {
private static String RANDOM_SOURCE = "src/edu/caltech/cs2/project02/choosers/RandomHangmanChooser.java";
private static String GUESSER_SOURCE = "src/edu/caltech/cs2/project02/guessers/AIHangmanGuesser.java";
private static String EVIL_SOURCE = "src/edu/caltech/cs2/project02/choosers/EvilHangmanChooser.java";
@Order(3)
@Order(1)
@Tag("C")
@Tag("A")
@DisplayName("Does not use or import disallowed classes")
@DisplayName("Does not use or import disallowed classes")
@Test
@Test
public void testForInvalidClasses() {
public void testForInvalidClasses() {
List<String> regexps = List.of("java.lang.reflect", "Arrays");
List<String> regexps = List.of("java.lang.reflect", "Arrays");
Inspection.assertNoImportsOf(RANDOM_SOURCE, regexps);
Inspection.assertNoImportsOf(GUESSER_SOURCE, regexps);
Inspection.assertNoUsageOf(RANDOM_SOURCE, regexps);
Inspection.assertNoUsageOf(GUESSER_SOURCE, regexps);
Inspection.assertNoImportsOf(EVIL_SOURCE, regexps);
Inspection.assertNoUsageOf(EVIL_SOURCE, regexps);
}
@Order(3)
@Tag("C")
@DisplayName("The overall number of fields in RandomHangmanChooser is small")
@Test
public void testSmallNumberOfFieldsRHC() {
Reflection.assertFieldsLessThan(RandomHangmanChooser.class, "private", 5);
}
@Order(3)
@Tag("C")
@DisplayName("There are no public fields in RandomHangmanChooser")
@Test
public void testNoPublicFieldsRHC() {
Reflection.assertNoPublicFields(RandomHangmanChooser.class);
}
@Order(3)
@Tag("C")
@DisplayName("Chosen word is the only final field")
@Test
public void testChosenWordFinal() {
Field chosenWord = Reflection.getFieldByModifiers(RandomHangmanChooser.class, "final");
Reflection.checkFieldModifiers(chosenWord, List.of("private", "final"));
assertEquals(String.class, chosenWord.getType());
}
}
@Order(3)
@Order(1)
@Tag("C")
@Tag("A")
@DisplayName("Random is a static field")
@DisplayName("AIHangmanGuesser has no instance fields")
@Test
@Test
public void testRandomStatic() {
public void testNoFields() {
Field rand = Reflection.getFieldByType(RandomHangmanChooser.class, Random.class);
Reflection.assertFieldsLessThan(AIHangmanGuesser.class, "private", 1);
Reflection.checkFieldModifiers(rand, List.of("private", "static"));
}
}
 
@Order(1)
@Order(3)
@Tag("A")
@Tag("C")
@DisplayName("Test that the dictionary is static")
@DisplayName("Expected constructor exceptions for RandomHangmanChooser")
@Test
@Test
public void testExceptionsViolatedInRandomConstructor() {
public void testDictionaryModifiers() {
Constructor c = Reflection.getConstructor(RandomHangmanChooser.class, int.class, int.class);
Field dictField = Reflection.getFieldByType(AIHangmanGuesser.class, String.class);
assertThrows(IllegalArgumentException.class, () -> Reflection.newInstance(c, -1, 3));
Reflection.checkFieldModifiers(dictField, List.of("private", "static"));
assertThrows(IllegalArgumentException.class, () -> Reflection.newInstance(c, 3, -1));
assertThrows(IllegalStateException.class, () -> Reflection.newInstance(c, Integer.MAX_VALUE, 3));
}
}
@Order(3)
@Order(1)
@Tag("C")
@Tag("A")
@DisplayName("Expected makeGuess() exceptions for characters that aren't lower case for RandomHangmanChooser")
@DisplayName("Test getGuess Method in AIHangmanGuesser")
@Test
@Test
public void testMakeGuessExceptionsInRandom() {
public void testGetGuess() {
Constructor c = Reflection.getConstructor(RandomHangmanChooser.class, int.class, int.class);
Constructor c = Reflection.getConstructor(AIHangmanGuesser.class);
RandomHangmanChooser chooser = Reflection.newInstance(c, 1, 1);
AIHangmanGuesser instance = Reflection.newInstance(c);
Method m = Reflection.getMethod(RandomHangmanChooser.class, "makeGuess", char.class);
Method m = Reflection.getMethod(AIHangmanGuesser.class,"getGuess", String.class, Set.class);
IntStream.range(0, 20).forEach(i -> assertThrows(IllegalArgumentException.class, () -> m.invoke(chooser, (char) ('a' - (i + 1)))));
IntStream.range(0, 20).forEach(i -> assertThrows(IllegalArgumentException.class, () -> m.invoke(chooser, (char) ('z' + (i + 1)))));
// test character with most occurrences is chosen
 
assertEquals('e', (char)Reflection.invoke(m,instance, "---", new HashSet<>(Arrays.asList('a'))));
 
assertEquals('i', (char)Reflection.invoke(m, instance, "---", new HashSet<>(Arrays.asList('a', 'e', 'o'))));
 
assertEquals('e', (char)Reflection.invoke(m, instance, "sc--nc-", new HashSet<>(Arrays.asList('s', 'n', 'c'))));
 
// test first character in alphabetical order is chosen
 
assertEquals('b', (char)Reflection.invoke(m, instance, "-ee", new HashSet<>(Arrays.asList('e'))));
 
assertEquals('a', (char)Reflection.invoke(m, instance, "-ppl-", new HashSet<>(Arrays.asList('p', 'l'))));
 
// test only correct letter is chosen
 
assertEquals('g', (char)Reflection.invoke(m, instance, "en-ineerin-", new HashSet<>(Arrays.asList('e', 'n', 'i', 'r'))));
}
}
}
public void runTestGame(Class<? extends IHangmanChooser> clazz, int wordLength, int wrongAnswersAllowed, String guesses) {
Constructor<? extends IHangmanChooser> constructor = Reflection.getConstructor(clazz, int.class, int.class);
HangmanGame.playGame(
Reflection.newInstance(constructor, wordLength, wrongAnswersAllowed),
new ConsoleHangmanGuesser(new Scanner(String.join("\n", guesses.split(""))))
);
}
@Order(3)
@Tag("C")
@DisplayName("Test RandomHangmanChooser Full Game")
@ParameterizedTest(name = "{0}")
@FileSource(
inputs = {
"{seed = 1337, word length = 3, max wrong guesses = 26, guesses = abcdefghijklmnopqrstuvwxyz}",
"{seed = 1337, word length = 3, max wrong guesses = 10, guesses = abcdefghijklmnopqrstuvwxyz}",
"{seed = 2, word length = 3, max wrong guesses = 10, guesses = abcdefghijklmnopqrstuvwxyz}",
"{seed = 44, word length = 7, max wrong guesses = 6, guesses = debats}",
"{seed = 6, word length = 20, max wrong guesses = 16, guesses = aeioubcdfghjklmnpqrstvwxyz}",
"{seed = 19, word length = 14, max wrong guesses = 1, guesses = aeiou}",
"{seed = 19, word length = 14, max wrong guesses = 26, guesses = abcdefghijklmnopqrstuvwxyz}",
"{seed = 239, word length = 9, max wrong guesses = 7, guesses = gsnreou}",
"{seed = 77, word length = 21, max wrong guesses = 4, guesses = iqzyx}",
"{seed = 1288, word length = 7, max wrong guesses = 1, guesses = negator}",
"{seed = 1972, word length = 5, max wrong guesses = 8, guesses = computer}",
"{seed = 1972, word length = 19, max wrong guesses = 3, guesses = xvcounterz}",
"{seed = 2019, word length = 8, max wrong guesses = 26, guesses = abcdefghijklmnopqrstuvwxyz}",
"{seed = 2019, word length = 8, max wrong guesses = 7, guesses = redfqin}",
"{seed = 2019, word length = 8, max wrong guesses = 2, guesses = redfqin}",
},
outputFiles = {
"trace0.txt",
"trace1.txt",
"trace2.txt",
"trace3.txt",
"trace4.txt",
"trace5.txt",
"trace6.txt",
"trace7.txt",
"trace8.txt",
"trace9.txt",
"trace10.txt",
"trace11.txt",
"trace12.txt",
"trace13.txt",
"trace14.txt",
}
)
public void testPlayGameWithRandomChooser(Map<String, String> arguments, String expectedOutput, CaptureSystemOutput.OutputCapture capture) {
// Parse arguments
int seed = Integer.parseInt(arguments.get("seed"));
int length = Integer.parseInt(arguments.get("word length"));
int wrongAllowed = Integer.parseInt(arguments.get("max wrong guesses"));
String guesses = arguments.get("guesses");
// Set Random field to correct seed
Field rand = Reflection.getFieldByType(RandomHangmanChooser.class, Random.class);
Reflection.setFieldValue(RandomHangmanChooser.class, rand.getName(), null, new Random(seed));
// Run the actual game
runTestGame(RandomHangmanChooser.class, length, wrongAllowed, guesses);
assertEquals(expectedOutput.replace("\r\n", "\n").strip(), capture.toString().replace("\r\n", "\n").strip());
}
@Order(2)
@Tag("B")
@DisplayName("The overall number of fields in EvilHangmanChooser is small")
@Test
public void testSmallNumberOfFieldsEHC() {
Reflection.assertFieldsLessThan(EvilHangmanChooser.class, "private", 5);
}
@Order(2)
@Tag("B")
@DisplayName("There are no public fields in EvilHangmanChooser")
@Test
public void testNoPublicFieldsEHC() {
Reflection.assertNoPublicFields(EvilHangmanChooser.class);
}
@Order(2)
@Tag("B")
@DisplayName("There is no map field in EvilHangmanChooser")
@Test
public void testNoMapField() {
if (Reflection.getFields(EvilHangmanChooser.class).filter(Reflection.hasType(Map.class)).findAny().isPresent()) {
fail("You should not be storing a map as a field! Think about if the map is used in more than one method.");
}
}
@Order(2)
@Tag("B")
@DisplayName("Expected constructor exceptions for EvilHangmanChooser")
@Test
public void testExceptionsViolatedInEvilConstructor() {
Constructor c = Reflection.getConstructor(EvilHangmanChooser.class, int.class, int.class);
assertThrows(IllegalArgumentException.class, () -> Reflection.newInstance(c, -1, 3));
assertThrows(IllegalArgumentException.class, () -> Reflection.newInstance(c, 3, -1));
assertThrows(IllegalStateException.class, () -> Reflection.newInstance(c, Integer.MAX_VALUE, 3));
}
@Order(2)
@Tag("B")
@DisplayName("Expected makeGuess() exceptions for characters that aren't lower case for EvilHangmanChooser")
@Test
public void testMakeGuessExceptionsInEvil() {
Constructor c = Reflection.getConstructor(EvilHangmanChooser.class, int.class, int.class);
EvilHangmanChooser chooser = Reflection.newInstance(c, 1, 1);
Method m = Reflection.getMethod(EvilHangmanChooser.class, "makeGuess", char.class);
IntStream.range(0, 20).forEach(i -> assertThrows(IllegalArgumentException.class, () -> m.invoke(chooser, (char) ('a' - (i + 1)))));
IntStream.range(0, 20).forEach(i -> assertThrows(IllegalArgumentException.class, () -> m.invoke(chooser, (char) ('z' + (i + 1)))));
}
@Order(2)
@Tag("B")
@DisplayName("Test EvilHangmanChooser Full Game")
@ParameterizedTest(name = "{0}")
@FileSource(
inputs = {
"{word length = 3, max wrong guesses = 10, guesses = abcdefghijklmnopqrstuvwxyz}",
"{word length = 3, max wrong guesses = 26, guesses = abcdefghijklmnopqrstuvwxyz}",
"{word length = 5, max wrong guesses = 26, guesses = abcdefghijklmnopqrstuvwxyz}",
"{word length = 5, max wrong guesses = 1, guesses = a}",
"{word length = 5, max wrong guesses = 10, guesses = abcdefghijklmnopqrstuvwxyz}",
"{word length = 15, max wrong guesses = 15, guesses = aeioubcdfghjklmnpqrstvwxyz}",
"{word length = 20, max wrong guesses = 15, guesses = aeioubcdfghjklmnpqrstvwxyz}",
"{word length = 8, max wrong guesses = 14, guesses = aeioubcdfghjklmnpqrstvwxyz}",
"{word length = 20, max wrong guesses = 1, guesses = u}",
"{word length = 7, max wrong guesses = 26, guesses = abcdefghijklmnopqrstuvwxyz}",
"{word length = 7, max wrong guesses = 5, guesses = tusor}",
"{word length = 7, max wrong guesses = 8, guesses = tusoraeiz}",
"{word length = 7, max wrong guesses = 7, guesses = ziearosut}",
"{word length = 4, max wrong guesses = 11, guesses = etaoinshrlud}",
"{word length = 12, max wrong guesses = 7, guesses = etaoinshrlud}",
},
outputFiles = {
"trace0-evil.txt",
"trace1-evil.txt",
"trace2-evil.txt",
"trace3-evil.txt",
"trace4-evil.txt",
"trace5-evil.txt",
"trace6-evil.txt",
"trace7-evil.txt",
"trace8-evil.txt",
"trace9-evil.txt",
"trace10-evil.txt",
"trace11-evil.txt",
"trace12-evil.txt",
"trace13-evil.txt",
"trace14-evil.txt",
}
)
public void testPlayGameWithEvilChooser(Map<String, String> arguments, String expectedOutput, CaptureSystemOutput.OutputCapture capture) {
// Parse arguments
int length = Integer.parseInt(arguments.get("word length"));
int wrongAllowed = Integer.parseInt(arguments.get("max wrong guesses"));
String guesses = arguments.get("guesses");
// Run the actual game
runTestGame(EvilHangmanChooser.class, length, wrongAllowed, guesses);
assertEquals(expectedOutput.replace("\r\n", "\n").strip(), capture.toString().replace("\r\n", "\n").strip());
}
}
\ No newline at end of file
0 Assignees
None
Assign to
0 Reviewers
None
Request review from
Milestone
No milestone
None
None
Time tracking
No estimate or time spent
Labels
0
None
0
None
    Assign labels
  • Manage project labels

Lock merge request
Unlocked
2
2 participants
Adam Blank
Johanna S. Karras
Reference: cs2-19wi/project02!4
Source branch: jkarras2

Menu

Projects Groups Snippets
Help