package cz.habarta.typescript.generator; import com.fasterxml.jackson.annotation.*; import cz.habarta.typescript.generator.compiler.*; import cz.habarta.typescript.generator.emitter.*; import cz.habarta.typescript.generator.ext.TypeGuardsForJackson2PolymorphismExtension; import cz.habarta.typescript.generator.parser.*; import java.util.*; import org.junit.*; public class TypeGuardsForJackson2PolymorphismExtensionTest { @Test public void basicTest() { final List<String> lines = new ArrayList<>(); final EmitterExtension.Writer writer = new EmitterExtension.Writer() { @Override public void writeIndentedLine(String line) { lines.add(line); } }; final Settings settings = TestUtils.settings(); final TypeProcessor typeProcessor = new DefaultTypeProcessor(); final Model model = new Jackson2Parser(settings, typeProcessor).parseModel(Point.class); final TsModel tsModel = new ModelCompiler(settings, typeProcessor).javaToTypeScript(model); new TypeGuardsForJackson2PolymorphismExtension().emitElements(writer, settings, false, tsModel); Assert.assertEquals(8, lines.size()); Assert.assertEquals("", lines.get(0)); Assert.assertEquals("function isCartesianPoint(point: Point): point is CartesianPoint {", lines.get(1)); Assert.assertEquals(" return point.type === \"cartesian\";", lines.get(2)); Assert.assertEquals("}", lines.get(3)); } @Test public void testInTypeScriptGenerator() { final Settings settings = TestUtils.settings(); settings.outputFileType = TypeScriptFileType.implementationFile; settings.addTypeNamePrefix = "Json"; settings.extensions.add(new TypeGuardsForJackson2PolymorphismExtension()); final String actual = new TypeScriptGenerator(settings).generateTypeScript(Input.from(Point.class)); Assert.assertTrue(actual.contains("type: \"cartesian\" | \"polar\";")); Assert.assertTrue(actual.contains("function isJsonCartesianPoint(jsonPoint: JsonPoint): jsonPoint is JsonCartesianPoint {")); } @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") @JsonSubTypes({ @JsonSubTypes.Type(CartesianPoint.class), @JsonSubTypes.Type(PolarPoint.class) }) private static interface Point { } @JsonTypeName("cartesian") private static class CartesianPoint implements Point { public double x, y; } @JsonTypeName("polar") private static class PolarPoint implements Point { public double r, theta; } }