/*
 * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 * @test
 * @bug 8141415 8129418
 * @summary Test imports
 * @modules jdk.compiler/com.sun.tools.javac.api
 *          jdk.compiler/com.sun.tools.javac.main
 *          jdk.jdeps/com.sun.tools.javap
 * @library /tools/lib
 * @build KullaTesting TestingInputStream toolbox.Task.ExpectedDiagnostic
 * @run testng ImportTest
 */

import java.lang.reflect.Method;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.function.Consumer;

import javax.tools.Diagnostic;
import jdk.jshell.JShell;

import jdk.jshell.Snippet;
import org.testng.annotations.Test;

import static jdk.jshell.Snippet.Status.VALID;
import static jdk.jshell.Snippet.Status.OVERWRITTEN;
import static jdk.jshell.Snippet.SubKind.MODULE_IMPORT_SUBKIND;
import static jdk.jshell.Snippet.SubKind.SINGLE_TYPE_IMPORT_SUBKIND;
import static jdk.jshell.Snippet.SubKind.SINGLE_STATIC_IMPORT_SUBKIND;
import static jdk.jshell.Snippet.SubKind.TYPE_IMPORT_ON_DEMAND_SUBKIND;
import static jdk.jshell.Snippet.SubKind.STATIC_IMPORT_ON_DEMAND_SUBKIND;

@Test
public class ImportTest extends KullaTesting {

    public void testImport() {
        assertImportKeyMatch("import java.util.List;", "List", SINGLE_TYPE_IMPORT_SUBKIND, added(VALID));
        assertImportKeyMatch("import java.util.ArrayList;", "ArrayList", SINGLE_TYPE_IMPORT_SUBKIND, added(VALID));
        assertEval("List<Integer> list = new ArrayList<>();");
        assertEval("list.add(45);");
        assertEval("list.size();", "1");
    }

    public void testImportOnDemand() {
        assertImportKeyMatch("import java.util.*;", "java.util.*", TYPE_IMPORT_ON_DEMAND_SUBKIND, added(VALID));
        assertEval("List<Integer> list = new ArrayList<>();");
        assertEval("list.add(45);");
        assertEval("list.size();", "1");
    }

    public void testImportStatic() {
        assertImportKeyMatch("import static java.lang.Math.PI;", "PI", SINGLE_STATIC_IMPORT_SUBKIND, added(VALID));
        assertEval("Double.valueOf(PI).toString().substring(0, 16).equals(\"3.14159265358979\");", "true");
    }

    public void testImportStaticOnDemand() {
        assertImportKeyMatch("import static java.lang.Math.*;", "java.lang.Math.*", STATIC_IMPORT_ON_DEMAND_SUBKIND, added(VALID));
        assertEval("abs(cos(PI / 2)) < 0.00001;", "true");
    }

    public void testUnknownPackage() {
        assertDeclareFail("import unknown.qqq;",
                new ExpectedDiagnostic("compiler.err.doesnt.exist", 7, 18, 14, -1, -1, Diagnostic.Kind.ERROR));
        assertDeclareFail("import unknown.*;",
                new ExpectedDiagnostic("compiler.err.doesnt.exist", 7, 14, 7, -1, -1, Diagnostic.Kind.ERROR));
    }

    public void testBogusImportIgnoredInFuture() {
        assertDeclareFail("import unknown.qqq;", "compiler.err.doesnt.exist");
        assertDeclareFail("import unknown.*;", "compiler.err.doesnt.exist");
        assertEval("2 + 2;");
    }

    public void testBadImport() {
        assertDeclareFail("import static java.lang.reflect.Modifier;",
                new ExpectedDiagnostic("compiler.err.cant.resolve.location", 14, 31, 23, -1, -1, Diagnostic.Kind.ERROR));
    }

    public void testBadSyntaxImport() {
        assertDeclareFail("import not found.*;",
                new ExpectedDiagnostic("compiler.err.expected", 10, 10, 10, -1, -1, Diagnostic.Kind.ERROR));
    }

