/*
 * Copyright 2009 the original author or authors.
 *
 * Licensed 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.gradle.foundation;

import junit.framework.TestCase;
import org.gradle.DefaultCommandLine2StartParameterConverter;

/**
 * This tests aspects of command line parsing that the UI does.
 *
 * @author mhunsicker
 */
public class CommandLineParsingTest extends TestCase {
    /**
   This verifies that the user can override the current log level on a command line.
   The issue here is that the UI defines a default log level that will always be
   used for all commands, but there are time when you want to override it. This is
   useful if someone enters something into the command line tab or just wants to
   make a favorite that always uses a specific log level. All they have to do is
   specify a log level on their command line and the won't append one. This verifies
   that the function that does the check if its already defined is working.
    */
    public void testOverridingLogLevel() {
        //first try it with the log level at the end
        String commandLine = ":build:something -" + DefaultCommandLine2StartParameterConverter.DEBUG;

        CommandLineAssistant commandLineAssistant = new CommandLineAssistant();
        String[] arguments = CommandLineAssistant.breakUpCommandLine(commandLine);
        assertTrue(commandLineAssistant.hasLogLevelDefined(arguments));

        //now try it with the log level in the middle
        commandLine = ":build:something -" + DefaultCommandLine2StartParameterConverter.DEBUG + " :clean";
        arguments = CommandLineAssistant.breakUpCommandLine(commandLine);
        assertTrue(commandLineAssistant.hasLogLevelDefined(arguments));

        //now try it with the log level at the beginning
        commandLine = "-" + DefaultCommandLine2StartParameterConverter.DEBUG + " :clean";
        arguments = CommandLineAssistant.breakUpCommandLine(commandLine);
        assertTrue(commandLineAssistant.hasLogLevelDefined(arguments));

        //now try it with 'info' instead of debug
        commandLine = "-" + DefaultCommandLine2StartParameterConverter.INFO + " :clean";
        arguments = CommandLineAssistant.breakUpCommandLine(commandLine);
        assertTrue(commandLineAssistant.hasLogLevelDefined(arguments));

        //lastly verify it doesn't inadvertantly detect a log level
        commandLine = ":clean";
        arguments = CommandLineAssistant.breakUpCommandLine(commandLine);
        assertFalse(commandLineAssistant.hasLogLevelDefined(arguments));
    }

    /**
   This verifies that the user can override the current stack trace level on a command line.
   The issue here is that the UI defines a default stack trace level that will always be
   used for all commands, but there are time when you want to override it. This is
   useful if someone enters something into the command line tab or just wants to
   make a favorite that always uses a specific stack trace level. All they have to do is
   specify a stack trace level on their command line and the won't append one. This verifies
   that the function that does the check if its already defined is working.
    */
    public void testOverridingStackTraceLevel() {
        //first try it with the stack trace level at the end
        String commandLine = ":build:something -" + DefaultCommandLine2StartParameterConverter.FULL_STACKTRACE;

        CommandLineAssistant commandLineAssistant = new CommandLineAssistant();
        String[] arguments = CommandLineAssistant.breakUpCommandLine(commandLine);
        assertTrue(commandLineAssistant.hasShowStacktraceDefined(arguments));

        //now try it with the stack trace level in the middle
        commandLine = ":build:something -" + DefaultCommandLine2StartParameterConverter.FULL_STACKTRACE + " :clean";
        arguments = CommandLineAssistant.breakUpCommandLine(commandLine);
        assertTrue(commandLineAssistant.hasShowStacktraceDefined(arguments));

        //now try it with the stack trace level at the beginning
        commandLine = "-" + DefaultCommandLine2StartParameterConverter.FULL_STACKTRACE + " :clean";
        arguments = CommandLineAssistant.breakUpCommandLine(commandLine);
        assertTrue(commandLineAssistant.hasShowStacktraceDefined(arguments));

        //now try it with a different stack trace level
        commandLine = "-" + DefaultCommandLine2StartParameterConverter.STACKTRACE + " :clean";
        arguments = CommandLineAssistant.breakUpCommandLine(commandLine);
        assertTrue(commandLineAssistant.hasShowStacktraceDefined(arguments));

        //lastly verify it doesn't inadvertantly detect a stack trace
        commandLine = ":clean";
        arguments = CommandLineAssistant.breakUpCommandLine(commandLine);
        assertFalse(commandLineAssistant.hasShowStacktraceDefined(arguments));
    }
}
