diff --git a/src/aiunittests/java/MakeItFit/MakeItFitTest.java b/src/aiunittests/java/MakeItFit/MakeItFitTest.java index 7d62b92..643d4fa 100644 --- a/src/aiunittests/java/MakeItFit/MakeItFitTest.java +++ b/src/aiunittests/java/MakeItFit/MakeItFitTest.java @@ -4,15 +4,6 @@ import java.util.List; import java.util.UUID; -import org.junit.After; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import org.junit.Before; -import org.junit.Test; - import MakeItFit.activities.Activity; import MakeItFit.activities.implementation.PushUp; import MakeItFit.exceptions.EntityDoesNotExistException; @@ -21,6 +12,15 @@ import MakeItFit.users.Gender; import MakeItFit.users.User; import MakeItFit.utils.MakeItFitDate; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; public class MakeItFitTest { diff --git a/src/aiunittests/java/MakeItFit/activities/implementation/TrailTest.java b/src/aiunittests/java/MakeItFit/activities/implementation/TrailTest.java index 2178341..6d68841 100644 --- a/src/aiunittests/java/MakeItFit/activities/implementation/TrailTest.java +++ b/src/aiunittests/java/MakeItFit/activities/implementation/TrailTest.java @@ -2,14 +2,14 @@ import java.util.UUID; +import MakeItFit.utils.MakeItFitDate; +import org.junit.jupiter.api.Test; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNotSame; import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.jupiter.api.Test; - -import MakeItFit.utils.MakeItFitDate; public class TrailTest { diff --git a/src/aiunittests/java/MakeItFit/queries/HowManyAltimetryDoneTest.java b/src/aiunittests/java/MakeItFit/queries/HowManyAltimetryDoneTest.java index e4d9fe2..862ba8a 100644 --- a/src/aiunittests/java/MakeItFit/queries/HowManyAltimetryDoneTest.java +++ b/src/aiunittests/java/MakeItFit/queries/HowManyAltimetryDoneTest.java @@ -3,10 +3,6 @@ import java.util.ArrayList; import java.util.UUID; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import org.junit.jupiter.api.Test; - import MakeItFit.activities.Activity; import MakeItFit.activities.implementation.Trail; import MakeItFit.users.Gender; @@ -14,6 +10,10 @@ import MakeItFit.users.UserManager; import MakeItFit.users.types.Amateur; import MakeItFit.utils.MakeItFitDate; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; public class HowManyAltimetryDoneTest { diff --git a/src/aiunittests/java/MakeItFit/queries/MostDemandingTrainingPlanTest.java b/src/aiunittests/java/MakeItFit/queries/MostDemandingTrainingPlanTest.java index be913b7..0bbeee0 100644 --- a/src/aiunittests/java/MakeItFit/queries/MostDemandingTrainingPlanTest.java +++ b/src/aiunittests/java/MakeItFit/queries/MostDemandingTrainingPlanTest.java @@ -4,10 +4,6 @@ import java.util.List; import java.util.UUID; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import org.junit.jupiter.api.Test; - import MakeItFit.activities.Activity; import MakeItFit.activities.implementation.Trail; import MakeItFit.trainingPlan.TrainingPlan; @@ -18,6 +14,10 @@ import MakeItFit.users.types.Amateur; import MakeItFit.utils.MakeItFitDate; import MakeItFit.utils.MyTuple; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; public class MostDemandingTrainingPlanTest { @@ -51,7 +51,7 @@ void testExecuteQuery() { 800.0, 600.0, Trail.TRAIL_TYPE_HARD); - User user2 = new Amateur("José Fernandes", + User user2 = new Amateur("José Fernandes", 45, Gender.Male, 75, diff --git a/src/aiunittests/java/MakeItFit/queries/MostDoneActivityTest.java b/src/aiunittests/java/MakeItFit/queries/MostDoneActivityTest.java index df3b5c9..04cead8 100644 --- a/src/aiunittests/java/MakeItFit/queries/MostDoneActivityTest.java +++ b/src/aiunittests/java/MakeItFit/queries/MostDoneActivityTest.java @@ -3,15 +3,15 @@ import java.util.ArrayList; import java.util.List; -import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.jupiter.api.Test; - import MakeItFit.activities.Activity; import MakeItFit.activities.implementation.PushUp; import MakeItFit.users.Gender; import MakeItFit.users.User; import MakeItFit.users.UserManager; import MakeItFit.users.types.Amateur; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; public class MostDoneActivityTest { diff --git a/src/aiunittests/java/MakeItFit/queries/QueriesManagerTest.java b/src/aiunittests/java/MakeItFit/queries/QueriesManagerTest.java index 93a5a88..910fd7b 100644 --- a/src/aiunittests/java/MakeItFit/queries/QueriesManagerTest.java +++ b/src/aiunittests/java/MakeItFit/queries/QueriesManagerTest.java @@ -2,10 +2,6 @@ import java.util.UUID; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import org.junit.jupiter.api.Test; - import MakeItFit.activities.Activity; import MakeItFit.activities.implementation.Trail; import MakeItFit.trainingPlan.TrainingPlan; @@ -15,6 +11,10 @@ import MakeItFit.users.UserManager; import MakeItFit.users.types.Amateur; import MakeItFit.utils.MakeItFitDate; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; public class QueriesManagerTest { diff --git a/src/aiunittests/java/MakeItFit/queries/WhoBurnsMoreCaloriesTest.java b/src/aiunittests/java/MakeItFit/queries/WhoBurnsMoreCaloriesTest.java index 50a4aa5..553a510 100644 --- a/src/aiunittests/java/MakeItFit/queries/WhoBurnsMoreCaloriesTest.java +++ b/src/aiunittests/java/MakeItFit/queries/WhoBurnsMoreCaloriesTest.java @@ -2,11 +2,6 @@ import java.util.UUID; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import org.junit.jupiter.api.Test; - import MakeItFit.activities.Activity; import MakeItFit.activities.implementation.PushUp; import MakeItFit.users.Gender; @@ -14,6 +9,11 @@ import MakeItFit.users.UserManager; import MakeItFit.users.types.Amateur; import MakeItFit.utils.MakeItFitDate; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; public class WhoBurnsMoreCaloriesTest { diff --git a/src/aiunittests/java/MakeItFit/users/UserTest.java b/src/aiunittests/java/MakeItFit/users/UserTest.java index f0215de..a587779 100644 --- a/src/aiunittests/java/MakeItFit/users/UserTest.java +++ b/src/aiunittests/java/MakeItFit/users/UserTest.java @@ -4,14 +4,14 @@ import java.util.List; import java.util.UUID; +import MakeItFit.activities.Activity; +import MakeItFit.activities.implementation.PushUp; +import org.junit.jupiter.api.Test; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.jupiter.api.Test; - -import MakeItFit.activities.Activity; -import MakeItFit.activities.implementation.PushUp; class TestUser extends User { diff --git a/src/aiunittests/java/MakeItFit/users/types/ProfessionalTest.java b/src/aiunittests/java/MakeItFit/users/types/ProfessionalTest.java index 3f86607..bdf3902 100644 --- a/src/aiunittests/java/MakeItFit/users/types/ProfessionalTest.java +++ b/src/aiunittests/java/MakeItFit/users/types/ProfessionalTest.java @@ -1,10 +1,10 @@ package MakeItFit.users.types; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; +import MakeItFit.users.Gender; import org.junit.jupiter.api.Test; -import MakeItFit.users.Gender; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; class ProfessionalTest { @@ -84,7 +84,6 @@ void testSpecializationManagement() { // Test setting specialization pro.setSpecialization("Swimming"); assertEquals("Swimming", pro.getSpecialization()); - } @Test diff --git a/src/testgen/testgen/FacadeTemplates.hs b/src/testgen/testgen/FacadeTemplates.hs index 9fab41b..8d38933 100644 --- a/src/testgen/testgen/FacadeTemplates.hs +++ b/src/testgen/testgen/FacadeTemplates.hs @@ -14,12 +14,32 @@ module FacadeTemplates ( equalityTemplate, - emailTemplate + emailTemplate, + getActivitiesFromUserTemplate, + addActivityToUserTemplate, + removeActivityFromUserTemplate, + createTrainingPlanTemplate, + createTrainingPlanExceptionTemplate, + constructTrainingPlanTemplate, + constructTrainingPlanExceptionTemplate, + removeTrainingPlanTemplate, + getTrainingPlanTemplate, + getTrainingPlanExceptionTemplate, + updateTrainingPlanTemplate, + updateTrainingPlanExceptionTemplate, + getAllTrainingPlansTemplate, + addActivityToTrainingPlanTemplate, + removeActivityFromTrainingPlanTemplate, + getTrainingPlansFromUserTemplate ) where -import Java (assertEquals, runJava, toJavaExpression) +import Java (assertEquals, assertTrue, runJava, toJavaExpression, toJavaExpressionList, + JavaData (toJavaExpression), assertThrows) import TestTemplate (TestTemplate(..), genToTestTemplate) -import Test.QuickCheck (Gen, arbitrary, elements, generate, listOf) +import Test.QuickCheck (Gen, arbitrary, elements, generate, listOf, Arbitrary (arbitrary)) +import Generators +import Data.List (intercalate) +import GHC.Generics (Associativity) equalityTestGenerator :: Gen [String] equalityTestGenerator = do @@ -55,3 +75,469 @@ emailTestGenerator = do emailTemplate :: TestTemplate emailTemplate = TestTemplate "validEmail" emailTestGenerator 1 + +-- getActivitiesFromUserdate +userEmail :: User -> String +userEmail (Amateur _ _ _ _ _ _ _ _ _ email _) = email +userEmail (Occasional _ _ _ _ _ _ _ _ _ email _ _) = email +userEmail (Professional _ _ _ _ _ _ _ _ _ email _ _) = email + +userActivities :: User -> [Activity] +userActivities (Amateur _ _ _ _ _ _ _ _ _ _ acts) = acts +userActivities (Occasional _ _ _ _ _ _ _ _ _ _ _ acts) = acts +userActivities (Professional _ _ _ _ _ _ _ _ _ _ _ acts) = acts + +userCodeActivity :: String -> Activity -> Activity +userCodeActivity userCode (PushUp _ a b c d e f) = PushUp userCode a b c d e f +userCodeActivity userCode (Running _ a b c d e f) = Running userCode a b c d e f +userCodeActivity userCode (Trail _ a b c d e f g h) = Trail userCode a b c d e f g h +userCodeActivity userCode (WeightSquat _ a b c d e f g) = WeightSquat userCode a b c d e f g + +getActivitiesFromUserTestGenerator :: Gen [String] +getActivitiesFromUserTestGenerator = do + user <- arbitrary :: Gen User + let email = userEmail user + let activitiesLen = length (userActivities user) + let activities = map (userCodeActivity "userCode") (userActivities user) + let emailNoSpaces = filter (/= ' ') email + let userVarName = "user" + let setupLine = "MakeItFit model = new MakeItFit();" + let userLine = "model.createUser(" ++ toJavaCreateUserArgs user ++ ");" + let userCodeLine = "UUID userCode = model.getUser(" ++ toJavaExpression email ++ ").getCode();" + let activitiesVar = "activities" + let activitiesDecl = "List " ++ activitiesVar ++ " = Arrays.asList(" ++ + intercalate ", " (map toJavaExpression activities) ++ ");" + let forLine = "for (Activity a : " ++ activitiesVar ++ ") model.addActivityToUser(" ++ + toJavaExpression emailNoSpaces ++ ", a);" + let testLine = assertEquals ("model.getActivitiesFromUser(\"" ++ emailNoSpaces ++ "\").size()") + (toJavaExpression activitiesLen) + return ([setupLine] ++ [userLine] ++ [userCodeLine, activitiesDecl, forLine] ++ + [testLine]) + +getActivitiesFromUserTemplate :: TestTemplate +getActivitiesFromUserTemplate = genToTestTemplate "getActivitiesFromUserTest" + getActivitiesFromUserTestGenerator 1 + +-- addActivityToUserdate +addActivityToUserTestGenerator :: Gen [String] +addActivityToUserTestGenerator = do + user <- arbitrary :: Gen User + let email = userEmail user + let activitiesLen = length (userActivities user) + let activities = map (userCodeActivity "userCode") (userActivities user) + let emailNoSpaces = filter (/= ' ') email + let userVarName = "user" + let setupLine = "MakeItFit model = new MakeItFit();" + let userLine = "model.createUser(" ++ toJavaCreateUserArgs user ++ ");" + let userCodeLine = "UUID userCode = model.getUser(" ++ toJavaExpression email ++ ").getCode();" + let activitiesVar = "activities" + let activitiesDecl = "List " ++ activitiesVar ++ " = Arrays.asList(" ++ + intercalate ", " (map toJavaExpression activities) ++ ");" + let forLine = "for (Activity a : " ++ activitiesVar ++ ") model.addActivityToUser(" ++ + toJavaExpression emailNoSpaces ++ ", a);" + let testLineBefore = assertEquals + ("model.getActivitiesFromUser(\"" ++ emailNoSpaces ++ "\").size()") + (toJavaExpression activitiesLen) + activityToAdd <- genActivity "userCode" + let activityAdd = "model.addActivityToUser(" ++ toJavaExpression emailNoSpaces ++ ", " ++ + toJavaExpression activityToAdd ++ ");" + let testLineAfter = assertEquals + ("model.getActivitiesFromUser(\"" ++ emailNoSpaces ++ "\").size()") + (toJavaExpression (activitiesLen + 1)) + return ([setupLine, userLine] ++ [";"] ++ [userCodeLine, activitiesDecl, forLine, + testLineBefore, activityAdd, testLineAfter]) + +addActivityToUserTemplate :: TestTemplate +addActivityToUserTemplate = genToTestTemplate "addActivityToUserTest" + addActivityToUserTestGenerator 1 + +-- removeActivityFromUserdate +removeActivityFromUserTestGenerator :: Gen [String] +removeActivityFromUserTestGenerator = do + user <- arbitrary :: Gen User + let email = userEmail user + let activitiesLen = length (userActivities user) + let activities = map (userCodeActivity "userCode") (userActivities user) + let emailNoSpaces = filter (/= ' ') email + let setupLine = "MakeItFit model = new MakeItFit();" + let userLine = "model.createUser(" ++ toJavaCreateUserArgs user ++ ");" + let userCodeLine = "UUID userCode = model.getUser(" ++ toJavaExpression email ++ ").getCode();" + let activitiesVar = "activities" + let activitiesDecl = "List " ++ activitiesVar ++ " = Arrays.asList(" ++ + intercalate ", " (map toJavaExpression activities) ++ ");" + let forAddLine = "for (Activity a : " ++ activitiesVar ++ ") model.addActivityToUser(" ++ + toJavaExpression emailNoSpaces ++ ", a);" + let activityIdsVar = "activityIds" + let activityIdsDecl = "List " ++ activityIdsVar ++ " = new java.util.ArrayList<>();" + let forGetIdLine = "for (Activity a : " ++ activitiesVar ++ ") " ++ activityIdsVar ++ + ".add(a.getCode());" + let forRemoveLine = "for (UUID activityId : " ++ activityIdsVar ++ + ") model.removeActivityFromUser(" ++ toJavaExpression emailNoSpaces ++ ", activityId);" + let testLine = assertEquals ("model.getActivitiesFromUser(\"" ++ emailNoSpaces ++ "\").size()") + "0" + return + [ setupLine + , userLine + , userCodeLine + , activitiesDecl + , forAddLine + , activityIdsDecl + , forGetIdLine + , forRemoveLine + , testLine + ] + +removeActivityFromUserTemplate :: TestTemplate +removeActivityFromUserTemplate = genToTestTemplate "removeActivityFromUserTest" + removeActivityFromUserTestGenerator 1 + +-- createTrainingPlandate +createTrainingPlanTestGenerator :: Gen [String] +createTrainingPlanTestGenerator = do + user <- arbitrary :: Gen User + let email = userEmail user + date <- arbitrary :: Gen MakeItFitDate + let setupLine = "MakeItFit model = new MakeItFit();" + let userLine = "model.createUser(" ++ toJavaCreateUserArgs user ++ ");" + let userCodeLine = "UUID userCode = model.getUser(" ++ toJavaExpression email ++ ").getCode();" + let dateLine = "MakeItFitDate startDate = " ++ toJavaExpression date ++ ";" + let planCodeLine = "UUID planCode = model.createTrainingPlan(userCode, startDate);" + let assertLine = "assertNotNull(planCode);" + return + [ setupLine + , userLine + , userCodeLine + , dateLine + , planCodeLine + , assertLine + ] + +createTrainingPlanTemplate :: TestTemplate +createTrainingPlanTemplate = genToTestTemplate "createTrainingPlanTest" + createTrainingPlanTestGenerator 1 + +createTrainingPlanExceptionTestGenerator :: Gen [String] +createTrainingPlanExceptionTestGenerator = do + user <- arbitrary :: Gen User + let email = userEmail user + date <- arbitrary :: Gen MakeItFitDate + let setupLine = "MakeItFit model = new MakeItFit();" + let userLine = "model.createUser(" ++ toJavaCreateUserArgs user ++ ");" + let userCodeLine = "UUID userCode = model.getUser(" ++ toJavaExpression email ++ ").getCode();" + let assertThrowsLines = assertThrows "IllegalArgumentException" + ["model.createTrainingPlan(userCode, null);"] + return + ([ setupLine + , userLine + , userCodeLine + ] ++ assertThrowsLines) + +createTrainingPlanExceptionTemplate :: TestTemplate +createTrainingPlanExceptionTemplate = genToTestTemplate "createTrainingPlanExceptionTest" + createTrainingPlanExceptionTestGenerator 1 + +-- ConstructTrainingPlandate +constructTrainingPlanTestGenerator :: Gen [String] +constructTrainingPlanTestGenerator = do + user <- arbitrary :: Gen User + let email = userEmail user + date <- arbitrary :: Gen MakeItFitDate + let setupLine = "MakeItFit model = new MakeItFit();" + let userLine = "model.createUser(" ++ toJavaCreateUserArgs user ++ ");" + let userCodeLine = "UUID userCode = model.getUser(" ++ toJavaExpression email ++ ").getCode();" + let dateLine = "MakeItFitDate startDate = " ++ toJavaExpression date ++ ";" + let planCodeLine = "UUID planCode = model.createTrainingPlan(userCode, startDate);" + let planLine = "TrainingPlan plan = model.getTrainingPlan(planCode);" + let assertLine = "assertDoesNotThrow(() -> { model.constructTrainingPlanByObjectives(plan," ++ + " true, 2, 3, 4, 500); });" + return + [ setupLine + , userLine + , userCodeLine + , dateLine + , planCodeLine + , planLine + , assertLine + ] + +constructTrainingPlanTemplate :: TestTemplate +constructTrainingPlanTemplate = genToTestTemplate "constructTrainingPlanTest" + constructTrainingPlanTestGenerator 1 + +constructTrainingPlanExceptionTestGenerator :: Gen [String] +constructTrainingPlanExceptionTestGenerator = do + date <- arbitrary :: Gen MakeItFitDate + let setupLine = "MakeItFit model = new MakeItFit();" + let fakeUserCodeLine = "UUID fakeUserCode = UUID.randomUUID();" + let dateLine = "MakeItFitDate startDate = " ++ toJavaExpression date ++ ";" + let fakePlanLine = "TrainingPlan fakePlan = new TrainingPlan(fakeUserCode, startDate);" + let assertLine = assertThrows "EntityDoesNotExistException" + ["model.constructTrainingPlanByObjectives(fakePlan, true, 2, 3, 4, 500);"] + return + ([setupLine + , fakeUserCodeLine + , dateLine + , fakePlanLine + ] ++ assertLine) + +constructTrainingPlanExceptionTemplate :: TestTemplate +constructTrainingPlanExceptionTemplate = genToTestTemplate "constructTrainingPlanExceptionTest" + constructTrainingPlanExceptionTestGenerator 1 + +-- removeTrainingPlan +removeTrainingPlanTestGenerator :: Gen [String] +removeTrainingPlanTestGenerator = do + user <- arbitrary :: Gen User + let email = userEmail user + date <- arbitrary :: Gen MakeItFitDate + let setupLine = "MakeItFit model = new MakeItFit();" + let userLine = "model.createUser(" ++ toJavaCreateUserArgs user ++ ");" + let userCodeLine = "UUID userCode = model.getUser(" ++ toJavaExpression email ++ ").getCode();" + let dateLine = "MakeItFitDate startDate = " ++ toJavaExpression date ++ ";" + let planCodeLine = "UUID planCode = model.createTrainingPlan(userCode, startDate);" + let removeLine = "model.removeTrainingPlan(planCode);" + let assertLine = assertThrows "IllegalArgumentException" ["model.getTrainingPlan(planCode);"] + return + ([setupLine + , userLine + , userCodeLine + , dateLine + , planCodeLine + , removeLine + ] ++ assertLine) + +removeTrainingPlanTemplate :: TestTemplate +removeTrainingPlanTemplate = + genToTestTemplate "removeTrainingPlanTest" removeTrainingPlanTestGenerator 1 + +-- getTrainingPlandate +getTrainingPlanTestGenerator :: Gen [String] +getTrainingPlanTestGenerator = do + user <- arbitrary :: Gen User + let email = userEmail user + date <- arbitrary :: Gen MakeItFitDate + let setupLine = "MakeItFit model = new MakeItFit();" + let userLine = "model.createUser(" ++ toJavaCreateUserArgs user ++ ");" + let userCodeLine = "UUID userCode = model.getUser(" ++ toJavaExpression email ++ ").getCode();" + let dateLine = "MakeItFitDate startDate = " ++ toJavaExpression date ++ ";" + let planCodeLine = "UUID planCode = model.createTrainingPlan(userCode, startDate);" + let retrievedLine = "TrainingPlan retrievedPlan = model.getTrainingPlan(planCode);" + let assertNotNullLine = "assertNotNull(retrievedPlan);" + let assertEqualsLine = assertEquals "planCode" "retrievedPlan.getCode()" + return + [ setupLine + , userLine + , userCodeLine + , dateLine + , planCodeLine + , retrievedLine + , assertNotNullLine + , assertEqualsLine + ] + +getTrainingPlanTemplate :: TestTemplate +getTrainingPlanTemplate = + genToTestTemplate "getTrainingPlanTest" getTrainingPlanTestGenerator 1 + +getTrainingPlanExceptionTestGenerator :: Gen [String] +getTrainingPlanExceptionTestGenerator = do + let setupLine = "MakeItFit model = new MakeItFit();" + let invalidCodeLine = "UUID invalidCode = UUID.randomUUID();" + let assertLine = assertThrows "IllegalArgumentException" ["model.getTrainingPlan(invalidCode);"] + return + ([ setupLine + ,invalidCodeLine] ++ assertLine) + +getTrainingPlanExceptionTemplate :: TestTemplate +getTrainingPlanExceptionTemplate = + genToTestTemplate "getTrainingPlanExceptionTest" getTrainingPlanExceptionTestGenerator 1 + +-- updateTrainingPlandate +updateTrainingPlanTestGenerator :: Gen [String] +updateTrainingPlanTestGenerator = do + user <- arbitrary :: Gen User + let email = userEmail user + date1 <- arbitrary :: Gen MakeItFitDate + date2 <- arbitrary :: Gen MakeItFitDate + let setupLine = "MakeItFit model = new MakeItFit();" + let userLine = "model.createUser(" ++ toJavaCreateUserArgs user ++ ");" + let userCodeLine = "UUID userCode = model.getUser(" ++ toJavaExpression email ++ ").getCode();" + let dateLine1 = "MakeItFitDate startDate = " ++ toJavaExpression date1 ++ ";" + let planCodeLine = "UUID planCode = model.createTrainingPlan(userCode, startDate);" + let planLine = "TrainingPlan plan = model.getTrainingPlan(planCode);" + let setDateLine = "plan.setStartDate(" ++ toJavaExpression date2 ++ ");" + let assertDoesNotThrowLine = "assertDoesNotThrow(() -> model.updateTrainingPlan(plan));" + let updatedLine = "TrainingPlan updated = model.getTrainingPlan(planCode);" + let assertEqualsLine = assertEquals (toJavaExpression date2) "updated.getStartDate()" + return + [ setupLine + , userLine + , userCodeLine + , dateLine1 + , planCodeLine + , planLine + , setDateLine + , assertDoesNotThrowLine + , updatedLine + , assertEqualsLine + ] + +updateTrainingPlanTemplate :: TestTemplate +updateTrainingPlanTemplate = + genToTestTemplate "updateTrainingPlanTest" updateTrainingPlanTestGenerator 1 + +updateTrainingPlanExceptionTestGenerator :: Gen [String] +updateTrainingPlanExceptionTestGenerator = do + date <- arbitrary :: Gen MakeItFitDate + let setupLine = "MakeItFit model = new MakeItFit();" + let dateLine = "MakeItFitDate startDate = " ++ toJavaExpression date ++ ";" + let fakePlanLine = "TrainingPlan fakePlan = new TrainingPlan(UUID.randomUUID(), startDate);" + let assertLine = assertThrows "EntityDoesNotExistException" + ["model.updateTrainingPlan(fakePlan);"] + return + ([setupLine + , dateLine + , fakePlanLine + ] ++ assertLine) + +updateTrainingPlanExceptionTemplate :: TestTemplate +updateTrainingPlanExceptionTemplate = + genToTestTemplate "updateTrainingPlanExceptionTest" updateTrainingPlanExceptionTestGenerator 1 + +-- getAllTrainingPlansdate +getAllTrainingPlansTestGenerator :: Gen [String] +getAllTrainingPlansTestGenerator = do + user <- arbitrary :: Gen User + let email = userEmail user + date1 <- arbitrary :: Gen MakeItFitDate + date2 <- arbitrary :: Gen MakeItFitDate + let setupLine = "MakeItFit model = new MakeItFit();" + let date2Line = "MakeItFitDate startDate2 =" ++ toJavaExpression date2 ++ ";" + let userLine = "model.createUser(" ++ toJavaCreateUserArgs user ++ ");" + let userCodeLine = "UUID userCode = model.getUser(" ++ toJavaExpression email ++ ").getCode();" + let dateLine1 = "MakeItFitDate startDate = " ++ toJavaExpression date1 ++ ";" + let createPlan1 = "model.createTrainingPlan(userCode, startDate);" + let createPlan2 = "model.createTrainingPlan(userCode, startDate.plusDays(7));" + let plansLine = "List plans = model.getAllTrainingPlans();" + let assertLine = assertEquals "2" "plans.size()" + return + [ setupLine + , userLine + , userCodeLine + , dateLine1 + , createPlan1 + , createPlan2 + , plansLine + , assertLine + ] + +getAllTrainingPlansTemplate :: TestTemplate +getAllTrainingPlansTemplate = + genToTestTemplate "getAllTrainingPlansTest" getAllTrainingPlansTestGenerator 1 + +-- addActivityToTrainingPlan +addActivityToTrainingPlanTestGenerator :: Gen [String] +addActivityToTrainingPlanTestGenerator = do + user <- arbitrary :: Gen User + let email = userEmail user + date <- arbitrary :: Gen MakeItFitDate + activity <- genActivity "userCode" + let setupLine = "MakeItFit model = new MakeItFit();" + let userLine = "model.createUser(" ++ toJavaCreateUserArgs user ++ ");" + let userCodeLine = "UUID userCode = model.getUser(" ++ toJavaExpression email ++ ").getCode();" + let dateLine = "MakeItFitDate startDate = " ++ toJavaExpression date ++ ";" + let planCodeLine = "UUID planCode = model.createTrainingPlan(userCode, startDate);" + let activityLine = "Activity activity = " ++ toJavaExpression activity ++ ";" + let assertDoesNotThrowLine = "assertDoesNotThrow(() -> {" ++ + " model.addActivityToTrainingPlan(planCode, activity, 3); });" + let planLine = "TrainingPlan plan = model.getTrainingPlan(planCode);" + let assertTrueLine = assertTrue + "plan.getActivities().stream().anyMatch(a -> a.getItem2().equals(activity))" + return + [ setupLine + , userLine + , userCodeLine + , dateLine + , planCodeLine + , activityLine + , assertDoesNotThrowLine + , planLine + , assertTrueLine + ] + +addActivityToTrainingPlanTemplate :: TestTemplate +addActivityToTrainingPlanTemplate = + genToTestTemplate "addActivityToTrainingPlanTest" addActivityToTrainingPlanTestGenerator 1 + +-- removeActivityFromTrainingPlan +removeActivityFromTrainingPlanTestGenerator :: Gen [String] +removeActivityFromTrainingPlanTestGenerator = do + user <- arbitrary :: Gen User + let email = userEmail user + date <- arbitrary :: Gen MakeItFitDate + activity <- genActivity "userCode" + let setupLine = "MakeItFit model = new MakeItFit();" + let userLine = "model.createUser(" ++ toJavaCreateUserArgs user ++ ");" + let userCodeLine = "UUID userCode = model.getUser(" ++ toJavaExpression email ++ ").getCode();" + let dateLine = "MakeItFitDate startDate = " ++ toJavaExpression date ++ ";" + let planCodeLine = "UUID planCode = model.createTrainingPlan(userCode, startDate);" + let activityLine = "Activity activity = " ++ toJavaExpression activity ++ ";" + let addActivityLine = "model.addActivityToTrainingPlan(planCode, activity, 2);" + let planLine = "TrainingPlan plan = model.getTrainingPlan(planCode);" + let activityCodeLine = "UUID activityCode = plan.getActivities().get(0).getItem2().getCode();" + let removeActivityLine = "model.removeActivityFromTrainingPlan(planCode, activityCode);" + let updatedLine = "TrainingPlan updated = model.getTrainingPlan(planCode);" + let assertTrueLine = assertTrue ("updated.getActivities().stream().noneMatch(a ->" ++ + " a.getItem2().getCode().equals(activityCode))") + return + [ setupLine + , userLine + , userCodeLine + , dateLine + , planCodeLine + , activityLine + , addActivityLine + , planLine + , activityCodeLine + , removeActivityLine + , updatedLine + , assertTrueLine + ] + +removeActivityFromTrainingPlanTemplate :: TestTemplate +removeActivityFromTrainingPlanTemplate = genToTestTemplate "removeActivityFromTrainingPlanTest" + removeActivityFromTrainingPlanTestGenerator 1 + +-- getTrainingPlansFromUser +getTrainingPlansFromUserTestGenerator :: Gen [String] +getTrainingPlansFromUserTestGenerator = do + user <- arbitrary :: Gen User + let email = userEmail user + date1 <- arbitrary :: Gen MakeItFitDate + date2 <- arbitrary :: Gen MakeItFitDate + let setupLine = "MakeItFit model = new MakeItFit();" + let userLine = "model.createUser(" ++ toJavaCreateUserArgs user ++ ");" + let userCodeLine = "UUID userCode = model.getUser(" ++ toJavaExpression email ++ ").getCode();" + let dateLine1 = "MakeItFitDate startDate = " ++ toJavaExpression date1 ++ ";" + let createPlan1 = "model.createTrainingPlan(userCode, startDate);" + let createPlan2 = "model.createTrainingPlan(userCode," ++ toJavaExpression date2 ++ ");" + let userPlansLine = "List userPlans = model.getTrainingPlansFromUser(userCode);" + let assertSizeLine = assertEquals "2" "userPlans.size()" + let forLine = "for (TrainingPlan plan : userPlans) {" ++ + "assertEquals(userCode, plan.getUserCode()); }" + return + [ setupLine + , userLine + , userCodeLine + , dateLine1 + , createPlan1 + , createPlan2 + , userPlansLine + , assertSizeLine + , forLine + ] + +getTrainingPlansFromUserTemplate :: TestTemplate +getTrainingPlansFromUserTemplate = + genToTestTemplate "getTrainingPlansFromUserTest" getTrainingPlansFromUserTestGenerator 1 + diff --git a/src/testgen/testgen/Generators.hs b/src/testgen/testgen/Generators.hs index f6154ac..a2b5aae 100644 --- a/src/testgen/testgen/Generators.hs +++ b/src/testgen/testgen/Generators.hs @@ -22,7 +22,8 @@ module Generators , Activity(..) , TrainingPlan(..) , genActivity - , genTrainingPlan + , genTrainingPlan, + toJavaCreateUserArgs ) where import Data.List (intercalate) @@ -47,7 +48,7 @@ data User = String -- ^ User's name Int -- ^ User's age Gender -- ^ User's gender - Float -- ^ User's weight + Int -- ^ User's weight Int -- ^ User's height Int -- ^ User's BPM Int -- ^ User's level @@ -60,7 +61,7 @@ data User = String -- ^ User's name Int -- ^ User's age Gender -- ^ User's gender - Float -- ^ User's weight + Int -- ^ User's weight Int -- ^ User's height Int -- ^ User's BPM Int -- ^ User's level @@ -74,7 +75,7 @@ data User = String -- ^ User's name Int -- ^ User's age Gender -- ^ User's gender - Float -- ^ User's weight + Int -- ^ User's weight Int -- ^ User's height Int -- ^ User's BPM Int -- ^ User's level @@ -143,7 +144,7 @@ instance Arbitrary User where name <- genUserName age <- choose (18, 80) gender <- arbitrary :: Gen Gender - weight <- elements [50.0..100.00] -- NOTE: elements is used to avoid fractional numbers + weight <- elements [50..100] -- NOTE: elements is used to avoid fractional numbers height <- choose (150, 195) bpm <- choose (60, 100) level <- choose (1, 10) @@ -224,6 +225,52 @@ instance JavaData User where Occasional _ _ _ _ _ _ _ _ _ _ _ activities -> activities Professional _ _ _ _ _ _ _ _ _ _ _ activities -> activities +toJavaCreateUserArgs :: User -> String +toJavaCreateUserArgs (Amateur name age gender weight height bpm level address phone email _) = + intercalate ", " [ toJavaExpression name + , toJavaExpression age + , toJavaExpression gender + , toJavaExpression weight + , toJavaExpression height + , toJavaExpression bpm + , toJavaExpression level + , toJavaExpression address + , toJavaExpression phone + , toJavaExpression email + , "0" -- valor default para frequency + , "\"Amateur\"" + ] +toJavaCreateUserArgs (Occasional name age gender weight height bpm level address phone email + freq _) = + intercalate ", " [ toJavaExpression name + , toJavaExpression age + , toJavaExpression gender + , toJavaExpression weight + , toJavaExpression height + , toJavaExpression bpm + , toJavaExpression level + , toJavaExpression address + , toJavaExpression phone + , toJavaExpression email + , toJavaExpression freq + , "\"Occasional\"" + ] +toJavaCreateUserArgs (Professional name age gender weight height bpm level address phone email + freq _) = + intercalate ", " [ toJavaExpression name + , toJavaExpression age + , toJavaExpression gender + , toJavaExpression weight + , toJavaExpression height + , toJavaExpression bpm + , toJavaExpression level + , toJavaExpression address + , toJavaExpression phone + , toJavaExpression email + , toJavaExpression freq + , "\"Professional\"" + ] + -- | A MakeItFit date (YYYY/MM/DD) data MakeItFitDate = MakeItFitDate Int Int Int deriving (Show, Eq, Ord) @@ -242,7 +289,7 @@ instance Arbitrary MakeItFitDate where instance JavaData MakeItFitDate where javaTypeName = const "MakeItFitDate" toJavaExpression (MakeItFitDate y m d) = - "new MakeItFitDate(" ++ intercalate ", " (map toJavaExpression [y, m, d]) ++ ")" + "MakeItFitDate.of(" ++ intercalate ", " (map toJavaExpression [y, m, d]) ++ ")" -- | MakeItFit TrailType data TrailType = TrailEasy | TrailMedium | TrailHard deriving (Show, Eq) @@ -337,7 +384,7 @@ genActivity userCode = do series <- choose (1, 10) return $ PushUp userCode date duration designation name repetitions series "Running" -> do - distance <- choose (1.0, 45.0) + distance <- choose (1.0, 20.0) speed <- choose (6.0, 15.0) return $ Running userCode date duration designation name distance speed "Trail" -> do @@ -350,7 +397,7 @@ genActivity userCode = do "WeightSquat" -> do repetitions <- choose (5, 100) series <- choose (1, 10) - weight <- choose (10.0, 200.0) + weight <- choose (10.0, 20.0) return $ WeightSquat userCode date duration designation name repetitions series weight instance JavaData Activity where diff --git a/src/testgen/testgen/TestClass.hs b/src/testgen/testgen/TestClass.hs index 76fe043..15be59f 100644 --- a/src/testgen/testgen/TestClass.hs +++ b/src/testgen/testgen/TestClass.hs @@ -15,7 +15,7 @@ module TestClass (generateTestClass) where import Data.List (intercalate) -import Java (indent) +import Java (indent, toJavaExpressionList) import TestTemplate (generateTestsFromTemplate) import System.Process (StdStream(CreatePipe), createProcess, proc, std_in, std_out, waitForProcess) @@ -26,7 +26,22 @@ import FacadeTemplates templates = [ - equalityTemplate -- TODO: remove this simple template only to show the desired architecture + getActivitiesFromUserTemplate, + addActivityToUserTemplate, + removeActivityFromUserTemplate, + createTrainingPlanTemplate, + createTrainingPlanExceptionTemplate, + constructTrainingPlanTemplate, + constructTrainingPlanExceptionTemplate, + removeTrainingPlanTemplate, + getTrainingPlanTemplate, + getTrainingPlanExceptionTemplate, + updateTrainingPlanTemplate, + updateTrainingPlanExceptionTemplate, + getAllTrainingPlansTemplate, + addActivityToTrainingPlanTemplate, + removeActivityFromTrainingPlanTemplate, + getTrainingPlansFromUserTemplate ] generateTests :: IO [String] @@ -47,6 +62,15 @@ generateUnformattedTestClass = do , "import static org.junit.jupiter.api.Assertions.*;" , "" , "import MakeItFit.users.User;" + , "import MakeItFit.users.Gender;" + , "import java.util.UUID;" + , "import MakeItFit.activities.Activity;" + , "import MakeItFit.activities.implementation.*;" + , "import MakeItFit.utils.MakeItFitDate;" + , "import MakeItFit.trainingPlan.TrainingPlan;" + , "import static org.junit.Assert.assertThrows;" + , "import MakeItFit.exceptions.*;" + , "" , "public class MakeItFitTest {" ] diff --git a/src/unittests/java/MakeItFit/activities/types/RepetitionsTest.java b/src/unittests/java/MakeItFit/activities/types/RepetitionsTest.java index e0947b0..5961707 100644 --- a/src/unittests/java/MakeItFit/activities/types/RepetitionsTest.java +++ b/src/unittests/java/MakeItFit/activities/types/RepetitionsTest.java @@ -2,14 +2,14 @@ import java.util.UUID; +import MakeItFit.utils.MakeItFitDate; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotSame; import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import MakeItFit.utils.MakeItFitDate; public class RepetitionsTest { private TestRepetitions activity;