From 305a3ebadc3a4ab3729ad883391380026ed1ba15 Mon Sep 17 00:00:00 2001 From: Azad Abbasi Date: Wed, 7 Apr 2021 14:57:40 -0700 Subject: [PATCH 1/8] Implement JavaLibrary and add initial test framework. --- sdk/modelparser/.gitignore | 2 + .../implementation/codegen/CodeWriter.java | 44 +++-- .../codegen/IndentedFileWriter.java | 6 +- .../implementation/codegen/JavaClass.java | 23 +++ .../implementation/codegen/JavaInterface.java | 8 +- .../implementation/codegen/JavaLibrary.java | 138 +++++++++++++++ .../implementation/codegen/JavaType.java | 28 ++- .../parser/ClassCodeGeneratorTests.java | 163 ++++++++++++++++++ .../digitaltwins/parser/FileHelpers.java | 30 ++++ .../parser/GeneratedCodeComparerBase.java | 41 +++++ .../EmptyPackagePrivateClass.expected | 2 + .../EmptyPublicAbstractClass.expected | 2 + .../EmptyPublicClass.expected | 2 + .../EmptyPublicExtendsClass.expected | 2 + .../EmptyPublicStaticClass.expected | 2 + 15 files changed, 469 insertions(+), 24 deletions(-) create mode 100644 sdk/modelparser/.gitignore create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaClass.java create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaLibrary.java create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/FileHelpers.java create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeComparerBase.java create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPackagePrivateClass.expected create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicAbstractClass.expected create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicClass.expected create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicExtendsClass.expected create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicStaticClass.expected diff --git a/sdk/modelparser/.gitignore b/sdk/modelparser/.gitignore new file mode 100644 index 0000000000000..23578e6a7ca18 --- /dev/null +++ b/sdk/modelparser/.gitignore @@ -0,0 +1,2 @@ +# Generated test files. +*.temp.generated \ No newline at end of file diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/CodeWriter.java b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/CodeWriter.java index 74e0f948d73a0..432c248b8bb36 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/CodeWriter.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/CodeWriter.java @@ -37,6 +37,7 @@ public CodeWriter(String filePath) throws IOException { * @throws IOException */ public void close() throws IOException { + this.indentedFileWriter.close(); this.fileWriter.flush(); this.fileWriter.close(); } @@ -95,30 +96,47 @@ public void decreaseIndent() { * @param text Code text to write. */ public void writeLine(String text) throws IOException { - writeLine(text, false, false); + writeLine(text, false, false, false); + } + + /** + * Writes a line of code. + * + * @param text Code text to write. + * @param suppressLineBreak True if the line should not end with a line break. + */ + public void writeLine(String text, boolean suppressLineBreak) throws IOException { + writeLine(text, suppressLineBreak, false, false); } /** * Writes a line of code * - * @param text Code text to write. - * @param suppressBlank True if there should be no blank line preceding the text. + * @param text Code text to write. + * @param suppressLineBreak True if the line should not end with a line break. + * @param suppressBlank True if there should be no blank line preceding the text. */ - public void writeLine(String text, boolean suppressBlank) throws IOException { - writeLine(text, suppressBlank, false); + public void writeLine(String text, boolean suppressLineBreak, boolean suppressBlank) throws IOException { + writeLine(text, suppressLineBreak, suppressBlank, false); } /** * Writes a line of code * - * @param text Code text to write. - * @param suppressBlank True if there should be no blank line preceding the text. - * @param outdent True if the line should be out-dented one level. + * @param text Code text to write. + * @param suppressLineBreak True if the text should not be followed by a new line. + * @param suppressBlank True if there should be no blank line preceding the text. + * @param outdent True if the line should be out-dented one level. */ - public void writeLine(String text, boolean suppressBlank, boolean outdent) throws IOException { + public void writeLine(String text, boolean suppressLineBreak, boolean suppressBlank, boolean outdent) throws IOException { if (nextTextNeedsBlank) { if (!suppressBlank) { - indentedFileWriter.writeLineWithIndent(""); + if (suppressLineBreak) { + indentedFileWriter.writeWithIndent(""); + } else { + indentedFileWriter.writeLineWithIndent(""); + } + } nextTextNeedsBlank = false; @@ -128,7 +146,11 @@ public void writeLine(String text, boolean suppressBlank, boolean outdent) throw decreaseIndent(); } - this.indentedFileWriter.writeLineWithIndent(text); + if (suppressLineBreak) { + indentedFileWriter.writeWithIndent(text + " "); + } else { + indentedFileWriter.writeLineWithIndent(text); + } if (outdent) { increaseIndent(); diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/IndentedFileWriter.java b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/IndentedFileWriter.java index 7d862ff6308e0..7484850f340e7 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/IndentedFileWriter.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/IndentedFileWriter.java @@ -18,7 +18,7 @@ class IndentedFileWriter { } void writeLineWithIndent(String input) throws IOException { - fileWriter.append(calculateIndentation()).append(input).append("\n"); + fileWriter.append(calculateIndentation()).append(input).append("\r\n"); } void writeWithIndent(String input) throws IOException { @@ -46,4 +46,8 @@ private String calculateIndentation() { } return output.toString(); } + + public void close() throws IOException { + fileWriter.append("\r\n"); + } } diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaClass.java b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaClass.java new file mode 100644 index 0000000000000..b865822d660bc --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaClass.java @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.digitaltwins.parser.implementation.codegen; + +/** + * Generator for a java class. + */ +public class JavaClass extends JavaType { + /** + * Initializes a new instance of the {@link JavaClass} class. + * + * @param access Access level of class. + * @param novelty Novelty of the class. + * @param typeName The name of the class being declared. + * @param multiplicity Static or Instance. + * @param extend Interfaces extended by this class. + * @param implement Interfaces implemented by this class. + */ + public JavaClass(Access access, Novelty novelty, String typeName, Multiplicity multiplicity, String extend, String implement) { + super(access, novelty, typeName, multiplicity, extend, implement); + } +} diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaInterface.java b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaInterface.java index e5db615e45344..d938e945b8b4c 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaInterface.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaInterface.java @@ -67,14 +67,14 @@ public void generateCode(CodeWriter codeWriter) throws IOException { if (this.extend != null || this.implement != null) { if (this.extend == null) { - codeWriter.writeLine(this.getDecoratedName() + "implements " + this.implement); + codeWriter.writeLine(this.getDecoratedName() + " implements " + this.implement, true); } else if (implement == null) { - codeWriter.writeLine(this.getDecoratedName() + "extends " + this.extend); + codeWriter.writeLine(this.getDecoratedName() + " extends " + this.extend, true); } else { - codeWriter.writeLine(this.getDecoratedName() + "extends " + this.extend + " implements " + this.implement); + codeWriter.writeLine(this.getDecoratedName() + " extends " + this.extend + " implements " + this.implement, true); } } else { - codeWriter.writeLine(this.getDecoratedName()); + codeWriter.writeLine(this.getDecoratedName(), true); } codeWriter.openScope(); diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaLibrary.java b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaLibrary.java new file mode 100644 index 0000000000000..8068a1217ef43 --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaLibrary.java @@ -0,0 +1,138 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.digitaltwins.parser.implementation.codegen; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +/** + * Generator for a java library of code files. + */ +public class JavaLibrary { + private static final String FILE_EXTENSION = ".java"; + private final String outputDirectory; + private final String libraryNamespace; + + private List systemNamespaces; + private List otherNamespaces; + private List javaFiles; + + /** + * Initializes a new instance of the {@link JavaLibrary} class. + * + * @param outputDirectory Path to directory in which to create generated code files. + * @param libraryNamespace Namespace for the library. + */ + public JavaLibrary(String outputDirectory, String libraryNamespace) { + this.outputDirectory = outputDirectory; + this.libraryNamespace = libraryNamespace; + + this.systemNamespaces = new ArrayList<>(); + this.otherNamespaces = new ArrayList<>(); + this.javaFiles = new ArrayList<>(); + } + + /** + * Add an import statement to all code files. + * + * @param namespaceToImport The namespace for the "import" declaration. + */ + public void addImportStatement(String namespaceToImport) { + if (namespaceToImport.toLowerCase(Locale.getDefault()).startsWith("java")) { + this.systemNamespaces.add(namespaceToImport); + } else { + this.otherNamespaces.add(namespaceToImport); + } + } + + /** + * Add a java interface to the library. + * + * @param access Access level of the interface. + * @param typeName The name of the interface being declared. + * @param extend Types that the interface is extending from. + * @param implement Interfaces that the interface is implementing. + * @return The {@link JavaInterface} object added itself. + */ + public JavaInterface addInterface(Access access, String typeName, String extend, String implement) { + JavaInterface javaInterface = new JavaInterface(access, typeName, extend, implement); + this.javaFiles.add(javaInterface); + return javaInterface; + } + + /** + * Add a java class to the library. + * + * @param access Access level of the class. + * @param novelty Novelty of the class. + * @param typeName The name of the class being declared. + * @param multiplicity Static or Instance. + * @param extend Base classes that the class inherits from. + * @param implement Interfaces that the class implements. + * @return The {@link JavaClass} object added itself. + */ + public JavaClass addClass(Access access, Novelty novelty, String typeName, Multiplicity multiplicity, String extend, String implement) { + JavaClass javaClass = new JavaClass(access, novelty, typeName, multiplicity, extend, implement); + this.javaFiles.add(javaClass); + return javaClass; + } + + /** + * Add a java enum to the library. + * + * @param access Access level of the class. + * @param typeName The name of the enum being declared. + * @param isSorted True if the enum values should be sorted by name. + * @return The {@link JavaClass} object added itself. + */ + public JavaEnum addEnum(Access access, String typeName, boolean isSorted) { + JavaEnum javaEnum = new JavaEnum(access, typeName, isSorted); + this.javaFiles.add(javaEnum); + return javaEnum; + } + + /** + * Generates code for the library. + * + * @return A list of generated file names. + * @throws IOException + */ + public List generate() throws IOException { + List filePaths = new ArrayList<>(); + for (JavaFile javaFile : this.javaFiles) { + String fileName = javaFile.getTypeName() + FILE_EXTENSION; + String filePath = this.outputDirectory + fileName; + CodeWriter codeWriter = new CodeWriter(filePath); + + codeWriter.writeLine( + "// Copyright (c) Microsoft Corporation. All rights reserved.\n" + + "// Licensed under the MIT License." + + "// Code generated by Microsoft (R) Code Generator"); + + codeWriter.blank(); + + codeWriter.writeLine("package " + this.libraryNamespace); + + for (String importStatement : this.systemNamespaces) { + codeWriter.writeLine("import " + importStatement); + } + + for (String importStatement : this.otherNamespaces) { + codeWriter.writeLine("import " + importStatement); + } + + codeWriter.blank(); + + javaFile.generateCode(codeWriter); + + codeWriter.closeScope(); + codeWriter.close(); + filePaths.add(filePath); + } + + return filePaths; + } +} diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaType.java b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaType.java index a048508f6311b..fcbfaccea6c8e 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaType.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaType.java @@ -12,7 +12,7 @@ import java.util.Locale; /** - * Generator for a java class + * Generator for a java class. */ public class JavaType extends JavaDeclaration implements JavaFile { @@ -32,10 +32,10 @@ public class JavaType extends JavaDeclaration implements JavaFile { * * @param access Access level of class. * @param novelty Novelty of the class. - * @param typeName The name of the class or struct being declared. + * @param typeName The name of the type being declared. * @param multiplicity Static or Instance. - * @param extend Interfaces extended by this interface. - * @param implement Interfaces implemented by this interface. + * @param extend Interfaces extended by this type. + * @param implement Interfaces implemented by this type. */ public JavaType(Access access, Novelty novelty, String typeName, Multiplicity multiplicity, String extend, String implement) { super(access, novelty, "class", typeName, multiplicity, Mutability.MUTABLE); @@ -53,6 +53,18 @@ public JavaType(Access access, Novelty novelty, String typeName, Multiplicity mu this.methods = new ArrayList<>(); } + /** + * Add a java field to the type. + * + * @param access Access level of field. + * @param type Type of field. + * @param name Name of field. + * @param value Optional value for field. + * @param multiplicity Static or Instance. + * @param mutability Mutability of the type. + * @param description Optional text description of the field. + * @return The {@link JavaField} object added. + */ public JavaField addField( Access access, String type, @@ -187,14 +199,14 @@ public void generateCode(CodeWriter codeWriter) throws IOException { if (this.extend != null || this.implement != null) { if (this.extend == null) { - codeWriter.writeLine(this.getDecoratedName() + "implements " + this.implement); + codeWriter.writeLine(this.getDecoratedName() + " implements " + this.implement, true); } else if (implement == null) { - codeWriter.writeLine(this.getDecoratedName() + "extends " + this.extend); + codeWriter.writeLine(this.getDecoratedName() + " extends " + this.extend, true); } else { - codeWriter.writeLine(this.getDecoratedName() + "extends " + this.extend + " implements " + this.implement); + codeWriter.writeLine(this.getDecoratedName() + " extends " + this.extend + " implements " + this.implement, true); } } else { - codeWriter.writeLine(this.getDecoratedName()); + codeWriter.writeLine(this.getDecoratedName(), true); } codeWriter.openScope(); diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java new file mode 100644 index 0000000000000..f862b63619fb5 --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java @@ -0,0 +1,163 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.digitaltwins.parser; + +import com.azure.digitaltwins.parser.implementation.codegen.*; +import org.junit.jupiter.api.Test; + +import java.io.IOException; + +/** + * Tests code generation for {@link JavaClass}. + * Note that The tests make the following assumptions: + * - Each test has a field called: "typeName" which will dictate the name of each class. + * - Each test expects an existing file with the "typeName" and ".expected" extension in the src/test/resources/ClassTestResources + * - Each test will have a code comment with the path to the target files. + * - Each test generates a file with ".temp.generated" extension. generated files will be deleted after the test pass. + * - In case of test failure, the generated file will remain in the directory for further inspection. + */ +public class ClassCodeGeneratorTests extends GeneratedCodeComparerBase { + + private static final String TEST_SUB_DIRECTORY = "ClassTestResources"; + + /** + * Tests an empty public java class with no class comments. + * Find the expected output in "src/test/resources/ClassTestResources/EmptyPublicClass.expected" + * Find the expected output in "src/test/resources/ClassTestResources/EmptyPublicClass.temp.expected" + * + * @throws IOException + */ + @Test + public void emptyPublicClass() throws IOException { + final String typeName = "EmptyPublicClass"; + + CodeWriter codeWriter = this.getCodeWriter(TEST_SUB_DIRECTORY, typeName); + + JavaClass javaClass = new JavaClass( + Access.PUBLIC, + Novelty.NORMAL, + typeName, + Multiplicity.INSTANCE, + null, + null); + + javaClass.generateCode(codeWriter); + + codeWriter.close(); + + this.compareGeneratedCodeWithExpected(TEST_SUB_DIRECTORY, typeName); + } + + /** + * Tests an empty package private java class with no class comments. + * Find the expected output in "src/test/resources/ClassTestResources/EmptyPackagePrivateClass.expected" + * Find the generated file in "src/test/resources/ClassTestResources/EmptyPackagePrivateClass.temp.generated" + * + * @throws IOException + */ + @Test + public void emptyPackagePrivateClass() throws IOException { + final String typeName = "EmptyPackagePrivateClass"; + + CodeWriter codeWriter = this.getCodeWriter(TEST_SUB_DIRECTORY, typeName); + + JavaClass javaClass = new JavaClass( + Access.PACKAGE_PRIVATE, + Novelty.NORMAL, + typeName, + Multiplicity.INSTANCE, + null, + null); + + javaClass.generateCode(codeWriter); + + codeWriter.close(); + + this.compareGeneratedCodeWithExpected(TEST_SUB_DIRECTORY, typeName); + } + + /** + * Tests an empty package private java class with no class comments. + * Find the expected output in "src/test/resources/ClassTestResources/EmptyPublicAbstractClass.expected" + * Find the generated file in "src/test/resources/ClassTestResources/EmptyPublicAbstractClass.temp.generated" + * + * @throws IOException + */ + @Test + public void emptyPublicAbstractClass() throws IOException { + final String typeName = "EmptyPublicAbstractClass"; + + CodeWriter codeWriter = this.getCodeWriter(TEST_SUB_DIRECTORY, typeName); + + JavaClass javaClass = new JavaClass( + Access.PUBLIC, + Novelty.ABSTRACT, + typeName, + Multiplicity.INSTANCE, + null, + null); + + javaClass.generateCode(codeWriter); + + codeWriter.close(); + + this.compareGeneratedCodeWithExpected(TEST_SUB_DIRECTORY, typeName); + } + + /** + * Tests an empty public static java class with no class comments. + * Find the expected output in "src/test/resources/ClassTestResources/EmptyPublicStaticClass.expected" + * Find the generated file in "src/test/resources/ClassTestResources/EmptyPublicStaticClass.temp.generated" + * + * @throws IOException + */ + @Test + public void emptyPublicStaticClass() throws IOException { + final String typeName = "EmptyPublicStaticClass"; + + CodeWriter codeWriter = this.getCodeWriter(TEST_SUB_DIRECTORY, typeName); + + JavaClass javaClass = new JavaClass( + Access.PUBLIC, + Novelty.NORMAL, + typeName, + Multiplicity.STATIC, + null, + null); + + javaClass.generateCode(codeWriter); + + codeWriter.close(); + + this.compareGeneratedCodeWithExpected(TEST_SUB_DIRECTORY, typeName); + } + + /** + * Tests an empty public java class with no class comments which extends a type. + * Find the expected output in "src/test/resources/ClassTestResources/EmptyPublicExtendsClass.expected" + * Find the generated file in "src/test/resources/ClassTestResources/EmptyPublicExtendsClass.temp.generated" + * + * @throws IOException + */ + @Test + public void emptyPublicExtendsClass() throws IOException { + final String typeName = "EmptyPublicExtendsClass"; + + CodeWriter codeWriter = this.getCodeWriter(TEST_SUB_DIRECTORY, typeName); + + JavaClass javaClass = new JavaClass( + Access.PUBLIC, + Novelty.NORMAL, + typeName, + Multiplicity.INSTANCE, + "TestType", + null); + + javaClass.generateCode(codeWriter); + + codeWriter.close(); + + this.compareGeneratedCodeWithExpected(TEST_SUB_DIRECTORY, typeName); + } +} diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/FileHelpers.java b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/FileHelpers.java new file mode 100644 index 0000000000000..d702dfee5bc40 --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/FileHelpers.java @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.digitaltwins.parser; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class FileHelpers { + public static String getTestResourceFilePath(String subDirectoryName, String fileName) { + Path resourceDirectory = Paths.get("src", "test", "resources", subDirectoryName); + return resourceDirectory.toFile().getAbsolutePath() + "/" + fileName; + } + + public static String getFileContentsByPath(String filePath) throws IOException { + return new String(Files.readAllBytes(Paths.get(filePath))); + } + + public static String getFileContentsByFileName(String subDirectoryName, String fileName) throws IOException { + return getFileContentsByPath(getTestResourceFilePath(subDirectoryName, fileName)); + } + + public static void deleteFile(String subDirectoryName, String fileName) { + File file = new File(FileHelpers.getTestResourceFilePath(subDirectoryName, fileName)); + file.delete(); + } +} diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeComparerBase.java b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeComparerBase.java new file mode 100644 index 0000000000000..aa40c175c7b0e --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeComparerBase.java @@ -0,0 +1,41 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.digitaltwins.parser; + +import com.azure.digitaltwins.parser.implementation.codegen.CodeWriter; +import org.junit.jupiter.api.Assertions; + +import java.io.IOException; + +public class GeneratedCodeComparerBase { + private final static String DASH_SEPARATOR = "------------------------------------------------------------------------------------------------------------------------"; + private final static String GENERATED_CODE_FILE_EXTENSION = ".temp.generated"; + private final static String EXPECTED_CODE_FILE_EXTENSION = ".expected"; + + public CodeWriter getCodeWriter(String subDirectoryName, String typeName) throws IOException { + CodeWriter codeWriter = new CodeWriter(FileHelpers.getTestResourceFilePath(subDirectoryName, typeName + GENERATED_CODE_FILE_EXTENSION)); + return codeWriter; + } + + public void compareGeneratedCodeWithExpected(String subDirectoryName, String typeName) throws IOException { + String expectedFileContents = FileHelpers.getFileContentsByFileName(subDirectoryName, typeName + EXPECTED_CODE_FILE_EXTENSION); + String generatedFileContents = FileHelpers.getFileContentsByFileName(subDirectoryName, typeName + GENERATED_CODE_FILE_EXTENSION); + Assertions.assertEquals( + expectedFileContents, + generatedFileContents, + String.format( + "Expected \n%s\n%s%s\nwith %s characters, but found \n%s\n%s%s\nwith %s characters.", + DASH_SEPARATOR, + expectedFileContents, + DASH_SEPARATOR, + expectedFileContents.chars().count(), + DASH_SEPARATOR, + generatedFileContents, + DASH_SEPARATOR, + generatedFileContents.chars().count())); + + // Clean up if test is successful. + FileHelpers.deleteFile(subDirectoryName, typeName + GENERATED_CODE_FILE_EXTENSION); + } +} diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPackagePrivateClass.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPackagePrivateClass.expected new file mode 100644 index 0000000000000..0bdb02d0ad776 --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPackagePrivateClass.expected @@ -0,0 +1,2 @@ +class EmptyPackagePrivateClass { +} diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicAbstractClass.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicAbstractClass.expected new file mode 100644 index 0000000000000..a749bcb309da7 --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicAbstractClass.expected @@ -0,0 +1,2 @@ +public abstract class EmptyPublicAbstractClass { +} diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicClass.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicClass.expected new file mode 100644 index 0000000000000..baeb7c4be2140 --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicClass.expected @@ -0,0 +1,2 @@ +public class EmptyPublicClass { +} diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicExtendsClass.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicExtendsClass.expected new file mode 100644 index 0000000000000..b5f6e403bf301 --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicExtendsClass.expected @@ -0,0 +1,2 @@ +public class EmptyPublicExtendsClass extends TestType { +} diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicStaticClass.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicStaticClass.expected new file mode 100644 index 0000000000000..3f9653a1c9736 --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicStaticClass.expected @@ -0,0 +1,2 @@ +public static class EmptyPublicStaticClass { +} From c4962dbd0d50e31ebf67152f08f770ee8d7ab1cc Mon Sep 17 00:00:00 2001 From: Azad Abbasi Date: Wed, 7 Apr 2021 15:02:21 -0700 Subject: [PATCH 2/8] Fix code style issues. --- .../parser/implementation/codegen/JavaLibrary.java | 6 +++--- .../digitaltwins/parser/ClassCodeGeneratorTests.java | 12 ++++++------ ...mparerBase.java => GeneratedCodeCompareBase.java} | 11 +++++------ 3 files changed, 14 insertions(+), 15 deletions(-) rename sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/{GeneratedCodeComparerBase.java => GeneratedCodeCompareBase.java} (79%) diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaLibrary.java b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaLibrary.java index 8068a1217ef43..57223e95a56f0 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaLibrary.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaLibrary.java @@ -108,9 +108,9 @@ public List generate() throws IOException { CodeWriter codeWriter = new CodeWriter(filePath); codeWriter.writeLine( - "// Copyright (c) Microsoft Corporation. All rights reserved.\n" + - "// Licensed under the MIT License." + - "// Code generated by Microsoft (R) Code Generator"); + "// Copyright (c) Microsoft Corporation. All rights reserved.\n" + + "// Licensed under the MIT License.\n" + + "// Code generated by Microsoft (R) Code Generator"); codeWriter.blank(); diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java index f862b63619fb5..1b5674c2de1b8 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java @@ -17,7 +17,7 @@ * - Each test generates a file with ".temp.generated" extension. generated files will be deleted after the test pass. * - In case of test failure, the generated file will remain in the directory for further inspection. */ -public class ClassCodeGeneratorTests extends GeneratedCodeComparerBase { +public class ClassCodeGeneratorTests extends GeneratedCodeCompareBase { private static final String TEST_SUB_DIRECTORY = "ClassTestResources"; @@ -26,7 +26,7 @@ public class ClassCodeGeneratorTests extends GeneratedCodeComparerBase { * Find the expected output in "src/test/resources/ClassTestResources/EmptyPublicClass.expected" * Find the expected output in "src/test/resources/ClassTestResources/EmptyPublicClass.temp.expected" * - * @throws IOException + * @throws IOException IOException. */ @Test public void emptyPublicClass() throws IOException { @@ -54,7 +54,7 @@ public void emptyPublicClass() throws IOException { * Find the expected output in "src/test/resources/ClassTestResources/EmptyPackagePrivateClass.expected" * Find the generated file in "src/test/resources/ClassTestResources/EmptyPackagePrivateClass.temp.generated" * - * @throws IOException + * @throws IOException IOException. */ @Test public void emptyPackagePrivateClass() throws IOException { @@ -82,7 +82,7 @@ public void emptyPackagePrivateClass() throws IOException { * Find the expected output in "src/test/resources/ClassTestResources/EmptyPublicAbstractClass.expected" * Find the generated file in "src/test/resources/ClassTestResources/EmptyPublicAbstractClass.temp.generated" * - * @throws IOException + * @throws IOException IOException. */ @Test public void emptyPublicAbstractClass() throws IOException { @@ -110,7 +110,7 @@ public void emptyPublicAbstractClass() throws IOException { * Find the expected output in "src/test/resources/ClassTestResources/EmptyPublicStaticClass.expected" * Find the generated file in "src/test/resources/ClassTestResources/EmptyPublicStaticClass.temp.generated" * - * @throws IOException + * @throws IOException IOException. */ @Test public void emptyPublicStaticClass() throws IOException { @@ -138,7 +138,7 @@ public void emptyPublicStaticClass() throws IOException { * Find the expected output in "src/test/resources/ClassTestResources/EmptyPublicExtendsClass.expected" * Find the generated file in "src/test/resources/ClassTestResources/EmptyPublicExtendsClass.temp.generated" * - * @throws IOException + * @throws IOException IOException. */ @Test public void emptyPublicExtendsClass() throws IOException { diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeComparerBase.java b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java similarity index 79% rename from sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeComparerBase.java rename to sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java index aa40c175c7b0e..4e253816ef51d 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeComparerBase.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java @@ -8,14 +8,13 @@ import java.io.IOException; -public class GeneratedCodeComparerBase { - private final static String DASH_SEPARATOR = "------------------------------------------------------------------------------------------------------------------------"; - private final static String GENERATED_CODE_FILE_EXTENSION = ".temp.generated"; - private final static String EXPECTED_CODE_FILE_EXTENSION = ".expected"; +public class GeneratedCodeCompareBase { + private static final String DASH_SEPARATOR = "------------------------------------------------------------------------------------------------------------------------"; + private static final String EXPECTED_CODE_FILE_EXTENSION = ".expected"; + private static final String GENERATED_CODE_FILE_EXTENSION = ".temp.generated"; public CodeWriter getCodeWriter(String subDirectoryName, String typeName) throws IOException { - CodeWriter codeWriter = new CodeWriter(FileHelpers.getTestResourceFilePath(subDirectoryName, typeName + GENERATED_CODE_FILE_EXTENSION)); - return codeWriter; + return new CodeWriter(FileHelpers.getTestResourceFilePath(subDirectoryName, typeName + GENERATED_CODE_FILE_EXTENSION)); } public void compareGeneratedCodeWithExpected(String subDirectoryName, String typeName) throws IOException { From 37f92de99db4de143819f83c66d35222a173800f Mon Sep 17 00:00:00 2001 From: Azad Abbasi Date: Wed, 7 Apr 2021 15:18:46 -0700 Subject: [PATCH 3/8] Update GeneratedCodeCompareBase.java --- .../azure/digitaltwins/parser/GeneratedCodeCompareBase.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java index 4e253816ef51d..dfdf6ab973c15 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java @@ -20,9 +20,8 @@ public CodeWriter getCodeWriter(String subDirectoryName, String typeName) throws public void compareGeneratedCodeWithExpected(String subDirectoryName, String typeName) throws IOException { String expectedFileContents = FileHelpers.getFileContentsByFileName(subDirectoryName, typeName + EXPECTED_CODE_FILE_EXTENSION); String generatedFileContents = FileHelpers.getFileContentsByFileName(subDirectoryName, typeName + GENERATED_CODE_FILE_EXTENSION); - Assertions.assertEquals( - expectedFileContents, - generatedFileContents, + Assertions.assertTrue( + expectedFileContents.startsWith(generatedFileContents), String.format( "Expected \n%s\n%s%s\nwith %s characters, but found \n%s\n%s%s\nwith %s characters.", DASH_SEPARATOR, From e4c564c43338764a28406c972fda8c2b9e046bac Mon Sep 17 00:00:00 2001 From: Azad Abbasi Date: Wed, 7 Apr 2021 15:24:34 -0700 Subject: [PATCH 4/8] Lower the minimum test coverage until more tests are developed. --- sdk/modelparser/azure-digitaltwins-parser/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/modelparser/azure-digitaltwins-parser/pom.xml b/sdk/modelparser/azure-digitaltwins-parser/pom.xml index f0f4b3b4f7834..03def70355e3a 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/pom.xml +++ b/sdk/modelparser/azure-digitaltwins-parser/pom.xml @@ -33,8 +33,8 @@ - 0.20 - 0.20 + 0.0 + 0.0 From 89ec813066e248a31a24db2cb3492d8006f50768 Mon Sep 17 00:00:00 2001 From: Azad Abbasi Date: Wed, 7 Apr 2021 15:48:35 -0700 Subject: [PATCH 5/8] Update GeneratedCodeCompareBase.java --- .../digitaltwins/parser/GeneratedCodeCompareBase.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java index dfdf6ab973c15..874a167a87aa2 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java @@ -20,8 +20,13 @@ public CodeWriter getCodeWriter(String subDirectoryName, String typeName) throws public void compareGeneratedCodeWithExpected(String subDirectoryName, String typeName) throws IOException { String expectedFileContents = FileHelpers.getFileContentsByFileName(subDirectoryName, typeName + EXPECTED_CODE_FILE_EXTENSION); String generatedFileContents = FileHelpers.getFileContentsByFileName(subDirectoryName, typeName + GENERATED_CODE_FILE_EXTENSION); - Assertions.assertTrue( - expectedFileContents.startsWith(generatedFileContents), + + expectedFileContents = expectedFileContents.replaceAll("\r\n", "\n"); + generatedFileContents = generatedFileContents.replaceAll("\r\n", "\n"); + + Assertions.assertEquals( + expectedFileContents, + generatedFileContents, String.format( "Expected \n%s\n%s%s\nwith %s characters, but found \n%s\n%s%s\nwith %s characters.", DASH_SEPARATOR, From c3e50d53f07e1a9d21a2b863636769470fd5c5a0 Mon Sep 17 00:00:00 2001 From: Azad Abbasi Date: Wed, 7 Apr 2021 17:45:13 -0700 Subject: [PATCH 6/8] Refactor CodeWriter and add more tests --- .../implementation/codegen/CodeWriter.java | 19 +- .../codegen/IndentedFileWriter.java | 28 ++- .../codegen/JavaDeclaration.java | 28 ++- .../implementation/codegen/JavaEnum.java | 2 +- .../implementation/codegen/JavaMethod.java | 76 ++++-- .../implementation/codegen/JavaProperty.java | 6 +- .../implementation/codegen/JavaScope.java | 1 - .../implementation/codegen/JavaType.java | 8 +- .../codegen/StyleException.java | 2 +- .../parser/ClassCodeGeneratorTests.java | 238 +++++++++++++++++- .../parser/GeneratedCodeCompareBase.java | 8 +- .../EmptyPackagePrivateClass.expected | 1 + .../EmptyPublicAbstractClass.expected | 1 + .../EmptyPublicClass.expected | 1 + .../EmptyPublicClassWithCodeComments.expected | 7 + ...icClassWithCodeCommentsAndRemarks.expected | 11 + .../EmptyPublicExtendsClass.expected | 1 + ...EmptyPublicExtendsImplementsClass.expected | 2 + .../EmptyPublicImplementsClass.expected | 2 + .../EmptyPublicStaticClass.expected | 1 + ...icClassWithConstructorAndOneParam.expected | 13 + .../PublicClassWithSimpleConstructor.expected | 7 + ...sWithSimpleConstructorWithRemarks.expected | 12 + 23 files changed, 413 insertions(+), 62 deletions(-) create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicClassWithCodeComments.expected create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicClassWithCodeCommentsAndRemarks.expected create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicExtendsImplementsClass.expected create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicImplementsClass.expected create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithConstructorAndOneParam.expected create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithSimpleConstructor.expected create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithSimpleConstructorWithRemarks.expected diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/CodeWriter.java b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/CodeWriter.java index 432c248b8bb36..0f8f698de8657 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/CodeWriter.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/CodeWriter.java @@ -28,7 +28,20 @@ public class CodeWriter { public CodeWriter(String filePath) throws IOException { FileOutputStream fileStream = new FileOutputStream(filePath); this.fileWriter = new OutputStreamWriter(fileStream, StandardCharsets.UTF_8); - this.indentedFileWriter = new IndentedFileWriter(fileWriter, INDENTATION); + this.indentedFileWriter = new IndentedFileWriter(fileWriter, INDENTATION, false); + } + + /** + * Initializes a new instance of {@link CodeWriter}. + * + * @param filePath Full path of file to be generated. + * @param isDebug Boolean indicating whether or not debug mode is on or not. + * @throws IOException + */ + public CodeWriter(String filePath, boolean isDebug) throws IOException { + FileOutputStream fileStream = new FileOutputStream(filePath); + this.fileWriter = new OutputStreamWriter(fileStream, StandardCharsets.UTF_8); + this.indentedFileWriter = new IndentedFileWriter(fileWriter, INDENTATION, isDebug); } /** @@ -58,7 +71,7 @@ public void blank() { * @throws IOException */ public void openScope() throws IOException { - indentedFileWriter.writeLineWithIndent("{"); + indentedFileWriter.writeLineWithNoIndent("{"); this.increaseIndent(); nextTextNeedsBlank = false; lastLineWasText = false; @@ -71,7 +84,7 @@ public void openScope() throws IOException { */ public void closeScope() throws IOException { indentedFileWriter.decreaseIndent(); - indentedFileWriter.writeWithIndent("}"); + indentedFileWriter.writeLineWithIndent("}"); nextTextNeedsBlank = true; lastLineWasText = false; } diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/IndentedFileWriter.java b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/IndentedFileWriter.java index 7484850f340e7..091f307fbb502 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/IndentedFileWriter.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/IndentedFileWriter.java @@ -10,25 +10,48 @@ class IndentedFileWriter { private final OutputStreamWriter fileWriter; private int indent; private final String indentation; + private boolean isDebug; + private StringBuilder stringBuilder; - IndentedFileWriter(OutputStreamWriter fileWriter, String indentation) { + IndentedFileWriter(OutputStreamWriter fileWriter, String indentation, boolean isDebug) { this.indent = 0; this.indentation = indentation; this.fileWriter = fileWriter; + this.isDebug = isDebug; + if (isDebug) { + stringBuilder = new StringBuilder(); + } } void writeLineWithIndent(String input) throws IOException { + if (this.isDebug) { + stringBuilder.append(calculateIndentation()).append(input).append("\r\n"); + } + fileWriter.append(calculateIndentation()).append(input).append("\r\n"); } void writeWithIndent(String input) throws IOException { + if (this.isDebug) { + stringBuilder.append(calculateIndentation()).append(input); + } fileWriter.append(calculateIndentation()).append(input); } void writeWithNoIndent(String input) throws IOException { + if (this.isDebug) { + this.stringBuilder.append(input); + } fileWriter.append(input); } + void writeLineWithNoIndent(String input) throws IOException { + if (this.isDebug) { + this.stringBuilder.append(input); + } + fileWriter.append(input).append("\r\n"); + } + void increaseIndent() { indent++; } @@ -48,6 +71,9 @@ private String calculateIndentation() { } public void close() throws IOException { + if (this.isDebug) { + stringBuilder.append("\r\n"); + } fileWriter.append("\r\n"); } } diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaDeclaration.java b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaDeclaration.java index 6bd62dd6d057b..23a3bfe5efc97 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaDeclaration.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaDeclaration.java @@ -20,10 +20,10 @@ public class JavaDeclaration { private final String type; private final String name; - private boolean inheritDoc; - private final List summaryLines; - private final List remarksLines; - private final List attributes; + protected boolean inheritDoc; + protected final List summaryLines; + protected final List remarksLines; + protected final List attributes; /** * Initializes a new instance of the {@link JavaDeclaration} class. @@ -114,7 +114,7 @@ public String getDecoratedName() { decoratedName.append("private "); break; default: - logger.logThrowableAsError(new IllegalStateException("Unexpected value: " + access)); + throw logger.logExceptionAsError(new IllegalStateException("Unexpected value: " + access)); } if (multiplicity == Multiplicity.STATIC) { @@ -145,7 +145,7 @@ public String getDecoratedName() { */ public void addSummary(String text) { if (!text.endsWith(".")) { - logger.logThrowableAsError(new StyleException("Summary text of declaration '" + this.name + "' must end with a period -- SA1629.")); + throw logger.logExceptionAsError(new StyleException("Summary text of declaration '" + this.name + "' must end with a period -- SA1629.")); } this.summaryLines.add(text); @@ -158,7 +158,7 @@ public void addSummary(String text) { */ public void addRemarks(String text) { if (!text.endsWith(".")) { - logger.logThrowableAsError(new StyleException("Remarks text of declaration '" + this.name + "' must end with a period -- SA1629.")); + throw logger.logExceptionAsError(new StyleException("Remarks text of declaration '" + this.name + "' must end with a period -- SA1629.")); } this.remarksLines.add(text); @@ -196,16 +196,18 @@ protected void writeSummaryAndRemarks(CodeWriter codeWriter) throws IOException codeWriter.writeLine("/**"); for (String summaryLine : summaryLines) { - codeWriter.writeLine("* " + summaryLine); + codeWriter.writeLine(" * " + summaryLine); } - codeWriter.writeLine("*

