Skip to content

Commit 44a5811

Browse files
committed
Extract assertNoLoopsUsed in critical places
This method is rather slow, so it should only be run once per test. Closes #11
1 parent 0228af5 commit 44a5811

File tree

8 files changed

+75
-22
lines changed

8 files changed

+75
-22
lines changed

src/graderPrivate/java/h11/H11_RubricProvider.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public class H11_RubricProvider implements RubricProvider {
5757
.shortDescription("H11.2.B | Das Wachstum wird korrekt berechnet")
5858
.maxPoints(2)
5959
.grader(Grader.testAwareBuilder()
60+
.requirePass(JUnitTestRef.ofMethod(() -> LSystemGrowerTest.class.getMethod("testNoLoopsInGrow")))
6061
.requirePass(JUnitTestRef.ofMethod(() -> LSystemGrowerTest.class.getMethod("testGrow", LSystemGrowerTestCase.class)))
6162
.pointsFailedMin()
6263
.pointsPassedMax()
@@ -70,6 +71,7 @@ public class H11_RubricProvider implements RubricProvider {
7071
private static final Criterion H3_1_A = Criterion.builder()
7172
.shortDescription("H11.3.1.A | Die erste Projektion gibt das Axiom vor")
7273
.grader(Grader.testAwareBuilder()
74+
.requirePass(JUnitTestRef.ofMethod(() -> ParsedLSystemTest.class.getMethod("testNoLoopsInGetAxiomUsed")))
7375
.requirePass(JUnitTestRef.ofMethod(() -> ParsedLSystemTest.class.getMethod("testThat_firstProjectionGivesAxiom", ParsedLSystemTestCase.class)))
7476
.pointsFailedMin()
7577
.pointsPassedMax()
@@ -78,6 +80,7 @@ public class H11_RubricProvider implements RubricProvider {
7880
private static final Criterion H3_1_B = Criterion.builder()
7981
.shortDescription("H11.3.1.B | Ist der aktuale Parameter bekannt, wird korrekt projektiert")
8082
.grader(Grader.testAwareBuilder()
83+
.requirePass(JUnitTestRef.ofMethod(() -> ParsedLSystemTest.class.getMethod("testNoLoopsInProjectUsed")))
8184
.requirePass(JUnitTestRef.ofMethod(() -> ParsedLSystemTest.class.getMethod("testThat_projectionsOfKnownProject", ParsedLSystemTestCase.class)))
8285
.pointsFailedMin()
8386
.pointsPassedMax()
@@ -86,6 +89,7 @@ public class H11_RubricProvider implements RubricProvider {
8689
private static final Criterion H3_1_C = Criterion.builder()
8790
.shortDescription("H11.3.1.C | Ist der aktuale Parameter nicht bekannt, wird korrekt projektiert")
8891
.grader(Grader.testAwareBuilder()
92+
.requirePass(JUnitTestRef.ofMethod(() -> ParsedLSystemTest.class.getMethod("testNoLoopsInProjectUsed")))
8993
.requirePass(JUnitTestRef.ofMethod(() -> ParsedLSystemTest.class.getMethod("testThat_projectionsOfUnknownDoesNotProject", ParsedLSystemTestCase.class)))
9094
.pointsFailedMin()
9195
.pointsPassedMax()
@@ -176,6 +180,7 @@ public class H11_RubricProvider implements RubricProvider {
176180
private static final Criterion H4_3_A = Criterion.builder()
177181
.shortDescription("H11.4.3.A | Der Test ist korrekt implementiert")
178182
.grader(Grader.testAwareBuilder()
183+
.requirePass(JUnitTestRef.ofMethod(() -> AlgaeTestTest.class.getMethod("testNoLoopsUsed")))
179184
.requirePass(JUnitTestRef.ofMethod(() -> AlgaeTestTest.class.getMethod("testThat_algaeTestAcceptsPositive", int.class)))
180185
.requirePass(JUnitTestRef.ofMethod(() -> AlgaeTestTest.class.getMethod("testThat_algaeTestRejectsWrongSize", int.class)))
181186
.requirePass(JUnitTestRef.ofMethod(() -> AlgaeTestTest.class.getMethod("testThat_algaeTestRejectsWrongValues", int.class)))
@@ -195,6 +200,7 @@ public class H11_RubricProvider implements RubricProvider {
195200
private static final Criterion H5_1 = Criterion.builder()
196201
.shortDescription("H11.5.1 | Pythons choices")
197202
.grader(Grader.testAwareBuilder()
203+
.requirePass(JUnitTestRef.ofMethod(() -> RandomTest.class.getMethod("testNoLoopsInChoicesUsed")))
198204
.requirePass(JUnitTestRef.ofMethod(() -> RandomTest.class.getMethod("testChoices", RandomChoicesTestCase.class)))
199205
.pointsFailedMin()
200206
.pointsPassedMax()
@@ -204,6 +210,7 @@ public class H11_RubricProvider implements RubricProvider {
204210
.shortDescription("H11.5.2 | Zufälliges Latein")
205211
.maxPoints(2)
206212
.grader(Grader.testAwareBuilder()
213+
.requirePass(JUnitTestRef.ofMethod(() -> RandomTest.class.getMethod("testNoLoopsInLatinUsed")))
207214
.requirePass(JUnitTestRef.ofMethod(() -> RandomTest.class.getMethod("testLatin", RandomLatinTestCase.class)))
208215
.pointsFailedMin()
209216
.pointsPassedMax()
@@ -217,6 +224,7 @@ public class H11_RubricProvider implements RubricProvider {
217224
private static final Criterion H6_1 = Criterion.builder()
218225
.shortDescription("H11.6.1 | Zufällige Projektionen")
219226
.grader(Grader.testAwareBuilder()
227+
.requirePass(JUnitTestRef.ofMethod(() -> RandomLSystemGeneratorTest.class.getMethod("testNoLoopsInMakeProjectionUsed")))
220228
.requirePass(JUnitTestRef.or(
221229
JUnitTestRef.ofMethod(() -> RandomLSystemGeneratorTest.class.getMethod("testMakeProjectionInclusive", MakeProjectionTestCase.class)),
222230
JUnitTestRef.ofMethod(() -> RandomLSystemGeneratorTest.class.getMethod("testMakeProjectionExclusive", MakeProjectionTestCase.class))
@@ -228,6 +236,7 @@ public class H11_RubricProvider implements RubricProvider {
228236
private static final Criterion H6_2_A = Criterion.builder()
229237
.shortDescription("H11.6.2.A | Es gibt keine doppelten Quellen")
230238
.grader(Grader.testAwareBuilder()
239+
.requirePass(JUnitTestRef.ofMethod(() -> RandomLSystemGeneratorTest.class.getMethod("testNoLoopsInGenerateUsed")))
231240
.requirePass(JUnitTestRef.ofMethod(() -> RandomLSystemGeneratorTest.class.getMethod("testThat_sourcesAreUnique", int.class)))
232241
.pointsFailedMin()
233242
.pointsPassedMax()
@@ -237,6 +246,7 @@ public class H11_RubricProvider implements RubricProvider {
237246
.shortDescription("H11.6.2.B | Die L-Systeme werden korrekt generiert")
238247
.maxPoints(2)
239248
.grader(Grader.testAwareBuilder()
249+
.requirePass(JUnitTestRef.ofMethod(() -> RandomLSystemGeneratorTest.class.getMethod("testNoLoopsInGenerateUsed")))
240250
.requirePass(JUnitTestRef.or(
241251
JUnitTestRef.ofMethod(() -> RandomLSystemGeneratorTest.class.getMethod("testGenerateExclusive", GenerateTestCase.class)),
242252
JUnitTestRef.ofMethod(() -> RandomLSystemGeneratorTest.class.getMethod("testGenerateInclusive", GenerateTestCase.class))
@@ -257,6 +267,7 @@ public class H11_RubricProvider implements RubricProvider {
257267
private static final Criterion H7_1 = Criterion.builder()
258268
.shortDescription("H11.7.1 | Zufällige Leerzeichen")
259269
.grader(Grader.testAwareBuilder()
270+
.requirePass(JUnitTestRef.ofMethod(() -> LSystemToRandomLinesConverterTest.class.getMethod("testNoLoopsInGenerateSpacesUsed")))
260271
.requirePass(JUnitTestRef.or(
261272
JUnitTestRef.ofMethod(() -> LSystemToRandomLinesConverterTest.class.getMethod("testRandomSpacingExclusive", RandomSpacesTestCase.class)),
262273
JUnitTestRef.ofMethod(() -> LSystemToRandomLinesConverterTest.class.getMethod("testRandomSpacingInclusive", RandomSpacesTestCase.class))
@@ -268,6 +279,7 @@ public class H11_RubricProvider implements RubricProvider {
268279
private static final Criterion H7_2 = Criterion.builder()
269280
.shortDescription("H11.7.2 | Darstellung für das ganze System")
270281
.grader(Grader.testAwareBuilder()
282+
.requirePass(JUnitTestRef.ofMethod(() -> LSystemToRandomLinesConverterTest.class.getMethod("testNoLoopsInLSystemAsLines")))
271283
.requirePass(JUnitTestRef.or(
272284
JUnitTestRef.ofMethod(() -> LSystemToRandomLinesConverterTest.class.getMethod("testLSystemAsLinesExclusive", LSystemAsLinesTestCase.class)),
273285
JUnitTestRef.ofMethod(() -> LSystemToRandomLinesConverterTest.class.getMethod("testLSystemAsLinesInclusive", LSystemAsLinesTestCase.class))

src/graderPrivate/java/h11/h2/LSystemGrowerTest.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,16 @@ public Stream<Character> project(Character e) {
4747
"The returned Stream ended to soon");
4848
}
4949

50+
@Test
51+
@Tag("H2")
52+
public void testNoLoopsInGrow() {
53+
assertNoLoopsUsed(LSystemGrowerImpl.class, "grow");
54+
}
55+
5056
@ParameterizedTest
5157
@JsonClasspathSource("h11/h2/lsystem-grower-test.json")
5258
@Tag("H2")
5359
public void testGrow(LSystemGrowerTestCase testCase) throws NoSuchMethodException {
54-
assertNoLoopsUsed(LSystemGrowerImpl.class, "grow");
55-
5660
LSystemGrowerImpl<Character> grower = getGrower(testCase);
5761

5862
var actual = grower

src/graderPrivate/java/h11/h3/ParsedLSystemTest.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import h11.parse.ParsedLSystem;
44
import org.junit.jupiter.api.Tag;
5+
import org.junit.jupiter.api.Test;
56
import org.junit.jupiter.params.ParameterizedTest;
67
import org.junitpioneer.jupiter.json.JsonClasspathSource;
78
import org.sourcegrade.jagr.api.rubric.TestForSubmission;
@@ -16,11 +17,16 @@
1617
@TestForSubmission
1718
public class ParsedLSystemTest {
1819

20+
@Test
21+
@Tag("H3")
22+
public void testNoLoopsInGetAxiomUsed() {
23+
assertNoLoopsUsed(ParsedLSystem.class, "getAxiom");
24+
}
25+
1926
@ParameterizedTest
2027
@JsonClasspathSource("h11/h3/parsed-lsystem-test.json")
2128
@Tag("H3")
2229
public void testThat_firstProjectionGivesAxiom(ParsedLSystemTestCase testCase) throws NoSuchMethodException {
23-
assertNoLoopsUsed(ParsedLSystem.class, "getAxiom");
2430
var lSystem = new ParsedLSystem(testCase.projections());
2531
var expected = testCase.projections().get(0).source();
2632
Assertions2.assertEquals(expected, lSystem.getAxiom(), getAxiomContext(), result ->
@@ -33,12 +39,16 @@ private Context getAxiomContext() throws NoSuchMethodException {
3339
.build();
3440
}
3541

42+
@Test
43+
@Tag("H3")
44+
public void testNoLoopsInProjectUsed() {
45+
assertNoLoopsUsed(ParsedLSystem.class, "project");
46+
}
47+
3648
@ParameterizedTest
3749
@JsonClasspathSource("h11/h3/parsed-lsystem-test.json")
3850
@Tag("H3")
3951
public void testThat_projectionsOfKnownProject(ParsedLSystemTestCase testCase) throws NoSuchMethodException {
40-
assertNoLoopsUsed(ParsedLSystem.class, "project");
41-
4252
var lSystem = new ParsedLSystem(testCase.projections());
4353

4454
for (var p : testCase.projections()) {
@@ -56,8 +66,6 @@ public void testThat_projectionsOfKnownProject(ParsedLSystemTestCase testCase) t
5666
@JsonClasspathSource("h11/h3/parsed-lsystem-test.json")
5767
@Tag("H3")
5868
public void testThat_projectionsOfUnknownDoesNotProject(ParsedLSystemTestCase testCase) throws NoSuchMethodException {
59-
assertNoLoopsUsed(ParsedLSystem.class, "project");
60-
6169
var lSystem = new ParsedLSystem(testCase.projections());
6270

6371
for (char c = '0'; c <= '9'; c++) {

src/graderPrivate/java/h11/h4/AlgaeTestTest.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import h11.fibs.FibonacciGenerator;
55
import h11.tutor.fibs.TutorFibonacciGenerator;
66
import org.junit.jupiter.api.Tag;
7+
import org.junit.jupiter.api.Test;
78
import org.junit.jupiter.api.function.Executable;
89
import org.junit.jupiter.params.ParameterizedTest;
910
import org.junit.jupiter.params.provider.ValueSource;
@@ -21,18 +22,22 @@ public class AlgaeTestTest {
2122

2223
private static final FibonacciGenerator TUTOR_FIBONACCI_GENERATOR = new TutorFibonacciGenerator();
2324

25+
@Test
26+
@Tag("H4")
27+
public void testNoLoopsUsed() {
28+
assertNoLoopsUsed(AlgaeTest.class, "testAlgaeGeneratesFibs");
29+
}
30+
2431
@ParameterizedTest
2532
@ValueSource(ints = {8, 16, 20, 24, 30})
2633
@Tag("H4")
2734
public void testThat_algaeTestAcceptsPositive(int numberOfFibs) throws NoSuchMethodException {
28-
assertNoLoopsUsed(AlgaeTest.class, "testAlgaeGeneratesFibs");
2935
var algaeTest = new MockAlgaeTest(TUTOR_FIBONACCI_GENERATOR);
3036
Assertions2.assertTrue(testAccepts(() -> algaeTest.testAlgaeGeneratesFibs(numberOfFibs)), getContext(numberOfFibs), result ->
3137
"The test case did not accept correct input");
3238
}
3339

3440
private Context getContext(int numberOfFibs) throws NoSuchMethodException {
35-
assertNoLoopsUsed(AlgaeTest.class, "testAlgaeGeneratesFibs");
3641
return Assertions2.contextBuilder()
3742
.subject(AlgaeTest.class.getMethod("testAlgaeGeneratesFibs", int.class))
3843
.add("numberOfFibs", numberOfFibs)
@@ -43,7 +48,6 @@ private Context getContext(int numberOfFibs) throws NoSuchMethodException {
4348
@ValueSource(ints = {8, 16, 20, 24, 30})
4449
@Tag("H4")
4550
public void testThat_algaeTestRejectsWrongSize(int numberOfFibs) throws NoSuchMethodException {
46-
assertNoLoopsUsed(AlgaeTest.class, "testAlgaeGeneratesFibs");
4751
var algaeTest = new MockAlgaeTest(n ->
4852
TUTOR_FIBONACCI_GENERATOR.generate(numberOfFibs-1));
4953
Assertions2.assertFalse(testAccepts(() -> algaeTest.testAlgaeGeneratesFibs(numberOfFibs)), getContext(numberOfFibs), result ->
@@ -54,7 +58,6 @@ public void testThat_algaeTestRejectsWrongSize(int numberOfFibs) throws NoSuchMe
5458
@ValueSource(ints = {8, 16, 20, 24, 30})
5559
@Tag("H4")
5660
public void testThat_algaeTestRejectsWrongValues(int numberOfFibs) throws NoSuchMethodException {
57-
assertNoLoopsUsed(AlgaeTest.class, "testAlgaeGeneratesFibs");
5861
var algaeTest = new MockAlgaeTest(n -> {
5962
var fibs = new ArrayList<>(TUTOR_FIBONACCI_GENERATOR.generate(numberOfFibs-1));
6063
fibs.set(fibs.size()-2, 0);

src/graderPrivate/java/h11/h4/FibonacciGeneratorTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package h11.h4;
22

3-
import h11.fibs.AlgaeTest;
43
import h11.fibs.FibonacciGenerator;
54
import h11.tutor.fibs.TutorFibonacciGenerator;
65
import org.junit.jupiter.api.Tag;

src/graderPrivate/java/h11/h5/RandomTest.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import h11.Random;
44
import org.junit.jupiter.api.Tag;
5+
import org.junit.jupiter.api.Test;
56
import org.junit.jupiter.params.ParameterizedTest;
67
import org.junitpioneer.jupiter.json.JsonClasspathSource;
78
import org.sourcegrade.jagr.api.rubric.TestForSubmission;
@@ -13,12 +14,16 @@
1314
@TestForSubmission
1415
public class RandomTest {
1516

17+
@Test
18+
@Tag("H5")
19+
public void testNoLoopsInChoicesUsed() {
20+
assertNoLoopsUsed(Random.class, "choices");
21+
}
22+
1623
@ParameterizedTest
1724
@JsonClasspathSource("h11/h5/random-choices-test.json")
1825
@Tag("H5")
1926
public void testChoices(RandomChoicesTestCase testCase) throws NoSuchMethodException {
20-
assertNoLoopsUsed(Random.class, "choices");
21-
2227
var random = new Random(testCase.seed());
2328
var actual = random
2429
.choices(testCase.input())
@@ -36,12 +41,16 @@ private Context getChoicesContext(RandomChoicesTestCase testCase) throws NoSuchM
3641
.build();
3742
}
3843

44+
@Test
45+
@Tag("H5")
46+
public void testNoLoopsInLatinUsed() {
47+
assertNoLoopsUsed(Random.class, "latin");
48+
}
49+
3950
@ParameterizedTest
4051
@JsonClasspathSource("h11/h5/random-latin-test.json")
4152
@Tag("H5")
4253
public void testLatin(RandomLatinTestCase testCase) throws NoSuchMethodException {
43-
assertNoLoopsUsed(Random.class, "latin");
44-
4554
var random = new Random(testCase.seed());
4655
var actual = random.latin(testCase.length());
4756
Assertions2.assertEquals(testCase.output(), actual, getLatinContext(testCase), result ->

src/graderPrivate/java/h11/h6/RandomLSystemGeneratorTest.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import h11.providers.RandomLSystemGenerator;
55
import h11.tutor.TutorRandom;
66
import org.junit.jupiter.api.Tag;
7+
import org.junit.jupiter.api.Test;
78
import org.junit.jupiter.params.ParameterizedTest;
89
import org.junit.jupiter.params.provider.ValueSource;
910
import org.junitpioneer.jupiter.json.JsonClasspathSource;
@@ -30,9 +31,13 @@ public void testMakeProjectionInclusive(MakeProjectionTestCase testCase) throws
3031
testMakeProjection(testCase);
3132
}
3233

33-
private void testMakeProjection(MakeProjectionTestCase testCase) throws NoSuchMethodException {
34+
@Test
35+
@Tag("H6")
36+
public void testNoLoopsInMakeProjectionUsed() {
3437
assertNoLoopsUsed(RandomLSystemGenerator.class, "makeProjection");
38+
}
3539

40+
private void testMakeProjection(MakeProjectionTestCase testCase) throws NoSuchMethodException {
3641
var random = new TutorRandom(testCase.seed());
3742
var generator = new RandomLSystemGenerator(random);
3843

@@ -55,8 +60,6 @@ private Context getMakeProjectionContext(MakeProjectionTestCase testCase) throws
5560
@ValueSource(ints = { 12, 3, 5, 67, 8, 2, 1 })
5661
@Tag("H6")
5762
public void testThat_sourcesAreUnique(int seed) throws NoSuchMethodException {
58-
assertNoLoopsUsed(RandomLSystemGenerator.class, "generate");
59-
6063
var random = new TutorRandom(seed);
6164
var generator = new RandomLSystemGenerator(random);
6265
var projections = generator.generate();
@@ -86,9 +89,13 @@ public void testGenerateInclusive(GenerateTestCase testCase) throws NoSuchMethod
8689
testGenerate(testCase);
8790
}
8891

89-
private void testGenerate(GenerateTestCase testCase) throws NoSuchMethodException {
92+
@Test
93+
@Tag("H6")
94+
public void testNoLoopsInGenerateUsed() {
9095
assertNoLoopsUsed(RandomLSystemGenerator.class, "generate");
96+
}
9197

98+
private void testGenerate(GenerateTestCase testCase) throws NoSuchMethodException {
9299
var random = new TutorRandom(testCase.seed());
93100
var generator = new RandomLSystemGenerator(random);
94101
var actual = generator.generate();

src/graderPrivate/java/h11/h7/LSystemToRandomLinesConverterTest.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import h11.providers.LSystemToRandomLinesConverter;
44
import h11.tutor.TutorRandom;
55
import org.junit.jupiter.api.Tag;
6+
import org.junit.jupiter.api.Test;
67
import org.junit.jupiter.params.ParameterizedTest;
78
import org.junitpioneer.jupiter.json.JsonClasspathSource;
89
import org.sourcegrade.jagr.api.rubric.TestForSubmission;
@@ -30,9 +31,13 @@ public void testRandomSpacingInclusive(RandomSpacesTestCase testCase) throws NoS
3031
testRandomSpacing(testCase);
3132
}
3233

33-
private void testRandomSpacing(RandomSpacesTestCase testCase) throws NoSuchMethodException {
34-
assertNoLoopsUsed(LSystemToRandomLinesConverter.class, "randomSpacing");
34+
@Test
35+
@Tag("H7")
36+
public void testNoLoopsInGenerateSpacesUsed() {
37+
assertNoLoopsUsed(LSystemToRandomLinesConverter.class, "generateSpaces");
38+
}
3539

40+
private void testRandomSpacing(RandomSpacesTestCase testCase) throws NoSuchMethodException {
3641
var random = new TutorRandom(testCase.seed());
3742
var converter = new LSystemToRandomLinesConverter(random);
3843
Assertions2.assertEquals(testCase.spaces(), converter.generateSpaces(), getSpacingContext(testCase), result ->
@@ -60,6 +65,12 @@ public void testLSystemAsLinesInclusive(LSystemAsLinesTestCase testCase) throws
6065
testLSystemAsLines(testCase);
6166
}
6267

68+
@Test
69+
@Tag("H7")
70+
public void testNoLoopsInLSystemAsLines() {
71+
assertNoLoopsUsed(LSystemToRandomLinesConverter.class, "lSystemAsLines");
72+
}
73+
6374
private void testLSystemAsLines(LSystemAsLinesTestCase testCase) throws NoSuchMethodException {
6475
assertNoLoopsUsed(LSystemToRandomLinesConverter.class, "lSystemAsLines");
6576

0 commit comments

Comments
 (0)