Skip to content

Commit 3b7b3b3

Browse files
authored
Merge pull request #1190 from MoChiUaena/codex/fix-enum-map-constant-lookup
Fix EnumMap lookups for enum constants with class bodies
2 parents f1f2902 + a024bb7 commit 3b7b3b3

2 files changed

Lines changed: 80 additions & 1 deletion

File tree

‎handlebars/src/main/java/com/github/jknack/handlebars/context/MapValueResolver.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public Object resolve(final Object context, final String name) {
3535
EnumMap emap = (EnumMap) context;
3636
if (emap.size() > 0) {
3737
Enum first = (Enum) emap.keySet().iterator().next();
38-
Enum key = Enum.valueOf(first.getClass(), name);
38+
Enum key = Enum.valueOf(first.getDeclaringClass(), name);
3939
value = emap.get(key);
4040
}
4141
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*
2+
* Handlebars.java: https://github.com/jknack/handlebars.java
3+
* Apache License Version 2.0 http://www.apache.org/licenses/LICENSE-2.0
4+
* Copyright (c) 2012 Edgar Espina
5+
*/
6+
package com.github.jknack.handlebars.issues;
7+
8+
import static org.junit.jupiter.api.Assertions.assertThrows;
9+
10+
import java.io.IOException;
11+
import java.util.EnumMap;
12+
13+
import org.junit.jupiter.api.Test;
14+
import org.junit.jupiter.params.ParameterizedTest;
15+
import org.junit.jupiter.params.provider.ValueSource;
16+
17+
import com.github.jknack.handlebars.AbstractTest;
18+
import com.github.jknack.handlebars.context.MapValueResolver;
19+
20+
public class Issue1083 extends AbstractTest {
21+
22+
public enum Status {
23+
NEW {
24+
@Override
25+
public boolean isNew() {
26+
return true;
27+
}
28+
},
29+
DONE;
30+
31+
public boolean isNew() {
32+
return false;
33+
}
34+
}
35+
36+
@ParameterizedTest
37+
@ValueSource(
38+
strings = {
39+
"{{statuses.NEW}} {{statuses.DONE}}",
40+
"{{statuses.[NEW]}} {{statuses.[DONE]}}",
41+
"{{lookup statuses 'NEW'}} {{lookup statuses 'DONE'}}",
42+
"{{lookup statuses first}} {{lookup statuses second}}"
43+
})
44+
public void lookupEnumConstantsWithClassBodies(final String template) throws IOException {
45+
EnumMap<Status, Integer> statuses = new EnumMap<>(Status.class);
46+
statuses.put(Status.NEW, 10);
47+
statuses.put(Status.DONE, 20);
48+
shouldCompileTo(
49+
template, $("statuses", statuses, "first", Status.NEW, "second", Status.DONE), "10 20");
50+
}
51+
52+
@Test
53+
public void missingEnumEntryIsUnresolved() throws IOException {
54+
EnumMap<Status, Integer> statuses = new EnumMap<>(Status.class);
55+
statuses.put(Status.NEW, 10);
56+
shouldCompileTo("{{statuses.[DONE]}}", $("statuses", statuses), "");
57+
}
58+
59+
@Test
60+
public void nullEnumEntryIsUnresolved() throws IOException {
61+
EnumMap<Status, Integer> statuses = new EnumMap<>(Status.class);
62+
statuses.put(Status.NEW, null);
63+
shouldCompileTo("{{statuses.[NEW]}}", $("statuses", statuses), "");
64+
}
65+
66+
@Test
67+
public void emptyEnumMapIsUnresolved() throws IOException {
68+
shouldCompileTo("{{statuses.[NEW]}}", $("statuses", new EnumMap<>(Status.class)), "");
69+
}
70+
71+
@Test
72+
public void unknownEnumConstantStillThrows() {
73+
EnumMap<Status, Integer> statuses = new EnumMap<>(Status.class);
74+
statuses.put(Status.NEW, 10);
75+
assertThrows(
76+
IllegalArgumentException.class,
77+
() -> MapValueResolver.INSTANCE.resolve(statuses, "UNKNOWN"));
78+
}
79+
}

0 commit comments

Comments
 (0)