diff --git a/src/lessons/recursion/cons/AllDifferentEntity.java b/src/lessons/recursion/cons/AllDifferentEntity.java index 907ec11a5..10bcb89cb 100644 --- a/src/lessons/recursion/cons/AllDifferentEntity.java +++ b/src/lessons/recursion/cons/AllDifferentEntity.java @@ -12,7 +12,7 @@ public void run() int count = getTestCount(); for (int i = 0; i < count; i++) { Object[] param = (Object[])deserialize(getTest(i)); - setTestResult(i, serialize(allDifferent(RecList.fromArray((int[])param[0])))); + setTestResult(i, serialize(allDifferent(RecList.fromArray((int[]) param[0])))); } } diff --git a/src/lessons/recursion/cons/ButLastEntity.java b/src/lessons/recursion/cons/ButLastEntity.java index 305cfd107..b503c8322 100644 --- a/src/lessons/recursion/cons/ButLastEntity.java +++ b/src/lessons/recursion/cons/ButLastEntity.java @@ -12,7 +12,7 @@ public void run() int count = getTestCount(); for (int i = 0; i < count; i++) { Object[] param = (Object[])deserialize(getTest(i)); - setTestResult(i, serialize(butLast(RecList.fromArray((int[])param[0])))); + setTestResult(i, serialize(butLast(RecList.fromArray((int[]) param[0])))); } } diff --git a/src/lessons/recursion/cons/ButNfirstEntity.java b/src/lessons/recursion/cons/ButNfirstEntity.java index b4bb69e85..14c9d0639 100644 --- a/src/lessons/recursion/cons/ButNfirstEntity.java +++ b/src/lessons/recursion/cons/ButNfirstEntity.java @@ -1,11 +1,10 @@ package lessons.recursion.cons; -import static plm.core.ValueSerializer.deserialize; -import static plm.core.ValueSerializer.serialize; - import lessons.recursion.cons.universe.ConsEntity; import lessons.recursion.cons.universe.RecList; +import static plm.core.ValueSerializer.*; + public class ButNfirstEntity extends ConsEntity { public void run() @@ -13,7 +12,7 @@ public void run() int count = getTestCount(); for (int i = 0; i < count; i++) { Object[] param = (Object[])deserialize(getTest(i)); - setTestResult(i, serialize(butNfirst(RecList.fromArray((int[])param[0]), (Integer)param[1]))); + setTestResult(i, serialize(butNfirst(RecList.fromArray((int[]) param[0]), (Integer)param[1]))); } } diff --git a/src/lessons/recursion/cons/ButNlastEntity.java b/src/lessons/recursion/cons/ButNlastEntity.java index f7e72f87b..c36519a64 100644 --- a/src/lessons/recursion/cons/ButNlastEntity.java +++ b/src/lessons/recursion/cons/ButNlastEntity.java @@ -12,7 +12,7 @@ public void run() int count = getTestCount(); for (int i = 0; i < count; i++) { Object[] param = (Object[])deserialize(getTest(i)); - setTestResult(i, serialize(butNlast(RecList.fromArray((int[])param[0]), (Integer)param[1]))); + setTestResult(i, serialize(butNlast(RecList.fromArray((int[]) param[0]), (Integer)param[1]))); } } diff --git a/src/lessons/recursion/cons/ConcatEntity.java b/src/lessons/recursion/cons/ConcatEntity.java index 4ca92f9e1..2b5d14232 100644 --- a/src/lessons/recursion/cons/ConcatEntity.java +++ b/src/lessons/recursion/cons/ConcatEntity.java @@ -12,7 +12,7 @@ public void run() int count = getTestCount(); for (int i = 0; i < count; i++) { Object[] param = (Object[])deserialize(getTest(i)); - setTestResult(i, serialize(concat(RecList.fromArray((int[])param[0]), RecList.fromArray((int[])param[1])))); + setTestResult(i, serialize(concat(RecList.fromArray((int[]) param[0]), RecList.fromArray((int[]) param[1])))); } } diff --git a/src/lessons/recursion/cons/IncreasingEntity.java b/src/lessons/recursion/cons/IncreasingEntity.java index 78568a57f..ecc753cfc 100644 --- a/src/lessons/recursion/cons/IncreasingEntity.java +++ b/src/lessons/recursion/cons/IncreasingEntity.java @@ -12,7 +12,7 @@ public void run() int count = getTestCount(); for (int i = 0; i < count; i++) { Object[] param = (Object[])deserialize(getTest(i)); - setTestResult(i, serialize(increasing(RecList.fromArray((int[])param[0])))); + setTestResult(i, serialize(increasing(RecList.fromArray((int[]) param[0])))); } } diff --git a/src/lessons/recursion/cons/IsMemberEntity.java b/src/lessons/recursion/cons/IsMemberEntity.java index aa60e0c82..73b5ca718 100644 --- a/src/lessons/recursion/cons/IsMemberEntity.java +++ b/src/lessons/recursion/cons/IsMemberEntity.java @@ -12,7 +12,7 @@ public void run() int count = getTestCount(); for (int i = 0; i < count; i++) { Object[] param = (Object[])deserialize(getTest(i)); - setTestResult(i, serialize(isMember(RecList.fromArray((int[])param[0]), (Integer)param[1]))); + setTestResult(i, serialize(isMember(RecList.fromArray((int[]) param[0]), (Integer)param[1]))); } } diff --git a/src/lessons/recursion/cons/LastEntity.java b/src/lessons/recursion/cons/LastEntity.java index d8012b387..1cd3600a7 100644 --- a/src/lessons/recursion/cons/LastEntity.java +++ b/src/lessons/recursion/cons/LastEntity.java @@ -12,7 +12,7 @@ public void run() int count = getTestCount(); for (int i = 0; i < count; i++) { Object[] param = (Object[])deserialize(getTest(i)); - setTestResult(i, serialize(last(RecList.fromArray((int[])param[0])))); + setTestResult(i, serialize(last(RecList.fromArray((int[]) param[0])))); } } diff --git a/src/lessons/recursion/cons/LengthEntity.java b/src/lessons/recursion/cons/LengthEntity.java index f9df2e1f4..63c36165f 100644 --- a/src/lessons/recursion/cons/LengthEntity.java +++ b/src/lessons/recursion/cons/LengthEntity.java @@ -12,7 +12,7 @@ public void run() int count = getTestCount(); for (int i = 0; i < count; i++) { Object[] param = (Object[])deserialize(getTest(i)); - setTestResult(i, serialize(length(RecList.fromArray((int[])param[0])))); + setTestResult(i, serialize(length(RecList.fromArray((int[]) param[0])))); } } diff --git a/src/lessons/recursion/cons/MinEntity.java b/src/lessons/recursion/cons/MinEntity.java index e0ff348bc..470645e6c 100644 --- a/src/lessons/recursion/cons/MinEntity.java +++ b/src/lessons/recursion/cons/MinEntity.java @@ -12,7 +12,7 @@ public void run() int count = getTestCount(); for (int i = 0; i < count; i++) { Object[] param = (Object[])deserialize(getTest(i)); - setTestResult(i, serialize(min(RecList.fromArray((int[])param[0])))); + setTestResult(i, serialize(min(RecList.fromArray((int[]) param[0])))); } } diff --git a/src/lessons/recursion/cons/NfirstEntity.java b/src/lessons/recursion/cons/NfirstEntity.java index 27a3f460e..cfbd89fff 100644 --- a/src/lessons/recursion/cons/NfirstEntity.java +++ b/src/lessons/recursion/cons/NfirstEntity.java @@ -12,7 +12,7 @@ public void run() int count = getTestCount(); for (int i = 0; i < count; i++) { Object[] param = (Object[])deserialize(getTest(i)); - setTestResult(i, serialize(nfirst(RecList.fromArray((int[])param[0]), (Integer)param[1]))); + setTestResult(i, serialize(nfirst(RecList.fromArray((int[]) param[0]), (Integer)param[1]))); } } diff --git a/src/lessons/recursion/cons/NlastEntity.java b/src/lessons/recursion/cons/NlastEntity.java index 8d52c3953..9506e8490 100644 --- a/src/lessons/recursion/cons/NlastEntity.java +++ b/src/lessons/recursion/cons/NlastEntity.java @@ -12,7 +12,7 @@ public void run() int count = getTestCount(); for (int i = 0; i < count; i++) { Object[] param = (Object[])deserialize(getTest(i)); - setTestResult(i, serialize(nlast(RecList.fromArray((int[])param[0]), (Integer)param[1]))); + setTestResult(i, serialize(nlast(RecList.fromArray((int[]) param[0]), (Integer)param[1]))); } } diff --git a/src/lessons/recursion/cons/NthEntity.java b/src/lessons/recursion/cons/NthEntity.java index d5772acc0..84cabb5c9 100644 --- a/src/lessons/recursion/cons/NthEntity.java +++ b/src/lessons/recursion/cons/NthEntity.java @@ -12,7 +12,7 @@ public void run() int count = getTestCount(); for (int i = 0; i < count; i++) { Object[] param = (Object[])deserialize(getTest(i)); - setTestResult(i, serialize(nth(RecList.fromArray((int[])param[0]), (Integer)param[1]))); + setTestResult(i, serialize(nth(RecList.fromArray((int[]) param[0]), (Integer)param[1]))); } } diff --git a/src/lessons/recursion/cons/OccurrenceEntity.java b/src/lessons/recursion/cons/OccurrenceEntity.java index 45836b658..5f1fc361e 100644 --- a/src/lessons/recursion/cons/OccurrenceEntity.java +++ b/src/lessons/recursion/cons/OccurrenceEntity.java @@ -12,7 +12,7 @@ public void run() int count = getTestCount(); for (int i = 0; i < count; i++) { Object[] param = (Object[])deserialize(getTest(i)); - setTestResult(i, serialize(occurences(RecList.fromArray((int[])param[0]), (Integer)param[1]))); + setTestResult(i, serialize(occurences(RecList.fromArray((int[]) param[0]), (Integer)param[1]))); } } diff --git a/src/lessons/recursion/cons/PlusOneEntity.java b/src/lessons/recursion/cons/PlusOneEntity.java index f9c044918..c0729476d 100644 --- a/src/lessons/recursion/cons/PlusOneEntity.java +++ b/src/lessons/recursion/cons/PlusOneEntity.java @@ -12,7 +12,7 @@ public void run() int count = getTestCount(); for (int i = 0; i < count; i++) { Object[] param = (Object[])deserialize(getTest(i)); - setTestResult(i, serialize(plusOne(RecList.fromArray((int[])param[0])))); + setTestResult(i, serialize(plusOne(RecList.fromArray((int[]) param[0])))); } } diff --git a/src/lessons/recursion/cons/RemoveEntity.java b/src/lessons/recursion/cons/RemoveEntity.java index aa07a715f..b5f9c3049 100644 --- a/src/lessons/recursion/cons/RemoveEntity.java +++ b/src/lessons/recursion/cons/RemoveEntity.java @@ -12,7 +12,7 @@ public void run() int count = getTestCount(); for (int i = 0; i < count; i++) { Object[] param = (Object[])deserialize(getTest(i)); - setTestResult(i, serialize(remove(RecList.fromArray((int[])param[0]), (Integer)param[1]))); + setTestResult(i, serialize(remove(RecList.fromArray((int[]) param[0]), (Integer)param[1]))); } } diff --git a/src/lessons/recursion/cons/ReverseEntity.java b/src/lessons/recursion/cons/ReverseEntity.java index 85b8a5a67..03a6b081c 100644 --- a/src/lessons/recursion/cons/ReverseEntity.java +++ b/src/lessons/recursion/cons/ReverseEntity.java @@ -12,7 +12,7 @@ public void run() int count = getTestCount(); for (int i = 0; i < count; i++) { Object[] param = (Object[])deserialize(getTest(i)); - setTestResult(i, serialize(reverse(RecList.fromArray((int[])param[0])))); + setTestResult(i, serialize(reverse(RecList.fromArray((int[]) param[0])))); } } diff --git a/src/lessons/recursion/lego/tree/TreeEntity.java b/src/lessons/recursion/lego/tree/TreeEntity.java index d69c9641f..29e10b20a 100644 --- a/src/lessons/recursion/lego/tree/TreeEntity.java +++ b/src/lessons/recursion/lego/tree/TreeEntity.java @@ -28,7 +28,7 @@ public void setPos(int i,int j) { Color.lightGray, Color.gray, Color.darkGray, Color.black, Color.red}; @Primitive(308) - private void current(int v) { + public void current(int v) { if (v>=colors.length || v < 0) setColor(colors[colors.length -1]); setColor(colors[v]); diff --git a/src/lessons/sort/basic/comb/AlgCombSort11Entity.java b/src/lessons/sort/basic/comb/AlgCombSort11Entity.java index 7f12771b6..57f5db857 100644 --- a/src/lessons/sort/basic/comb/AlgCombSort11Entity.java +++ b/src/lessons/sort/basic/comb/AlgCombSort11Entity.java @@ -15,7 +15,7 @@ public void combSort11() { boolean swapped; do { if (gap>1) { - gap /= 1.3; + gap = (int) (gap / 1.3); if (gap == 10 || gap == 9) gap = 11; } diff --git a/src/lessons/sort/basic/comb/AlgCombSortEntity.java b/src/lessons/sort/basic/comb/AlgCombSortEntity.java index 670de741d..2b4ad3ce6 100644 --- a/src/lessons/sort/basic/comb/AlgCombSortEntity.java +++ b/src/lessons/sort/basic/comb/AlgCombSortEntity.java @@ -15,7 +15,7 @@ public void combSort() { boolean swapped; do { if (gap>1) - gap /= 1.3; + gap = (int) (gap / 1.3); swapped = false; for (int i=0; i+gap= input.length()) { - throw new IllegalArgumentException("Unexpected end of input at position " + pos); - } - - char c = input.charAt(pos); - if (c == 'Z') - return null; - if (c == '[') - return parseArray(); - if (c == '"') - return parseString(); - return parsePrimitive(); + private static String getTypeRepresentation(Class clazz) { + assert !clazz.isArray(); + + if (clazz == Integer.class || clazz == int.class) return "i"; + if (clazz == Double.class || clazz == double.class) return "f"; + if (clazz == Boolean.class || clazz == boolean.class) return "b"; + + if (clazz == Object.class || clazz == String.class) return ""; + throw new IllegalArgumentException("Unknown serializable type: " + clazz.getSimpleName()); } - private Object[] parseArray() - { - pos++; // Skip '[' - if (input.charAt(pos) == '0') { - pos += 2; - return new Object[0]; - } - - int colonIdx = input.indexOf(':', pos); - if (colonIdx == -1) { - throw new IllegalArgumentException("Expected ':' after array length at position " + pos); - } - - int len = Integer.parseInt(input.substring(pos, colonIdx)); - pos = colonIdx + 1; // Skip ':' - - Object[] arr = new Object[len]; - for (int i = 0; i < len; i++) { - arr[i] = parse(); - if (i < len - 1) { - if (input.charAt(pos) != ':') { - throw new IllegalArgumentException("Expected ':' between array elements at position " + pos); - } - pos++; // Skip ':' - } - } - - if (pos >= input.length() || input.charAt(pos) != ']') { - throw new IllegalArgumentException("Expected ']' at end of array at position " + pos); - } - pos++; // Skip ']' - return arr; + /* --- Serialization logic --- */ + public static String serialize(Object o) { + if (o == null) return "Z"; + + Class clazz = o.getClass(); + if (o instanceof Collection || clazz.isArray()) { + + List values; + String typeRepresentation; + + if (o instanceof Collection objects) { + values = Arrays.asList(objects.toArray()); + typeRepresentation = objects.isEmpty() ? "" : getTypeRepresentation(objects.iterator().next().getClass()); + } else { + typeRepresentation = getTypeRepresentation(clazz.getComponentType()); + if (o instanceof int[] ints) { + values = Arrays.stream(ints).boxed().toList(); + } else if (o instanceof double[] doubles) { + values = Arrays.stream(doubles).boxed().toList(); + } else if (o instanceof boolean[] booleans) { + // Arrays.stream is not implemented for booleans... + List booleanValues = new ArrayList<>(); + for (boolean b : booleans) { + Boolean boo = b ? Boolean.TRUE : Boolean.FALSE; + booleanValues.add(boo); + } + values = booleanValues; + } else { + values = Arrays.stream((Object[]) o).toList(); + } + } + + return typeRepresentation + + "[" + + values.size() + + values.stream().map(ValueSerializer::serialize).map(s -> ":" + s).collect(Collectors.joining()) + + "]"; + } + + if (o instanceof String value) { + String escaped = value + .replace("\\", "\\\\") + .replace("\"", "\\\""); + return "\"" + escaped + "\""; + } + + String typeRepresentation = getTypeRepresentation(clazz); + + if (typeRepresentation.equals("b")) { + return "b" + (Objects.equals(o, true) ? "1" : "0"); + } + return typeRepresentation + o; } - private String parseString() - { - pos++; // Skip opening '"' - StringBuilder sb = new StringBuilder(); - while (pos < input.length()) { - char c = input.charAt(pos); - if (c == '\\' && pos + 1 < input.length() && input.charAt(pos + 1) == '"') { - sb.append('"'); - pos += 2; - } else if (c == '"') { - pos++; // Skip closing '"' - return sb.toString(); - } else { - sb.append(c); - pos++; - } - } - throw new IllegalArgumentException("Unterminated string starting at position " + (pos - sb.length() - 1)); + /* --- Deserialization logic --- */ + + public static Object deserialize(String text) { + Parser parser = new Parser(text); + Object value = parser.parseValue(); + if (!parser.isFinished()) { + throw new IllegalArgumentException("Unexpected trailing characters."); + } + return value; } - private Object parsePrimitive() - { - int start = pos; - while (pos < input.length() && input.charAt(pos) != ':' && input.charAt(pos) != ']') { - pos++; - } - char typeHint = input.charAt(start); - String val = input.substring(start + 1, pos); - - try { - switch (typeHint) { - case 'i': - return Integer.parseInt(val); - case 'b': - return val.equals("1"); - case 'f': - return Double.parseDouble(val); - default: // Fallback if format string is exhausted or mismatched - throw new IllegalArgumentException("Parse error: Invalid type hint '" + typeHint + "' at position " + start + " in input \"" + input + "\""); - } - } catch (NumberFormatException e) { - throw new IllegalArgumentException(e); - } + private static final class Parser { + + private final String text; + private int pos = 0; + + Parser(String text) { + this.text = text; + } + + private static boolean isNumberChar(char c) { + return Character.isDigit(c) || c == '-'; + } + + private static boolean isDoubleChar(char c) { + return Character.isDigit(c) + || c == '-' + || c == '.' + || c == 'e' + || c == 'E' + || c == '+'; + } + + /* ---------- Arrays ---------- */ + + boolean isFinished() { + return pos == text.length(); + } + + Object parseValue() { + char c = peek(); + + if (c == 'Z') { + pos++; + return null; + } + + if (c == '"') { + return parseString(); + } + + if (c == 'i') { + pos++; + if (peek() == '[') { + return parseIntArray(); + } + return parseInt(); + } + + if (c == 'f') { + pos++; + if (peek() == '[') { + return parseDoubleArray(); + } + return parseDouble(); + } + + if (c == 'b') { + pos++; + if (peek() == '[') { + return parseBooleanArray(); + } + return parseBoolean(); + } + + if (c == '[') { + return parseObjectArray(); + } + + throw new IllegalArgumentException("Unexpected character '" + c + "' at " + pos); + } + + private int[] parseIntArray() { + Object[] values = parseArrayContents(); + int[] result = new int[values.length]; + for (int i = 0; i < values.length; i++) { + result[i] = (Integer) values[i]; + } + return result; + } + + private double[] parseDoubleArray() { + Object[] values = parseArrayContents(); + double[] result = new double[values.length]; + for (int i = 0; i < values.length; i++) { + result[i] = (Double) values[i]; + } + return result; + } + + private boolean[] parseBooleanArray() { + Object[] values = parseArrayContents(); + boolean[] result = new boolean[values.length]; + for (int i = 0; i < values.length; i++) { + result[i] = (Boolean) values[i]; + } + return result; + } + + /* ---------- Primitive values ---------- */ + + private Object[] parseObjectArray() { + return parseArrayContents(); + } + + private Object[] parseArrayContents() { + expect('['); + + int size = parseUnsignedInt(); + + Object[] values = new Object[size]; + + for (int i = 0; i < size; i++) { + expect(':'); + values[i] = parseValue(); + } + + expect(']'); + + return values; + } + + private Integer parseInt() { + int start = pos; + while (!isFinished() && isNumberChar(peek())) { + pos++; + } + return Integer.parseInt(text.substring(start, pos)); + } + + private Double parseDouble() { + int start = pos; + while (!isFinished() && isDoubleChar(peek())) { + pos++; + } + return Double.parseDouble(text.substring(start, pos)); + } + + /* ---------- Helpers ---------- */ + + private Boolean parseBoolean() { + char c = peek(); + pos++; + return switch (c) { + case '0' -> false; + case '1' -> true; + default -> throw new IllegalArgumentException("Invalid boolean"); + }; + } + + private String parseString() { + expect('"'); + + StringBuilder sb = new StringBuilder(); + + while (true) { + if (isFinished()) { + throw new IllegalArgumentException("Unterminated string"); + } + + char c = text.charAt(pos++); + + if (c == '\\') { + if (isFinished()) { + throw new IllegalArgumentException("Invalid escape"); + } + sb.append(text.charAt(pos++)); + } else if (c == '"') { + break; + } else { + sb.append(c); + } + } + + return sb.toString(); + } + + private int parseUnsignedInt() { + int start = pos; + while (!isFinished() && Character.isDigit(peek())) { + pos++; + } + return Integer.parseInt(text.substring(start, pos)); + } + + private char peek() { + return text.charAt(pos); + } + + private void expect(char c) { + if (isFinished() || text.charAt(pos) != c) { + throw new IllegalArgumentException( + "Expected '" + c + "' at " + pos); + } + pos++; + } } - } } \ No newline at end of file diff --git a/src/plm/core/ValueSerializerTest.java b/src/plm/core/ValueSerializerTest.java index 9599200b4..ec6efe047 100644 --- a/src/plm/core/ValueSerializerTest.java +++ b/src/plm/core/ValueSerializerTest.java @@ -27,14 +27,14 @@ public class ValueSerializerTest { assertEquals("\"he\\\"llo\"", ValueSerializer.serialize("he\"llo")); } - @Test void serialize_intArray_returnsFormattedString() { assertEquals("[3:i1:i2:i3]", ValueSerializer.serialize(new int[] {1, 2, 3})); } - @Test void serialize_IntegerArray_returnsFormattedString() { assertEquals("[2:i1:i2]", ValueSerializer.serialize(new Integer[] {1, 2})); } + @Test void serialize_intArray_returnsFormattedString() { assertEquals("i[3:i1:i2:i3]", ValueSerializer.serialize(new int[] {1, 2, 3})); } + @Test void serialize_IntegerArray_returnsFormattedString() { assertEquals("i[2:i1:i2]", ValueSerializer.serialize(new Integer[] {1, 2})); } - @Test void serialize_doubleArray_returnsFormattedString() { assertEquals("[2:f1.5:f-2.2]", ValueSerializer.serialize(new double[] {1.5, -2.2})); } - @Test void serialize_DoubleArray_returnsFormattedString() { assertEquals("[2:f1.5:f-2.2]", ValueSerializer.serialize(new Double[] {1.5, -2.2})); } + @Test void serialize_doubleArray_returnsFormattedString() { assertEquals("f[2:f1.5:f-2.2]", ValueSerializer.serialize(new double[] {1.5, -2.2})); } + @Test void serialize_DoubleArray_returnsFormattedString() { assertEquals("f[2:f1.5:f-2.2]", ValueSerializer.serialize(new Double[] {1.5, -2.2})); } @Test void serialize_stringArray_returnsFormattedString() { assertEquals("[2:\"a\":\"b\"]", ValueSerializer.serialize(new String[] {"a", "b"})); } - @Test void serialize_booleanArray_returnsFormattedString() { assertEquals("[2:b1:b0]", ValueSerializer.serialize(new boolean[] {true, false})); } - @Test void serialize_BooleanArray_returnsFormattedString() { assertEquals("[2:b1:b0]", ValueSerializer.serialize(new Boolean[] {true, false})); } + @Test void serialize_booleanArray_returnsFormattedString() { assertEquals("b[2:b1:b0]", ValueSerializer.serialize(new boolean[] {true, false})); } + @Test void serialize_BooleanArray_returnsFormattedString() { assertEquals("b[2:b1:b0]", ValueSerializer.serialize(new Boolean[] {true, false})); } @Test void serialize_mixedObjectArray_returnsFormattedString() { Object[] input = {"Hi", 2}; @@ -44,7 +44,7 @@ public class ValueSerializerTest { @Test void serialize_emptyArray_returnsZeroLength() { assertEquals("[0]", ValueSerializer.serialize(new Object[] {})); - assertEquals("[0]", ValueSerializer.serialize(new int[] {})); + assertEquals("i[0]", ValueSerializer.serialize(new int[] {})); } @Test void serialize_nestedArray_serializesCorrectly() diff --git a/src/plm/core/model/lesson/ExerciseTemplated.java b/src/plm/core/model/lesson/ExerciseTemplated.java index 7f6d13a20..31051b509 100644 --- a/src/plm/core/model/lesson/ExerciseTemplated.java +++ b/src/plm/core/model/lesson/ExerciseTemplated.java @@ -411,7 +411,7 @@ public void run() { compileAll(Game.getInstance().getOutputWriter(), StudentOrCorrection.CORRECTION); } catch (PLMCompilerException e) { System.err.println("Severe error: the correction of exercise " + id + - " cannot be compiled in C. Please go fix your PLM."); + " cannot be compiled in "+Game.getInstance().getProgrammingLanguage().getLang()+". Please go fix your PLM."); e.printStackTrace(); Game.getInstance().setState(Game.GameState.COMPILATION_ENDED); Game.getInstance().setState(Game.GameState.EXECUTION_ENDED);