JRecordTest.java

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.jute.compiler;

import static org.junit.jupiter.api.Assertions.assertEquals;
import java.io.StringReader;
import java.lang.reflect.Field;
import java.util.List;
import org.apache.jute.compiler.generated.ParseException;
import org.apache.jute.compiler.generated.Rcc;
import org.junit.jupiter.api.Test;

@SuppressWarnings({"unchecked", "SameParameterValue"})
public class JRecordTest {

    @Test
    public void testEndOfLineComments() throws ParseException, NoSuchFieldException, IllegalAccessException {
        String juteStr = "module org.apache.zookeeper.data {\n"
                + "    // information explicitly stored by the server persistently\n"
                + "    class StatPersisted {\n"
                + "        long czxid;      // created zxid\n"
                + "        long mzxid;      // last modified zxid\n"
                + "        long ctime;      /* created */\n"
                + "        long mtime;      /** last modified */\n"
                + "        int version;     /* version */ /* testComment1 */\n"
                + "        int cversion;    /* child version */ /* child versionComment2 */ /* child versionComment3 */\n"
                + "        int aversion;    /** acl version */ /** acl versionComment2 */ /** acl version */\n"
                + "        long ephemeralOwner;  /* A multi-line end of line comment. */ /* Another multi-line end of line comment. */ /* Yet another\n"
                + "end of line comment. */ /* Comment belong to new field */\n"
                + "        long pzxid;     /* A multi-line end of line comment. */ /* Another multi-line end of line comment. */ /* Yet another\n"
                + "end of line comment. */ /* Comment belong to new field */\n"
                + "    }\n"
                + "}";

        try (StringReader stringReader = new StringReader(juteStr)) {
            Rcc parser = new Rcc(stringReader);
            JFile jFile = parser.Input();
            List<JRecord> mRecords = getField(jFile, "mRecords", List.class);
            assertEquals(1, mRecords.size());

            JRecord jRecord = mRecords.get(0);
            assertEquals("StatPersisted", jRecord.getName());
            List<JField> fields = jRecord.getFields();
            assertFiled(fields);

            assertEquals("// information explicitly stored by the server persistently\n", jRecord.getRecordComments());
            assertEquals("  // created zxid\n", jRecord.getJavaFieldComments(fields.get(0)));
            assertEquals("  // last modified zxid\n", jRecord.getJavaFieldComments(fields.get(1)));
            assertEquals("  /* created */\n", jRecord.getJavaFieldComments(fields.get(2)));
            assertEquals("  /** last modified */\n", jRecord.getJavaFieldComments(fields.get(3)));
            assertEquals("  /* version */\n  /* testComment1 */\n", jRecord.getJavaFieldComments(fields.get(4)));
            assertEquals("  /* child version */\n  /* child versionComment2 */\n  /* child versionComment3 */\n", jRecord.getJavaFieldComments(fields.get(5)));
            assertEquals("  /** acl version */\n  /** acl versionComment2 */\n  /** acl version */\n", jRecord.getJavaFieldComments(fields.get(6)));
            assertEquals(
                    "  /* A multi-line end of line comment. */\n"
                            + "  /* Another multi-line end of line comment. */\n"
                            + "  /* Yet another\n"
                            + "  end of line comment. */\n", jRecord.getJavaFieldComments(fields.get(7)));
            assertEquals(
                    "  /* Comment belong to new field */\n"
                            + "  /* A multi-line end of line comment. */\n"
                            + "  /* Another multi-line end of line comment. */\n"
                            + "  /* Yet another\n"
                            + "  end of line comment. */\n", jRecord.getJavaFieldComments(fields.get(8)));
        }
    }

