Skip to content

feat: adds StrengthMachine class including tests and a custom exception #495

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Apr 11, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.codedifferently.lesson16.strengthMachine;

public class MachineInUseException extends RuntimeException {
public MachineInUseException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
package com.codedifferently.lesson16.strengthMachine;

import java.util.ArrayList;

public class StrengthMachine {
private String name;
private int currentWeight;
private boolean inUse;
private ArrayList<String> safetyTips;
private MuscleGroup targetMuscle;

public enum MuscleGroup {
SHOULDERS,
CHEST,
ARMS,
LEGS,
BACK
}

public StrengthMachine(
String name,
int currentWeight,
boolean inUse,
ArrayList<String> safetyTips,
MuscleGroup targetMuscle) {
this.name = name;
this.currentWeight = currentWeight;
this.inUse = inUse;
this.safetyTips = safetyTips;
this.targetMuscle = targetMuscle;
}

public StrengthMachine(String name, MuscleGroup targetMuscle) {
this.name = name;
this.currentWeight = 5;
this.inUse = false;
this.safetyTips = new ArrayList<>();
this.targetMuscle = targetMuscle;
}

public boolean isAvailable() {
return !inUse;
}

public void increaseWeightGradually(int targetWeight) {
while (currentWeight < targetWeight) {
currentWeight += 5;
}
}

public void addSafetyTip(String tip) {
safetyTips.add(tip);
}

public void useMachine() {
if (isAvailable()) {
inUse = true;
} else {
throw new MachineInUseException("Cannot use - Machine currently in use");
}
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getCurrentWeight() {
return currentWeight;
}

public void setCurrentWeight(int currentWeight) {
this.currentWeight = currentWeight;
}

public boolean getInUse() {
return inUse;
}

public void setInUse(boolean inUse) {
this.inUse = inUse;
}

public ArrayList<String> getSafetyTips() {
return safetyTips;
}

public void setSafetyTips(ArrayList<String> safetyTips) {
this.safetyTips = safetyTips;
}

public MuscleGroup getTargetMuscle() {
return targetMuscle;
}

public void setTargetMuscle(MuscleGroup targetMuscle) {
this.targetMuscle = targetMuscle;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
package com.codedifferently.lesson16.strengthMachineTest;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

import com.codedifferently.lesson16.strengthMachine.MachineInUseException;
import com.codedifferently.lesson16.strengthMachine.StrengthMachine;
import com.codedifferently.lesson16.strengthMachine.StrengthMachine.MuscleGroup;
import java.util.ArrayList;
import java.util.Arrays;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class StrengthMachineTest {

StrengthMachine strengthMachine;

@BeforeEach
void setUp() {
strengthMachine =
new StrengthMachine(
"Leg Press",
100,
false,
new ArrayList<>(Arrays.asList("Keep back straight.", "Use a spotter for heavy lifts.")),
StrengthMachine.MuscleGroup.LEGS);
}

@Test
public void testIsAvailableTrue() {
assertTrue(strengthMachine.isAvailable());
}

@Test
public void testIsAvailableFalse() {
strengthMachine.useMachine();
assertFalse(strengthMachine.isAvailable());
}

@Test
public void testIncreaseWeightGradually() {
strengthMachine.increaseWeightGradually(125);
int actual = strengthMachine.getCurrentWeight();
assertThat(actual).isEqualTo(125);
}

@Test
public void testAddSafetyTip() {
strengthMachine.addSafetyTip("Do not lock your joints.");
assertThat(strengthMachine.getSafetyTips().size()).isEqualTo(3);
}

@Test
public void testUseMachineAvailable() {
strengthMachine.useMachine();
assertFalse(strengthMachine.isAvailable());
}

@Test
public void testUseMachineException() {
strengthMachine.useMachine();

assertThatThrownBy(() -> strengthMachine.useMachine())
.isInstanceOf(MachineInUseException.class)
.hasMessage("Cannot use - Machine currently in use");
}

@Test
public void testGetName() {
// Act
String actual = strengthMachine.getName();

// Assert
assertThat(actual).isEqualTo("Leg Press");
}

@Test
public void testSetName() {
// Act
strengthMachine.setName("Leg Curl");
String actual = strengthMachine.getName();

// Assert
assertThat(actual).isEqualTo("Leg Curl");
}

@Test
public void testGetCurrentWeight() {
// Act
int actual = strengthMachine.getCurrentWeight();

// Assert
assertThat(actual).isEqualTo(100);
}

@Test
public void testSetCurrentWeight() {
// Act
strengthMachine.setCurrentWeight(150);
int actual = strengthMachine.getCurrentWeight();

// Assert
assertThat(actual).isEqualTo(150);
}

@Test
public void testGetInUse() {
// Act
boolean actual = strengthMachine.getInUse();

// Assert
assertThat(actual).isEqualTo(false);
}

@Test
public void testSetInUse() {
// Act
strengthMachine.setInUse(true);
boolean actual = strengthMachine.getInUse();

// Assert
assertThat(actual).isEqualTo(true);
}

@Test
public void testGetSafetyTips() {
// Act
ArrayList<String> actual = strengthMachine.getSafetyTips();

// Assert
assertThat(actual.size()).isEqualTo(2);
assertThat(actual.get(0)).isEqualTo("Keep back straight.");
assertThat(actual.get(1)).isEqualTo("Use a spotter for heavy lifts.");
}

@Test
public void testSetSafetyTips() {
// Arrange
ArrayList<String> newTips =
new ArrayList<>(Arrays.asList("Bend knees slightly.", "Do not lock your joints."));
// Act
strengthMachine.setSafetyTips(newTips);
ArrayList<String> actual = strengthMachine.getSafetyTips();

// Assert
assertThat(actual.size()).isEqualTo(2);
assertThat(actual.get(0)).isEqualTo("Bend knees slightly.");
assertThat(actual.get(1)).isEqualTo("Do not lock your joints.");
}

@Test
public void testGetTargetMuscle() {
// Act
MuscleGroup actual = strengthMachine.getTargetMuscle();

// Assert
assertThat(actual).isEqualTo(StrengthMachine.MuscleGroup.LEGS);
}

@Test
public void testSetTargetMuscle() {
// Act
strengthMachine.setTargetMuscle(StrengthMachine.MuscleGroup.BACK);
MuscleGroup actual = strengthMachine.getTargetMuscle();

// Assert
assertThat(actual).isEqualTo(StrengthMachine.MuscleGroup.BACK);
}
}