    public void testImportRedefinition() {
        Compiler compiler = new Compiler();
        Path path = Paths.get("testImport");
        compiler.compile(path, "package util; public class ArrayList { public String toString() { return \"MyList\"; } }");
        compiler.compile(path, "package util; public class A { public static class ArrayList {\n" +
                "public String toString() { return \"MyInnerList\"; } } }");
        addToClasspath(compiler.getPath(path));

        assertImportKeyMatch("import util.*;", "util.*", TYPE_IMPORT_ON_DEMAND_SUBKIND, added(VALID));
        assertEval("new ArrayList();", "MyList", added(VALID));

        Snippet import0 = assertImportKeyMatch("import java.util.ArrayList;", "ArrayList", SINGLE_TYPE_IMPORT_SUBKIND, added(VALID));
        assertEval("new ArrayList();", "[]");

        Snippet import1 = assertImportKeyMatch("import util.ArrayList;", "ArrayList", SINGLE_TYPE_IMPORT_SUBKIND,
                ste(MAIN_SNIPPET, VALID, VALID, false, null),
                ste(import0, VALID, OVERWRITTEN, false, MAIN_SNIPPET));
        assertEval("new ArrayList();", "MyList");

        Snippet import2 = assertImportKeyMatch("import java.util.ArrayList;", "ArrayList", SINGLE_TYPE_IMPORT_SUBKIND,
                ste(MAIN_SNIPPET, VALID, VALID, false, null),
                ste(import1, VALID, OVERWRITTEN, false, MAIN_SNIPPET));
        assertEval("new ArrayList();", "[]");

        Snippet import3 = assertImportKeyMatch("import util.A.ArrayList;", "ArrayList", SINGLE_TYPE_IMPORT_SUBKIND,
                ste(MAIN_SNIPPET, VALID, VALID, false, null),
                ste(import2, VALID, OVERWRITTEN, false, MAIN_SNIPPET));
        assertEval("new ArrayList();", "MyInnerList");

        Snippet import4 = assertImportKeyMatch("import java.util.ArrayList;", "ArrayList", SINGLE_TYPE_IMPORT_SUBKIND,
                ste(MAIN_SNIPPET, VALID, VALID, false, null),
                ste(import3, VALID, OVERWRITTEN, false, MAIN_SNIPPET));
        assertEval("new ArrayList();", "[]");

        Snippet import5 = assertImportKeyMatch("import static util.A.ArrayList;", "ArrayList", SINGLE_STATIC_IMPORT_SUBKIND,
                ste(MAIN_SNIPPET, VALID, VALID, false, null),
                ste(import4, VALID, OVERWRITTEN, false, MAIN_SNIPPET));
        assertEval("new ArrayList();", "MyInnerList");
    }

    public void testImportMemberRedefinition() {
        Compiler compiler = new Compiler();
        Path path = Paths.get("testImport");
        compiler.compile(path, "package util; public class A {" +
                "public static String field = \"A\";" +
                "public static String method() { return \"A\"; } }");
        compiler.compile(path, "package util; public class B {" +
                "public static String field = \"B\";" +
                "public static String method() { return \"B\"; } }");
        addToClasspath(compiler.getPath(path));

        assertImportKeyMatch("import static util.B.*;", "util.B.*", STATIC_IMPORT_ON_DEMAND_SUBKIND, added(VALID));
        assertEval("field;", "\"B\"");
        assertEval("method();", "\"B\"");

        assertImportKeyMatch("import static util.A.method;", "method", SINGLE_STATIC_IMPORT_SUBKIND, added(VALID));
        assertEval("field;", "\"B\"");
        assertEval("method();", "\"A\"");

        assertImportKeyMatch("import static util.A.field;", "field", SINGLE_STATIC_IMPORT_SUBKIND, added(VALID));
        assertEval("field;", "\"A\"");
        assertEval("method();", "\"A\"");
    }

    public void testImportWithComment() {
        assertImportKeyMatch("import java.util.List;//comment", "List", SINGLE_TYPE_IMPORT_SUBKIND, added(VALID));
        assertEval("List l = null;");
    }

    public void testImportModule() {
        assertImportKeyMatch("import module java.base;", "java.base", MODULE_IMPORT_SUBKIND, added(VALID));
        assertEval("MethodHandle m;");
    }

    @org.testng.annotations.BeforeMethod
    public void setUp(Method m) {
        switch (m.getName()) {
            case "testImportModule" ->
                super.setUp(bc -> bc.compilerOptions("--source", System.getProperty("java.specification.version"), "--enable-preview").remoteVMOptions("--enable-preview"));
            default ->
                super.setUp(bc -> {});
        }
    }

}
