peer-at-code-parser-java/test/be/jeffcheasey88/peeratcode/parser/java/AnnotationTests.java
2023-09-12 23:52:11 +02:00

106 lines
3.9 KiB
Java

package be.jeffcheasey88.peeratcode.parser.java;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.LinkedHashMap;
import java.util.Map;
import org.junit.jupiter.api.Test;
import be.jeffcheasey88.peeratcode.parser.Parser;
import be.jeffcheasey88.peeratcode.parser.Token;
import be.jeffcheasey88.peeratcode.parser.TokenType;
import be.jeffcheasey88.peeratcode.parser.TokenValidator;
import be.jeffcheasey88.peeratcode.parser.java.Annotation.Annotable;
import be.jeffcheasey88.peeratcode.parser.java.Function.FunctionContainer;
import be.jeffcheasey88.peeratcode.parser.state.RedirectStateTree;
import be.jeffcheasey88.peeratcode.parser.state.StateTree;
public class AnnotationTests {
public static StateTree<JavaElement> get(){
StateTree<JavaElement> annotation = new StateTree<>();
StateTree<JavaElement> annotation_name = annotation.then((validator) ->
validator.validate((token) -> token.getValue().equals("@")) &&
!validator.validate((token) -> token.getValue().equals("interface")))
.then((validator) -> validator.validate(
(token) -> token.getType().equals(TokenType.NAME),
(bag, token) -> {
Token name = bag.get("name");
if(name == null) bag.set("name", token);
else bag.set("name", name.concat(token));
}));
annotation_name.then((validator) -> validator.validate(
(token) -> token.getValue().equals("."),
(bag, token) -> {
Token name = bag.get("name");
if(name == null) bag.set("name", token);
else bag.set("name", name.concat(token));
}))
.then(annotation_name);
annotation_name.end((parent, bag) -> {
Annotation result = new Annotation(bag.get("name"));
bag.set(result);
if(parent instanceof Annotable) ((Annotable)parent).addAnnotation(result);
return null;
});
StateTree<JavaElement> annotation_begin = annotation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("(")));
StateTree<JavaElement> annotation_end = annotation_begin.then((validator) -> validator.validate((token) -> token.getValue().equals(")")));
annotation_end.end((parent, bag) -> {
Annotation result = new Annotation(bag.get("name"), bag.get("values"));
bag.set(result);
if(parent instanceof Annotable) ((Annotable)parent).addAnnotation(result);
return null;
});
StateTree<JavaElement> annotation_var = annotation_begin.then((validator) -> validator.validate(
(token) -> token.getType().equals(TokenType.NAME),
(bag, token) -> bag.set("index", token)));
StateTree<JavaElement> annotation_value = annotation_var.then((validator) -> validator.validate((token) -> token.getValue().equals("=")))
.then(new RedirectStateTree<>(ValueTests.get(), (global, local) -> {
Map<Token, Value> map = global.get("values");
if(map == null){
map = new LinkedHashMap<>();
global.set("values", map);
}
map.put(global.get("index"), local.get());
}));
annotation_value.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(annotation_var);
annotation_value.then(annotation_end);
annotation_begin.then(new RedirectStateTree<>(ValueTests.get(), (global, local) -> {
Map<Token, Value> map = global.get("values");
if(map == null){
map = new LinkedHashMap<>();
global.set("values", map);
}
map.put(null, local.get());
})).then(annotation_end);
return annotation;
}
private static Parser<JavaElement> parser = new Parser<JavaElement>(){
{
setTokenizer(ModifierTests.TOKENIZER);
setStateTree(get());
}
};
JavaElement testCase(String value) throws Exception{
TokenValidator.TOKENS = 0;
TokenValidator.MAX_VALIDATE = 0;
JavaElement result = new JavaElement();
parser.parse(value, result);
assertEquals(TokenValidator.TOKENS, TokenValidator.MAX_VALIDATE);
return result;
}
@Test
void routeAnnotation() throws Exception{
JavaElement result = testCase("@Route(path = \"^\\\\/result\\\\/(\\\\d+)$\", needLogin = true)");
}
}