    @Test
    public void testCommentBeforeLineAndEndOfLine() throws ParseException, NoSuchFieldException, IllegalAccessException {
        String juteStr = "module org.apache.zookeeper.data {\n"
                + "    /**\n"
                + "      * information explicitly stored by the server persistently\n"
                + "      */ \n"
                + "    class StatPersisted {\n"
                + "        // created zxid\n"
                + "        long czxid; // created zxid comment2\n"
                + "        /* last modified zxid */\n"
                + "        long mzxid; // last modified zxid comment2\n"
                + "        /* created */\n"
                + "        long ctime; // created comment2\n"
                + "        /* last modified */\n"
                + "        /* last modified */\n"
                + "        long mtime; // last modified comment2\n"
                + "        // version comment\n "
                + "        int version;     /* version comment1 */ /* version\n comment2 */\n"
                + "        /** child version */\n"
                + "        /** child version */\n"
                + "        int cversion;  /** child version */  // child version\n"
                + "        // acl version\n"
                + "        // acl version\n"
                + "        // acl version\n"
                + "        int aversion;    // acl version\n"
                + "        // ephemeralOwner comment\n"
                + "        long ephemeralOwner;  /* A multi-line end of line comment. */ /* Another multi-line end of line comment. */ /* Yet another\n"
                + "end of line comment. */ /* Comment belong to new field */\n"
                + "        // pzxid comment\n"
                + "        long pzxid;     /* A multi-line end of line comment. */ /* Another multi-line end of line comment. */ /* Yet another\n"
                + "end of line comment. */ /* Comment belong to new field */\n"
                + "    }\n"
                + "}";
        try (StringReader stringReader = new StringReader(juteStr)) {
            Rcc parser = new Rcc(stringReader);
            JFile jFile = parser.Input();
            List<JRecord> mRecords = getField(jFile, "mRecords", List.class);
            assertEquals(1, mRecords.size());

            JRecord jRecord = mRecords.get(0);
            assertEquals("StatPersisted", jRecord.getName());
            List<JField> fields = jRecord.getFields();
            assertFiled(fields);

            assertEquals("/**\n  * information explicitly stored by the server persistently\n  */\n", jRecord.getRecordComments());
            assertEquals("  // created zxid\n  // created zxid comment2\n", jRecord.getJavaFieldComments(fields.get(0)));
            assertEquals("  /* last modified zxid */\n  // last modified zxid comment2\n", jRecord.getJavaFieldComments(fields.get(1)));
            assertEquals("  /* created */\n  // created comment2\n", jRecord.getJavaFieldComments(fields.get(2)));
            assertEquals("  /* last modified */\n  /* last modified */\n  // last modified comment2\n", jRecord.getJavaFieldComments(fields.get(3)));

            assertEquals("  // version comment\n  /* version comment1 */\n  /* version\n  comment2 */\n", jRecord.getJavaFieldComments(fields.get(4)));
            assertEquals("  /** child version */\n  /** child version */\n  /** child version */\n  // child version\n", jRecord.getJavaFieldComments(fields.get(5)));
            assertEquals("  // acl version\n  // acl version\n  // acl version\n  // acl version\n", jRecord.getJavaFieldComments(fields.get(6)));
            assertEquals(
                    "  // ephemeralOwner comment\n"
                            + "  /* A multi-line end of line comment. */\n"
                            + "  /* Another multi-line end of line comment. */\n"
                            + "  /* Yet another\n"
                            + "  end of line comment. */\n", jRecord.getJavaFieldComments(fields.get(7)));
            assertEquals(
                    "  /* Comment belong to new field */\n"
                            + "  // pzxid comment\n"
                            + "  /* A multi-line end of line comment. */\n"
                            + "  /* Another multi-line end of line comment. */\n"
                            + "  /* Yet another\n"
                            + "  end of line comment. */\n", jRecord.getJavaFieldComments(fields.get(8)));
        }
    }

