package cz.habarta.typescript.generator;
import cz.habarta.typescript.generator.parser.*;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import org.junit.Assert;
import org.junit.Test;
public class OptionalAnnotationTest {
@Test
public void testJackson1OptionalAnnotation() {
Settings settings = new Settings();
settings.optionalAnnotations.add(Nullable.class);
ModelParser parser = new Jackson1Parser(settings, new DefaultTypeProcessor());
testModel(parser.parseModel(Jackson1Bean.class), true);
}
@Test
public void testJackson1NoAnnotation() {
Settings settings = new Settings();
ModelParser parser = new Jackson1Parser(settings, new DefaultTypeProcessor());
testModel(parser.parseModel(Jackson1Bean.class), false);
}
@Test
public void testJackson2OptionalAnnotation() {
Settings settings = new Settings();
settings.optionalAnnotations.add(Nullable.class);
ModelParser parser = new Jackson2Parser(settings, new DefaultTypeProcessor());
testModel(parser.parseModel(Jackson2Bean.class), true);
}
@Test
public void testJackson2NoAnnotation() {
Settings settings = new Settings();
ModelParser parser = new Jackson2Parser(settings, new DefaultTypeProcessor());
testModel(parser.parseModel(Jackson2Bean.class), false);
}
private void testModel(Model model, boolean optional) {
Assert.assertEquals(1, model.getBeans().size());
BeanModel beanModel = model.getBeans().get(0);
Assert.assertEquals(2, beanModel.getProperties().size());
for (PropertyModel propertyModel : beanModel.getProperties()) {
Assert.assertEquals(optional, propertyModel.isOptional());
}
}
@Test
public void testJavaxNullableWithJackson1() {
testJavaxNullableUsingTypeScriptGenerator(JsonLibrary.jackson1);
}
@Test
public void testJavaxNullableWithJackson2() {
testJavaxNullableUsingTypeScriptGenerator(JsonLibrary.jackson2);
}
private void testJavaxNullableUsingTypeScriptGenerator(JsonLibrary jsonLibrary) {
Settings settings = TestUtils.settings();
settings.jsonLibrary = jsonLibrary;
settings.optionalAnnotations.add(javax.annotation.Nullable.class);
final String output = new TypeScriptGenerator(settings).generateTypeScript(Input.from(BeanWithJavaxNullable.class));
Assert.assertTrue(output.contains("property1?: string;"));
}
@org.codehaus.jackson.annotate.JacksonAnnotation
@Retention(RetentionPolicy.RUNTIME)
static @interface Nullable {
// marker
}
static class Jackson1Bean {
@Nullable
@org.codehaus.jackson.annotate.JsonProperty
private String fieldProperty;
@Nullable
@org.codehaus.jackson.annotate.JsonProperty
public String getMethodProperty() {
return fieldProperty;
}
}
static class Jackson2Bean {
@Nullable
@com.fasterxml.jackson.annotation.JsonProperty
private String fieldProperty;
@Nullable
@com.fasterxml.jackson.annotation.JsonProperty
public String getMethodProperty() {
return fieldProperty;
}
}
static class BeanWithJavaxNullable {
@javax.annotation.Nullable
public String property1;
}
}