package net.cloudcodex.server.test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
import net.cloudcodex.server.Context;
import net.cloudcodex.server.data.AdvancedDAO;
import net.cloudcodex.server.data.Data;
import net.cloudcodex.server.data.Data.Campaign;
import net.cloudcodex.server.data.Data.Scene;
import net.cloudcodex.server.data.campaign.msg.SceneSDO;
import net.cloudcodex.server.data.campaign.scene.SceneToCreateSDO;
import net.cloudcodex.server.service.CampaignService;
import net.cloudcodex.server.service.HomeService;
import net.cloudcodex.server.service.MessageService;
import net.cloudcodex.shared.Errors;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
/**
* jUnit Test for {@link MessageService#startScenes(Context, long, SceneToCreateSDO[])}
*/
public class StartScenesTest extends TestCase {
private final LocalServiceTestHelper helper =
new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());
private CampaignService campaignService;
private MessageService messageService;
private HomeService homeService;
private AdvancedDAO dao;
private Data.User master;
private Data.User player1;
private Data.User player2;
private Data.User player3;
private Campaign campaign;
private long campaignId;
private Data.Character char1;
private long char1Id;
private Data.Character char2;
private long char2Id;
private Data.Character char3;
private long char3Id;
private Data.Character npc1;
private long npc1Id;
private Data.Character npc2;
private long npc2Id;
private Scene scene;
private Scene scene2;
private Context context;
@Before
public void setUp() {
helper.setUp();
DatastoreService store = DatastoreServiceFactory.getDatastoreService();
campaignService = new CampaignService(store);
messageService = new MessageService(store);
homeService = new HomeService(store);
dao = new AdvancedDAO(store);
master = homeService.createUser(null, "master@test.com", "Master");
player1 = homeService.createUser(null, "player1@test.com", "Player1");
player2 = homeService.createUser(null, "player2@test.com", "Player2");
player3 = homeService.createUser(null, "player3@test.com", "Player3");
campaign = campaignService.createCampaign(null, "Test Campaign", "Some game", "Some desc", null, master);
campaignId = campaign.getKey().getId();
char1 = campaignService.createCharacter(null, campaign, "Char1", player1, null, null);
char1Id = char1.getKey().getId();
char2 = campaignService.createCharacter(null, campaign, "Char2", player2, null, null);
char2Id = char2.getKey().getId();
char3 = campaignService.createCharacter(null, campaign, "Char3", player3, null, null);
char3Id = char3.getKey().getId();
npc1 = campaignService.createCharacter(null, campaign, "NPC1", null, null, null);
npc1Id = npc1.getKey().getId();
npc2 = campaignService.createCharacter(null, campaign, "NPC2", null, null, null);
npc2Id = npc2.getKey().getId();
context = new Context(master);
scene = messageService.startScene(context, "introduction",
char1.getKey(), char2.getKey());
assertNotNull(scene);
}
@After
public void tearDown() {
helper.tearDown();
campaignService = null;
homeService = null;
dao = null;
}
@Test
public void testCreatingAGoodNewScene() {
final String intro = "The Intro";
final SceneToCreateSDO scene = new SceneToCreateSDO();
scene.setCharacters(new long[] {char1Id, char2Id, char3Id});
scene.setIntroduction(intro);
final SceneToCreateSDO[] scenes = new SceneToCreateSDO[] { scene };
boolean result = messageService.startScenes(context, campaignId, scenes);
assertTrue(result);
assertFalse(context.hasErrors());
context = new Context(player1);
final List<SceneSDO> readScenes =
messageService.getMessages(context, campaignId, char1Id, null, null);
final SceneSDO lastScene = readScenes.get(readScenes.size() - 1);
assertTrue(lastScene.getScene().getCharacters().contains(char1.getKey()));
assertTrue(lastScene.getScene().getCharacters().contains(char2.getKey()));
assertTrue(lastScene.getScene().getCharacters().contains(char3.getKey()));
assertTrue(lastScene.getScene().getCharacters().size() == 3);
assertTrue(intro.equals(lastScene.getScene().getIntroduction()));
}
@Test
public void testCreatingAGoodNewSceneWithAliases() {
final String intro = "The Intro";
final SceneToCreateSDO scene = new SceneToCreateSDO();
scene.setCharacters(new long[] {char1Id, char2Id, char3Id});
scene.setIntroduction(intro);
final Map<Long, String> char1Aliases = new HashMap<Long, String>();
char1Aliases.put(null, "Global");
char1Aliases.put(char3Id, "Specific");
scene.getAliases().put(char1Id, char1Aliases);
final SceneToCreateSDO[] scenes = new SceneToCreateSDO[] { scene };
boolean result = messageService.startScenes(context, campaignId, scenes);
assertTrue(result);
assertFalse(context.hasErrors());
context = new Context(player1);
final List<SceneSDO> readScenes =
messageService.getMessages(context, campaignId, char1Id, null, null);
final SceneSDO lastScene = readScenes.get(readScenes.size() - 1);
assertTrue(lastScene.getScene().getCharacters().contains(char1.getKey()));
assertTrue(lastScene.getScene().getCharacters().contains(char2.getKey()));
assertTrue(lastScene.getScene().getCharacters().contains(char3.getKey()));
assertTrue(lastScene.getScene().getCharacters().size() == 3);
assertTrue(intro.equals(lastScene.getScene().getIntroduction()));
assertEquals("Global", lastScene.getScene().getAlias(char1Id + ""));
assertEquals("Specific", lastScene.getScene().getAlias(char1Id + "-" + char3Id));
}
@Test
public void testCreating2GoodNewScenes() {
final String intro = "The Intro";
final SceneToCreateSDO scene = new SceneToCreateSDO();
scene.setCharacters(new long[] {char1Id, char3Id});
scene.setIntroduction(intro);
final SceneToCreateSDO scene2 = new SceneToCreateSDO();
scene2.setCharacters(new long[] {char2Id, npc1Id});
scene2.setIntroduction(intro + "2");
final SceneToCreateSDO[] scenes = new SceneToCreateSDO[] { scene, scene2 };
boolean result = messageService.startScenes(context, campaignId, scenes);
assertTrue(result);
assertFalse(context.hasErrors());
context = new Context(player1);
List<SceneSDO> readScenes =
messageService.getMessages(context, campaignId, char1Id, null, null);
SceneSDO lastScene = readScenes.get(readScenes.size() - 1);
assertTrue(lastScene.getScene().getCharacters().contains(char1.getKey()));
assertTrue(lastScene.getScene().getCharacters().contains(char3.getKey()));
assertTrue(lastScene.getScene().getCharacters().size() == 2);
assertTrue(intro.equals(lastScene.getScene().getIntroduction()));
context = new Context(player2);
readScenes =
messageService.getMessages(context, campaignId, char2Id, null, null);
lastScene = readScenes.get(readScenes.size() - 1);
assertTrue(lastScene.getScene().getCharacters().contains(char2.getKey()));
assertTrue(lastScene.getScene().getCharacters().contains(npc1.getKey()));
assertTrue(lastScene.getScene().getCharacters().size() == 2);
assertTrue((intro + "2").equals(lastScene.getScene().getIntroduction()));
}
@Test
public void testCreating2GoodNewScenesWithNPCUbiquity() {
final String intro = "The Intro";
final SceneToCreateSDO scene = new SceneToCreateSDO();
scene.setCharacters(new long[] {char1Id, char3Id, npc1Id});
scene.setIntroduction(intro);
final SceneToCreateSDO scene2 = new SceneToCreateSDO();
scene2.setCharacters(new long[] {char2Id, npc1Id});
scene2.setIntroduction(intro + "2");
final SceneToCreateSDO[] scenes = new SceneToCreateSDO[] { scene, scene2 };
boolean result = messageService.startScenes(context, campaignId, scenes);
assertTrue(result);
assertFalse(context.hasErrors());
context = new Context(player1);
List<SceneSDO> readScenes =
messageService.getMessages(context, campaignId, char1Id, null, null);
SceneSDO lastScene = readScenes.get(readScenes.size() - 1);
assertTrue(lastScene.getScene().getCharacters().contains(char1.getKey()));
assertTrue(lastScene.getScene().getCharacters().contains(char3.getKey()));
assertTrue(lastScene.getScene().getCharacters().contains(npc1.getKey()));
assertTrue(lastScene.getScene().getCharacters().size() == 3);
assertTrue(intro.equals(lastScene.getScene().getIntroduction()));
context = new Context(player2);
readScenes =
messageService.getMessages(context, campaignId, char2Id, null, null);
lastScene = readScenes.get(readScenes.size() - 1);
assertTrue(lastScene.getScene().getCharacters().contains(char2.getKey()));
assertTrue(lastScene.getScene().getCharacters().contains(npc1.getKey()));
assertTrue(lastScene.getScene().getCharacters().size() == 2);
assertTrue((intro + "2").equals(lastScene.getScene().getIntroduction()));
}
@Test
public void testCreating2ScenesButUbiquity() {
final String intro = "The Intro";
final SceneToCreateSDO scene = new SceneToCreateSDO();
scene.setCharacters(new long[] {char1Id, char3Id});
scene.setIntroduction(intro);
final SceneToCreateSDO scene2 = new SceneToCreateSDO();
scene2.setCharacters(new long[] {char2Id, npc1Id, char1Id});
scene2.setIntroduction(intro + "2");
final SceneToCreateSDO[] scenes = new SceneToCreateSDO[] { scene, scene2 };
boolean result = messageService.startScenes(context, campaignId, scenes);
assertFalse(result);
assertTrue(context.hasError(Errors.IMPOSSIBLE_UBIQUITY));
}
@Test
public void testCreatingASceneWithOnlyNPC() {
final String intro = "The Intro";
final SceneToCreateSDO scene = new SceneToCreateSDO();
scene.setCharacters(new long[] {npc1Id, npc2Id});
scene.setIntroduction(intro);
final SceneToCreateSDO[] scenes = new SceneToCreateSDO[] { scene };
boolean result = messageService.startScenes(context, campaignId, scenes);
assertFalse(result);
assertTrue(context.hasError(Errors.IMPOSSIBLE_ONLY_NPCS));
}
@Test
public void testCreatingASceneWithMissingParams() {
final String intro = "The Intro";
final SceneToCreateSDO scene = new SceneToCreateSDO();
scene.setCharacters(new long[] {});
scene.setIntroduction(intro);
final SceneToCreateSDO[] scenes = new SceneToCreateSDO[] { scene };
boolean result = messageService.startScenes(context, campaignId, scenes);
assertFalse(result);
assertTrue(context.hasError(Errors.REQUIRED));
}
@Test
public void testCreatingASceneWithPCNotDispatched() {
final String intro = "The Intro";
final SceneToCreateSDO scene = new SceneToCreateSDO();
scene.setCharacters(new long[] {char1Id});
scene.setIntroduction(intro);
final SceneToCreateSDO[] scenes = new SceneToCreateSDO[] { scene };
boolean result = messageService.startScenes(context, campaignId, scenes);
assertFalse(result);
assertTrue(context.hasError(Errors.IMPOSSIBLE_PC_NOT_DISPATCHED));
}
}