Skip to content
This repository has been archived by the owner on Apr 16, 2024. It is now read-only.

Commit

Permalink
[ch05] Refactored.
Browse files Browse the repository at this point in the history
  • Loading branch information
dhsim86 committed Sep 2, 2017
1 parent c46c3cd commit e1eed87
Show file tree
Hide file tree
Showing 5 changed files with 111 additions and 33 deletions.
39 changes: 22 additions & 17 deletions src/main/java/ch01/springbook/user/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@

public class UserService {

public static final int MIN_LOGCOUNT_FOR_SILVER = 50;
public static final int MIN_RECOMMEND_FOR_GOLD = 30;

UserDao userDao;

public void setUserDao(UserDao userDao) {
Expand All @@ -20,23 +23,8 @@ public void upgradeLevels() {

for (User user : userList) {

Boolean changed = null;

if (user.getLevel() == Level.BASIC && user.getLogin() >= 50) {
user.setLevel(Level.SILVER);
changed = true;

} else if (user.getLevel() == Level.SILVER && user.getRecommend() >= 30) {
user.setLevel(Level.GOLD);
changed = true;
} else if (user.getLevel() == Level.GOLD) {
changed = false;
} else {
changed = false;
}

if (changed) {
userDao.update(user);
if (canUpgradeLevel(user) == true) {
upgradeLevel(user);
}
}
}
Expand All @@ -48,4 +36,21 @@ public void add(User user) {

userDao.add(user);
}

private boolean canUpgradeLevel(User user) {

Level currentLevel = user.getLevel();

switch (currentLevel) {
case BASIC: return (user.getLogin() >= MIN_LOGCOUNT_FOR_SILVER);
case SILVER: return (user.getRecommend() >= MIN_RECOMMEND_FOR_GOLD);
case GOLD: return false;
default: throw new IllegalArgumentException("Unknown level: " + currentLevel);
}
}

private void upgradeLevel(User user) {
user.upgradeLevel();
userDao.update(user);
}
}
14 changes: 10 additions & 4 deletions src/main/java/ch01/springbook/user/domain/Level.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,26 @@

public enum Level {

BASIC(1),
SILVER(2),
GOLD(3);
GOLD(3, null),
SILVER(2, GOLD),
BASIC(1, SILVER);

private final int value;
private final Level next;

private Level(int value) {
private Level(int value, Level next) {
this.value = value;
this.next = next;
}

public int intValue() {
return value;
}

public Level nextLevel() {
return this.next;
}

public static Level valueOf(int value) {
switch(value) {
case 1: return BASIC;
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/ch01/springbook/user/domain/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,16 @@ public int getRecommend() {
public void setRecommend(int recommend) {
this.recommend = recommend;
}

public void upgradeLevel() {

Level nextLevel = level.nextLevel();

if (nextLevel == null) {
throw new IllegalStateException(level + " can not upgrade.");
} else {
level = nextLevel;
}

}
}
32 changes: 20 additions & 12 deletions src/test/java/ch01/springbook/user/UserServiceTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package ch01.springbook.user;

import static ch01.springbook.user.UserService.MIN_LOGCOUNT_FOR_SILVER;
import static ch01.springbook.user.UserService.MIN_RECOMMEND_FOR_GOLD;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
Expand Down Expand Up @@ -34,11 +36,11 @@ public class UserServiceTest {
public void setUp() {

userList = Arrays.asList(
new User("test01", "test", "no1", Level.BASIC, 49, 0),
new User("test02", "test", "no2", Level.BASIC, 50, 0),
new User("test03", "test", "no3", Level.SILVER, 60, 29),
new User("test04", "test", "no3", Level.SILVER, 60, 30),
new User("test05", "test", "no3", Level.GOLD, 100, 100)
new User("test01", "test", "no1", Level.BASIC, MIN_LOGCOUNT_FOR_SILVER - 1, 0),
new User("test02", "test", "no2", Level.BASIC, MIN_LOGCOUNT_FOR_SILVER, 0),
new User("test03", "test", "no3", Level.SILVER, 60, MIN_RECOMMEND_FOR_GOLD - 1),
new User("test04", "test", "no3", Level.SILVER, 60, MIN_RECOMMEND_FOR_GOLD),
new User("test05", "test", "no3", Level.GOLD, 100, Integer.MAX_VALUE)
);
}

Expand All @@ -58,11 +60,11 @@ public void upgradeLevels() {

userService.upgradeLevels();

checkLevel(userList.get(0), Level.BASIC);
checkLevel(userList.get(1), Level.SILVER);
checkLevel(userList.get(2), Level.SILVER);
checkLevel(userList.get(3), Level.GOLD);
checkLevel(userList.get(4), Level.GOLD);
checkLevelUpgraded(userList.get(0), false);
checkLevelUpgraded(userList.get(1), true);
checkLevelUpgraded(userList.get(2), false);
checkLevelUpgraded(userList.get(3), true);
checkLevelUpgraded(userList.get(4), false);
}

@Test
Expand All @@ -84,8 +86,14 @@ public void add() {
assertThat(userWithoutLevelRead.getLevel(), is(Level.BASIC));
}

private void checkLevel(User user, Level expectedLevel) {
private void checkLevelUpgraded(User user, boolean upgraded) {

User userUpdate = userDao.get(user.getId());
assertThat(userUpdate.getLevel(), is(expectedLevel));

if (upgraded) {
assertThat(userUpdate.getLevel(), is(user.getLevel().nextLevel()));
} else {
assertThat(userUpdate.getLevel(), is(user.getLevel()));
}
}
}
47 changes: 47 additions & 0 deletions src/test/java/ch01/springbook/user/UserTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package ch01.springbook.user;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import org.junit.Before;
import org.junit.Test;

import ch01.springbook.user.domain.Level;
import ch01.springbook.user.domain.User;

public class UserTest {

User user;

@Before
public void setUp() {
user = new User();
}

@Test
public void upgradeLevel() {

Level[] levels = Level.values();

for (Level level : levels) {
if (level.nextLevel() == null) continue;

user.setLevel(level);
user.upgradeLevel();
assertThat(user.getLevel(), is(level.nextLevel()));
}
}

@Test(expected = IllegalStateException.class)
public void cannotUpgradeLevel() {
Level[] levels = Level.values();

for (Level level : levels) {
if (level.nextLevel() != null) continue;

user.setLevel(level);
user.upgradeLevel();
assertThat(user.getLevel(), is(level.nextLevel()));
}
}
}

0 comments on commit e1eed87

Please sign in to comment.