    @Test
    public void testCommentBeforeLine() throws ParseException, NoSuchFieldException, IllegalAccessException {
        String juteStr = "module org.apache.zookeeper.data {\n"
                + "    // information explicitly stored by the server persistently\n"
                + "    // StatPersisted Comment1\n"
                + "    // StatPersisted Comment2\n"
                + "    class StatPersisted {\n"
                + "        // created zxid comment1\n"
                + "        // created zxid comment2\n"
                + "        // created zxid comment3\n"
                + "        long czxid;\n"
                + "        // last modified zxid\n"
                + "     // last modified zxid\n"
                + "             // last modified zxid\n"
                + "        long mzxid;\n"
                + "        /* created */\n"
                + "           /* created */\n"
                + "      /* created */\n"
                + "        long ctime;\n"
                + "        /** last modified */\n"
                + "        /** last modified */\n"
                + "        long mtime;\n"
                + "        /** version */\n"
                + "             /** version */\n"
                + "        int version;\n"
                + "        // child version\n"
                + "        /** child version */\n"
                + "        /** child version */\n"
                + "        int cversion;\n"
                + "        /* acl version */\n"
                + "        // acl version\n"
                + "        /* acl version */\n"
                + "        int aversion;\n"
                + "        // owner id if ephemeral, 0 otw\n"
                + "        long ephemeralOwner;\n"
                + "        // last modified children\n"
                + "        long pzxid;\n"
                + "    }\n"
                + "}";
        try (StringReader stringReader = new StringReader(juteStr)) {
            Rcc parser = new Rcc(stringReader);
            JFile jFile = parser.Input();
            List<JRecord> mRecords = getField(jFile, "mRecords", List.class);
            assertEquals(1, mRecords.size());

            JRecord jRecord = mRecords.get(0);
            assertEquals("StatPersisted", jRecord.getName());
            List<JField> fields = jRecord.getFields();
            assertFiled(fields);

            assertEquals("// information explicitly stored by the server persistently\n// StatPersisted Comment1\n// StatPersisted Comment2\n", jRecord.getRecordComments());
            assertEquals("  // created zxid comment1\n  // created zxid comment2\n  // created zxid comment3\n", jRecord.getJavaFieldComments(fields.get(0)));
            assertEquals("  // last modified zxid\n  // last modified zxid\n  // last modified zxid\n", jRecord.getJavaFieldComments(fields.get(1)));
            assertEquals("  /* created */\n  /* created */\n  /* created */\n", jRecord.getJavaFieldComments(fields.get(2)));
            assertEquals("  /** last modified */\n  /** last modified */\n", jRecord.getJavaFieldComments(fields.get(3)));
            assertEquals("  /** version */\n  /** version */\n", jRecord.getJavaFieldComments(fields.get(4)));
            assertEquals("  // child version\n  /** child version */\n  /** child version */\n", jRecord.getJavaFieldComments(fields.get(5)));
            assertEquals("  /* acl version */\n  // acl version\n  /* acl version */\n", jRecord.getJavaFieldComments(fields.get(6)));
            assertEquals("  // owner id if ephemeral, 0 otw\n", jRecord.getJavaFieldComments(fields.get(7)));
            assertEquals("  // last modified children\n", jRecord.getJavaFieldComments(fields.get(8)));
        }
    }

