package dev.peerat.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 dev.peerat.parser.Parser; import dev.peerat.parser.Token; import dev.peerat.parser.TokenType; import dev.peerat.parser.TokenValidator; import dev.peerat.parser.java.Annotation.AnnotableBuffer; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.state.RedirectStateTree; import dev.peerat.parser.state.StateTree; public class AnnotationTests { public static StateTree get(){ StateTree annotation = new StateTree<>(); StateTree 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 AnnotableBuffer) ((AnnotableBuffer)parent).addAnnotationBuffer(result); return null; }); StateTree annotation_begin = annotation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); StateTree 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 AnnotableBuffer) ((AnnotableBuffer)parent).addAnnotationBuffer(result); return null; }); StateTree annotation_var = annotation_begin.then((validator) -> validator.validate( (token) -> token.getType().equals(TokenType.NAME), (bag, token) -> bag.set("index", token))); StateTree annotation_value = annotation_var.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) .then(new RedirectStateTree<>(ValueTests.get(), (global, local) -> { Map 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 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 parser = new Parser(){ { setTokenizer(ModifierTests.TOKENIZER); setStateTree(get()); } }; JavaElement testCase(String value) throws Exception{ TokenValidator.TOKENS = 0; TokenValidator.MAX_VALIDATE = 0; JavaElement result = null; 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)"); } }