summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/com/p4square/grow/backend/resources/TrainingRecordResource.java36
-rw-r--r--src/com/p4square/grow/model/Score.java46
-rw-r--r--tst/com/p4square/grow/backend/resources/TrainingRecordResourceTest.java8
-rw-r--r--tst/com/p4square/grow/model/ScoreTest.java34
4 files changed, 81 insertions, 43 deletions
diff --git a/src/com/p4square/grow/backend/resources/TrainingRecordResource.java b/src/com/p4square/grow/backend/resources/TrainingRecordResource.java
index 4403b12..51ba56a 100644
--- a/src/com/p4square/grow/backend/resources/TrainingRecordResource.java
+++ b/src/com/p4square/grow/backend/resources/TrainingRecordResource.java
@@ -174,25 +174,35 @@ public class TrainingRecordResource extends ServerResource {
return null;
}
+ private Score getAssessedScore(String userId) throws IOException {
+ // Get the user's score.
+ Score assessedScore = new Score(0, 0);
+
+ String summaryString = mAnswerProvider.get(userId, "summary");
+ if (summaryString == null) {
+ throw new IOException("Asked to create training record for unassessed user " + userId);
+ }
+
+ Map<?,?> summary = MAPPER.readValue(summaryString, Map.class);
+
+ if (summary.containsKey("sum") && summary.containsKey("count")) {
+ double sum = (Double) summary.get("sum");
+ int count = (Integer) summary.get("count");
+ assessedScore = new Score(sum, count);
+ }
+
+ return assessedScore;
+ }
+
/**
* Mark the chapters which the user assessed through as not required.
*/
private void skipAssessedChapters(String userId, TrainingRecord record) {
// Get the user's score.
- double assessedScore = 0;
+ Score assessedScore = new Score(0, 0);
try {
- String summaryString = mAnswerProvider.get(userId, "summary");
- if (summaryString == null) {
- LOG.warn("Asked to create training record for unassessed user " + userId);
- return;
- }
- Map<?,?> summary = MAPPER.readValue(summaryString, Map.class);
-
- if (summary.containsKey("score")) {
- assessedScore = (Double) summary.get("score");
- }
-
+ assessedScore = getAssessedScore(userId);
} catch (IOException e) {
LOG.error("IOException fetching assessment record for " + userId, e);
return;
@@ -212,7 +222,7 @@ public class TrainingRecordResource extends ServerResource {
} else {
// Chapter required if the floor of the score is <= the chapter's numeric value.
- required = Math.floor(assessedScore) <= Score.numericScore(chapterId);
+ required = assessedScore.floor() <= Score.numericScore(chapterId);
}
if (!required) {
diff --git a/src/com/p4square/grow/model/Score.java b/src/com/p4square/grow/model/Score.java
index f7920dd..82f26c9 100644
--- a/src/com/p4square/grow/model/Score.java
+++ b/src/com/p4square/grow/model/Score.java
@@ -11,17 +11,20 @@ package com.p4square.grow.model;
*/
public class Score {
/**
- * Return the integer value for the given Score String.
+ * Return the decimal value for the given Score String.
+ *
+ * This method satisfies the invariant for Score x:
+ * numericScore(x.toString()) <= x.getScore()
*/
- public static int numericScore(String score) {
+ public static double numericScore(String score) {
if ("teacher".equals(score)) {
- return 4;
+ return 3.5;
} else if ("disciple".equals(score)) {
- return 3;
+ return 2.5;
} else if ("believer".equals(score)) {
- return 2;
+ return 1.5;
} else if ("seeker".equals(score)) {
- return 1;
+ return 0;
} else {
return Integer.MAX_VALUE;
}
@@ -35,6 +38,11 @@ public class Score {
count = 0;
}
+ public Score(double sum, int count) {
+ this.sum = sum;
+ this.count = count;
+ }
+
/**
* Copy Constructor.
*/
@@ -68,17 +76,37 @@ public class Score {
return sum / count;
}
+ /**
+ * @return the lowest score in the same category as this score.
+ */
+ public double floor() {
+ final double score = getScore();
+
+ if (score >= 3.5) {
+ return 3.5; // teacher
+
+ } else if (score >= 2.5) {
+ return 2.5; // disciple
+
+ } else if (score >= 1.5) {
+ return 1.5; // believer
+
+ } else {
+ return 0; // seeker
+ }
+ }
+
@Override
public String toString() {
final double score = getScore();
- if (score >= 4) {
+ if (score >= 3.5) {
return "teacher";
- } else if (score >= 3) {
+ } else if (score >= 2.5) {
return "disciple";
- } else if (score >= 2) {
+ } else if (score >= 1.5) {
return "believer";
} else {
diff --git a/tst/com/p4square/grow/backend/resources/TrainingRecordResourceTest.java b/tst/com/p4square/grow/backend/resources/TrainingRecordResourceTest.java
index 8fec4c8..db85051 100644
--- a/tst/com/p4square/grow/backend/resources/TrainingRecordResourceTest.java
+++ b/tst/com/p4square/grow/backend/resources/TrainingRecordResourceTest.java
@@ -67,7 +67,7 @@ public class TrainingRecordResourceTest extends ResourceTestBase {
@Test
public void testSkipAssessedChaptersLow() throws Exception {
// Set the User's score.
- mApplication.getAnswerProvider().put(USER_ID, "summary", "{\"score\": 0.0}");
+ mApplication.getAnswerProvider().put(USER_ID, "summary", "{\"sum\": 0.0, \"count\": 1}");
// Run the test
TrainingRecord record = run(TrainingRecord.class);
@@ -86,7 +86,7 @@ public class TrainingRecordResourceTest extends ResourceTestBase {
@Test
public void testSkipAssessedChaptersSeeker() throws Exception {
// Set the User's score.
- mApplication.getAnswerProvider().put(USER_ID, "summary", "{\"score\": 1.0}");
+ mApplication.getAnswerProvider().put(USER_ID, "summary", "{\"sum\": 1.0, \"count\": 1}");
// Run the test
TrainingRecord record = run(TrainingRecord.class);
@@ -105,7 +105,7 @@ public class TrainingRecordResourceTest extends ResourceTestBase {
@Test
public void testSkipAssessedChaptersBeliever() throws Exception {
// Set the User's score.
- mApplication.getAnswerProvider().put(USER_ID, "summary", "{\"score\": 2.0}");
+ mApplication.getAnswerProvider().put(USER_ID, "summary", "{\"sum\": 2.0, \"count\": 1}");
// Run the test
TrainingRecord record = run(TrainingRecord.class);
@@ -124,7 +124,7 @@ public class TrainingRecordResourceTest extends ResourceTestBase {
@Test
public void testSkipAssessedChaptersHigh() throws Exception {
// Set the User's score.
- mApplication.getAnswerProvider().put(USER_ID, "summary", "{\"score\": 4.0}");
+ mApplication.getAnswerProvider().put(USER_ID, "summary", "{\"sum\": 4.0, \"count\": 1}");
// Run the test
TrainingRecord record = run(TrainingRecord.class);
diff --git a/tst/com/p4square/grow/model/ScoreTest.java b/tst/com/p4square/grow/model/ScoreTest.java
index dd3522a..5c7be46 100644
--- a/tst/com/p4square/grow/model/ScoreTest.java
+++ b/tst/com/p4square/grow/model/ScoreTest.java
@@ -57,10 +57,10 @@ public class ScoreTest {
*/
@Test
public void testNumericScore() {
- assertEquals(4, Score.numericScore("teacher"));
- assertEquals(3, Score.numericScore("disciple"));
- assertEquals(2, Score.numericScore("believer"));
- assertEquals(1, Score.numericScore("seeker"));
+ assertEquals(3.5, Score.numericScore("teacher"), DELTA);
+ assertEquals(2.5, Score.numericScore("disciple"), DELTA);
+ assertEquals(1.5, Score.numericScore("believer"), DELTA);
+ assertEquals(0, Score.numericScore("seeker"), DELTA);
}
/**
@@ -70,35 +70,35 @@ public class ScoreTest {
public void testToString() {
mScore.count = 1;
- // Seeker is defined as score < 2
+ // Seeker is defined as score < 1.5
mScore.sum = 0;
assertEquals("seeker", mScore.toString());
mScore.sum = 0.5;
assertEquals("seeker", mScore.toString());
mScore.sum = 1;
assertEquals("seeker", mScore.toString());
- mScore.sum = 1.5;
- assertEquals("seeker", mScore.toString());
- mScore.sum = 1.99;
+ mScore.sum = 1.49;
assertEquals("seeker", mScore.toString());
- // Believer is defined as 2 <= score < 3
- mScore.sum = 2;
+ // Believer is defined as 1.5 <= score < 2.5
+ mScore.sum = 1.5;
assertEquals("believer", mScore.toString());
- mScore.sum = 2.5;
+ mScore.sum = 2;
assertEquals("believer", mScore.toString());
- mScore.sum = 2.99;
+ mScore.sum = 2.49;
assertEquals("believer", mScore.toString());
- // Disciple is defined as 3 <= score < 4
- mScore.sum = 3;
+ // Disciple is defined as 2.5 <= score < 3.5
+ mScore.sum = 2.5;
assertEquals("disciple", mScore.toString());
- mScore.sum = 3.5;
+ mScore.sum = 3;
assertEquals("disciple", mScore.toString());
- mScore.sum = 3.99;
+ mScore.sum = 3.49;
assertEquals("disciple", mScore.toString());
- // Teacher is defined as 4 <= score
+ // Teacher is defined as 3.5 <= score
+ mScore.sum = 3.5;
+ assertEquals("teacher", mScore.toString());
mScore.sum = 4;
assertEquals("teacher", mScore.toString());
mScore.sum = 4.5;