/*
 * 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.maven.it;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import org.apache.maven.shared.utils.io.FileUtils;
import org.apache.maven.shared.verifier.Verifier;
import org.apache.maven.shared.verifier.util.ResourceExtractor;
import org.junit.jupiter.api.Test;

/**
 * This is a test set for <a href="https://issues.apache.org/jira/browse/MNG-828">MNG-828</a>.
 *
 * @author Slawomir Jaranowski
 */
public class MavenITmng0828PluginConfigValuesInDebugTest extends AbstractMavenIntegrationTestCase {

    private static final String NL = System.lineSeparator();

    public MavenITmng0828PluginConfigValuesInDebugTest() {
        super(ALL_MAVEN_VERSIONS);
    }

    /**
     * Verify that plain plugin configuration values are listed correctly in debug mode.
     *
     * @throws Exception in case of failure
     */
    @Test
    public void testitMNG0828() throws Exception {
        File testDir = ResourceExtractor.simpleExtractResources(getClass(), "/mng-0828");

        Verifier verifier = newVerifier(testDir.getAbsolutePath());
        verifier.setAutoclean(false);
        verifier.deleteDirectory("target");
        verifier.addCliArgument("-X");
        verifier.addCliArgument("validate");
        verifier.execute();
        verifier.verifyErrorFreeLog();

        String log = FileUtils.fileRead(new File(verifier.getBasedir(), verifier.getLogFileName()));

        checkLog(log, "[DEBUG]   (f) aliasDefaultExpressionParam = test");
        checkLog(log, "[DEBUG]   (f) basedir = " + testDir.getCanonicalPath());
        checkLog(
                log,
                "[DEBUG]   (f) beanParam = org.apache.maven.plugin.coreit.Bean[fieldParam=field, setterParam=setter, setterCalled=true]");
        checkLog(log, "[DEBUG]   (f) booleanParam = true");
        checkLog(log, "[DEBUG]   (f) byteParam = 42");
        checkLog(log, "[DEBUG]   (f) byteParam = 42");
        checkLog(log, "[DEBUG]   (f) characterParam = X");

        Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S a", Locale.US).parse("2008-11-09 11:59:03.0 AM");
        checkLog(log, "[DEBUG]   (f) dateParam = " + date);

        checkLog(log, "[DEBUG]   (f) defaultParam = maven-core-it");
        checkLog(log, "[DEBUG]   (f) defaultParamWithExpression = org.apache.maven.its.mng0828:test1:1.0-SNAPSHOT");

        // new line of dumping dom is not guaranteed, but all items should be present
        checkLog(log, "[DEBUG]   (f) domParam = <domParam><echo>one</echo>");
        checkLog(log, "<echo>two</echo>");
        checkLog(log, "<echo>three</echo>");
        checkLog(log, "<echo>four</echo>");
        checkLog(log, "</domParam>");

        checkLog(log, "[DEBUG]   (f) doubleParam = -1.5");
        checkLog(log, "[DEBUG]   (f) fieldParam = field");
        checkLog(log, "[DEBUG]   (f) fileParam = " + new File(testDir, "pom.xml").getCanonicalPath());
        checkLog(log, "[DEBUG]   (f) floatParam = 0.0");
        checkLog(log, "[DEBUG]   (f) integerParam = 0");
        checkLog(log, "[DEBUG]   (f) listParam = [one, two, three, four]");
        checkLog(log, "[DEBUG]   (f) longParam = 9876543210");

        // Map items order is not guaranteed, so only check begin of params ...
        checkLog(log, "[DEBUG]   (f) mapParam = {key");
        checkLog(
                log,
                "[DEBUG]   (f) propertiesFile = "
                        + new File(testDir, "target/plugin-config.properties").getCanonicalPath());

        // Properties item order is not guaranteed, so only check begin of params ...
        checkLog(log, "[DEBUG]   (f) propertiesParam = {key");
        checkLog(log, "[DEBUG]   (f) setParam = [item]");
        checkLog(log, "[DEBUG]   (f) shortParam = -12345");
        checkLog(log, "[DEBUG]   (f) stringParam = Hello World!");
        checkLog(log, "[DEBUG]   (f) stringParams = [one, two, three, four]");
        checkLog(log, "[DEBUG]   (f) urlParam = http://maven.apache.org/");
        checkLog(log, "[DEBUG]   (s) setterParam = setter");
    }

    private void checkLog(String log, String expected) {
        assertTrue(
                NL + ">>>" + NL + log + "<<<" + NL + NL + "does not contains: " + NL + expected + NL,
                log.contains(expected));
    }
}
