////////////////////////////////////////////////////////////////////////////////
// checkstyle: Checks Java source code for adherence to a set of rules.
// Copyright (C) 2001-2017 the original author or authors.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
////////////////////////////////////////////////////////////////////////////////

package com.puppycrawl.tools.checkstyle.grammars.javadoc;

import static org.junit.Assert.assertEquals;

import org.junit.Test;

/**
 * GeneratedJavadocTokenTypesTest.
 * @noinspection ClassIndependentOfModule
 */
public class GeneratedJavadocTokenTypesTest {

    private static final String MSG = "Ensure that token numbers generated for the elements"
            + "present in JavadocParser are consistent with what the tests assert.";

    /**
     * This method checks that the numbers generated for tokens in <tt>JavadocLexer.g4</tt> don't
     * change with the lexer grammar itself.
     * <br>ANTLR maps all the lexer elements to compile time constants used internally by ANTLR.
     * Compatibility damage is incurred <i>(with respect to the previous checkstyle versions)
     * </i> if these compile time constants keep changing with the grammar.
     *
     * @see "https://github.com/checkstyle/checkstyle/issues/5139"
     * @see "https://github.com/checkstyle/checkstyle/issues/5186"
     */
    @Test
    public void testTokenNumbers() {
        assertEquals(MSG, 1, JavadocParser.LEADING_ASTERISK);
        assertEquals(MSG, 2, JavadocParser.HTML_COMMENT_START);
        assertEquals(MSG, 3, JavadocParser.CDATA);
        assertEquals(MSG, 4, JavadocParser.WS);
        assertEquals(MSG, 5, JavadocParser.START);
        assertEquals(MSG, 6, JavadocParser.NEWLINE);
        assertEquals(MSG, 7, JavadocParser.AUTHOR_LITERAL);
        assertEquals(MSG, 8, JavadocParser.DEPRECATED_LITERAL);
        assertEquals(MSG, 9, JavadocParser.EXCEPTION_LITERAL);
        assertEquals(MSG, 10, JavadocParser.PARAM_LITERAL);
        assertEquals(MSG, 11, JavadocParser.RETURN_LITERAL);
        assertEquals(MSG, 12, JavadocParser.SEE_LITERAL);
        assertEquals(MSG, 13, JavadocParser.SERIAL_LITERAL);
        assertEquals(MSG, 14, JavadocParser.SERIAL_FIELD_LITERAL);
        assertEquals(MSG, 15, JavadocParser.SERIAL_DATA_LITERAL);
        assertEquals(MSG, 16, JavadocParser.SINCE_LITERAL);
        assertEquals(MSG, 17, JavadocParser.THROWS_LITERAL);
        assertEquals(MSG, 18, JavadocParser.VERSION_LITERAL);
        assertEquals(MSG, 19, JavadocParser.JAVADOC_INLINE_TAG_START);
        assertEquals(MSG, 20, JavadocParser.JAVADOC_INLINE_TAG_END);
        assertEquals(MSG, 21, JavadocParser.CUSTOM_NAME);
        assertEquals(MSG, 22, JavadocParser.LITERAL_INCLUDE);
        assertEquals(MSG, 23, JavadocParser.LITERAL_EXCLUDE);
        assertEquals(MSG, 24, JavadocParser.CHAR);
        assertEquals(MSG, 25, JavadocParser.PARAMETER_NAME);
        assertEquals(MSG, 26, JavadocParser.Char1);
        assertEquals(MSG, 27, JavadocParser.STRING);
        assertEquals(MSG, 28, JavadocParser.PACKAGE_CLASS);
        assertEquals(MSG, 29, JavadocParser.DOT);
        assertEquals(MSG, 30, JavadocParser.HASH);
        assertEquals(MSG, 31, JavadocParser.CLASS);
        assertEquals(MSG, 32, JavadocParser.Char2);
        assertEquals(MSG, 33, JavadocParser.MEMBER);
        assertEquals(MSG, 34, JavadocParser.LEFT_BRACE);
        assertEquals(MSG, 35, JavadocParser.RIGHT_BRACE);
        assertEquals(MSG, 36, JavadocParser.ARGUMENT);
        assertEquals(MSG, 37, JavadocParser.COMMA);
        assertEquals(MSG, 38, JavadocParser.Char20);
        assertEquals(MSG, 39, JavadocParser.FIELD_NAME);
        assertEquals(MSG, 40, JavadocParser.Char3);
        assertEquals(MSG, 41, JavadocParser.FIELD_TYPE);
        assertEquals(MSG, 42, JavadocParser.Char4);
        assertEquals(MSG, 43, JavadocParser.CLASS_NAME);
        assertEquals(MSG, 44, JavadocParser.Char5);
        assertEquals(MSG, 45, JavadocParser.CODE_LITERAL);
        assertEquals(MSG, 46, JavadocParser.DOC_ROOT_LITERAL);
        assertEquals(MSG, 47, JavadocParser.INHERIT_DOC_LITERAL);
        assertEquals(MSG, 48, JavadocParser.LINK_LITERAL);
        assertEquals(MSG, 49, JavadocParser.LINKPLAIN_LITERAL);
        assertEquals(MSG, 50, JavadocParser.LITERAL_LITERAL);
        assertEquals(MSG, 51, JavadocParser.VALUE_LITERAL);
        assertEquals(MSG, 52, JavadocParser.Char7);
        assertEquals(MSG, 53, JavadocParser.Char8);
        assertEquals(MSG, 54, JavadocParser.Char10);
        assertEquals(MSG, 55, JavadocParser.END);
        assertEquals(MSG, 56, JavadocParser.SLASH_END);
        assertEquals(MSG, 57, JavadocParser.SLASH);
        assertEquals(MSG, 58, JavadocParser.EQUALS);
        assertEquals(MSG, 59, JavadocParser.P_HTML_TAG_NAME);
        assertEquals(MSG, 60, JavadocParser.LI_HTML_TAG_NAME);
        assertEquals(MSG, 61, JavadocParser.TR_HTML_TAG_NAME);
        assertEquals(MSG, 62, JavadocParser.TD_HTML_TAG_NAME);
        assertEquals(MSG, 63, JavadocParser.TH_HTML_TAG_NAME);
        assertEquals(MSG, 64, JavadocParser.BODY_HTML_TAG_NAME);
        assertEquals(MSG, 65, JavadocParser.COLGROUP_HTML_TAG_NAME);
        assertEquals(MSG, 66, JavadocParser.DD_HTML_TAG_NAME);
        assertEquals(MSG, 67, JavadocParser.DT_HTML_TAG_NAME);
        assertEquals(MSG, 68, JavadocParser.HEAD_HTML_TAG_NAME);
        assertEquals(MSG, 69, JavadocParser.HTML_HTML_TAG_NAME);
        assertEquals(MSG, 70, JavadocParser.OPTION_HTML_TAG_NAME);
        assertEquals(MSG, 71, JavadocParser.TBODY_HTML_TAG_NAME);
        assertEquals(MSG, 72, JavadocParser.TFOOT_HTML_TAG_NAME);
        assertEquals(MSG, 73, JavadocParser.THEAD_HTML_TAG_NAME);
        assertEquals(MSG, 74, JavadocParser.AREA_HTML_TAG_NAME);
        assertEquals(MSG, 75, JavadocParser.BASE_HTML_TAG_NAME);
        assertEquals(MSG, 76, JavadocParser.BASEFONT_HTML_TAG_NAME);
        assertEquals(MSG, 77, JavadocParser.BR_HTML_TAG_NAME);
        assertEquals(MSG, 78, JavadocParser.COL_HTML_TAG_NAME);
        assertEquals(MSG, 79, JavadocParser.FRAME_HTML_TAG_NAME);
        assertEquals(MSG, 80, JavadocParser.HR_HTML_TAG_NAME);
        assertEquals(MSG, 81, JavadocParser.IMG_HTML_TAG_NAME);
        assertEquals(MSG, 82, JavadocParser.INPUT_HTML_TAG_NAME);
        assertEquals(MSG, 83, JavadocParser.ISINDEX_HTML_TAG_NAME);
        assertEquals(MSG, 84, JavadocParser.LINK_HTML_TAG_NAME);
        assertEquals(MSG, 85, JavadocParser.META_HTML_TAG_NAME);
        assertEquals(MSG, 86, JavadocParser.PARAM_HTML_TAG_NAME);
        assertEquals(MSG, 87, JavadocParser.EMBED_HTML_TAG_NAME);
        assertEquals(MSG, 88, JavadocParser.KEYGEN_HTML_TAG_NAME);
        assertEquals(MSG, 92, JavadocParser.SOURCE_HTML_TAG_NAME);
        assertEquals(MSG, 93, JavadocParser.TRACK_HTML_TAG_NAME);
        assertEquals(MSG, 94, JavadocParser.WBR_HTML_TAG_NAME);
        assertEquals(MSG, 95, JavadocParser.HTML_TAG_NAME);
        assertEquals(MSG, 96, JavadocParser.Char11);
        assertEquals(MSG, 89, JavadocParser.ATTR_VALUE);
        assertEquals(MSG, 90, JavadocParser.Char12);
        assertEquals(MSG, 91, JavadocParser.HTML_COMMENT_END);
    }

