/*******************************************************************************
 * Copyright (c) 2015, 2022 1C-Soft LLC.
 *
 * This program and the accompanying materials are made available under
 * the terms of the Eclipse Public License 2.0 which is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Vladimir Piskarev (1C) - initial API and implementation
 *******************************************************************************/
package org.eclipse.handly.internal.examples.jmodel;

import java.io.ByteArrayInputStream;
import java.util.Arrays;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.handly.examples.jmodel.IJavaProject;
import org.eclipse.handly.examples.jmodel.IPackageFragment;
import org.eclipse.handly.examples.jmodel.IPackageFragmentRoot;
import org.eclipse.handly.examples.jmodel.JavaModelCore;
import org.eclipse.handly.junit.NoJobsWorkspaceTestCase;

/**
 * <code>PackageFragmentRoot</code> tests.
 */
public class PackageFragmentRootTest
    extends NoJobsWorkspaceTestCase
{
    private IPackageFragmentRoot root;
    private IPackageFragment defaultPkg;
    private IPackageFragment fooPkg;
    private IPackageFragment foobarPkg;
    private IFolder metainfFolder;
    private IFile abcFile;

    @Override
    protected void setUp() throws Exception
    {
        super.setUp();
        IProject project = setUpProject("Test005");
        IJavaProject javaProject = JavaModelCore.create(project);
        root = javaProject.getPackageFragmentRoot(project.getFolder("src"));
        defaultPkg = root.getPackageFragment("");
        fooPkg = root.getPackageFragment("foo");
        foobarPkg = root.getPackageFragment("foo.bar");
        IFolder rootFolder = (IFolder)root.getResource();
        metainfFolder = rootFolder.getFolder("META-INF");
        abcFile = rootFolder.getFile("abc");
    }

    public void test001() throws Exception
    {
        IPackageFragment[] packageFragments = root.getPackageFragments();
        assertEquals(3, packageFragments.length);
        assertTrue(Arrays.asList(packageFragments).contains(defaultPkg));
        assertTrue(defaultPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(fooPkg));
        assertTrue(fooPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(foobarPkg));
        assertTrue(foobarPkg.exists());

        Object[] nonJavaResources = root.getNonJavaResources();
        assertEquals(2, nonJavaResources.length);
        assertTrue(Arrays.asList(nonJavaResources).contains(metainfFolder));
        assertTrue(Arrays.asList(nonJavaResources).contains(abcFile));

        // delete foo.bar
        foobarPkg.getResource().delete(true, null);

        packageFragments = root.getPackageFragments();
        assertEquals(2, packageFragments.length);
        assertTrue(Arrays.asList(packageFragments).contains(defaultPkg));
        assertTrue(defaultPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(fooPkg));
        assertTrue(fooPkg.exists());
        assertFalse(foobarPkg.exists());

        nonJavaResources = root.getNonJavaResources();
        assertEquals(2, nonJavaResources.length);
        assertTrue(Arrays.asList(nonJavaResources).contains(metainfFolder));
        assertTrue(Arrays.asList(nonJavaResources).contains(abcFile));

        // (re-)create foo.bar
        ((IFolder)foobarPkg.getResource()).create(true, true, null);

        packageFragments = root.getPackageFragments();
        assertEquals(3, packageFragments.length);
        assertTrue(Arrays.asList(packageFragments).contains(defaultPkg));
        assertTrue(defaultPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(fooPkg));
        assertTrue(fooPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(foobarPkg));
        assertTrue(foobarPkg.exists());

        nonJavaResources = root.getNonJavaResources();
        assertEquals(2, nonJavaResources.length);
        assertTrue(Arrays.asList(nonJavaResources).contains(metainfFolder));
        assertTrue(Arrays.asList(nonJavaResources).contains(abcFile));

        // delete META-INF and abc
        metainfFolder.delete(true, null);
        abcFile.delete(true, null);

        packageFragments = root.getPackageFragments();
        assertEquals(3, packageFragments.length);
        assertTrue(Arrays.asList(packageFragments).contains(defaultPkg));
        assertTrue(defaultPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(fooPkg));
        assertTrue(fooPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(foobarPkg));
        assertTrue(foobarPkg.exists());

        nonJavaResources = root.getNonJavaResources();
        assertEquals(0, nonJavaResources.length);

        // (re-)create META-INF and abc
        metainfFolder.create(true, true, null);
        abcFile.create(new ByteArrayInputStream(new byte[0]), true, null);

        packageFragments = root.getPackageFragments();
        assertEquals(3, packageFragments.length);
        assertTrue(Arrays.asList(packageFragments).contains(defaultPkg));
        assertTrue(defaultPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(fooPkg));
        assertTrue(fooPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(foobarPkg));
        assertTrue(foobarPkg.exists());

        nonJavaResources = root.getNonJavaResources();
        assertEquals(2, nonJavaResources.length);
        assertTrue(Arrays.asList(nonJavaResources).contains(metainfFolder));
        assertTrue(Arrays.asList(nonJavaResources).contains(abcFile));
    }

    public void test002() throws Exception
    {
        IPackageFragment[] packageFragments = root.getPackageFragments();
        assertEquals(3, packageFragments.length);
        assertTrue(Arrays.asList(packageFragments).contains(defaultPkg));
        assertTrue(defaultPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(fooPkg));
        assertTrue(fooPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(foobarPkg));
        assertTrue(foobarPkg.exists());

        Object[] nonJavaResources = root.getNonJavaResources();
        assertEquals(2, nonJavaResources.length);
        assertTrue(Arrays.asList(nonJavaResources).contains(metainfFolder));
        assertTrue(Arrays.asList(nonJavaResources).contains(abcFile));

        // move foo
        IPackageFragment foo2Pkg = root.getPackageFragment("foo2");
        assertFalse(foo2Pkg.exists());
        fooPkg.getResource().move(foo2Pkg.getResource().getFullPath(), true,
            null);
        assertFalse(fooPkg.exists());
        assertFalse(foobarPkg.exists());

        packageFragments = root.getPackageFragments();
        assertEquals(3, packageFragments.length);
        assertTrue(Arrays.asList(packageFragments).contains(defaultPkg));
        assertTrue(defaultPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(foo2Pkg));
        assertTrue(foo2Pkg.exists());
        IPackageFragment foo2barPkg = root.getPackageFragment("foo2.bar");
        assertTrue(Arrays.asList(packageFragments).contains(foo2barPkg));
        assertTrue(foo2barPkg.exists());

        nonJavaResources = root.getNonJavaResources();
        assertEquals(2, nonJavaResources.length);
        assertTrue(Arrays.asList(nonJavaResources).contains(metainfFolder));
        assertTrue(Arrays.asList(nonJavaResources).contains(abcFile));
    }

    public void test003() throws Exception
    {
        IPackageFragment[] packageFragments = root.getPackageFragments();
        assertEquals(3, packageFragments.length);
        assertTrue(Arrays.asList(packageFragments).contains(defaultPkg));
        assertTrue(defaultPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(fooPkg));
        assertTrue(fooPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(foobarPkg));
        assertTrue(foobarPkg.exists());

        Object[] nonJavaResources = root.getNonJavaResources();
        assertEquals(2, nonJavaResources.length);
        assertTrue(Arrays.asList(nonJavaResources).contains(metainfFolder));
        assertTrue(Arrays.asList(nonJavaResources).contains(abcFile));

        // move foo to a non-Java resource
        IFolder rootFolder = (IFolder)root.getResource();
        IFolder osgiinfFolder = rootFolder.getFolder("OSGI-INF");
        fooPkg.getResource().move(osgiinfFolder.getFullPath(), true, null);
        assertFalse(fooPkg.exists());
        assertFalse(foobarPkg.exists());

        packageFragments = root.getPackageFragments();
        assertEquals(1, packageFragments.length);
        assertTrue(Arrays.asList(packageFragments).contains(defaultPkg));
        assertTrue(defaultPkg.exists());

        nonJavaResources = root.getNonJavaResources();
        assertEquals(3, nonJavaResources.length);
        assertTrue(Arrays.asList(nonJavaResources).contains(metainfFolder));
        assertTrue(Arrays.asList(nonJavaResources).contains(osgiinfFolder));
        assertTrue(Arrays.asList(nonJavaResources).contains(abcFile));

        // move it back
        osgiinfFolder.move(fooPkg.getResource().getFullPath(), true, null);

        packageFragments = root.getPackageFragments();
        assertEquals(3, packageFragments.length);
        assertTrue(Arrays.asList(packageFragments).contains(defaultPkg));
        assertTrue(defaultPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(fooPkg));
        assertTrue(fooPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(foobarPkg));
        assertTrue(foobarPkg.exists());

        nonJavaResources = root.getNonJavaResources();
        assertEquals(2, nonJavaResources.length);
        assertTrue(Arrays.asList(nonJavaResources).contains(metainfFolder));
        assertTrue(Arrays.asList(nonJavaResources).contains(abcFile));
    }

    public void test004() throws Exception
    {
        IPackageFragment[] packageFragments = root.getPackageFragments();
        assertEquals(3, packageFragments.length);
        assertTrue(Arrays.asList(packageFragments).contains(defaultPkg));
        assertTrue(defaultPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(fooPkg));
        assertTrue(fooPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(foobarPkg));
        assertTrue(foobarPkg.exists());

        Object[] nonJavaResources = root.getNonJavaResources();
        assertEquals(2, nonJavaResources.length);
        assertTrue(Arrays.asList(nonJavaResources).contains(metainfFolder));
        assertTrue(Arrays.asList(nonJavaResources).contains(abcFile));

        // move META-INF, abc and A.java
        IFolder rootFolder = (IFolder)root.getResource();
        IFolder osgiinfFolder = rootFolder.getFolder("OSGI-INF");
        metainfFolder.move(osgiinfFolder.getFullPath(), true, null);
        IFile abcJavaFile = rootFolder.getFile("abc.java");
        abcFile.move(abcJavaFile.getFullPath(), true, null);
        IFile aJavaFile = rootFolder.getFile("A.java");
        IFile aFile = rootFolder.getFile("A");
        aJavaFile.move(aFile.getFullPath(), true, null);

        packageFragments = root.getPackageFragments();
        assertEquals(3, packageFragments.length);
        assertTrue(Arrays.asList(packageFragments).contains(defaultPkg));
        assertTrue(defaultPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(fooPkg));
        assertTrue(fooPkg.exists());
        assertTrue(Arrays.asList(packageFragments).contains(foobarPkg));
        assertTrue(foobarPkg.exists());

        nonJavaResources = root.getNonJavaResources();
        assertEquals(2, nonJavaResources.length);
        assertTrue(Arrays.asList(nonJavaResources).contains(osgiinfFolder));
        assertTrue(Arrays.asList(nonJavaResources).contains(aFile));
    }
}
