Skip to content

Commit

Permalink
fix unit and UI tests
Browse files Browse the repository at this point in the history
  • Loading branch information
sverbach committed Jun 10, 2021
1 parent 595c8c9 commit 2d0f925
Show file tree
Hide file tree
Showing 10 changed files with 59 additions and 70 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import androidx.test.runner.AndroidJUnit4;
import ch.m3ts.display.statistic.GameStats;
import ch.m3ts.display.statistic.MatchStats;
import ch.m3ts.display.statistic.PointData;
import ch.m3ts.display.statistic.TrackData;
import ch.m3ts.display.statistic.data.GameData;
import ch.m3ts.display.statistic.data.MatchData;
import ch.m3ts.display.statistic.data.PointData;
import ch.m3ts.display.statistic.data.TrackData;
import ch.m3ts.eventbus.TTEvent;
import ch.m3ts.eventbus.TTEventBus;
import ch.m3ts.eventbus.event.StatsData;
Expand Down Expand Up @@ -104,13 +104,13 @@ public void onClickMatchStats() {
points.add(new PointData("msg1", new ArrayList<TrackData>(), Side.LEFT, 9, 2, Side.RIGHT, Side.RIGHT, Side.LEFT, 12));
points.add(new PointData("msg2", new ArrayList<TrackData>(), Side.LEFT, 10, 2, Side.RIGHT, Side.RIGHT, Side.LEFT, 10));
points.add(new PointData("msg3", new ArrayList<TrackData>(), Side.LEFT, 11, 2, Side.RIGHT, Side.RIGHT, Side.LEFT, 3));
List<GameStats> games = new ArrayList<>();
GameStats gameStats = new GameStats(points);
List<GameData> games = new ArrayList<>();
GameData gameStats = new GameData(points);
games.add(gameStats);
Map<Side, Integer> tableCorners = new HashMap<>();
tableCorners.put(Side.LEFT, 60);
tableCorners.put(Side.RIGHT, 1130);
MatchStats stats = new MatchStats(games, playerLeftName, playerRightName, "12.12.2021", tableCorners);
MatchData stats = new MatchData(games, playerLeftName, playerRightName, "12.12.2021", tableCorners);
TTEventBus.getInstance().dispatch(new TTEvent<>(new StatsData(stats)));
onView(isRoot()).perform(waitFor(1000));
onView(withId(R.id.player_left)).check(matches(withText(playerLeftName)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public void addTableCorners(int tableCornerLeft, int tableCornerRight) {
this.tableCorners.put(Side.RIGHT, tableCornerRight);
}

public void addPoint(String decision, Side winner, int scoreLeft, int scoreRight, int strikes, Side ballSide, Side striker, Side server, int duration, List<Track> tracks) {
public void addPoint(String decision, Side winner, int scoreLeft, int scoreRight, Side ballSide, Side striker, Side server, int duration, List<Track> tracks) {
List<DetectionData> detections = new ArrayList<>();
List<TrackData> trackDataList = new ArrayList<>();
for (Track track : tracks) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public PointData(String refereeDecision, List<TrackData> tracks, Side winner, in
this.isCorrection = refereeDecision.contains("deduction");
StatsProcessing.putTogetherTracksOfSameStrikes(tracks);
this.strikes = StatsProcessing.countAmountOfStrikesOfBothSides(this.tracks);
setFastestStrikes();
}

public void setFastestStrikes() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package ch.m3ts.display.statistic.processing;

import java.util.Arrays;
import java.util.Collections;
import java.util.EnumMap;
import java.util.HashMap;
Expand All @@ -12,7 +11,6 @@
import ch.m3ts.detection.ZPositionCalc;
import ch.m3ts.display.statistic.data.DetectionData;
import ch.m3ts.display.statistic.data.TrackData;
import ch.m3ts.util.Log;
import ch.m3ts.util.Side;
import edu.princeton.cs.algs4.LinearRegression;

Expand Down Expand Up @@ -124,44 +122,47 @@ public static Map<Side, Integer> countAmountOfStrikesOfBothSides(List<TrackData>
}

public static void calculatePositionsInMm(List<TrackData> trackDataList, ZPositionCalc calc) {
Log.d("x[mm];y[mm];z[mm];");
for (TrackData trackData : trackDataList) {
List<Double> xPositions = new LinkedList();
List<Double> yArr = new LinkedList();
List<Double> zPositions = new LinkedList();
List<DetectionData> detectionDataList = new LinkedList<>();
double videoWidthPx = calc.getVideoWidthPx();
for (int i = 0; i < trackData.getDetections().size(); i++) {
DetectionData d = trackData.getDetections().get(i);
ZPositionCalc.ZPosMmToProportion p = calc.findProportionOfZPos(d.getZ());
double wmm = videoWidthPx * p.getProportion();
double xmm = d.getX() * p.getProportion();
double ymm = d.getY() * p.getProportion();
double edgeLocLeft = wmm / 2 - ZPositionCalc.TABLE_TENNIS_TABLE_LENGTH_MM / 2.0;
xmm = xmm - edgeLocLeft;
if (xmm > 0 && xmm <= ZPositionCalc.TABLE_TENNIS_TABLE_LENGTH_MM) {
xPositions.add(xmm);
yArr.add(ymm);
zPositions.add(calc.zPosRelToMm(d.getZ()));
d.setX((int) xmm);
d.setY((int) ymm);
detectionDataList.add(d);
if (calc != null) {
double videoWidthPx = calc.getVideoWidthPx();
for (int i = 0; i < trackData.getDetections().size(); i++) {
DetectionData d = trackData.getDetections().get(i);
ZPositionCalc.ZPosMmToProportion p = calc.findProportionOfZPos(d.getZ());
double wmm = videoWidthPx * p.getProportion();
double xmm = d.getX() * p.getProportion();
double ymm = d.getY() * p.getProportion();
double edgeLocLeft = wmm / 2 - ZPositionCalc.TABLE_TENNIS_TABLE_LENGTH_MM / 2.0;
xmm = xmm - edgeLocLeft;
if (xmm > 0 && xmm <= ZPositionCalc.TABLE_TENNIS_TABLE_LENGTH_MM) {
xPositions.add(xmm);
zPositions.add(calc.zPosRelToMm(d.getZ()));
d.setX((int) xmm);
d.setY((int) ymm);
detectionDataList.add(d);
}
}
smoothXAndZPositions(xPositions, zPositions);
for (int i = 0; i < detectionDataList.size(); i++) {
DetectionData d = detectionDataList.get(i);
if (d.getX() == xPositions.get(i)) {
d.setZ(zPositions.get(i));
}
}
trackData.setDetections(detectionDataList);
}
smoothXAndZPositions(xPositions, zPositions);
trackData.setDetections(detectionDataList);
Log.d("x = " + Arrays.toString(xPositions.toArray()) + ";y = " +
Arrays.toString(yArr.toArray()) + ";z = " + Arrays.toString(zPositions.toArray()) + ";\n"
);
}
}

private static void smoothXAndZPositions(List<Double> xPositions, List<Double> zPositions) {
if (!xPositions.isEmpty() && !zPositions.isEmpty()) {
LinearRegression linearRegression = calcLinRegFromLists(xPositions, zPositions);

for (int i = 0; i < xPositions.size(); i++) {
zPositions.set(i, Math.min(linearRegression.predict(xPositions.get(i)), ZPositionCalc.TABLE_TENNIS_TABLE_WIDTH_MM + 2 * ZPositionCalc.MAX_OFFSET_MM));
if (linearRegression != null) {
for (int i = 0; i < xPositions.size(); i++) {
zPositions.set(i, Math.min(linearRegression.predict(xPositions.get(i)), ZPositionCalc.TABLE_TENNIS_TABLE_WIDTH_MM + 2 * ZPositionCalc.MAX_OFFSET_MM));
}
}
}
}
Expand All @@ -184,7 +185,10 @@ private static LinearRegression calcLinRegFromLists(List<Double> xPositions, Lis
x[i] = xCopy.get(i);
z[i] = zCopy.get(i);
}

return new LinearRegression(x, z);
if (xCopy.isEmpty()) {
return null;
} else {
return new LinearRegression(x, z);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,8 @@ private void logScoring(Side lastServer) {
}
int scoreLeft = this.currentGame.getScore(Side.LEFT);
int scoreRight = this.currentGame.getScore(Side.RIGHT);
StatsCreator.getInstance().addPoint(lastDecision, lastPointWinner, scoreLeft, scoreRight, this.strikes, this.currentBallSide, this.currentStriker, lastServer, this.duration.getSeconds(), this.strikeLogs);
StatsCreator.getInstance().addPoint(lastDecision, lastPointWinner, scoreLeft, scoreRight,
this.currentBallSide, this.currentStriker, lastServer, this.duration.getSeconds(), this.strikeLogs);
this.strikeLogs = new ArrayList<>();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import ch.m3ts.util.Side;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;

public class StatsProcessingTest {
List<TrackData> trackDataList;
Expand Down Expand Up @@ -47,34 +46,18 @@ public void initTestData() {

@Test
public void putTogetherTracksOfSameStrikes() {
trackDataList.get(0).getDetections().add(new DetectionData(9, 10, 1, 100f, false, DirectionX.RIGHT));
trackDataList.get(1).getDetections().add(new DetectionData(19, 10, 1, 100f, false, DirectionX.RIGHT));
trackDataList.get(2).getDetections().add(new DetectionData(29, 10, 1, 100f, false, DirectionX.RIGHT));
trackDataList.get(3).getDetections().add(new DetectionData(26, 10, 1, 100f, false, DirectionX.LEFT));
trackDataList.get(4).getDetections().add(new DetectionData(16, 10, 1, 100f, false, DirectionX.LEFT));
StatsProcessing.putTogetherTracksOfSameStrikes(trackDataList);
assertEquals(2, trackDataList.size());
// try again, no change expected
StatsProcessing.putTogetherTracksOfSameStrikes(trackDataList);
assertEquals(2, trackDataList.size());
}

@Test
public void averageZPositions() {
trackDataList = new LinkedList<>();
detectionDataArr = new DetectionData[]{
new DetectionData(10, 10, 1, 100f, false, DirectionX.RIGHT),
new DetectionData(20, 10, 2, 200f, false, DirectionX.RIGHT),
new DetectionData(30, 10, 5, 300f, false, DirectionX.RIGHT),
};
List<DetectionData> detectionDataList = new LinkedList<>();
detectionDataList.add(detectionDataArr[0]);
detectionDataList.add(detectionDataArr[1]);
detectionDataList.add(detectionDataArr[2]);
List<TrackData> trackDataList = new LinkedList<>();
trackDataList.add(new TrackData(detectionDataList, 100f, Side.LEFT));
StatsProcessing.averageZPositions(trackDataList);
assertNotEquals(1.0, trackDataList.get(0).getDetections().get(0).getZ());
assertNotEquals(2.0, trackDataList.get(0).getDetections().get(1).getZ());
assertNotEquals(5.0, trackDataList.get(0).getDetections().get(2).getZ());
assertEquals(3, trackDataList.get(0).getDetections().size());
}

@Test
public void findFastestStrikeOfBothSides() {
Map<Side, Float> fastestStrikes = StatsProcessing.findFastestStrikeOfBothSides(trackDataList);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ public void prepare() {
when(mockConfig.getObjectRadius()).thenReturn(10f);
when(mockCalc.getMmPerPixelFrontEdge()).thenReturn(99999.9);
when(mockCalc.isBallZPositionOnTable(anyDouble())).thenReturn(true);
when(mockCalc.getVideoWidthPx()).thenReturn(1280.0);
stubListener = new StubListener(mockCallback);
TTEventBus.getInstance().register(stubListener);
}
Expand Down
1 change: 1 addition & 0 deletions app/src/test/java/ch/m3ts/tabletennis/match/MatchTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ public void testGameWinReset() {
assertEquals(0, status.getWinsRight());
assertEquals(0, status.getScoreRight());
assertEquals(10, status.getScoreLeft());
TTEventBus.getInstance().unregister(match);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,7 @@ public void testPointManipulation() {
referee.onPause();
referee.onResume();
assertSame(State.WAIT_FOR_SERVE, referee.getState());
TTEventBus.getInstance().unregister(subscribable);
}

@After
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyFloat;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
Expand Down Expand Up @@ -98,14 +97,12 @@ public void drawZPos() {

@Test
public void drawZPosOverloaded() {
int tableCornerLeftX = 10;
int tableCornerRightX = 100;
zPosVisualizer = Mockito.spy(zPosVisualizer);
DetectionData detectionData = new DetectionData(15, 20, .8, 66, false, 1);
zPosVisualizer.drawZPos(canvas, detectionData, tableCornerLeftX, tableCornerRightX);
zPosVisualizer.drawZPos(canvas, detectionData);

// verify that the same drawZPos method gets called when using detectionData
verify(zPosVisualizer, times(1)).drawZPos((Canvas) any(), (Lib.Detection) any(), anyInt(), anyInt());
verify(zPosVisualizer, times(1)).drawZPos((Canvas) any(), (DetectionData) any());
verify(canvas, times(1)).drawCircle(anyFloat(), anyFloat(), anyFloat(), (Paint) any());
}

Expand All @@ -115,16 +112,16 @@ private Lib.Detection[] generateDetectionsToDrawOnTable(int leftCornerX, int rig
d1.centerZ = .5;
Lib.Detection d2 = new Lib.Detection();
d2.centerX = rightCornerX - 1;
d2.centerZ = .9;
d2.centerZ = .8;
Lib.Detection d3 = new Lib.Detection();
d3.centerX = (int) Math.round(rightCornerX * .5);
d3.centerZ = .01;
d3.centerZ = .2;
Lib.Detection d4 = new Lib.Detection();
d4.centerX = rightCornerX;
d4.centerZ = 1;
d4.centerZ = .9;
Lib.Detection d5 = new Lib.Detection();
d5.centerX = leftCornerX;
d5.centerZ = 0;
d5.centerZ = .1;

return new Lib.Detection[]{
d1, d2, d3, d4, d5
Expand Down

0 comments on commit 2d0f925

Please sign in to comment.