package cz.habarta.typescript.generator; import com.fasterxml.jackson.annotation.JsonFormat; import cz.habarta.typescript.generator.emitter.EmitterExtension; import cz.habarta.typescript.generator.emitter.EmitterExtensionFeatures; import cz.habarta.typescript.generator.emitter.TsModel; import java.io.File; import org.junit.Test; // run `tsc` compiler from `src/test/ts` directory after this test public class ModulesAndNamespacesTest { @Test public void testNamespacesAndModules() { files(new File("target/test-ts-modules"), false); files(new File("target/test-ts-modules-pkg"), true); } public void files(File outputDir, boolean mapPackages) { outputDir.mkdirs(); file("Test1", null, null, mapPackages, TypeScriptOutputKind.global, TypeScriptFileType.declarationFile, new File(outputDir, "test-mn1.d.ts")); file("Test2", null, "NS2", mapPackages, TypeScriptOutputKind.global, TypeScriptFileType.declarationFile, new File(outputDir, "test-mn2.d.ts")); file("Test3a", "mod3a", null, mapPackages, TypeScriptOutputKind.ambientModule, TypeScriptFileType.declarationFile, new File(outputDir, "test-mn3a.d.ts")); file("Test3b", null, null, mapPackages, TypeScriptOutputKind.module, TypeScriptFileType.declarationFile, new File(outputDir, "test-mn3b.d.ts")); file("Test4a", "mod4a", "NS4a", mapPackages, TypeScriptOutputKind.ambientModule, TypeScriptFileType.declarationFile, new File(outputDir, "test-mn4a.d.ts")); file("Test4b", null, "NS4b", mapPackages, TypeScriptOutputKind.module, TypeScriptFileType.declarationFile, new File(outputDir, "test-mn4b.d.ts")); file("Test5", null, null, mapPackages, TypeScriptOutputKind.global, TypeScriptFileType.implementationFile, new File(outputDir, "test-mn5.ts")); file("Test6", null, "NS6", mapPackages, TypeScriptOutputKind.global, TypeScriptFileType.implementationFile, new File(outputDir, "test-mn6.ts")); file("Test7", null, null, mapPackages, TypeScriptOutputKind.module, TypeScriptFileType.implementationFile, new File(outputDir, "test-mn7.ts")); file("Test8", null, "NS8", mapPackages, TypeScriptOutputKind.module, TypeScriptFileType.implementationFile, new File(outputDir, "test-mn8.ts")); } private static void file(String prefix, String module, String namespace, boolean mapPackagesToNamespaces, TypeScriptOutputKind outputKind, TypeScriptFileType outputFileType, File output) { final Settings settings = new Settings(); settings.jsonLibrary = JsonLibrary.jackson2; settings.addTypeNamePrefix = prefix; settings.module = module; settings.namespace = namespace; settings.mapPackagesToNamespaces = mapPackagesToNamespaces; settings.outputKind = outputKind; settings.outputFileType = outputFileType; if (outputFileType == TypeScriptFileType.implementationFile) { settings.mapClasses = ClassMapping.asClasses; } if (outputFileType == TypeScriptFileType.implementationFile && !mapPackagesToNamespaces) { settings.extensions.add(new TestFunctionExtension()); } new TypeScriptGenerator(settings).generateTypeScript(Input.from(Data.class, Direction.class, Align.class), Output.to(output)); } private static class Data { } enum Direction { North, East, South, West } @JsonFormat(shape = JsonFormat.Shape.NUMBER_INT) enum Align { Left, Right } private static class TestFunctionExtension extends EmitterExtension { @Override public EmitterExtensionFeatures getFeatures() { final EmitterExtensionFeatures features = new EmitterExtensionFeatures(); features.generatesRuntimeCode = true; features.worksWithPackagesMappedToNamespaces = true; return features; } @Override public void emitElements(Writer writer, Settings settings, boolean exportKeyword, TsModel model) { writer.writeIndentedLine(""); writer.writeIndentedLine((exportKeyword ? "export " : "") + "function test() {}"); } } }