package de.avalax.fitbuddy.domain.model.workout;
import org.assertj.core.api.Java6Assertions;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import de.avalax.fitbuddy.domain.model.exercise.BasicExercise;
import de.avalax.fitbuddy.domain.model.exercise.Exercise;
import de.avalax.fitbuddy.domain.model.exercise.ExerciseException;
import de.avalax.fitbuddy.domain.model.exercise.ExerciseId;
import de.avalax.fitbuddy.domain.model.set.Set;
import de.avalax.fitbuddy.domain.model.workout.Workout.WorkoutMemento;
import de.bechte.junit.runners.context.HierarchicalContextRunner;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.mockito.Mockito.mock;
@RunWith(HierarchicalContextRunner.class)
public class BasicWorkoutTest {
private Workout workout;
@Before
public void setUp() throws Exception {
workout = new BasicWorkout();
}
@Test
public void equalWorkoutId_shouldHaveSameIdentity() throws Exception {
workout.setWorkoutId(new WorkoutId("42"));
Workout workout2 = new BasicWorkout();
workout2.setWorkoutId(new WorkoutId("42"));
assertThat(workout, equalTo(workout2));
assertThat(workout.hashCode(), equalTo(workout2.hashCode()));
}
@Test
public void differentWorkoutIds_shouldHaveDifferentIdentity() throws Exception {
workout.setWorkoutId(new WorkoutId("21"));
Workout workout2 = new BasicWorkout();
workout2.setWorkoutId(new WorkoutId("42"));
assertThat(workout, not(equalTo(workout2)));
assertThat(workout.hashCode(), not(equalTo(workout2.hashCode())));
}
@Test
public void nullValue_shouldHaveDifferentIdentity() throws Exception {
Workout workout2 = new BasicWorkout();
assertThat(workout, not(equalTo(workout2)));
assertThat(workout.hashCode(), not(equalTo(workout2.hashCode())));
}
@Test
@SuppressWarnings("EqualsBetweenInconvertibleTypes")
public void differntObject_shouldHaveDifferentIdentity() throws Exception {
workout.setWorkoutId(new WorkoutId("42"));
assertThat(workout.equals("42"), is(false));
}
@Test
public void getId_shouldReturnId() throws Exception {
WorkoutId id = new WorkoutId("42");
workout.setWorkoutId(id);
assertThat(workout.getWorkoutId(), equalTo(id));
}
@Test
public void nullValue_shouldSetNameToEmptyString() throws Exception {
workout.setName(null);
assertThat(workout.getName(), equalTo(""));
}
@Test
public void getName_shouldReturnName() throws Exception {
String name = "NameOfWorkout";
workout.setName(name);
assertThat(workout.getName(), equalTo(name));
}
@Test
public void setNameWithSpace_shouldSetTrimedName() throws Exception {
String name = " newName ";
workout.setName(name);
assertThat(workout.getName(), equalTo("newName"));
}
@Test(expected = ExerciseException.class)
public void indexOfCurrentExercise_shouldThrowExerciseNotFoundException() throws Exception {
workout.getExercises().indexOfCurrentExercise();
}
@Test(expected = ExerciseException.class)
public void setCurrentExercise_shouldThrowExerciseNotFoundException() throws Exception {
workout.getExercises().setCurrentExercise(0);
}
@Test(expected = ExerciseException.class)
public void setCurrentExerciseToNegativ_shouldThrowExerciseNotFoundException() throws Exception {
workout.getExercises().setCurrentExercise(-1);
}
@Test
public void setCurrentExercise_shouldReturnIndexOfCurrentExercise() throws Exception {
workout.getExercises().createExercise();
workout.getExercises().setCurrentExercise(0);
assertThat(workout.getExercises().indexOfCurrentExercise(), equalTo(0));
}
@Test
public void exercisesOfWorkout_shouldReturnExercises() throws Exception {
Exercise exercise = workout.getExercises().createExercise();
Exercise exercise2 = workout.getExercises().createExercise();
assertThat(workout.getExercises(), containsInAnyOrder(exercise, exercise2));
}
@Test
public void toString_shouldReturnWorkoutInformations() throws Exception {
String name = "NameOfWorkout";
workout.setName(name);
assertThat(workout.toString(), equalTo("BasicWorkout [name=" + name + "]"));
WorkoutId workoutId = new WorkoutId("42");
workout.setWorkoutId(workoutId);
assertThat(workout.toString(), equalTo("BasicWorkout [name=" + name + ", workoutId=" + workoutId.toString() + "]"));
}
public class givenAnExerciseToMoveInWorkout {
private Exercise exercise;
@Before
public void setUp() throws Exception {
exercise = workout.getExercises().createExercise();
exercise.setName("ExerciseOne");
}
@Test(expected = ExerciseException.class)
public void moveUnknownExerciseUp_shouldThrowExerciseNotFoundException() throws Exception {
workout.getExercises().moveExerciseAtPositionUp(1);
}
@Test
public void moveFirstExerciseAtPositionUp_shouldDoNothing() throws Exception {
boolean moved = workout.getExercises().moveExerciseAtPositionUp(0);
assertThat(moved, is(false));
assertThat(workout.getExercises().get(0), equalTo(exercise));
}
@Test
public void moveExerciseAtPositionUp_shouldPlaceTheExerciseAtTheRightPosition() throws Exception {
Exercise exerciseToMove = workout.getExercises().createExercise();
exerciseToMove.setName("ExerciseTwo");
boolean moved = workout.getExercises().moveExerciseAtPositionUp(1);
assertThat(moved, is(true));
assertThat(workout.getExercises().get(0), equalTo(exerciseToMove));
}
@Test(expected = ExerciseException.class)
public void moveUnknownExerciseDown_shouldThrowExerciseNotFoundException() throws Exception {
workout.getExercises().moveExerciseAtPositionDown(-1);
}
@Test
public void moveLastExerciseAtPositionDown_shouldDoNothing() throws Exception {
Exercise lastExercise = workout.getExercises().createExercise();
boolean moved = workout.getExercises().moveExerciseAtPositionDown(1);
assertThat(moved, is(false));
assertThat(workout.getExercises().get(1), equalTo(lastExercise));
}
@Test
public void moveExerciseAtPositionDown_shouldPlaceTheExerciseAtTheSecondPosition() throws Exception {
Exercise exerciseToMove = workout.getExercises().createExercise();
exerciseToMove.setName("ExerciseToMove");
Exercise lastExercise = workout.getExercises().createExercise();
lastExercise.setName("ExerciseLast");
boolean moved = workout.getExercises().moveExerciseAtPositionDown(1);
assertThat(moved, is(true));
assertThat(workout.getExercises().get(2), equalTo(exerciseToMove));
}
}
public class givenAWorkoutForExerciseManipulation {
@Test
public void countOfExercises_shouldReturnEmptyListOfExercisesOnConstruction() throws Exception {
assertThat(workout.getExercises().size(), equalTo(0));
}
@Test(expected = ExerciseException.class)
public void exerciseAtPosition_shouldThrowExerciseNotFoundException() throws Exception {
workout.getExercises().get(0);
}
@Test(expected = ExerciseException.class)
public void exerciseAtNegativePosition_shouldThrowExerciseNotFoundException() throws Exception {
workout.getExercises().get(-1);
}
@Test
public void createExercise_shouldAddExerciseToWorkout() throws Exception {
Exercise exercise = workout.getExercises().createExercise();
assertThat(workout.getExercises().size(), equalTo(1));
assertThat(workout.getExercises().get(0), equalTo(exercise));
}
@Test
public void removeExercise_shouldRemoveExerciseFromWorkout() throws Exception {
Exercise exercise = workout.getExercises().createExercise();
workout.getExercises().delete(exercise);
assertThat(workout.getExercises().size(), equalTo(0));
}
@Test
public void deleteExercise_shouldRemoveLastOfTwoExercisesAtPosition() throws Exception {
Exercise exercise = workout.getExercises().createExercise();
Exercise exerciseToDelete = workout.getExercises().createExercise();
workout.getExercises().delete(exerciseToDelete);
assertThat(workout.getExercises().size(), equalTo(1));
assertThat(workout.getExercises().get(0), equalTo(exercise));
}
@Test
public void deleteExerciseClone_shouldRemoveExercises() throws Exception {
ExerciseId exerciseId = new ExerciseId("42");
Exercise exercise = workout.getExercises().createExercise();
exercise.setExerciseId(exerciseId);
Exercise clonedExercise = new BasicExercise();
clonedExercise.setExerciseId(exerciseId);
workout.getExercises().delete(clonedExercise);
assertThat(workout.getExercises().size(), equalTo(0));
}
@Test
public void deleteExercise_shouldRemoveFirstOfTwoExercisesAtPosition() throws Exception {
Exercise exerciseToDelete = workout.getExercises().createExercise();
Exercise exercise = workout.getExercises().createExercise();
workout.getExercises().delete(exerciseToDelete);
assertThat(workout.getExercises().size(), equalTo(1));
assertThat(workout.getExercises().get(0), equalTo(exercise));
}
@Test
public void deleteExercise_shouldDoNothingWhenIndexIsOutOfBounce() throws Exception {
workout.getExercises().delete(mock(Exercise.class));
}
public class givenAnExerciseProgress {
@Test
public void getProgress_shouldReturnZeroProgress() throws Exception {
workout.getExercises().createExercise();
assertThat(workout.getProgress(0), equalTo(0.0));
}
@Test
public void getProgress_shouldReturnFullProgress() throws Exception {
workout.getExercises().createExercise();
Exercise exercise = workout.getExercises().createExercise();
Set set = exercise.getSets().createSet();
set.setMaxReps(1);
set.setReps(1);
assertThat(workout.getProgress(1), equalTo(1.0));
}
@Test
public void getProgress_shouldReturn1point5() throws Exception {
workout.getExercises().createExercise();
Exercise exercise = workout.getExercises().createExercise();
Set set = exercise.getSets().createSet();
set.setMaxReps(2);
set.setReps(1);
assertThat(workout.getProgress(1), equalTo(0.75));
}
}
public class memento {
@Test
public void null_shouldNotChangeExercises() throws Exception {
workout.setMemento(null);
Java6Assertions.assertThat(workout.getExercises()).isEmpty();
}
@Test
public void anExercisesDeletedAfterMemento_shouldUndDeletionBySetMemento() throws Exception {
Exercise exercise = workout.getExercises().createExercise();
WorkoutMemento memento = workout.createMemento();
workout.getExercises().delete(exercise);
workout.setMemento(memento);
Java6Assertions.assertThat(workout.getExercises()).containsExactly(exercise);
}
}
}
}