/**
 * 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.storm.command;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

public class TestCLI {

    @Test
    public void testSimple() throws Exception {
        Map<String, Object> values = CLI.opt("a", "aa", null)
                                        .opt("b", "bb", 1, CLI.AS_INT)
                                        .opt("c", "cc", 1, CLI.AS_INT, CLI.FIRST_WINS)
                                        .opt("d", "dd", null, CLI.AS_STRING, CLI.INTO_LIST)
                                        .opt("e", "ee", null, CLI.AS_INT)
                                        .opt("f", "ff", null, new PairParse(), CLI.INTO_MAP)
                                        .arg("A")
                                        .arg("B", CLI.AS_INT)
                                        .parse("-a100", "--aa", "200", "-c2", "-b", "50", "--cc", "100", "A-VALUE", "1", "2", "3", "-b40",
                                               "-d1", "-d2", "-d3"
                                            , "-f", "key1=value1", "-f", "key2=value2");
        assertEquals(8, values.size());
        assertEquals("200", (String) values.get("a"));
        assertEquals((Integer) 40, (Integer) values.get("b"));
        assertEquals((Integer) 2, (Integer) values.get("c"));
        assertEquals(null, values.get("e"));

        List<String> d = (List<String>) values.get("d");
        assertEquals(3, d.size());
        assertEquals("1", d.get(0));
        assertEquals("2", d.get(1));
        assertEquals("3", d.get(2));

        List<String> A = (List<String>) values.get("A");
        assertEquals(1, A.size());
        assertEquals("A-VALUE", A.get(0));

        List<Integer> B = (List<Integer>) values.get("B");
        assertEquals(3, B.size());
        assertEquals((Integer) 1, B.get(0));
        assertEquals((Integer) 2, B.get(1));
        assertEquals((Integer) 3, B.get(2));

        Map<String, String> f = (Map<String, String>) values.get("f");
        assertEquals(2, f.size());
        assertEquals("value1", f.get("key1"));
        assertEquals("value2", f.get("key2"));
    }


    @Test
    public void testOptional() throws Exception {
        Map<String, Object> values = CLI.optionalArg("A", CLI.LAST_WINS)
            .parse("TEST");

        assertEquals(1, values.size());
        assertEquals("TEST", values.get("A"));

        values = CLI.optionalArg("A", CLI.LAST_WINS)
            .parse();

        assertEquals(1, values.size());
        assertEquals(null, values.get("A"));


        values = CLI.optionalArg("A", CLI.LAST_WINS)
            .parse("THIS", "IS", "A", "TEST");

        assertEquals(1, values.size());
        assertEquals("TEST", values.get("A"));

        values = CLI.arg("A", CLI.LAST_WINS)
            .optionalArg("B", CLI.LAST_WINS)
            .parse("THIS", "IS", "A", "TEST");

        assertEquals(2, values.size());
        assertEquals("THIS", values.get("A"));
        assertEquals("TEST", values.get("B"));
    }

    @Test
    public void argAfterOptional() throws Exception {
        try {
            CLI.optionalArg("A", CLI.LAST_WINS)
                .arg("B");

            fail("Expected an exception to be thrown by now");
        } catch (IllegalStateException is) {
            //Expected
        }
    }

    private static final class PairParse implements CLI.Parse {

        @Override
        public Object parse(String value) {
            Map<String, String> result = new HashMap<>();
            String[] splits = value.split("=");
            result.put(splits[0], splits[1]);
            return result;
        }
    }
}
