diff --git a/src/main/java/uk/ac/rhul/cs/javatester/CodeTester.java b/src/main/java/uk/ac/rhul/cs/javatester/CodeTester.java index 101216a50ab2c293f20166701d658492ea0f679b..a5e478c7736aaf083af417671a7aab4d2d38db9f 100644 --- a/src/main/java/uk/ac/rhul/cs/javatester/CodeTester.java +++ b/src/main/java/uk/ac/rhul/cs/javatester/CodeTester.java @@ -190,7 +190,7 @@ public class CodeTester { public String getIndentedLinesString() { StringBuilder sb = new StringBuilder(); for (String line : getLines()) { - sb.append(" " + line + ";\n"); + sb.append(" " + line + "\n"); } return idealize(sb.toString()); } @@ -379,7 +379,7 @@ public class CodeTester { ); } - recordCall(r, o, m, params); + recordCall(returnType, r, o, m, params); return r; } catch (InvocationTargetException e) { @@ -550,7 +550,7 @@ public class CodeTester { ); } - recordStaticCall(r, klass, m, params); + recordStaticCall(returnType, r, klass, m, params); return r; } @@ -810,7 +810,7 @@ public class CodeTester { if (getIsRecording()) { lines.add(className + " " + name + " = new " + className + - "(" + paramsString + ")"); + "(" + paramsString + ");"); } setLastCall("new " + className + "(" + paramsString + ")"); @@ -831,7 +831,7 @@ public class CodeTester { if (getIsRecording()) { lines.add(className + " " + name + " = new " + className + - " { " + valuesString + " }"); + " { " + valuesString + " };"); } setLastCall("new " + className + " { " + valuesString + " }"); @@ -841,18 +841,19 @@ public class CodeTester { /** * Record a call method object with given params. */ - private void recordCall(Object r, Object i, Method m, Object... params) { - recordCallGen(r, getParamsString(i), m, params); + private void recordCall( + Class<?> returnType, Object r, Object i, Method m, Object... params + ) { + recordCallGen(returnType, r, getParamsString(i), m, params); } /** * Record a static call */ - private void recordStaticCall(Object r, - Class<?> k, - Method m, - Object... params) { - recordCallGen(r, getClassString(k), m, params); + private void recordStaticCall( + Class<?> returnType, Object r, Class<?> k, Method m, Object... params + ) { + recordCallGen(returnType, r, getClassString(k), m, params); } /** @@ -870,12 +871,19 @@ public class CodeTester { * If null is not returned, a dummy name will be used in the log. * null is not returned * + * @param returnType the declared type of the variable returned to + * (or null if the return type is inferred from m -- in which case a + * warning is added to avoid students thinking their return type has + * been verified by the tester) * @param r the object returned by the call - * @param k the class the method was called on + * @param lhs the "thing" the method was called on (either class + * name or object variable name) * @param m the method called * @param params the arguments to the call */ - private void recordCallGen(Object r, String lhs, Method m, Object... params) { + private void recordCallGen( + Class<?> returnType, Object r, String lhs, Method m, Object... params + ) { String paramsString = getParamsString(params); if (getIsRecording()) { @@ -885,15 +893,27 @@ public class CodeTester { String line = ""; if (!rKlass.equals(Void.TYPE)) { - String rClassName = getClassString(rKlass); - line += rClassName + " " + rName + " = "; - } + if (returnType == null) { + lines.add(String.format( + "// The type of %s was inferred from your " + + "definition of", + rName + )); + lines.add(String.format( + "// %s. The tester has not verified it.", + m.getName() + )); + + returnType = m.getReturnType(); + } - lines.add(line + - lhs + - "." + m.getName() + - "(" + paramsString + ")"); + line += getClassString(returnType) + " " + rName + " = "; + } + + lines.add( + line + lhs + "." + m.getName() + "(" + paramsString + ");" + ); } setLastCall(lhs + "." + m.getName() + "(" + paramsString + ")");