Skip to content

Commit

Permalink
Merge pull request #34 from GledsonAfonso/master
Browse files Browse the repository at this point in the history
Adding pace calculation to SpeedCalculator (issue #15)
  • Loading branch information
Marcel authored Nov 9, 2019
2 parents 47b26d8 + 64c77a3 commit 9e77b79
Show file tree
Hide file tree
Showing 7 changed files with 191 additions and 7 deletions.
9 changes: 9 additions & 0 deletions src/main/java/segelzwerg/sporttooolbox/IUnits/Distance.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,13 @@ public Distance addDistance(Distance toAdd)
public Speed computeSpeed(Time time) {
return time.computeSpeed(kilometer, meter);
}

/**
* Compute pace given a specific time
* @param time amount of time
* @return calculated pace
*/
public Pace computePace(Time time) {
return time.computePace(kilometer, meter);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package segelzwerg.sporttooolbox.IUnits;

import lombok.EqualsAndHashCode;

/**
* Pace of minutes per hundred meters
*/
@EqualsAndHashCode
public class MinutesPerHundredMeters implements Pace {
private final float pace;

public MinutesPerHundredMeters(float pace) {
this.pace = pace;
}

/**
* Converting to minutes per kilometers
* @return Pace instance with a converted numeric value
*/
@Override
public Pace toMinutesPerKilometer() {
return new MinutesPerKilometer(pace * PER_HUNDRED_METER_TO_PER_KILOMETER);
}

/**
* Converting to minutes per hundred meters
* @return itself, since there's no conversion to be made
*/
@Override
public Pace toMinutesPerHundredMeters() {
return this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package segelzwerg.sporttooolbox.IUnits;

import lombok.EqualsAndHashCode;

/**
* Pace of minutes per kilometers
*/
@EqualsAndHashCode
public class MinutesPerKilometer implements Pace {
private final float pace;

public MinutesPerKilometer(float pace) {
this.pace = pace;
}

/**
* Converting to minutes per kilometers
* @return itself, since there's no conversion to be made
*/
@Override
public Pace toMinutesPerKilometer() {
return this;
}

/**
* Converting to minutes per hundred meters
* @return Pace instance with a converted numeric value
*/
@Override
public Pace toMinutesPerHundredMeters() {
return new MinutesPerHundredMeters(pace * PER_KILOMETER_TO_PER_HUNDRED_METER);
}
}
22 changes: 22 additions & 0 deletions src/main/java/segelzwerg/sporttooolbox/IUnits/Pace.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package segelzwerg.sporttooolbox.IUnits;

/**
* Pace interface
*/
public interface Pace {
float KILO = 1000.0f;
float PER_KILOMETER_TO_PER_HUNDRED_METER = 0.1f;
float PER_HUNDRED_METER_TO_PER_KILOMETER = 10.0f;

/**
* Converts to minutes per kilometers
* @return an instance of Pace
*/
Pace toMinutesPerKilometer();

/**
* Converts to minutes per hundred-meters
* @return an instance of Pace
*/
Pace toMinutesPerHundredMeters();
}
32 changes: 30 additions & 2 deletions src/main/java/segelzwerg/sporttooolbox/IUnits/Time.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package segelzwerg.sporttooolbox.IUnits;
import lombok.EqualsAndHashCode;
/**
* Time in hours
* Time in hours, minutes and second
*/
@EqualsAndHashCode(of = "seconds")
public class Time {
Expand Down Expand Up @@ -29,6 +29,34 @@ public Time(int hour, int minutes, int seconds) {
* @return calculated speed
*/
public Speed computeSpeed(float kilometer, float meter) {
return new KilometerPerHour(3_600f * (kilometer + meter / 1000) / seconds);
return new KilometerPerHour(3_600f * getMeters(kilometer, meter) / seconds);
}

/**
* Compute pace given some distances
* @param kilometer amount of kilometers
* @param meter amout of meters
* @return calculated pace
*/
public Pace computePace(float kilometer, float meter) {
return new MinutesPerKilometer(getMinutes() / getMeters(kilometer, meter));
}

/**
* Get meters from parameters
* @param kilometer amount of kilometers
* @param meter amount of meters
* @return numeric representation of meters
*/
private float getMeters(float kilometer, float meter) {
return (kilometer + meter / 1000);
}

/**
* Get minutes from class properties
* @return numeric representation of minutes
*/
private float getMinutes() {
return seconds / 60.0f;
}
}
9 changes: 9 additions & 0 deletions src/main/java/segelzwerg/sporttooolbox/SpeedCalculator.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package segelzwerg.sporttooolbox;

import segelzwerg.sporttooolbox.IUnits.Distance;
import segelzwerg.sporttooolbox.IUnits.Pace;
import segelzwerg.sporttooolbox.IUnits.Speed;
import segelzwerg.sporttooolbox.IUnits.Time;

Expand All @@ -25,5 +26,13 @@ public SpeedCalculator(Distance distance, Time time) {
public Speed computeSpeed() {
return distance.computeSpeed(time);
}

/**
* Compute pace
* @return calculated pace
*/
public Pace computePace() {
return distance.computePace(time);
}
}

60 changes: 55 additions & 5 deletions src/test/java/segelzwerg/sporttooolbox/SpeedCalculatorTest.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package segelzwerg.sporttooolbox;

import org.junit.Test;
import segelzwerg.sporttooolbox.IUnits.Distance;
import segelzwerg.sporttooolbox.IUnits.KilometerPerHour;
import segelzwerg.sporttooolbox.IUnits.Speed;
import segelzwerg.sporttooolbox.IUnits.Time;
import segelzwerg.sporttooolbox.IUnits.*;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
Expand Down Expand Up @@ -52,4 +49,57 @@ public void fifteen_kilometer_half_hour_test_speed() {

assertThat(speed, equalTo(expectedSpeed));
}
}

/**
* Use Case 3
* Distance: 1 km
* Time: 1 hour, 1 minute and 3 seconds
* Expected Pace: 61.05 min / km
* @result the computed result is 61.05
*/
@Test
public void one_kilometer_ran_through_one_hour_one_minute_and_three_seconds_should_generate_sixty_one_dot_zero_five_minutes_per_kilometer() {
Distance distance = new Distance(1);
Time time = new Time(1, 1, 3);
SpeedCalculator speedCalculator = new SpeedCalculator(distance, time);
Pace expectedPace = new MinutesPerKilometer(61.05f);

Pace pace = speedCalculator.computePace();

assertThat(pace, equalTo(expectedPace));
}

/**
* Use Case 4
* Distance: 1 km
* Time: 1 hour, 1 minute and 3 seconds
* Expected Pace: 6.105 min / 100m
* @result the converted result is 6.105
*/
@Test
public void converting_minutes_per_kilometer_to_minutes_per_hundred_meters_should_work() {
Distance distance = new Distance(1);
Time time = new Time(1, 1, 3);
SpeedCalculator speedCalculator = new SpeedCalculator(distance, time);
Pace expectedPace = new MinutesPerHundredMeters(6.105f);

Pace pace = speedCalculator.computePace().toMinutesPerHundredMeters();

assertThat(pace, equalTo(expectedPace));
}

/**
* Use Case 5
* Distance: 1 km
* Time: 1 hour, 1 minute and 3 seconds
* Expected Pace: 61.05 min / km
* @result the converted result is 61.05
*/
@Test
public void converting_minutes_per_hundred_meters_to_minutes_per_kilometers_should_work() {
Pace expectedPace = new MinutesPerKilometer(61.05f);
Pace pace = new MinutesPerHundredMeters(6.105f).toMinutesPerKilometer();

assertThat(pace, equalTo(expectedPace));
}
}

0 comments on commit 9e77b79

Please sign in to comment.