diff options
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; |