    /**
     * This method checks that the numbers generated for rules in <tt>JavadocParser.g4</tt> don't
     * change with the Parser grammar itself.
     * <br>ANTLR maps all the parser rules to compile time constants used internally by ANTLR.
     * Compatibility damage is incurred <i>(with respect to the previous checkstyle versions)
     * </i> if these compile time constants keep changing with the grammar.
     *
     * @see "https://github.com/checkstyle/checkstyle/issues/5139"
     * @see "https://github.com/checkstyle/checkstyle/issues/5186"
     */
    @Test
    public void testRuleNumbers() {
        assertEquals(MSG, 0, JavadocParser.RULE_javadoc);
        assertEquals(MSG, 1, JavadocParser.RULE_htmlElement);
        assertEquals(MSG, 2, JavadocParser.RULE_htmlElementStart);
        assertEquals(MSG, 3, JavadocParser.RULE_htmlElementEnd);
        assertEquals(MSG, 4, JavadocParser.RULE_attribute);
        assertEquals(MSG, 5, JavadocParser.RULE_htmlTag);
        assertEquals(MSG, 6, JavadocParser.RULE_pTagStart);
        assertEquals(MSG, 7, JavadocParser.RULE_pTagEnd);
        assertEquals(MSG, 8, JavadocParser.RULE_paragraph);
        assertEquals(MSG, 9, JavadocParser.RULE_liTagStart);
        assertEquals(MSG, 10, JavadocParser.RULE_liTagEnd);
        assertEquals(MSG, 11, JavadocParser.RULE_li);
        assertEquals(MSG, 12, JavadocParser.RULE_trTagStart);
        assertEquals(MSG, 13, JavadocParser.RULE_trTagEnd);
        assertEquals(MSG, 14, JavadocParser.RULE_tr);
        assertEquals(MSG, 15, JavadocParser.RULE_tdTagStart);
        assertEquals(MSG, 16, JavadocParser.RULE_tdTagEnd);
        assertEquals(MSG, 17, JavadocParser.RULE_td);
        assertEquals(MSG, 18, JavadocParser.RULE_thTagStart);
        assertEquals(MSG, 19, JavadocParser.RULE_thTagEnd);
        assertEquals(MSG, 20, JavadocParser.RULE_th);
        assertEquals(MSG, 21, JavadocParser.RULE_bodyTagStart);
        assertEquals(MSG, 22, JavadocParser.RULE_bodyTagEnd);
        assertEquals(MSG, 23, JavadocParser.RULE_body);
        assertEquals(MSG, 24, JavadocParser.RULE_colgroupTagStart);
        assertEquals(MSG, 25, JavadocParser.RULE_colgroupTagEnd);
        assertEquals(MSG, 26, JavadocParser.RULE_colgroup);
        assertEquals(MSG, 27, JavadocParser.RULE_ddTagStart);
        assertEquals(MSG, 28, JavadocParser.RULE_ddTagEnd);
        assertEquals(MSG, 29, JavadocParser.RULE_dd);
        assertEquals(MSG, 30, JavadocParser.RULE_dtTagStart);
        assertEquals(MSG, 31, JavadocParser.RULE_dtTagEnd);
        assertEquals(MSG, 32, JavadocParser.RULE_dt);
        assertEquals(MSG, 33, JavadocParser.RULE_headTagStart);
        assertEquals(MSG, 34, JavadocParser.RULE_headTagEnd);
        assertEquals(MSG, 35, JavadocParser.RULE_head);
        assertEquals(MSG, 36, JavadocParser.RULE_htmlTagStart);
        assertEquals(MSG, 37, JavadocParser.RULE_htmlTagEnd);
        assertEquals(MSG, 38, JavadocParser.RULE_html);
        assertEquals(MSG, 39, JavadocParser.RULE_optionTagStart);
        assertEquals(MSG, 40, JavadocParser.RULE_optionTagEnd);
        assertEquals(MSG, 41, JavadocParser.RULE_option);
        assertEquals(MSG, 42, JavadocParser.RULE_tbodyTagStart);
        assertEquals(MSG, 43, JavadocParser.RULE_tbodyTagEnd);
        assertEquals(MSG, 44, JavadocParser.RULE_tbody);
        assertEquals(MSG, 45, JavadocParser.RULE_tfootTagStart);
        assertEquals(MSG, 46, JavadocParser.RULE_tfootTagEnd);
        assertEquals(MSG, 47, JavadocParser.RULE_tfoot);
        assertEquals(MSG, 48, JavadocParser.RULE_theadTagStart);
        assertEquals(MSG, 49, JavadocParser.RULE_theadTagEnd);
        assertEquals(MSG, 50, JavadocParser.RULE_thead);
        assertEquals(MSG, 51, JavadocParser.RULE_singletonElement);
        assertEquals(MSG, 52, JavadocParser.RULE_emptyTag);
        assertEquals(MSG, 53, JavadocParser.RULE_areaTag);
        assertEquals(MSG, 54, JavadocParser.RULE_baseTag);
        assertEquals(MSG, 55, JavadocParser.RULE_basefontTag);
        assertEquals(MSG, 56, JavadocParser.RULE_brTag);
        assertEquals(MSG, 57, JavadocParser.RULE_colTag);
        assertEquals(MSG, 58, JavadocParser.RULE_frameTag);
        assertEquals(MSG, 59, JavadocParser.RULE_hrTag);
        assertEquals(MSG, 60, JavadocParser.RULE_imgTag);
        assertEquals(MSG, 61, JavadocParser.RULE_inputTag);
        assertEquals(MSG, 62, JavadocParser.RULE_isindexTag);
        assertEquals(MSG, 63, JavadocParser.RULE_linkTag);
        assertEquals(MSG, 64, JavadocParser.RULE_metaTag);
        assertEquals(MSG, 65, JavadocParser.RULE_paramTag);
        assertEquals(MSG, 66, JavadocParser.RULE_wrongSinletonTag);
        assertEquals(MSG, 67, JavadocParser.RULE_singletonTagName);
        assertEquals(MSG, 68, JavadocParser.RULE_description);
        assertEquals(MSG, 69, JavadocParser.RULE_reference);
        assertEquals(MSG, 70, JavadocParser.RULE_parameters);
        assertEquals(MSG, 71, JavadocParser.RULE_javadocTag);
        assertEquals(MSG, 72, JavadocParser.RULE_javadocInlineTag);
        assertEquals(MSG, 73, JavadocParser.RULE_htmlComment);
        assertEquals(MSG, 74, JavadocParser.RULE_text);
        assertEquals(MSG, 75, JavadocParser.RULE_embedTag);
        assertEquals(MSG, 76, JavadocParser.RULE_keygenTag);
        assertEquals(MSG, 77, JavadocParser.RULE_sourceTag);
        assertEquals(MSG, 78, JavadocParser.RULE_trackTag);
        assertEquals(MSG, 79, JavadocParser.RULE_wbrTag);
    }
}
