blob: 2c599a076bd8ce2a68a6387e64a475ca3f191440 [file] [log] [blame]
/*******************************************************************************
* 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 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
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());
}
}