/*******************************************************************************
 * Copyright (c) 2019 École Polytechnique de Montréal
 *
 * All rights reserved. This program and the accompanying materials are
 * made available under the terms of the Eclipse Public License v1.0 which
 * accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *******************************************************************************/

package org.eclipse.tracecompass.incubator.analysis.core.tests.weighted;

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

import java.util.Collection;

import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.tracecompass.incubator.analysis.core.tests.stubs.weighted.SimpleTree;
import org.eclipse.tracecompass.incubator.analysis.core.weighted.tree.ITree;
import org.eclipse.tracecompass.incubator.analysis.core.weighted.tree.WeightedTree;
import org.eclipse.tracecompass.incubator.analysis.core.weighted.tree.WeightedTreeSet;
import org.junit.Test;

/**
 * Test the {@link WeightedTreeSet} class
 *
 * @author Geneviève Bastien
 */
@NonNullByDefault
public class WeightedTreeSetTest {

    private static final String OBJ1 = "obj1";
    private static final String OBJ2 = "obj2";

    /**
     * Test adding trees to non-{@link ITree} elements in the tree
     */
    @Test
    public void testAddingSimpleData() {
        int initialWeight = 10;
        String element1 = "element1";
        String element2 = "element2";

        // Initialization
        WeightedTreeSet<String, String> treeSet = new WeightedTreeSet<>();
        Collection<String> elements = treeSet.getElements();
        assertTrue(elements.isEmpty());
        assertTrue(treeSet.getTreesFor(element1).isEmpty());
        assertTrue(treeSet.getTreesFor(element2).isEmpty());

        // Trees for element1

        // Add a first tree to the set and make sure we can retrieve it
        WeightedTree<String> wt = new WeightedTree<>(OBJ1, initialWeight);
        treeSet.addWeightedTree(element1, wt);
        elements = treeSet.getElements();
        assertEquals(1, elements.size());
        assertEquals(element1, elements.iterator().next());
        Collection<WeightedTree<String>> trees = treeSet.getTreesFor(element1);
        assertEquals(1, trees.size());
        assertEquals(wt, trees.iterator().next());

        // Add a second tree to the set for the same object, should be merged
        wt = new WeightedTree<>(OBJ1, initialWeight);
        treeSet.addWeightedTree(element1, wt);
        elements = treeSet.getElements();
        assertEquals(1, elements.size());
        assertEquals(element1, elements.iterator().next());
        trees = treeSet.getTreesFor(element1);
        assertEquals(1, trees.size());
        WeightedTree<String> tree = trees.iterator().next();
        assertEquals(wt.getObject(), tree.getObject());
        assertEquals(initialWeight * 2, tree.getWeight());

        // Add a third tree for another object, added
        wt = new WeightedTree<>(OBJ2, initialWeight);
        treeSet.addWeightedTree(element1, wt);
        elements = treeSet.getElements();
        assertEquals(1, elements.size());
        assertEquals(element1, elements.iterator().next());
        Collection<WeightedTree<String>> el1Trees = treeSet.getTreesFor(element1);
        assertEquals(2, el1Trees.size());

        // Trees for a second element

        // Add tree to second element, first element should not be affected
        wt = new WeightedTree<>(OBJ1, initialWeight);
        treeSet.addWeightedTree(element2, wt);
        elements = treeSet.getElements();
        assertEquals(2, elements.size());
        trees = treeSet.getTreesFor(element1);
        // Trees for element1 are identical to before
        assertEquals(el1Trees, trees);
        trees = treeSet.getTreesFor(element2);
        assertEquals(1, trees.size());
    }

    /**
     * Test adding trees to {@link ITree} elements in the tree
     */
    @Test
    public void testAddingTreeData() {
        int initialWeight = 10;
        SimpleTree element1 = new SimpleTree("element1");
        SimpleTree element2 = new SimpleTree("element2");
        SimpleTree element3 = new SimpleTree("element3");
        element1.addChild(element2);
        element1.addChild(element3);
        SimpleTree element4 = new SimpleTree("element3");

        // Initialization
        WeightedTreeSet<String, SimpleTree> treeSet = new WeightedTreeSet<>();
        Collection<SimpleTree> elements = treeSet.getElements();
        assertTrue(elements.isEmpty());
        assertTrue(treeSet.getTreesFor(element1).isEmpty());
        assertTrue(treeSet.getTreesFor(element2).isEmpty());
        assertTrue(treeSet.getTreesFor(element3).isEmpty());
        assertTrue(treeSet.getTreesFor(element4).isEmpty());

        // Trees for element2, that has a parent

        // Add a first tree to the set and make sure we can retrieve it
        WeightedTree<String> wt = new WeightedTree<>(OBJ1, initialWeight);
        treeSet.addWeightedTree(element2, wt);
        elements = treeSet.getElements();
        assertEquals(1, elements.size());
        // The main element should be the parent
        assertEquals(element1, elements.iterator().next());
        Collection<WeightedTree<String>> trees = treeSet.getTreesFor(element2);
        assertEquals(1, trees.size());
        assertEquals(wt, trees.iterator().next());
        assertTrue(treeSet.getTreesFor(element1).isEmpty());

        // Add a tree to a second child
        wt = new WeightedTree<>(OBJ1, initialWeight);
        treeSet.addWeightedTree(element3, wt);
        // Base element should still be only the parent
        elements = treeSet.getElements();
        assertEquals(1, elements.size());
        assertEquals(element1, elements.iterator().next());
        trees = treeSet.getTreesFor(element3);
        assertEquals(1, trees.size());

        // Add second tree to a second child, should be merged
        wt = new WeightedTree<>(OBJ1, initialWeight);
        treeSet.addWeightedTree(element3, wt);
        // Base element should still be only the parent
        elements = treeSet.getElements();
        assertEquals(1, elements.size());
        assertEquals(element1, elements.iterator().next());
        trees = treeSet.getTreesFor(element3);
        assertEquals(1, trees.size());
        WeightedTree<String> tree = trees.iterator().next();
        assertEquals(wt.getObject(), tree.getObject());
        assertEquals(initialWeight * 2, tree.getWeight());

    }

}
