/*
* Copyright 2010 Chad Retz
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.statmantis.mport.retro.event;
import static org.junit.Assert.*;
import javax.xml.parsers.DocumentBuilderFactory;
import org.junit.Test;
import org.statmantis.RetrosheetContextAwareTestBase;
import org.statmantis.model.Base;
import org.statmantis.model.FieldLocation;
import org.statmantis.model.Game;
import org.statmantis.model.GamePlayer;
import org.statmantis.model.PlayEvent;
import org.statmantis.model.PlayModifier;
import org.statmantis.model.PlayModifierType;
import org.statmantis.model.PlayType;
import org.statmantis.mport.retro.event.EventInformation;
import org.statmantis.mport.retro.event.GameContext;
import org.statmantis.mport.retro.event.PlayUtils;
import org.statmantis.xml.XmlUnmarshaller;
import org.w3c.dom.Document;
/**
* Tests for the {@link PlayUtils} class
*
* @author Chad Retz
*/
public class PlayUtilsTest extends RetrosheetContextAwareTestBase {
private GameContext buildGameContext(boolean playerOnFirst,
boolean playerOnSecond, boolean playerOnThird) throws Exception {
GameContext context = new GameContext(retroContext,
new EventInformation());
//new game
context.newGame("meh");
//set the game as what we load
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().
parse(PlayUtilsTest.class.getResourceAsStream("game.xml"));
context.setCurrentGame((Game) new XmlUnmarshaller().unmarshal(doc.getDocumentElement()));
//map all those current players
for (GamePlayer player : context.getCurrentGame().getHomeInfo().getGamePlayers()) {
context.getCurrentPlayers().put(player.getPlayer().getRetroId(), player);
}
for (GamePlayer player : context.getCurrentGame().getVisitorInfo().getGamePlayers()) {
context.getCurrentPlayers().put(player.getPlayer().getRetroId(), player);
}
//set the home team as batting
context.setHomeTeamBatting(true);
//the batter at the plate will always be the cruz missle
context.getOnBase().put(Base.HOME, context.getCurrentPlayers().get("cruzn002"));
if (playerOnFirst) {
//the impaler
context.getOnBase().put(Base.FIRST, context.getCurrentPlayers().get("guerv001"));
}
if (playerOnSecond) {
//hambone
context.getOnBase().put(Base.SECOND, context.getCurrentPlayers().get("hamij003"));
}
if (playerOnThird) {
//face
context.getOnBase().put(Base.THIRD, context.getCurrentPlayers().get("younm003"));
}
//we should be good now
return context;
}
private void assertModifier(GameContext context, PlayEvent event, int index, Base base,
String fielder, FieldLocation location, PlayModifierType type) {
assertTrue(event.getModifiers().size() >= index + 1);
PlayModifier modifier = event.getModifiers().get(index);
assertEquals(base, modifier.getBase());
if (fielder != null) {
assertEquals(context.getCurrentPlayers().get(fielder), modifier.getFielder());
}
assertEquals(location, modifier.getLocation());
assertEquals(type, modifier.getType());
}
//although the starting lineups are Rangers opening day 2k10, lots of these
// tests are made up
@Test
public void testFlyOut() throws Exception {
GameContext context = buildGameContext(false, false, false);
//cruz flies out to center fielder in left center
PlayEvent event = PlayUtils.buildPlayEvent("8/F78", context);
assertEquals(1, event.getFielders().size());
//face's friend
assertEquals(context.getCurrentPlayers().get("wellv001"),
event.getFielders().get(0));
assertEquals(PlayType.FLY_OUT, event.getPlayType());
assertModifier(context, event, 0, null, null,
FieldLocation.LEFT_CENTER, PlayModifierType.FLY);
}
@Test
public void testSacrificeFlyOut() throws Exception {
//face on third
GameContext context = buildGameContext(false, false, true);
//cruz sac flies to right fielder, face tags
PlayEvent event = PlayUtils.buildPlayEvent("9/SF", context);
assertEquals(1, event.getFielders().size());
assertEquals(context.getCurrentPlayers().get("bautj002"),
event.getFielders().get(0));
assertEquals(PlayType.FLY_OUT, event.getPlayType());
assertModifier(context, event, 0, null, null,
null, PlayModifierType.SACRIFICE_FLY);
}
@Test
public void testGroundOut() throws Exception {
GameContext context = buildGameContext(false, false, false);
//cruz simple 6-3
PlayEvent event = PlayUtils.buildPlayEvent("63/G6M", context);
assertEquals(2, event.getFielders().size());
assertEquals(context.getCurrentPlayers().get("gonza002"),
event.getFielders().get(0));
assertEquals(context.getCurrentPlayers().get("overl001"),
event.getFielders().get(1));
assertEquals(PlayType.GROUND_OUT, event.getPlayType());
assertModifier(context, event, 0, null, null,
FieldLocation.SHORTSTOP_MIDDLE, PlayModifierType.GROUND_BALL);
}
@Test
public void testThreePersonGroundOut() throws Exception {
GameContext context = buildGameContext(false, false, false);
//cruz 1-4-3
PlayEvent event = PlayUtils.buildPlayEvent("143/G1", context);
assertEquals(3, event.getFielders().size());
assertEquals(context.getCurrentPlayers().get("marcs001"),
event.getFielders().get(0));
assertEquals(context.getCurrentPlayers().get("hilla001"),
event.getFielders().get(1));
assertEquals(context.getCurrentPlayers().get("overl001"),
event.getFielders().get(2));
assertEquals(PlayType.GROUND_OUT, event.getPlayType());
assertModifier(context, event, 0, null, null,
FieldLocation.MOUND, PlayModifierType.GROUND_BALL);
}
@Test
public void testNonNormalBaseGroundOut() throws Exception {
GameContext context = buildGameContext(true, false, false);
//cruz 5-4 (but got him at first)
PlayEvent event = PlayUtils.buildPlayEvent("54(B)/BG25/SH", context);
assertEquals(2, event.getFielders().size());
assertEquals(context.getCurrentPlayers().get("encae001"),
event.getFielders().get(0));
assertEquals(context.getCurrentPlayers().get("hilla001"),
event.getFielders().get(1));
assertEquals(PlayType.GROUND_OUT, event.getPlayType());
assertEquals(context.getCurrentPlayers().get("cruzn002"),
event.getPrimaryBaseRunner());
assertEquals(Base.HOME, event.getPrimaryRunningFrom());
assertEquals(Base.FIRST, event.getPrimaryRunningTo());
assertModifier(context, event, 0, null, null,
FieldLocation.HOME_THIRD, PlayModifierType.GROUND_BALL_BUNT);
assertModifier(context, event, 1, null, null, null,
PlayModifierType.SACRIFICE_HIT);
}
@Test
public void testForceOutGroundOut() throws Exception {
GameContext context = buildGameContext(true, false, false);
//cruz 5-4 (got player at second)
PlayEvent event = PlayUtils.buildPlayEvent("54(1)/FO/G5", context);
assertEquals(2, event.getFielders().size());
assertEquals(context.getCurrentPlayers().get("encae001"),
event.getFielders().get(0));
assertEquals(context.getCurrentPlayers().get("hilla001"),
event.getFielders().get(1));
assertEquals(PlayType.GROUND_OUT, event.getPlayType());
assertEquals(context.getCurrentPlayers().get("guerv001"),
event.getPrimaryBaseRunner());
assertEquals(Base.FIRST, event.getPrimaryRunningFrom());
assertEquals(Base.SECOND, event.getPrimaryRunningTo());
assertModifier(context, event, 0, null, null, null,
PlayModifierType.FORCE_OUT);
assertModifier(context, event, 1, null, null,
FieldLocation.THIRD, PlayModifierType.GROUND_BALL);
}
@Test
public void testDoublePlay() throws Exception {
GameContext context = buildGameContext(true, false, false);
//cruz GIDP w/ runner on first initial out
PlayEvent event = PlayUtils.buildPlayEvent("64(1)3/GDP/G6", context);
assertEquals(3, event.getFielders().size());
assertEquals(context.getCurrentPlayers().get("gonza002"),
event.getFielders().get(0));
assertEquals(context.getCurrentPlayers().get("hilla001"),
event.getFielders().get(1));
assertEquals(context.getCurrentPlayers().get("overl001"),
event.getFielders().get(2));
assertEquals(PlayType.GROUND_OUT_DOUBLE_PLAY, event.getPlayType());
assertEquals(context.getCurrentPlayers().get("guerv001"),
event.getPrimaryBaseRunner());
assertEquals(Base.FIRST, event.getPrimaryRunningFrom());
assertEquals(Base.SECOND, event.getPrimaryRunningTo());
assertModifier(context, event, 0, null, null, null,
PlayModifierType.GROUND_OUT_DOUBLE_PLAY);
assertModifier(context, event, 1, null, null,
FieldLocation.SHORTSTOP, PlayModifierType.GROUND_BALL);
}
@Test
public void testTouchBagDoublePlay() throws Exception {
GameContext context = buildGameContext(true, false, false);
//cruz GIDP (second base unassisted) w/ runner on first initial out
PlayEvent event = PlayUtils.buildPlayEvent("4(1)3/G4/GDP", context);
assertEquals(2, event.getFielders().size());
assertEquals(context.getCurrentPlayers().get("hilla001"),
event.getFielders().get(0));
assertEquals(context.getCurrentPlayers().get("overl001"),
event.getFielders().get(1));
assertEquals(PlayType.GROUND_OUT_DOUBLE_PLAY, event.getPlayType());
assertEquals(context.getCurrentPlayers().get("guerv001"),
event.getPrimaryBaseRunner());
assertEquals(Base.FIRST, event.getPrimaryRunningFrom());
assertEquals(Base.SECOND, event.getPrimaryRunningTo());
assertModifier(context, event, 0, null, null,
FieldLocation.SECOND, PlayModifierType.GROUND_BALL);
assertModifier(context, event, 1, null, null, null,
PlayModifierType.GROUND_OUT_DOUBLE_PLAY);
}
@Test
public void testLinedIntoDoublePlay() throws Exception {
GameContext context = buildGameContext(false, true, false);
//cruz lined into DP (face's friend to second)
PlayEvent event = PlayUtils.buildPlayEvent("8(B)84(2)/LDP/L8", context);
assertEquals(3, event.getFielders().size());
assertEquals(context.getCurrentPlayers().get("wellv001"),
event.getFielders().get(0));
assertEquals(context.getCurrentPlayers().get("wellv001"),
event.getFielders().get(1));
assertEquals(context.getCurrentPlayers().get("hilla001"),
event.getFielders().get(2));
assertEquals(PlayType.LINE_OUT_DOUBLE_PLAY, event.getPlayType());
assertEquals(context.getCurrentPlayers().get("cruzn002"),
event.getPrimaryBaseRunner());
assertEquals(Base.HOME, event.getPrimaryRunningFrom());
assertEquals(Base.FIRST, event.getPrimaryRunningTo());
assertEquals(context.getCurrentPlayers().get("hamij003"),
event.getSecondaryBaseRunner());
assertEquals(Base.SECOND, event.getSecondaryRunningFrom());
assertEquals(Base.THIRD, event.getSecondaryRunningTo());
assertModifier(context, event, 0, null, null, null,
PlayModifierType.LINE_DRIVE_DOUBLE_PLAY);
assertModifier(context, event, 1, null, null,
FieldLocation.CENTER, PlayModifierType.LINE_DRIVE);
}
@Test
public void testTriplePlay() throws Exception {
GameContext context = buildGameContext(true, true, false);
//cruz ground out triple play
PlayEvent event = PlayUtils.buildPlayEvent("1(B)16(2)63(1)/LTP/L1", context);
assertEquals(5, event.getFielders().size());
assertEquals(context.getCurrentPlayers().get("marcs001"),
event.getFielders().get(0));
assertEquals(context.getCurrentPlayers().get("marcs001"),
event.getFielders().get(1));
assertEquals(context.getCurrentPlayers().get("gonza002"),
event.getFielders().get(2));
assertEquals(context.getCurrentPlayers().get("gonza002"),
event.getFielders().get(3));
assertEquals(context.getCurrentPlayers().get("overl001"),
event.getFielders().get(4));
assertEquals(PlayType.LINE_OUT_TRIPLE_PLAY, event.getPlayType());
assertEquals(context.getCurrentPlayers().get("cruzn002"),
event.getPrimaryBaseRunner());
assertEquals(Base.HOME, event.getPrimaryRunningFrom());
assertEquals(Base.FIRST, event.getPrimaryRunningTo());
assertEquals(context.getCurrentPlayers().get("hamij003"),
event.getSecondaryBaseRunner());
assertEquals(Base.SECOND, event.getSecondaryRunningFrom());
assertEquals(Base.THIRD, event.getSecondaryRunningTo());
assertEquals(context.getCurrentPlayers().get("guerv001"),
event.getTertiaryBaseRunner());
assertEquals(Base.FIRST, event.getTertiaryRunningFrom());
assertEquals(Base.SECOND, event.getTertiaryRunningTo());
assertModifier(context, event, 0, null, null, null,
PlayModifierType.LINE_DRIVE_TRIPLE_PLAY);
assertModifier(context, event, 1, null, null,
FieldLocation.MOUND, PlayModifierType.LINE_DRIVE);
}
}