From 30c3befd956a89da308f5ea139e4fcd4c7ff57e0 Mon Sep 17 00:00:00 2001 From: voidbert Date: Wed, 4 Jun 2025 22:31:27 +0100 Subject: [PATCH 1/3] Codegen fixes --- src/testgen/testgen/Generators.hs | 5 ++++- src/testgen/testgen/Java.hs | 25 ++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/testgen/testgen/Generators.hs b/src/testgen/testgen/Generators.hs index f6154ac..60dd67f 100644 --- a/src/testgen/testgen/Generators.hs +++ b/src/testgen/testgen/Generators.hs @@ -175,6 +175,7 @@ instance JavaData User where , toJavaExpression age , toJavaExpression gender , toJavaExpression weight + , toJavaExpression height , toJavaExpression bpm , toJavaExpression level , toJavaExpression address @@ -188,6 +189,7 @@ instance JavaData User where , toJavaExpression age , toJavaExpression gender , toJavaExpression weight + , toJavaExpression height , toJavaExpression bpm , toJavaExpression level , toJavaExpression address @@ -202,6 +204,7 @@ instance JavaData User where , toJavaExpression age , toJavaExpression gender , toJavaExpression weight + , toJavaExpression height , toJavaExpression bpm , toJavaExpression level , toJavaExpression address @@ -242,7 +245,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) diff --git a/src/testgen/testgen/Java.hs b/src/testgen/testgen/Java.hs index 786f2e7..ff6dc9d 100644 --- a/src/testgen/testgen/Java.hs +++ b/src/testgen/testgen/Java.hs @@ -25,6 +25,7 @@ module Java , assertEquals , assertSame , assertThrows + , javaImports , runJava ) where @@ -85,7 +86,7 @@ instance JavaData Integer where instance JavaData Float where javaTypeName = const "float" - toJavaExpression = show + toJavaExpression f = show f ++ "f" instance JavaData Double where javaTypeName = const "double" @@ -229,3 +230,25 @@ runJava statements = do waitForProcess process return $ filter (not . isPrefixOf "| ") outputLines ) + +-- Useful code + +-- | Modules imported during testing +javaImports :: [String] +javaImports = + [ + "import java.util.*;" + , "" + , "import MakeItFit.MakeItFit;" + , "import MakeItFit.activities.Activity;" + , "import MakeItFit.activities.implementation.PushUp;" + , "import MakeItFit.activities.implementation.Running;" + , "import MakeItFit.activities.implementation.Trail;" + , "import MakeItFit.activities.implementation.WeightSquat;" + , "import MakeItFit.users.Gender;" + , "import MakeItFit.users.User;" + , "import MakeItFit.users.types.Amateur;" + , "import MakeItFit.users.types.Occasional;" + , "import MakeItFit.users.types.Professional;" + , "import MakeItFit.utils.MakeItFitDate;" + ] From e27e74e7d3b025b3078da2d3bf00f72586000677 Mon Sep 17 00:00:00 2001 From: voidbert Date: Wed, 4 Jun 2025 22:32:00 +0100 Subject: [PATCH 2/3] Add more templates --- src/testgen/testgen/FacadeTemplates.hs | 150 ++++++++++++++++++++++--- src/testgen/testgen/TestClass.hs | 16 +-- 2 files changed, 141 insertions(+), 25 deletions(-) diff --git a/src/testgen/testgen/FacadeTemplates.hs b/src/testgen/testgen/FacadeTemplates.hs index 9fab41b..6f94eff 100644 --- a/src/testgen/testgen/FacadeTemplates.hs +++ b/src/testgen/testgen/FacadeTemplates.hs @@ -13,11 +13,15 @@ -- limitations under the License. module FacadeTemplates ( - equalityTemplate, - emailTemplate + equalityTemplate + , executeQueryHowManyKMsDoneTemplate + , executeQueryHowManyKMsDoneDatesTemplate + , executeQueryHowManyAltimetryDoneTemplate + , executeQueryHowManyAltimetryDoneDatesTemplate ) where -import Java (assertEquals, runJava, toJavaExpression) +import Generators (User(..), MakeItFitDate(..)) +import Java (JavaData(..), assertEquals, javaImports, runJava, toJavaExpression) import TestTemplate (TestTemplate(..), genToTestTemplate) import Test.QuickCheck (Gen, arbitrary, elements, generate, listOf) @@ -34,24 +38,134 @@ equalityTestGenerator = do equalityTemplate :: TestTemplate equalityTemplate = genToTestTemplate "equals" equalityTestGenerator 3 -genEmail :: Gen String -genEmail = do - before <- listOf $ elements (['a'..'z'] ++ ['A'..'Z'] ++ ['0'..'9']) - after <- listOf $ elements (['a'..'z'] ++ ['A'..'Z'] ++ ['0'..'9']) - return $ before ++ "@" ++ after ++ ".com" +executeQueryHowManyKMsDoneGenerator :: IO [String] +executeQueryHowManyKMsDoneGenerator = do + user <- generate $ (arbitrary :: Gen User) + resultLines <- runJava $ concat + [ + javaImports + , toJavaVariable "user" user + , [ + "MakeItFit makeItFit = new MakeItFit();" + , "makeItFit.addUser(user);" + , "System.out.println(makeItFit.executeQueryHowManyKMsDone(user.getEmail()))" + ] + ] + return $ concat + [ + toJavaVariable "user" user + , [ + "MakeItFit makeItFit = new MakeItFit();" + , "makeItFit.addUser(user);" + , assertEquals (last resultLines) "makeItFit.executeQueryHowManyKMsDone(user.getEmail())" + ] + ] + +executeQueryHowManyKMsDoneTemplate :: TestTemplate +executeQueryHowManyKMsDoneTemplate = + TestTemplate "testExecuteQueryHowManyKMsDone" executeQueryHowManyKMsDoneGenerator 1 -emailTestGenerator :: IO [String] -emailTestGenerator = do - email <- generate $ genEmail - resultLines <- runJava +executeQueryHowManyKMsDoneDatesGenerator :: IO [String] +executeQueryHowManyKMsDoneDatesGenerator = do + user <- generate $ (arbitrary :: Gen User) + date1@(MakeItFitDate y m d) <- generate $ (arbitrary :: Gen MakeItFitDate) + date2 <- return $ MakeItFitDate (y + 100) m d + expr <- return $ concat + [ + "makeItFit.executeQueryHowManyKMsDone(user.getEmail(), " + , toJavaExpression date1 + , ", " + , toJavaExpression date2 + , ")" + ] + resultLines <- runJava $ concat + [ + javaImports + , toJavaVariable "user" user + , [ + "MakeItFit makeItFit = new MakeItFit();" + , "makeItFit.addUser(user);" + , "System.out.println(" ++ expr ++ ")" + ] + ] + return $ concat + [ + toJavaVariable "user" user + , [ + "MakeItFit makeItFit = new MakeItFit();" + , "makeItFit.addUser(user);" + , assertEquals (last resultLines) expr + ] + ] + +executeQueryHowManyKMsDoneDatesTemplate :: TestTemplate +executeQueryHowManyKMsDoneDatesTemplate = + TestTemplate "testExecuteQueryHowManyKMsDoneDates" executeQueryHowManyKMsDoneDatesGenerator 1 + +executeQueryHowManyAltimetryDoneGenerator :: IO [String] +executeQueryHowManyAltimetryDoneGenerator = do + user <- generate $ (arbitrary :: Gen User) + resultLines <- runJava $ concat + [ + javaImports + , toJavaVariable "user" user + , [ + "MakeItFit makeItFit = new MakeItFit();" + , "makeItFit.addUser(user);" + , "System.out.println(makeItFit.executeQueryHowManyAltimetryDone(user.getEmail()))" + ] + ] + return $ concat + [ + toJavaVariable "user" user + , [ + "MakeItFit makeItFit = new MakeItFit();" + , "makeItFit.addUser(user);" + , assertEquals (last resultLines) + "makeItFit.executeQueryHowManyAltimetryDone(user.getEmail())" + ] + ] + +executeQueryHowManyAltimetryDoneTemplate :: TestTemplate +executeQueryHowManyAltimetryDoneTemplate = + TestTemplate "testExecuteQueryHowManyAltimetryDone" executeQueryHowManyAltimetryDoneGenerator 1 + +executeQueryHowManyAltimetryDoneDatesGenerator :: IO [String] +executeQueryHowManyAltimetryDoneDatesGenerator = do + user <- generate $ (arbitrary :: Gen User) + date1@(MakeItFitDate y m d) <- generate $ (arbitrary :: Gen MakeItFitDate) + date2 <- return $ MakeItFitDate (y + 100) m d + expr <- return $ concat + [ + "makeItFit.executeQueryHowManyAltimetryDone(user.getEmail(), " + , toJavaExpression date1 + , ", " + , toJavaExpression date2 + , ")" + ] + resultLines <- runJava $ concat [ - "import MakeItFit.utils.EmailValidator;" - , "System.out.println(EmailValidator.isValidEmail(" ++ toJavaExpression email ++ "));" + javaImports + , toJavaVariable "user" user + , [ + "MakeItFit makeItFit = new MakeItFit();" + , "makeItFit.addUser(user);" + , "System.out.println(" ++ expr ++ ")" + ] ] - return + return $ concat [ - assertEquals (toJavaExpression email) (last resultLines) + toJavaVariable "user" user + , [ + "MakeItFit makeItFit = new MakeItFit();" + , "makeItFit.addUser(user);" + , assertEquals (last resultLines) expr + ] ] -emailTemplate :: TestTemplate -emailTemplate = TestTemplate "validEmail" emailTestGenerator 1 +executeQueryHowManyAltimetryDoneDatesTemplate :: TestTemplate +executeQueryHowManyAltimetryDoneDatesTemplate = + TestTemplate + "testExecuteQueryHowManyAltimetryDoneDates" + executeQueryHowManyAltimetryDoneDatesGenerator + 1 diff --git a/src/testgen/testgen/TestClass.hs b/src/testgen/testgen/TestClass.hs index 76fe043..0232ec5 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, javaImports) import TestTemplate (generateTestsFromTemplate) import System.Process (StdStream(CreatePipe), createProcess, proc, std_in, std_out, waitForProcess) @@ -26,7 +26,10 @@ import FacadeTemplates templates = [ - equalityTemplate -- TODO: remove this simple template only to show the desired architecture + executeQueryHowManyKMsDoneTemplate + , executeQueryHowManyKMsDoneDatesTemplate + , executeQueryHowManyAltimetryDoneTemplate + , executeQueryHowManyAltimetryDoneDatesTemplate ] generateTests :: IO [String] @@ -41,12 +44,11 @@ generateUnformattedTestClass = do $ concat [ [ "package MakeItFit;" , "" - , "import java.util.Arrays;" - , "import java.util.List;" + ] + , javaImports + , [ + "import static org.junit.jupiter.api.Assertions.*;" , "import org.junit.jupiter.api.Test;" - , "import static org.junit.jupiter.api.Assertions.*;" - , "" - , "import MakeItFit.users.User;" , "" , "public class MakeItFitTest {" ] From 7b4e1c031054b8776a9cd27beb72a71bf2520deb Mon Sep 17 00:00:00 2001 From: voidbert Date: Wed, 4 Jun 2025 22:39:16 +0100 Subject: [PATCH 3/3] Add missing method --- src/main/java/MakeItFit/MakeItFit.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/MakeItFit/MakeItFit.java b/src/main/java/MakeItFit/MakeItFit.java index 46e5679..3bb44a9 100644 --- a/src/main/java/MakeItFit/MakeItFit.java +++ b/src/main/java/MakeItFit/MakeItFit.java @@ -90,6 +90,11 @@ public void createUser(String name, this.userManager.insertUser(user); } + // CHANGED: added to facilitate testing + public void addUser(User user) { + this.userManager.insertUser(user); + } + /** * Removes a user based on the provided identifier. *