"); - for (String remarksLine : remarksLines) { - codeWriter.writeLine("* " + remarksLine); + if (!remarksLines.isEmpty()) { + codeWriter.writeLine(" *

"); + for (String remarksLine : remarksLines) { + codeWriter.writeLine(" * " + remarksLine); + } + codeWriter.writeLine(" *

"); } - codeWriter.writeLine("*

"); - codeWriter.writeLine("*/"); + codeWriter.writeLine(" */"); } } diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaEnum.java b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaEnum.java index aab3703b01549..b69fa7ad03b6a 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaEnum.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaEnum.java @@ -43,7 +43,7 @@ public JavaEnum(Access access, String typeName, boolean isSorted) { */ public JavaEnum value(String name, String description) { if (description != null && !description.endsWith(".")) { - logger.logThrowableAsError(new StyleException("Documentation text of enum value '" + name + "' must end with a period. -- SA1629.")); + throw logger.logExceptionAsError(new StyleException("Documentation text of enum value '" + name + "' must end with a period. -- SA1629.")); } this.enumValues.add( diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaMethod.java b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaMethod.java index 4ce29d55e6e42..cfdb29c3dfb23 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaMethod.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaMethod.java @@ -89,11 +89,11 @@ public JavaMethod preamble(String text) { */ public JavaMethod typeParam(String name, String description) { if (name.charAt(0) != 'T') { - logger.logThrowableAsError(new StyleException("Type parameter name `" + name + "' of method '" + this.getName() + "' must begin with a 'T' -- SA1314")); + throw logger.logExceptionAsError(new StyleException("Type parameter name `" + name + "' of method '" + this.getName() + "' must begin with a 'T' -- SA1314")); } if (description != null && !description.endsWith(".")) { - logger.logThrowableAsError(new StyleException("Documentation text of method '" + this.getName() + "' must end with a period -- SA1629.")); + throw logger.logExceptionAsError(new StyleException("Documentation text of method '" + this.getName() + "' must end with a period -- SA1629.")); } this.typeParameters.add( @@ -114,7 +114,7 @@ public JavaMethod typeParam(String name, String description) { */ public JavaMethod param(String type, String name, String description) { if (description != null && !description.endsWith(".")) { - logger.logThrowableAsError(new StyleException("Documentation text of method '" + this.getName() + "' must end with a period -- SA1629.")); + throw logger.logExceptionAsError(new StyleException("Documentation text of method '" + this.getName() + "' must end with a period -- SA1629.")); } this.parameters.add( @@ -134,11 +134,11 @@ public JavaMethod param(String type, String name, String description) { */ public JavaMethod returns(String returnDescription) { if (this.getType().equals("void")) { - logger.logThrowableAsError(new StyleException("Void return value of method '" + this.getName() + "' must not be documented. -- SA1617")); + throw logger.logExceptionAsError(new StyleException("Void return value of method '" + this.getName() + "' must not be documented. -- SA1617")); } if (!returnDescription.endsWith(".")) { - logger.logThrowableAsError(new StyleException("Documentation text of method '" + this.getName() + "' must end with a period. -- SA1629")); + throw logger.logExceptionAsError(new StyleException("Documentation text of method '" + this.getName() + "' must end with a period. -- SA1629")); } this.returnDescription = returnDescription; @@ -152,26 +152,6 @@ public JavaMethod returns(String returnDescription) { public void generateCode(CodeWriter codeWriter) throws IOException { this.writeSummaryAndRemarks(codeWriter); - codeWriter.writeLine("/**"); - - for (TypeParameter typeParam : this.typeParameters) { - if (typeParam.description != null) { - codeWriter.writeLine("* @param " + typeParam.name + " " + typeParam.description); - } - } - - for (Parameter param : this.parameters) { - if (param.description != null) { - codeWriter.writeLine("* @param " + param.name + " " + param.description); - } - } - - if (this.returnDescription != null) { - codeWriter.writeLine("* @return " + this.returnDescription); - } - - codeWriter.writeLine("*/"); - this.writeAttributes(codeWriter); String typeParams = ""; @@ -187,7 +167,7 @@ public void generateCode(CodeWriter codeWriter) throws IOException { terminator = ";"; } - codeWriter.writeLine(this.getDecoratedName() + typeParams + "(" + paramList + ")" + terminator); + codeWriter.writeLine(this.getDecoratedName() + typeParams + "(" + paramList + ")" + terminator, true); if (!this.preambleTexts.isEmpty()) { codeWriter.increaseIndent(); @@ -205,6 +185,50 @@ public void generateCode(CodeWriter codeWriter) throws IOException { } } + /** + * {@inheritDoc} + */ + @Override + public void writeSummaryAndRemarks(CodeWriter codeWriter) throws IOException { + codeWriter.blank(); + + if (this.inheritDoc) { + codeWriter.writeLine("/** {@inheritDoc} */"); + } else if (!summaryLines.isEmpty() || !remarksLines.isEmpty() || !parameters.isEmpty() || !typeParameters.isEmpty()) { + codeWriter.writeLine("/**"); + + for (String summaryLine : summaryLines) { + codeWriter.writeLine(" * " + summaryLine); + } + + if (!remarksLines.isEmpty()) { + codeWriter.writeLine(" *

