/*-
 * #%L
 * JSQLParser library
 * %%
 * Copyright (C) 2004 - 2020 JSQLParser
 * %%
 * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
 * #L%
 */
package net.sf.jsqlparser.statement.create;

import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.schema.Database;
import net.sf.jsqlparser.schema.Sequence;
import net.sf.jsqlparser.schema.Sequence.Parameter;
import net.sf.jsqlparser.schema.Sequence.ParameterType;
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
import static net.sf.jsqlparser.test.TestUtils.*;
import org.junit.jupiter.api.Test;

public class CreateSequenceTest {

    @Test
    public void testCreateSequence_noParams() throws JSQLParserException {
        String statement = "CREATE SEQUENCE my_seq";
        assertSqlCanBeParsedAndDeparsed(statement);
        assertDeparse(new CreateSequence().withSequence(new Sequence().withName("my_seq")),
                statement);
    }

    @Test
    public void testCreateSequence_withIncrement() throws JSQLParserException {
        String statement = "CREATE SEQUENCE db.schema.my_seq INCREMENT BY 1";
        assertSqlCanBeParsedAndDeparsed(statement);
        assertDeparse(new CreateSequence().withSequence(
                new Sequence().withDatabase(new Database("db")).withSchemaName("schema")
                        .withName("my_seq")
                        .addParameters(new Parameter(ParameterType.INCREMENT_BY).withValue(1L))),
                statement);
    }

    @Test
    public void testCreateSequence_withStart() throws JSQLParserException {
        assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq START WITH 10");
    }

    @Test
    public void testCreateSequence_withMaxValue() throws JSQLParserException {
        assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq MAXVALUE 5");
    }

    @Test
    public void testCreateSequence_withNoMaxValue() throws JSQLParserException {
        assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq NOMAXVALUE");
    }

    @Test
    public void testCreateSequence_withMinValue() throws JSQLParserException {
        assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq MINVALUE 5");
    }

    @Test
    public void testCreateSequence_withNoMinValue() throws JSQLParserException {
        assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq NOMINVALUE");
    }

    @Test
    public void testCreateSequence_withCycle() throws JSQLParserException {
        assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq CYCLE");
    }

    @Test
    public void testCreateSequence_withNoCycle() throws JSQLParserException {
        assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq NOCYCLE");
    }

    @Test
    public void testCreateSequence_withCache() throws JSQLParserException {
        assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq CACHE 10");
    }

    @Test
    public void testCreateSequence_withNoCache() throws JSQLParserException {
        assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq NOCACHE");
    }

    @Test
    public void testCreateSequence_withOrder() throws JSQLParserException {
        assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq ORDER");
    }

    @Test
    public void testCreateSequence_withNoOrder() throws JSQLParserException {
        assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq NOORDER");
    }

    @Test
    public void testCreateSequence_withKeep() throws JSQLParserException {
        assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq KEEP");
    }

    @Test
    public void testCreateSequence_withNoKeep() throws JSQLParserException {
        assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq NOKEEP");
    }

    @Test
    public void testCreateSequence_withSession() throws JSQLParserException {
        assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq SESSION");
    }

    @Test
    public void testCreateSequence_withGlobal() throws JSQLParserException {
        assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq GLOBAL");
    }

    /**
     * Verifies that we declare the parameter options in the order we found them
     */
    @Test
    public void testCreateSequence_preservesParamOrder() throws JSQLParserException {
        assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_sec INCREMENT BY 2 START WITH 10");
        assertSqlCanBeParsedAndDeparsed(
                "CREATE SEQUENCE my_sec START WITH 2 INCREMENT BY 5 NOCACHE");
        String statement = "CREATE SEQUENCE my_sec START WITH 2 INCREMENT BY 5 CACHE 200 CYCLE";
        assertSqlCanBeParsedAndDeparsed(statement);
        assertDeparse(new CreateSequence().withSequence(new Sequence().withName("my_sec")
                .addParameters(asList(
                        new Parameter(ParameterType.START_WITH).withValue(2L),
                        new Parameter(ParameterType.INCREMENT_BY).withValue(5L),
                        new Parameter(ParameterType.CACHE).withValue(200L),
                        new Parameter(ParameterType.CYCLE)))),
                statement);
    }

}
