package rabbitescape.engine.menu;
import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.CoreMatchers.*;
import org.junit.*;
import rabbitescape.engine.util.NamedFieldFormatter;
public class TestLevelsMenu
{
@Test
public void List_all_levels_in_a_dir_when_completed_none()
{
LevelsCompleted levelsCompleted = new HardCodedLevelsCompleted( 0 );
LevelsList levelsList
= new LevelsList( FakeLevelsList.levelSet( "test2", 3 ) );
LevelsMenu menu = new LevelsMenu(
"test2", levelsList, levelsCompleted );
// Only the first level is enabled
assertThat(
menuItemsToStrings( menu.items ),
equalTo(
new String[] {
"LeVeL test2 1 test2/lev1.rel",
"LeVeL test2 2 test2/lev2.rel (disabled)",
"LeVeL test2 3 test2/lev3.rel (disabled)"
}
)
);
}
@Test
public void List_all_levels_in_a_dir_when_completed_one()
{
LevelsCompleted levelsCompleted = new HardCodedLevelsCompleted( 1 );
LevelsList levelsList
= new LevelsList( FakeLevelsList.levelSet( "test2", 3 ) );
LevelsMenu menu = new LevelsMenu(
"test2", levelsList, levelsCompleted );
// The level after the one we completed is enabled
assertThat(
menuItemsToStrings( menu.items ),
equalTo(
new String[] {
"LeVeL test2 1 test2/lev1.rel",
"LeVeL test2 2 test2/lev2.rel",
"LeVeL test2 3 test2/lev3.rel (disabled)"
}
)
);
}
@Test
public void List_all_levels_in_a_dir_when_completed_all_but_last()
{
LevelsCompleted levelsCompleted = new HardCodedLevelsCompleted( 2 );
LevelsList levelsList
= new LevelsList( FakeLevelsList.levelSet( "test2", 3 ) );
LevelsMenu menu = new LevelsMenu(
"test2", levelsList, levelsCompleted );
// All levels are enabled because we've completed the penultimate one
assertThat(
menuItemsToStrings( menu.items ),
equalTo(
new String[] {
"LeVeL test2 1 test2/lev1.rel",
"LeVeL test2 2 test2/lev2.rel",
"LeVeL test2 3 test2/lev3.rel"
}
)
);
}
@Test
public void List_all_levels_in_a_dir_when_completed_all()
{
LevelsCompleted levelsCompleted = new HardCodedLevelsCompleted( 3 );
LevelsList levelsList
= new LevelsList( FakeLevelsList.levelSet( "test2", 3 ) );
LevelsMenu menu = new LevelsMenu(
"test2", levelsList, levelsCompleted );
// All levels are enabled because we've completed them all
assertThat(
menuItemsToStrings( menu.items ),
equalTo(
new String[] {
"LeVeL test2 1 test2/lev1.rel",
"LeVeL test2 2 test2/lev2.rel",
"LeVeL test2 3 test2/lev3.rel"
}
)
);
}
@Test
public void Can_refresh_which_levels_are_enabled()
{
HardCodedLevelsCompleted levelsCompleted =
new HardCodedLevelsCompleted( 1 );
LevelsList levelsList
= new LevelsList( FakeLevelsList.levelSet( "test2", 3 ) );
LevelsMenu menu = new LevelsMenu(
"test2", levelsList, levelsCompleted );
// Sanity: level 3 is disabled
assertThat(
menuItemsToStrings( menu.items ),
equalTo(
new String[] {
"LeVeL test2 1 test2/lev1.rel",
"LeVeL test2 2 test2/lev2.rel",
"LeVeL test2 3 test2/lev3.rel (disabled)"
}
)
);
// This is what we are testing: change the highest and refresh
levelsCompleted.highest = 2;
menu.refresh();
// Level 3 is now enabled
assertThat(
menuItemsToStrings( menu.items ),
equalTo(
new String[] {
"LeVeL test2 1 test2/lev1.rel",
"LeVeL test2 2 test2/lev2.rel",
"LeVeL test2 3 test2/lev3.rel"
}
)
);
}
// ---
private static class HardCodedLevelsCompleted implements LevelsCompleted
{
private int highest;
public HardCodedLevelsCompleted( int highest )
{
this.highest = highest;
}
@Override
public void setCompletedLevel( String levelsDir, int levelNum )
{
throw new UnsupportedOperationException();
}
@Override
public int highestLevelCompleted( String levelsDir )
{
return highest;
}
}
private String[] menuItemsToStrings( MenuItem[] menuItems )
{
String[] ret = new String[menuItems.length];
int i = 0;
for ( MenuItem genericItem : menuItems )
{
LevelMenuItem item = (LevelMenuItem)genericItem;
// Note don't use t() here since this is a test and we want
// the same answer in all locales
String ans = NamedFieldFormatter.format(
item.name, item.nameParams );
ans += " " + item.fileName;
if ( !item.enabled )
{
ans += " (disabled)";
}
ret[i] = ans;
++i;
}
return ret;
}
}