"); + for (String remarksLine : remarksLines) { + codeWriter.writeLine(" * " + remarksLine); + } + codeWriter.writeLine(" *

"); + } + + for (TypeParameter typeParam : this.typeParameters) { + if (typeParam.description != null) { + codeWriter.writeLine(" * @param " + typeParam.name + " " + typeParam.description); + } + } + + for (Parameter param : this.parameters) { + if (param.description != null) { + codeWriter.writeLine(" * @param " + param.name + " " + param.description); + } + } + + if (this.returnDescription != null) { + codeWriter.writeLine(" * @return " + this.returnDescription); + } + + codeWriter.writeLine(" */"); + } + } + @Fluent static class TypeParameter { private String name; diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaProperty.java b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaProperty.java index 814231e40890d..517a5381d394d 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaProperty.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaProperty.java @@ -32,7 +32,7 @@ public class JavaProperty extends JavaStatement { public JavaProperty(Access access, String propertyName, String propertyType) { // propertyName should start with a lowercase character. if (!Character.isLowerCase(propertyName.charAt(0))) { - logger.logThrowableAsError(new StyleException("Property name '" + propertyName + "' should start with a lowercase character")); + throw logger.logExceptionAsError(new StyleException("Property name '" + propertyName + "' should start with a lowercase character")); } this.propertyName = propertyName; @@ -66,7 +66,7 @@ public JavaProperty getter(Access access, String description) { if (description != null) { if (!description.endsWith(".")) { - logger.logThrowableAsError(new StyleException("Documentation text of method '" + getterMethodName + "' must end with a period. -- SA1629")); + throw logger.logExceptionAsError(new StyleException("Documentation text of method '" + getterMethodName + "' must end with a period. -- SA1629")); } setterMethod.addSummary(description); @@ -97,7 +97,7 @@ public JavaProperty setter(Access access, String description) { if (description != null) { if (!description.endsWith(".")) { - logger.logThrowableAsError(new StyleException("Documentation text of method '" + setterMethodName + "' must end with a period. -- SA1629")); + throw logger.logExceptionAsError(new StyleException("Documentation text of method '" + setterMethodName + "' must end with a period. -- SA1629")); } setterMethod.addSummary(description); diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaScope.java b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaScope.java index cc5b12b05c89a..4cb14f26a54dd 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaScope.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaScope.java @@ -215,7 +215,6 @@ public void generateCode(CodeWriter codeWriter) throws IOException { if (this.getDoubleIndent()) { codeWriter.decreaseIndent(); } - codeWriter.closeScope(); } diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaType.java b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaType.java index fcbfaccea6c8e..ad7431bf42ec0 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaType.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaType.java @@ -75,21 +75,21 @@ public JavaField addField( String description) { if (access != Access.PRIVATE && (multiplicity != Multiplicity.STATIC || mutability != Mutability.FINAL)) { - logger.logThrowableAsError(new StyleException("Field '" + name + "' must be private unless it's static and final. --SA1401.")); + throw logger.logExceptionAsError(new StyleException("Field '" + name + "' must be private unless it's static and final. --SA1401.")); } if (multiplicity == Multiplicity.STATIC && mutability == Mutability.FINAL) { if (!name.toUpperCase(Locale.getDefault()).equals(name)) { - logger.logThrowableAsError(new StyleException("Static final field name '" + name + "' must be all uppercase letters. --SA13311")); + throw logger.logExceptionAsError(new StyleException("Static final field name '" + name + "' must be all uppercase letters. --SA13311")); } } else { if (name.charAt(0) < 'a' || name.charAt(0) > 'z') { - logger.logThrowableAsError(new StyleException("Field name '" + name + "' must begin with a lowercase letter. --SA1306.")); + throw logger.logExceptionAsError(new StyleException("Field name '" + name + "' must begin with a lowercase letter. --SA1306.")); } } if (description != null && !description.endsWith(".")) { - logger.logThrowableAsError(new StyleException("Documentation text of field '" + name + "' must end with a period. -- SA1629.")); + throw logger.logExceptionAsError(new StyleException("Documentation text of field '" + name + "' must end with a period. -- SA1629.")); } JavaField field = new JavaField(access, type, name, value, multiplicity, mutability); diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/StyleException.java b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/StyleException.java index a8503e8d7d404..70a94d025cbe5 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/StyleException.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/StyleException.java @@ -6,7 +6,7 @@ /** * Indicates violation of style rules. */ -public class StyleException extends Exception { +public class StyleException extends RuntimeException { /** * Initializes a new instance of the {@link StyleException} class. diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java index 1b5674c2de1b8..7a6fa88decb7f 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java @@ -4,6 +4,7 @@ package com.azure.digitaltwins.parser; import com.azure.digitaltwins.parser.implementation.codegen.*; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.io.IOException; @@ -21,8 +22,9 @@ public class ClassCodeGeneratorTests extends GeneratedCodeCompareBase { private static final String TEST_SUB_DIRECTORY = "ClassTestResources"; + // POSITIVE TEST CASES. + /** - * Tests an empty public java class with no class comments. * Find the expected output in "src/test/resources/ClassTestResources/EmptyPublicClass.expected" * Find the expected output in "src/test/resources/ClassTestResources/EmptyPublicClass.temp.expected" * @@ -50,7 +52,6 @@ public void emptyPublicClass() throws IOException { } /** - * Tests an empty package private java class with no class comments. * Find the expected output in "src/test/resources/ClassTestResources/EmptyPackagePrivateClass.expected" * Find the generated file in "src/test/resources/ClassTestResources/EmptyPackagePrivateClass.temp.generated" * @@ -78,7 +79,6 @@ public void emptyPackagePrivateClass() throws IOException { } /** - * Tests an empty package private java class with no class comments. * Find the expected output in "src/test/resources/ClassTestResources/EmptyPublicAbstractClass.expected" * Find the generated file in "src/test/resources/ClassTestResources/EmptyPublicAbstractClass.temp.generated" * @@ -106,7 +106,6 @@ public void emptyPublicAbstractClass() throws IOException { } /** - * Tests an empty public static java class with no class comments. * Find the expected output in "src/test/resources/ClassTestResources/EmptyPublicStaticClass.expected" * Find the generated file in "src/test/resources/ClassTestResources/EmptyPublicStaticClass.temp.generated" * @@ -134,7 +133,6 @@ public void emptyPublicStaticClass() throws IOException { } /** - * Tests an empty public java class with no class comments which extends a type. * Find the expected output in "src/test/resources/ClassTestResources/EmptyPublicExtendsClass.expected" * Find the generated file in "src/test/resources/ClassTestResources/EmptyPublicExtendsClass.temp.generated" * @@ -160,4 +158,234 @@ public void emptyPublicExtendsClass() throws IOException { this.compareGeneratedCodeWithExpected(TEST_SUB_DIRECTORY, typeName); } + + /** + * Find the expected output in "src/test/resources/ClassTestResources/EmptyPublicImplementsClass.expected" + * Find the generated file in "src/test/resources/ClassTestResources/EmptyPublicImplementsClass.temp.generated" + * + * @throws IOException IOException. + */ + @Test + public void emptyPublicImplementsClass() throws IOException { + final String typeName = "EmptyPublicImplementsClass"; + + CodeWriter codeWriter = this.getCodeWriter(TEST_SUB_DIRECTORY, typeName); + + JavaClass javaClass = new JavaClass( + Access.PUBLIC, + Novelty.NORMAL, + typeName, + Multiplicity.INSTANCE, + null, + "TestType"); + + javaClass.generateCode(codeWriter); + + codeWriter.close(); + + this.compareGeneratedCodeWithExpected(TEST_SUB_DIRECTORY, typeName); + } + + /** + * Find the expected output in "src/test/resources/ClassTestResources/EmptyPublicExtendsImplementsClass.expected" + * Find the generated file in "src/test/resources/ClassTestResources/EmptyPublicExtendsImplementsClass.temp.generated" + * + * @throws IOException IOException. + */ + @Test + public void emptyPublicImplementsAndExtendsClass() throws IOException { + final String typeName = "EmptyPublicExtendsImplementsClass"; + + CodeWriter codeWriter = this.getCodeWriter(TEST_SUB_DIRECTORY, typeName); + + JavaClass javaClass = new JavaClass( + Access.PUBLIC, + Novelty.NORMAL, + typeName, + Multiplicity.INSTANCE, + "TestType", + "TestType"); + + javaClass.generateCode(codeWriter); + + codeWriter.close(); + + this.compareGeneratedCodeWithExpected(TEST_SUB_DIRECTORY, typeName); + } + + /** + * Find the expected output in "src/test/resources/ClassTestResources/EmptyPublicClassWithCodeComments.expected" + * Find the generated file in "src/test/resources/ClassTestResources/EmptyPublicClassWithCodeComments.temp.generated" + * + * @throws IOException IOException. + */ + @Test + public void emptyPublicClassWithCodeComments() throws IOException { + final String typeName = "EmptyPublicClassWithCodeComments"; + + CodeWriter codeWriter = this.getCodeWriter(TEST_SUB_DIRECTORY, typeName); + + JavaClass javaClass = new JavaClass( + Access.PUBLIC, + Novelty.NORMAL, + typeName, + Multiplicity.INSTANCE, + null, + null); + + javaClass.addSummary("This is code comments."); + javaClass.addSummary("This is another line of comments."); + + javaClass.generateCode(codeWriter); + + codeWriter.close(); + + this.compareGeneratedCodeWithExpected(TEST_SUB_DIRECTORY, typeName); + } + + /** + * Find the expected output in "src/test/resources/ClassTestResources/EmptyPublicClassWithCodeCommentsAndRemarks.expected" + * Find the generated file in "src/test/resources/ClassTestResources/EmptyPublicClassWithCodeCommentsAndRemarks.temp.generated" + * + * @throws IOException IOException. + */ + @Test + public void emptyPublicClassWithCodeCommentsAndRemarks() throws IOException { + final String typeName = "EmptyPublicClassWithCodeCommentsAndRemarks"; + + CodeWriter codeWriter = this.getCodeWriter(TEST_SUB_DIRECTORY, typeName); + + JavaClass javaClass = new JavaClass( + Access.PUBLIC, + Novelty.NORMAL, + typeName, + Multiplicity.INSTANCE, + null, + null); + + javaClass.addSummary("This is code comments."); + javaClass.addSummary("This is another line of comments."); + javaClass.addRemarks("This is remarks."); + javaClass.addRemarks("This is more remarks."); + + javaClass.generateCode(codeWriter); + + codeWriter.close(); + + this.compareGeneratedCodeWithExpected(TEST_SUB_DIRECTORY, typeName); + } + + /** + * Find the expected output in "src/test/resources/ClassTestResources/PublicClassWithSimpleConstructor.expected" + * Find the generated file in "src/test/resources/ClassTestResources/PublicClassWithSimpleConstructor.temp.generated" + * + * @throws IOException IOException. + */ + @Test + public void publicClassWithSimpleConstructor() throws IOException { + final String typeName = "PublicClassWithSimpleConstructor"; + + CodeWriter codeWriter = this.getCodeWriter(TEST_SUB_DIRECTORY, typeName); + + JavaClass javaClass = new JavaClass( + Access.PUBLIC, + Novelty.NORMAL, + typeName, + Multiplicity.INSTANCE, + null, + null); + + JavaConstructor constructor = javaClass.addConstructor(Access.PUBLIC, Multiplicity.INSTANCE); + + javaClass.generateCode(codeWriter); + + codeWriter.close(); + + this.compareGeneratedCodeWithExpected(TEST_SUB_DIRECTORY, typeName); + } + + /** + * Find the expected output in "src/test/resources/ClassTestResources/PublicClassWithSimpleConstructorWithRemarks.expected" + * Find the generated file in "src/test/resources/ClassTestResources/PublicClassWithSimpleConstructorWithRemarks.temp.generated" + * + * @throws IOException IOException. + */ + @Test + public void publicClassWithSimpleConstructorWithRemarks() throws IOException { + final String typeName = "PublicClassWithSimpleConstructorWithRemarks"; + + CodeWriter codeWriter = this.getCodeWriter(TEST_SUB_DIRECTORY, typeName); + + JavaClass javaClass = new JavaClass( + Access.PUBLIC, + Novelty.NORMAL, + typeName, + Multiplicity.INSTANCE, + null, + null); + + JavaConstructor constructor = javaClass.addConstructor(Access.PUBLIC, Multiplicity.INSTANCE); + constructor.addSummary("This is more information."); + constructor.addSummary("This is even more information."); + constructor.addRemarks("This is remarks."); + javaClass.generateCode(codeWriter); + + codeWriter.close(); + + this.compareGeneratedCodeWithExpected(TEST_SUB_DIRECTORY, typeName); + } + + /** + * Find the expected output in "src/test/resources/ClassTestResources/PublicClassWithConstructorAndOneParam.expected" + * Find the generated file in "src/test/resources/ClassTestResources/PublicClassWithConstructorAndOneParam.temp.generated" + * + * @throws IOException IOException. + */ + @Test + public void publicClassWithConstructorAndParam() throws IOException { + final String typeName = "PublicClassWithConstructorAndOneParam"; + + CodeWriter codeWriter = this.getCodeWriter(TEST_SUB_DIRECTORY, typeName); + + JavaClass javaClass = new JavaClass( + Access.PUBLIC, + Novelty.NORMAL, + typeName, + Multiplicity.INSTANCE, + null, + null); + + JavaConstructor constructor = javaClass.addConstructor(Access.PUBLIC, Multiplicity.INSTANCE); + constructor.addSummary("This is more information."); + constructor.addSummary("This is even more information."); + constructor.addRemarks("This is remarks."); + + constructor.param("String", "firstParam", "This is my first parameter."); + javaClass.generateCode(codeWriter); + + codeWriter.close(); + + this.compareGeneratedCodeWithExpected(TEST_SUB_DIRECTORY, typeName); + } + + // NEGATIVE TEST CASES. + + /** + * No file will be generated. + */ + @Test + public void codeCommentsMissingPeriod() { + final String typeName = "NoOpType"; + + JavaClass javaClass = new JavaClass( + Access.PUBLIC, + Novelty.NORMAL, + typeName, + Multiplicity.INSTANCE, + null, + null); + + Assertions.assertThrows(StyleException.class, () -> javaClass.addSummary("This is code comments with no period")); + Assertions.assertThrows(StyleException.class, () -> javaClass.addRemarks("This is code remarks with no period")); + } } diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java index 874a167a87aa2..4a2c59b99c572 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java @@ -14,21 +14,21 @@ public class GeneratedCodeCompareBase { private static final String GENERATED_CODE_FILE_EXTENSION = ".temp.generated"; public CodeWriter getCodeWriter(String subDirectoryName, String typeName) throws IOException { - return new CodeWriter(FileHelpers.getTestResourceFilePath(subDirectoryName, typeName + GENERATED_CODE_FILE_EXTENSION)); + return new CodeWriter(FileHelpers.getTestResourceFilePath(subDirectoryName, typeName + GENERATED_CODE_FILE_EXTENSION), true); } public void compareGeneratedCodeWithExpected(String subDirectoryName, String typeName) throws IOException { String expectedFileContents = FileHelpers.getFileContentsByFileName(subDirectoryName, typeName + EXPECTED_CODE_FILE_EXTENSION); String generatedFileContents = FileHelpers.getFileContentsByFileName(subDirectoryName, typeName + GENERATED_CODE_FILE_EXTENSION); - expectedFileContents = expectedFileContents.replaceAll("\r\n", "\n"); - generatedFileContents = generatedFileContents.replaceAll("\r\n", "\n"); + expectedFileContents = expectedFileContents.trim().replaceAll("\r\n", "\n"); + generatedFileContents = generatedFileContents.trim().replaceAll("\r\n", "\n"); Assertions.assertEquals( expectedFileContents, generatedFileContents, String.format( - "Expected \n%s\n%s%s\nwith %s characters, but found \n%s\n%s%s\nwith %s characters.", + "Expected \n%s\n%s\n%s\nwith %s characters, but found \n%s\n%s\n%s\nwith %s characters.", DASH_SEPARATOR, expectedFileContents, DASH_SEPARATOR, diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPackagePrivateClass.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPackagePrivateClass.expected index 0bdb02d0ad776..cf1c874f59d14 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPackagePrivateClass.expected +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPackagePrivateClass.expected @@ -1,2 +1,3 @@ class EmptyPackagePrivateClass { } + diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicAbstractClass.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicAbstractClass.expected index a749bcb309da7..5d07e7abed7ae 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicAbstractClass.expected +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicAbstractClass.expected @@ -1,2 +1,3 @@ public abstract class EmptyPublicAbstractClass { } + diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicClass.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicClass.expected index baeb7c4be2140..4bf29b53e6a34 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicClass.expected +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicClass.expected @@ -1,2 +1,3 @@ public class EmptyPublicClass { } + diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicClassWithCodeComments.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicClassWithCodeComments.expected new file mode 100644 index 0000000000000..ec5b25f2443d2 --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicClassWithCodeComments.expected @@ -0,0 +1,7 @@ +/** + * This is code comments. + * This is another line of comments. + */ +public class EmptyPublicClassWithCodeComments { +} + diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicClassWithCodeCommentsAndRemarks.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicClassWithCodeCommentsAndRemarks.expected new file mode 100644 index 0000000000000..11b85a1b677f9 --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicClassWithCodeCommentsAndRemarks.expected @@ -0,0 +1,11 @@ +/** + * This is code comments. + * This is another line of comments. + *

