/**
 * 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 cli;

import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.falcon.cliParser.CLIParser;
import org.testng.Assert;
import org.testng.annotations.Test;

/**
 * Command parser for CLI.
 */
public class TestCLIParser {

    @Test
    public void testEmptyParser() throws Exception {
        try {
            CLIParser parser = new CLIParser("falcon", new String[]{});
            CLIParser.Command c = parser.parse(new String[]{"a"});
            Assert.fail();
        } catch (ParseException ex) {
            // nop
        }
    }

    @Test
    public void testCommandParser() throws Exception {
        try {
            CLIParser parser = new CLIParser("oozie", new String[]{});
            parser.addCommand("a", "<A>", "AAAAA", new Options(), false);
            CLIParser.Command c = parser.parse(new String[]{"a", "b"});
            Assert.assertEquals("a", c.getName());
            Assert.assertEquals("b", c.getCommandLine().getArgs()[0]);
        } catch (ParseException ex) {
            Assert.fail();
        }
    }

    @Test
    public void testCommandParserX() throws Exception {
        Option opt = new Option("o", false, "O");
        Options opts = new Options();
        opts.addOption(opt);
        CLIParser parser = new CLIParser("test", new String[]{});
        parser.addCommand("c", "-X ",
                "(everything after '-X' are pass-through parameters)", opts,
                true);
        CLIParser.Command c = parser.parse("c -o -X -o c".split(" "));
        Assert.assertEquals("-X", c.getCommandLine().getArgList().get(0));
        Assert.assertEquals(3, c.getCommandLine().getArgList().size());
    }
}
