package rabbitescape.ui.android;
import android.content.SharedPreferences;
import junit.framework.TestCase;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import rabbitescape.engine.config.Config;
import rabbitescape.engine.config.ConfigTools;
import rabbitescape.engine.menu.ByNumberConfigBasedLevelsCompleted;
public class TestAndroidConfigUpgradeTo1 extends TestCase
{
public void test_Empty_config_results_in_empty_config()
{
// Make a config based on preferences, with no version
FakeSharedPreferences prefs = new FakeSharedPreferences();
AndroidConfigUpgradeTo1 to1 = new AndroidConfigUpgradeTo1();
FakeAndroidConfigStorage storage = new FakeAndroidConfigStorage( prefs );
// Sanity: no prefs at start
assertEquals( 0, prefs.getAll().size() );
// This is what we are testing: run the upgrade
to1.run( storage );
// The content version was changed, and nothing was done
assertEquals( 1, prefs.getAll().size() );
assertEquals( "1", prefs.getString( Config.CFG_VERSION, null ) );
}
public void test_Unnumbered_level_dirs_are_upgraded()
{
// Make a config based on preferences, with no version
FakeSharedPreferences prefs = new FakeSharedPreferences();
AndroidConfigUpgradeTo1 to1 = new AndroidConfigUpgradeTo1();
FakeAndroidConfigStorage storage = new FakeAndroidConfigStorage( prefs );
// Make some old-style unnumbered-directory prefs
prefs.edit()
.putInt( "levels.completed.medium", 7 )
.putInt( "levels.completed.hard", 12 )
.commit();
// This is what we are testing: run the upgrade
to1.run( storage );
// The content and version were upgraded
assertEquals( 2, prefs.getAll().size() );
assertEquals( "1", prefs.getString( Config.CFG_VERSION, null ) );
assertEquals(
"{\"hard\":12,\"medium\":7}",
prefs.getString( "levels.completed", null )
);
}
public void test_Numbered_level_dirs_are_upgraded()
{
// Make a config based on preferences, with no version
FakeSharedPreferences prefs = new FakeSharedPreferences();
AndroidConfigUpgradeTo1 to1 = new AndroidConfigUpgradeTo1();
FakeAndroidConfigStorage storage = new FakeAndroidConfigStorage( prefs );
// Make some old-style unnumbered-directory prefs
prefs.edit()
.putInt( "levels.completed.03_hard", 13 )
.putInt( "levels.completed.01_easy", 8 )
.putInt( "levels.completed.02_medium", 8 )
.commit();
// This is what we are testing: run the upgrade
to1.run( storage );
// The content and version were upgraded
assertEquals( 2, prefs.getAll().size() );
assertEquals( "1", prefs.getString( Config.CFG_VERSION, null ) );
assertEquals(
"{\"easy\":8,\"hard\":13,\"medium\":8}",
prefs.getString( "levels.completed", null )
);
}
public void test_muted_true_is_upgraded()
{
// Make a config based on preferences, with no version
FakeSharedPreferences prefs = new FakeSharedPreferences();
// Make some old-style unnumbered-directory prefs
prefs.edit()
.putBoolean( "rabbitescape.muted", true )
.commit();
// This is what we are testing: run the upgrade
Config upgraded = AndroidConfigSetup.createConfig( prefs, new AndroidConfigUpgradeTo1() );
// Muted was upgraded
assertEquals( true, ConfigTools.getBool( upgraded, "muted" ) );
}
public void test_muted_false_is_upgraded()
{
// Make a config based on preferences, with no version
FakeSharedPreferences prefs = new FakeSharedPreferences();
// Make some old-style unnumbered-directory prefs
prefs.edit()
.putBoolean( "rabbitescape.muted", false )
.commit();
// This is what we are testing: run the upgrade
Config upgraded = AndroidConfigSetup.createConfig( prefs, new AndroidConfigUpgradeTo1() );
// Muted was upgraded
assertEquals( false, ConfigTools.getBool( upgraded, "muted" ) );
}
public void test_Level_dirs_and_muted_both_upgraded()
{
// Make a config based on preferences, with no version
FakeSharedPreferences prefs = new FakeSharedPreferences();
AndroidConfigUpgradeTo1 to1 = new AndroidConfigUpgradeTo1();
FakeAndroidConfigStorage storage = new FakeAndroidConfigStorage( prefs );
// Make some old-style unnumbered-directory prefs
prefs.edit()
.putInt( "levels.completed.03_hard", 13 )
.putBoolean( "rabbitescape.muted", true )
.commit();
// This is what we are testing: run the upgrade
to1.run( storage );
// The content and version were upgraded
assertEquals( 3, prefs.getAll().size() );
assertEquals( "1", prefs.getString( Config.CFG_VERSION, null ) );
assertEquals( "{\"hard\":13}", prefs.getString( "levels.completed", null ) );
assertEquals( "true", prefs.getString( "muted", null ) );
}
public void test_Levels_completed_upgrades_from_0_to_1()
{
SharedPreferences prefs = new FakeSharedPreferences();
AndroidPreferencesBasedLevelsCompleted oldCompleted =
new AndroidPreferencesBasedLevelsCompleted( prefs );
// Set some levels completed in different dirs
oldCompleted.setCompletedLevel( "abc", 12 );
oldCompleted.setCompletedLevel( "02_def", 14 );
oldCompleted.setCompletedLevel( "ghi", 2 );
// Sanity: we get what we put in
assertEquals( 12, oldCompleted.highestLevelCompleted( "abc" ) );
assertEquals( 14, oldCompleted.highestLevelCompleted( "02_def" ) );
assertEquals( 2, oldCompleted.highestLevelCompleted( "ghi" ) );
// Sanity: unmentioned dir
assertEquals( 0, oldCompleted.highestLevelCompleted( "jkl" ) );
// This is what we are testing - run the upgrade
Config upgraded = AndroidConfigSetup.createConfig( prefs, new AndroidConfigUpgradeTo1() );
// The new levelscompleted should agree with the old
ByNumberConfigBasedLevelsCompleted newCompleted =
new ByNumberConfigBasedLevelsCompleted( upgraded );
assertEquals( 12, newCompleted.highestLevelCompleted( "abc" ) );
assertEquals( 14, newCompleted.highestLevelCompleted( "def" ) );
assertEquals( 2, newCompleted.highestLevelCompleted( "ghi" ) );
assertEquals( 0, newCompleted.highestLevelCompleted( "jkl" ) );
}
// ---
private static class FakeAndroidConfigStorage implements IAndroidConfigStorage
{
private final FakeSharedPreferences prefs;
public FakeAndroidConfigStorage( FakeSharedPreferences prefs )
{
this.prefs = prefs;
}
@Override
public void set( String key, String value )
{
prefs.edit().putString( key, value ).commit();
}
@Override
public String get( String key )
{
throw new UnsupportedOperationException();
}
@Override
public void save( Config config )
{
throw new UnsupportedOperationException();
}
@Override
public SharedPreferences getPrefs()
{
return prefs;
}
}
private static class FakeSharedPreferences implements SharedPreferences
{
Map<String, Object> contents = new HashMap<String, Object>();
@Override
public Map<String, ?> getAll()
{
return contents;
}
@Override
public String getString( String key, String def )
{
String ret = (String)contents.get( key );
if ( ret == null )
{
return def;
}
else
{
return ret;
}
}
@Override
public Set<String> getStringSet( String s, Set<String> strings )
{
throw new UnsupportedOperationException();
}
@Override
public int getInt( String key, int def )
{
Integer ret = (Integer)contents.get( key );
if ( ret == null )
{
return def;
}
else
{
return ret;
}
}
@Override
public long getLong( String key, long def )
{
Long ret = (Long)contents.get( key );
if ( ret == null )
{
return def;
}
else
{
return ret;
}
}
@Override
public float getFloat( String s, float v )
{
throw new UnsupportedOperationException();
}
@Override
public boolean getBoolean( String key, boolean def )
{
Boolean ret = (Boolean)contents.get( key );
if ( ret == null )
{
return def;
}
else
{
return ret;
}
}
@Override
public boolean contains( String key )
{
return contents.containsKey( key );
}
@Override
public Editor edit()
{
return new FakeEditor( contents );
}
@Override
public void registerOnSharedPreferenceChangeListener(
OnSharedPreferenceChangeListener onSharedPreferenceChangeListener
)
{
throw new UnsupportedOperationException();
}
@Override
public void unregisterOnSharedPreferenceChangeListener(
OnSharedPreferenceChangeListener onSharedPreferenceChangeListener
)
{
throw new UnsupportedOperationException();
}
}
private static class FakeEditor implements SharedPreferences.Editor
{
private final Map<String, Object> contents;
private final HashMap<String, Object> newContents;
private List<String> toDelete;
public FakeEditor( Map<String, Object> contents )
{
this.contents = contents;
this.newContents = new HashMap<String, Object>();
this.toDelete = new ArrayList<String>();
}
@Override
public SharedPreferences.Editor putString( String key, String value )
{
newContents.put( key, value );
return this;
}
@Override
public SharedPreferences.Editor putStringSet(
String s, Set<String> strings
)
{
throw new UnsupportedOperationException();
}
@Override
public SharedPreferences.Editor putInt( String key, int value )
{
newContents.put( key, value );
return this;
}
@Override
public SharedPreferences.Editor putLong( String key, long value )
{
newContents.put( key, value );
return this;
}
@Override
public SharedPreferences.Editor putFloat( String s, float v )
{
throw new UnsupportedOperationException();
}
@Override
public SharedPreferences.Editor putBoolean( String s, boolean b )
{
newContents.put( s, b );
return this;
}
@Override
public SharedPreferences.Editor remove( String key )
{
toDelete.add( key );
return this;
}
@Override
public SharedPreferences.Editor clear()
{
throw new UnsupportedOperationException();
}
@Override
public boolean commit()
{
for ( String del : toDelete )
{
contents.remove( del );
}
for ( Map.Entry<String, Object> entry : newContents.entrySet() )
{
contents.put( entry.getKey(), entry.getValue() );
}
boolean ret = newContents.size() > 0 || toDelete.size() > 0;
newContents.clear();
toDelete.clear();
return ret;
}
@Override
public void apply()
{
throw new UnsupportedOperationException();
}
}
}