+ * This is remarks. + * This is more remarks. + *

+ */ +public class EmptyPublicClassWithCodeCommentsAndRemarks { +} + diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicExtendsClass.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicExtendsClass.expected index b5f6e403bf301..69f24d55ba651 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicExtendsClass.expected +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicExtendsClass.expected @@ -1,2 +1,3 @@ public class EmptyPublicExtendsClass extends TestType { } + diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicExtendsImplementsClass.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicExtendsImplementsClass.expected new file mode 100644 index 0000000000000..e4d76c932ef66 --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicExtendsImplementsClass.expected @@ -0,0 +1,2 @@ +public class EmptyPublicExtendsImplementsClass extends TestType implements TestType { +} diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicImplementsClass.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicImplementsClass.expected new file mode 100644 index 0000000000000..ecf196ff9e187 --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicImplementsClass.expected @@ -0,0 +1,2 @@ +public class EmptyPublicImplementsClass implements TestType { +} diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicStaticClass.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicStaticClass.expected index 3f9653a1c9736..b7070c4a04745 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicStaticClass.expected +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/EmptyPublicStaticClass.expected @@ -1,2 +1,3 @@ public static class EmptyPublicStaticClass { } + diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithConstructorAndOneParam.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithConstructorAndOneParam.expected new file mode 100644 index 0000000000000..320da9edf6576 --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithConstructorAndOneParam.expected @@ -0,0 +1,13 @@ +public class PublicClassWithConstructorAndOneParam { + /** + * Initializes a new instance of the {@link PublicClassWithConstructorAndOneParam} class. + * This is more information. + * This is even more information. + *

+ * This is remarks. + *

+ * @param firstParam This is my first parameter. + */ + public PublicClassWithConstructorAndOneParam(String firstParam) { + } +} diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithSimpleConstructor.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithSimpleConstructor.expected new file mode 100644 index 0000000000000..539410b085092 --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithSimpleConstructor.expected @@ -0,0 +1,7 @@ +public class PublicClassWithSimpleConstructor { + /** + * Initializes a new instance of the {@link PublicClassWithSimpleConstructor} class. + */ + public PublicClassWithSimpleConstructor() { + } +} diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithSimpleConstructorWithRemarks.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithSimpleConstructorWithRemarks.expected new file mode 100644 index 0000000000000..18fad0e214b8c --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithSimpleConstructorWithRemarks.expected @@ -0,0 +1,12 @@ +public class PublicClassWithSimpleConstructorWithRemarks { + /** + * Initializes a new instance of the {@link PublicClassWithSimpleConstructorWithRemarks} class. + * This is more information. + * This is even more information. + *

+ * This is remarks. + *

+ */ + public PublicClassWithSimpleConstructorWithRemarks() { + } +} From 54bfa0ab5d2cc58aef297e14ffa247236dfd4162 Mon Sep 17 00:00:00 2001 From: Azad Abbasi Date: Wed, 7 Apr 2021 18:27:47 -0700 Subject: [PATCH 7/8] Add tests for fields and constructor --- .../implementation/codegen/CodeWriter.java | 2 +- .../implementation/codegen/JavaType.java | 2 +- .../parser/ClassCodeGeneratorTests.java | 133 +++++++++++++++++- ...ClassWithConstructorAndSimpleBody.expected | 15 ++ ...cClassWithConstructorAndTwoParams.expected | 14 ++ .../PublicClassWithFields.expected | 32 +++++ 6 files changed, 195 insertions(+), 3 deletions(-) create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithConstructorAndSimpleBody.expected create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithConstructorAndTwoParams.expected create mode 100644 sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithFields.expected diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/CodeWriter.java b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/CodeWriter.java index 0f8f698de8657..ca96752ea9753 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/CodeWriter.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/CodeWriter.java @@ -147,7 +147,7 @@ public void writeLine(String text, boolean suppressLineBreak, boolean suppressBl if (suppressLineBreak) { indentedFileWriter.writeWithIndent(""); } else { - indentedFileWriter.writeLineWithIndent(""); + indentedFileWriter.writeLineWithNoIndent(""); } } diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaType.java b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaType.java index ad7431bf42ec0..67b5064fdd058 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaType.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/main/java/com/azure/digitaltwins/parser/implementation/codegen/JavaType.java @@ -94,7 +94,7 @@ public JavaField addField( JavaField field = new JavaField(access, type, name, value, multiplicity, mutability); if (description != null) { - this.addSummary(description); + field.addSummary(description); } this.fields.add(field); diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java index 7a6fa88decb7f..35e4b15e6fc09 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java @@ -342,7 +342,7 @@ public void publicClassWithSimpleConstructorWithRemarks() throws IOException { * @throws IOException IOException. */ @Test - public void publicClassWithConstructorAndParam() throws IOException { + public void publicClassWithConstructorAndOneParam() throws IOException { final String typeName = "PublicClassWithConstructorAndOneParam"; CodeWriter codeWriter = this.getCodeWriter(TEST_SUB_DIRECTORY, typeName); @@ -368,6 +368,137 @@ public void publicClassWithConstructorAndParam() throws IOException { this.compareGeneratedCodeWithExpected(TEST_SUB_DIRECTORY, typeName); } + /** + * Find the expected output in "src/test/resources/ClassTestResources/PublicClassWithConstructorAndTwoParams.expected" + * Find the generated file in "src/test/resources/ClassTestResources/PublicClassWithConstructorAndTwoParams.temp.generated" + * + * @throws IOException IOException. + */ + @Test + public void publicClassWithConstructorAndTwoParams() throws IOException { + final String typeName = "PublicClassWithConstructorAndTwoParams"; + + CodeWriter codeWriter = this.getCodeWriter(TEST_SUB_DIRECTORY, typeName); + + JavaClass javaClass = new JavaClass( + Access.PUBLIC, + Novelty.NORMAL, + typeName, + Multiplicity.INSTANCE, + null, + null); + + JavaConstructor constructor = javaClass.addConstructor(Access.PUBLIC, Multiplicity.INSTANCE); + constructor.addSummary("This is more information."); + constructor.addSummary("This is even more information."); + constructor.addRemarks("This is remarks."); + + constructor.param("String", "firstParam", "This is my first parameter."); + constructor.param("int", "secondParam", "This is my second parameter."); + javaClass.generateCode(codeWriter); + + codeWriter.close(); + + this.compareGeneratedCodeWithExpected(TEST_SUB_DIRECTORY, typeName); + } + + /** + * No files are generated. + * + * @throws IOException IOException. + */ + @Test + public void publicClassWithInvalidFields() throws IOException { + final String typeName = "NoOpType"; + + JavaClass javaClass = new JavaClass( + Access.PUBLIC, + Novelty.NORMAL, + typeName, + Multiplicity.INSTANCE, + null, + null); + + Assertions.assertThrows(StyleException.class, () -> javaClass.addField(Access.PRIVATE, "String", "field5", null, Multiplicity.STATIC, Mutability.FINAL, "field 5 description.")); + Assertions.assertThrows(StyleException.class, () -> javaClass.addField(Access.PUBLIC, "String", "field5", null, Multiplicity.INSTANCE, Mutability.FINAL, "field 5 description.")); + Assertions.assertThrows(StyleException.class, () -> javaClass.addField(Access.PUBLIC, "String", "field5", null, Multiplicity.STATIC, Mutability.MUTABLE, "field 5 description.")); + } + + /** + * Find the expected output in "src/test/resources/ClassTestResources/PublicClassWithFields.expected" + * Find the generated file in "src/test/resources/ClassTestResources/PublicClassWithFields.temp.generated" + * + * @throws IOException IOException. + */ + @Test + public void publicClassWithFields() throws IOException { + final String typeName = "PublicClassWithFields"; + + CodeWriter codeWriter = this.getCodeWriter(TEST_SUB_DIRECTORY, typeName); + + JavaClass javaClass = new JavaClass( + Access.PUBLIC, + Novelty.NORMAL, + typeName, + Multiplicity.INSTANCE, + null, + null); + + javaClass.addField(Access.PRIVATE, "String", "FIELD_1", "\"default string value\"", Multiplicity.STATIC, Mutability.FINAL, "field 1 description."); + javaClass.addField(Access.PRIVATE, "String", "field2", null, Multiplicity.INSTANCE, Mutability.MUTABLE, "field 2 description."); + javaClass.addField(Access.PRIVATE, "int", "field3", "2", Multiplicity.INSTANCE, Mutability.MUTABLE, "field 3 description."); + javaClass.addField(Access.PRIVATE, "boolean", "field4", "false", Multiplicity.INSTANCE, Mutability.MUTABLE, "field 4 description."); + javaClass.addField(Access.PRIVATE, "String", "field5", "\"default string value\"", Multiplicity.INSTANCE, Mutability.MUTABLE, "field 5 description."); + + javaClass.addConstructor(Access.PUBLIC, Multiplicity.INSTANCE); + + javaClass.generateCode(codeWriter); + + codeWriter.close(); + + this.compareGeneratedCodeWithExpected(TEST_SUB_DIRECTORY, typeName); + } + + /** + * Find the expected output in "src/test/resources/ClassTestResources/PublicClassWithConstructorAndSimpleBody.expected" + * Find the generated file in "src/test/resources/ClassTestResources/PublicClassWithConstructorAndSimpleBody.temp.generated" + * + * @throws IOException IOException. + */ + @Test + public void publicClassWithConstructorAndSimpleBody() throws IOException { + final String typeName = "PublicClassWithConstructorAndSimpleBody"; + + CodeWriter codeWriter = this.getCodeWriter(TEST_SUB_DIRECTORY, typeName); + + JavaClass javaClass = new JavaClass( + Access.PUBLIC, + Novelty.NORMAL, + typeName, + Multiplicity.INSTANCE, + null, + null); + + JavaConstructor constructor = javaClass.addConstructor(Access.PUBLIC, Multiplicity.INSTANCE); + constructor.addSummary("This is more information."); + constructor.addSummary("This is even more information."); + constructor.addRemarks("This is remarks."); + + constructor.param("String", "firstParam", "This is my first parameter."); + constructor.param("int", "secondParam", "This is my second parameter."); + + JavaScope body = new JavaScope(null); + body.addStatement(new JavaLine("this.field = firstParam;")); + constructor.setBody(body); + + javaClass.generateCode(codeWriter); + + codeWriter.close(); + + this.compareGeneratedCodeWithExpected(TEST_SUB_DIRECTORY, typeName); + } + + // NEGATIVE TEST CASES. /** diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithConstructorAndSimpleBody.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithConstructorAndSimpleBody.expected new file mode 100644 index 0000000000000..18508f8f43b0f --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithConstructorAndSimpleBody.expected @@ -0,0 +1,15 @@ +public class PublicClassWithConstructorAndSimpleBody { + /** + * Initializes a new instance of the {@link PublicClassWithConstructorAndSimpleBody} class. + * This is more information. + * This is even more information. + *

+ * This is remarks. + *

+ * @param firstParam This is my first parameter. + * @param secondParam This is my second parameter. + */ + public PublicClassWithConstructorAndSimpleBody(String firstParam, int secondParam) { + this.field = firstParam; + } +} diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithConstructorAndTwoParams.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithConstructorAndTwoParams.expected new file mode 100644 index 0000000000000..a5761b2fd922f --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithConstructorAndTwoParams.expected @@ -0,0 +1,14 @@ +public class PublicClassWithConstructorAndTwoParams { + /** + * Initializes a new instance of the {@link PublicClassWithConstructorAndTwoParams} class. + * This is more information. + * This is even more information. + *

+ * This is remarks. + *

+ * @param firstParam This is my first parameter. + * @param secondParam This is my second parameter. + */ + public PublicClassWithConstructorAndTwoParams(String firstParam, int secondParam) { + } +} diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithFields.expected b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithFields.expected new file mode 100644 index 0000000000000..b11c8fb235a73 --- /dev/null +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/resources/ClassTestResources/PublicClassWithFields.expected @@ -0,0 +1,32 @@ +public class PublicClassWithFields { + /** + * field 1 description. + */ + private static final String FIELD_1 = "default string value"; + + /** + * field 2 description. + */ + private String field2; + + /** + * field 3 description. + */ + private int field3 = 2; + + /** + * field 4 description. + */ + private boolean field4 = false; + + /** + * field 5 description. + */ + private String field5 = "default string value"; + + /** + * Initializes a new instance of the {@link PublicClassWithFields} class. + */ + public PublicClassWithFields() { + } +} From 7f3b47049a96541e7628481a2f19937e52edc726 Mon Sep 17 00:00:00 2001 From: Azad Abbasi Date: Wed, 7 Apr 2021 18:30:14 -0700 Subject: [PATCH 8/8] Address comments. --- .../com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java | 2 +- .../test/java/com/azure/digitaltwins/parser/FileHelpers.java | 2 +- .../com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java index 35e4b15e6fc09..30bdcc0d33f87 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/ClassCodeGeneratorTests.java @@ -15,7 +15,7 @@ * - Each test has a field called: "typeName" which will dictate the name of each class. * - Each test expects an existing file with the "typeName" and ".expected" extension in the src/test/resources/ClassTestResources * - Each test will have a code comment with the path to the target files. - * - Each test generates a file with ".temp.generated" extension. generated files will be deleted after the test pass. + * - Each test generates a file with ".temp.generated" extension. Generated files will be deleted after the test pass. * - In case of test failure, the generated file will remain in the directory for further inspection. */ public class ClassCodeGeneratorTests extends GeneratedCodeCompareBase { diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/FileHelpers.java b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/FileHelpers.java index d702dfee5bc40..dd299c4157017 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/FileHelpers.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/FileHelpers.java @@ -9,7 +9,7 @@ import java.nio.file.Path; import java.nio.file.Paths; -public class FileHelpers { +class FileHelpers { public static String getTestResourceFilePath(String subDirectoryName, String fileName) { Path resourceDirectory = Paths.get("src", "test", "resources", subDirectoryName); return resourceDirectory.toFile().getAbsolutePath() + "/" + fileName; diff --git a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java index 4a2c59b99c572..4fdfbecf9618b 100644 --- a/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java +++ b/sdk/modelparser/azure-digitaltwins-parser/src/test/java/com/azure/digitaltwins/parser/GeneratedCodeCompareBase.java @@ -8,7 +8,7 @@ import java.io.IOException; -public class GeneratedCodeCompareBase { +class GeneratedCodeCompareBase { private static final String DASH_SEPARATOR = "------------------------------------------------------------------------------------------------------------------------"; private static final String EXPECTED_CODE_FILE_EXTENSION = ".expected"; private static final String GENERATED_CODE_FILE_EXTENSION = ".temp.generated";