    @Test
    public void testMultiLineComments() throws ParseException, NoSuchFieldException, IllegalAccessException {
        String juteStr = "module org.apache.zookeeper.data {\n"
                + "    /**\n"
                + "      * information explicitly stored by the server persistently\n"
                + "      */\n"
                + "     // StatPersisted Comment\n"
                + "     /* StatPersisted Comment */\n"
                + "    class StatPersisted {\n"
                + "        /**\n"
                + "         * created zxid\n"
                + "         */\n"
                + "        long czxid;\n"
                + "        /**\n"
                + "         * last modified zxid comment1\n"
                + "         */\n"
                + "        /**\n"
                + "         * last modified zxid comment2\n"
                + "         */\n"
                + "        long mzxid;\n"
                + "        /*\n"
                + "         * created\n"
                + "         */\n"
                + "        long ctime; /* multi-line\n"
                + "end of line */\n"
                + "        /*\n"
                + "         last modified\n"
                + "         */"
                + "        long mtime; /* A multi-line end of line comment. */ /* Another multi-line end of line comment. */ /* Yet another\n"
                + "end of line comment. */ /* Comment belong to new field */\n"
                + "        /* version comment */\n"
                + "        int version;     // version\n"
                + "        /**\n"
                + "         * child version\n"
                + "         */\n"
                + "        /**\n"
                + "         * child version comment2\n"
                + "         */\n"
                + "        int cversion;    // child version\n"
                + "        /* acl version */\n"
                + "        int aversion;  /* acl version */ /* acl version */  // acl version\n"
                + "        /*\n"
                + "        ephemeralOwner comment\n"
                + "        */\n"
                + "        // ephemeralOwner comment\n"
                + "        /*\n"
                + "        ephemeralOwner comment\n"
                + "        */\n"
                + "        long ephemeralOwner;  // owner id if ephemeral, 0 otw\n"
                + "        /*\n"
                + "        pzxid comment\n"
                + "        */\n"
                + "        long pzxid;      // last modified children\n"
                + "    }\n"
                + "}";
        try (StringReader stringReader = new StringReader(juteStr)) {
            Rcc parser = new Rcc(stringReader);
            JFile jFile = parser.Input();
            List<JRecord> mRecords = getField(jFile, "mRecords", List.class);
            assertEquals(1, mRecords.size());

            JRecord jRecord = mRecords.get(0);
            assertEquals("StatPersisted", jRecord.getName());
            List<JField> fields = jRecord.getFields();
            assertFiled(fields);

            assertEquals(
                    "/**\n"
                            + "  * information explicitly stored by the server persistently\n"
                            + "  */\n"
                            + "// StatPersisted Comment\n"
                            + "/* StatPersisted Comment */\n", jRecord.getRecordComments());
            assertEquals("  /**\n   * created zxid\n   */\n", jRecord.getJavaFieldComments(fields.get(0)));
            assertEquals("  /**\n   * last modified zxid comment1\n   */\n  /**\n   * last modified zxid comment2\n   */\n",
                    jRecord.getJavaFieldComments(fields.get(1)));
            assertEquals("  /*\n   * created\n   */\n  /* multi-line\n  end of line */\n", jRecord.getJavaFieldComments(fields.get(2)));
            assertEquals("  /*\n   last modified\n   */\n"
                            + "  /* A multi-line end of line comment. */\n"
                            + "  /* Another multi-line end of line comment. */\n"
                            + "  /* Yet another\n"
                            + "  end of line comment. */\n", jRecord.getJavaFieldComments(fields.get(3)));
            assertEquals("  /* Comment belong to new field */\n  /* version comment */\n  // version\n",
                    jRecord.getJavaFieldComments(fields.get(4)));
            assertEquals("  /**\n   * child version\n   */\n  /**\n   * child version comment2\n   */\n  // child version\n",
                    jRecord.getJavaFieldComments(fields.get(5)));
            assertEquals("  /* acl version */\n  /* acl version */\n  /* acl version */\n  // acl version\n", jRecord.getJavaFieldComments(fields.get(6)));
            assertEquals("  /*\n"
                    + "  ephemeralOwner comment\n"
                    + "  */\n"
                    + "  // ephemeralOwner comment\n"
                    + "  /*\n"
                    + "  ephemeralOwner comment\n"
                    + "  */\n"
                    + "  // owner id if ephemeral, 0 otw\n", jRecord.getJavaFieldComments(fields.get(7)));
            assertEquals("  /*\n  pzxid comment\n  */\n  // last modified children\n", jRecord.getJavaFieldComments(fields.get(8)));
        }
    }

    private void assertFiled(List<JField> fields) {
        assertEquals(9, fields.size());
        assertEquals("long", fields.get(0).getType().getJavaType());
        assertEquals("czxid", fields.get(0).getName());
        assertEquals("long", fields.get(1).getType().getJavaType());
        assertEquals("mzxid", fields.get(1).getName());
        assertEquals("long", fields.get(2).getType().getJavaType());
        assertEquals("ctime", fields.get(2).getName());
        assertEquals("long", fields.get(3).getType().getJavaType());
        assertEquals("mtime", fields.get(3).getName());
        assertEquals("int", fields.get(4).getType().getJavaType());
        assertEquals("version", fields.get(4).getName());
        assertEquals("int", fields.get(5).getType().getJavaType());
        assertEquals("cversion", fields.get(5).getName());
        assertEquals("int", fields.get(6).getType().getJavaType());
        assertEquals("aversion", fields.get(6).getName());
        assertEquals("long", fields.get(7).getType().getJavaType());
        assertEquals("ephemeralOwner", fields.get(7).getName());
        assertEquals("long", fields.get(8).getType().getJavaType());
        assertEquals("pzxid", fields.get(8).getName());
    }

    private <T> T getField(final Object target,
                           final String fieldName,
                           final Class<T> fieldClassType) throws NoSuchFieldException, IllegalAccessException {
        Class<?> targetClazz = target.getClass();
        Field field = targetClazz.getDeclaredField(fieldName);
        field.setAccessible(true);
        return fieldClassType.cast(field.get(target));
    }
}