/*
We are building a program to manage a gym's membership. The gym has multiple members, each with a unique ID, name, and membership status. The program allows gym staff to add new members, update members status, and get membership statistics.
Definitions:
* A "member" is an object that represents a gym member. It has properties for the ID, name, and membership status.
* A "membership" is a class which is used for managing members in the gym.
To begin with, we present you with two tasks:
1-1) Read through and understand the code below. Please take as much time as necessary, and feel free to run the code.
1-2) The test for Membership is not passing due to a bug in the code. Make the necessary changes to Membership to fix the bug.
*/
import java.util.*;
import org.junit.Test;
import static org.junit.Assert.*;
enum MembershipStatus {
/*
Membership Status is of three types: BASIC, PRO and ELITE.
BASIC is the default membership a new member gets.
PRO and ELITE are paid memberships for the gym.
*/
BASIC,
PRO,
ELITE
}
/* Data about a gym member.*/
public int memberId;
public MembershipStatus membershipStatus;
public Member(int memberId,
String name, MembershipStatus membershipStatus
) { this.memberId = memberId;
this.name = name;
this.membershipStatus = membershipStatus;
}
@Override
return "Member ID: " + memberId + ", Name: " + name + ", Membership Status: " + membershipStatus;
}
}
class Membership {
/*
Data for managing a gym membership, and methods which staff can
use to perform any queries or updates.
*/
public List<Member> members;
public Membership() {
members = new ArrayList<>();
}
public void addMember
(Member member
) { members.add(member);
}
public void updateMembership(int memberId, MembershipStatus membershipStatus) {
for (Member member
: members
) { if (member.memberId == memberId) {
member.membershipStatus = membershipStatus;
break;
}
}
}
public MembershipStatistics getMembershipStatistics() {
int totalMembers = members.size();
int totalPaidMembers = 0;
for (Member member
: members
) { if (member.membershipStatus == MembershipStatus.PRO) {
totalPaidMembers++;
}
}
double conversionRate = (totalPaidMembers / (double) totalMembers) * 100.0;
return new MembershipStatistics(totalMembers, totalPaidMembers, conversionRate);
}
}
class MembershipStatistics {
/*
Class for returning the getMembershipStatistics result
*/
public int totalMembers;
public int totalPaidMembers;
public double conversionRate;
public MembershipStatistics(int totalMembers, int totalPaidMembers, double conversionRate) {
this.totalMembers = totalMembers;
this.totalPaidMembers = totalPaidMembers;
this.conversionRate = conversionRate;
}
}
class Ideone {
/*
This is not a complete test suite, but tests some basic functionality of
the code and shows how to use it.
*/
public static void main
(String[] args
) { testMember();
testMembership();
}
public static void testMember() {
System.
out.
println("Running testMember"); Member testMember
= new Member(1,
"John Doe", MembershipStatus.
BASIC); assert testMember.memberId == 1;
assert testMember.name.equals("John Doe");
assert testMember.membershipStatus == MembershipStatus.BASIC;
}
public static void testMembership() {
System.
out.
println("Running testMembership"); Membership testMembership = new Membership();
Member testMember
= new Member(1,
"John Doe", MembershipStatus.
BASIC); testMembership.addMember(testMember);
assert testMembership.members.size() == 1;
assert testMembership.members.get(0).equals(testMember);
testMembership.updateMembership(1, MembershipStatus.PRO);
assert testMembership.members.get(0).membershipStatus == MembershipStatus.PRO;
Member testMember2
= new Member(2,
"Alex C", MembershipStatus.
BASIC); testMembership.addMember(testMember2);
Member testMember3
= new Member(3,
"Marie C", MembershipStatus.
ELITE); testMembership.addMember(testMember3);
Member testMember4
= new Member(4,
"Joe D", MembershipStatus.
PRO); testMembership.addMember(testMember4);
MembershipStatistics attendanceStats = testMembership.getMembershipStatistics();
assert attendanceStats.totalMembers == 4;
assert attendanceStats.totalPaidMembers == 3;
assert Math.
abs(attendanceStats.
conversionRate - 75.00) < 0.1; }
}