blob: 5f7be2e40cffcffa79b48e8164658cc6d6f037d9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014 É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
*
* Contributors:
* Guilliano Molaire - Initial API and implementation
* Mathieu Rail - Initial API and implementation
*******************************************************************************/
package org.eclipse.tracecompass.tmf.core.tests.analysis;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement;
import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisRequirement.ValuePriorityLevel;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
/**
* Test suite for the {@link TmfAnalysisRequirement} class.
*
* @author Guilliano Molaire
* @author Mathieu Rail
*/
public class AnalysisRequirementTest {
/* Requirements used in the tests */
private TmfAnalysisRequirement fRequirement;
private TmfAnalysisRequirement fSubRequirement;
/* Types of requirement type strings */
private static final String TYPE_A = "Test Type A";
private static final String TYPE_B = "Test Type B";
/* Requirement value name strings */
private static final String VALUE_A = "Test Value A";
private static final String VALUE_B = "Test Value B";
private static final String VALUE_C = "Test Value C";
private static final String VALUE_D = "Test Value D";
private static final String VALUE_E = "Test Value E";
private static final String VALUE_F = "Test Value F";
/* Requirement information strings */
private static final String INFO_A = "This is an information.";
private static final String INFO_B = "This is another information.";
private static final String INFO_C = "This is the last information.";
/**
* Test suite for the {@link TmfAnalysisRequirement#addInformation} and the
* {@link TmfAnalysisRequirement#getInformation} methods.
*/
@Test
public void testAddAndGetInformation() {
fRequirement = new TmfAnalysisRequirement(TYPE_A);
fRequirement.addInformation(INFO_A);
fRequirement.addInformation(INFO_B);
fRequirement.addInformation(INFO_B);
Set<String> information = fRequirement.getInformation();
assertEquals(2, information.size());
assertTrue(information.contains(INFO_A));
assertTrue(information.contains(INFO_B));
}
/**
* Test suite for the {@link TmfAnalysisRequirement#addValues} and the
* {@link TmfAnalysisRequirement#addValue} methods.
*/
@Test
public void testAddValuesToRequirement() {
fRequirement = new TmfAnalysisRequirement(TYPE_A);
assertEquals(0, fRequirement.getValues().size());
List<String> values = new ArrayList<>();
values.add(VALUE_A);
values.add(VALUE_B);
values.add(VALUE_C);
values.add(VALUE_C);
/*
* Add values to the requirement with the same level, Value C should
* only exist once
*/
fRequirement.addValues(values, ValuePriorityLevel.MANDATORY);
assertEquals(3, fRequirement.getValues().size());
/*
* The new value should only exist once and its level should be
* mandatory
*/
fRequirement.addValue(VALUE_D, ValuePriorityLevel.OPTIONAL);
fRequirement.addValue(VALUE_D, ValuePriorityLevel.MANDATORY);
assertEquals(4, fRequirement.getValues().size());
assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_D));
}
/**
* Test suite for the {@link TmfAnalysisRequirement#getValueLevel} method.
*/
@Test
public void testGetValueLevel() {
fRequirement = new TmfAnalysisRequirement(TYPE_A);
fRequirement.addValue(VALUE_A, ValuePriorityLevel.OPTIONAL);
/* Try to get the level of a value */
assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_A));
/* Try to get the level of a value that doesn't exist */
assertNull(fRequirement.getValueLevel(VALUE_B));
}
/**
* Test suite for the {@link TmfAnalysisRequirement#merge} method with the
* parameter value MANDATORY.
*/
@Test
public void testMergeMandatory() {
initMergeRequirements(TYPE_A, TYPE_A);
assertTrue(fRequirement.merge(fSubRequirement, ValuePriorityLevel.MANDATORY));
assertEquals(fRequirement.getValues().size(), 6);
assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_A));
assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_B));
assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_C));
assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_D));
assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_E));
assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_F));
Set<String> information = fRequirement.getInformation();
assertEquals(3, information.size());
assertTrue(information.contains(INFO_A));
assertTrue(information.contains(INFO_B));
assertTrue(information.contains(INFO_C));
}
/**
* Test suite for the {@link TmfAnalysisRequirement#merge} method with the
* parameter value OPTIONAL.
*/
@Test
public void testMergeOptional() {
initMergeRequirements(TYPE_A, TYPE_A);
assertTrue(fRequirement.merge(fSubRequirement, ValuePriorityLevel.OPTIONAL));
assertEquals(6, fRequirement.getValues().size());
assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_A));
assertEquals(ValuePriorityLevel.MANDATORY, fRequirement.getValueLevel(VALUE_B));
assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_C));
assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_D));
assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_E));
assertEquals(ValuePriorityLevel.OPTIONAL, fRequirement.getValueLevel(VALUE_F));
Set<String> information = fRequirement.getInformation();
assertEquals(3, information.size());
assertTrue(information.contains(INFO_A));
assertTrue(information.contains(INFO_B));
assertTrue(information.contains(INFO_C));
}
/**
* Test suite for the {@link TmfAnalysisRequirement#merge} method with
* different requirement types.
*/
@Test
public void testMergeDifferentTypes() {
initMergeRequirements(TYPE_A, TYPE_B);
assertFalse(fRequirement.merge(fSubRequirement, ValuePriorityLevel.OPTIONAL));
}
/**
* Test suite for the {@link TmfAnalysisRequirement#isSameType} method.
*/
@Test
public void testIsSameRequirementType() {
fRequirement = new TmfAnalysisRequirement(TYPE_A);
assertTrue(fRequirement.isSameType(new TmfAnalysisRequirement(TYPE_A)));
assertFalse(fRequirement.isSameType(new TmfAnalysisRequirement(TYPE_B)));
}
/**
* Initialize the requirement and sub-requirement for the merge tests.
*
* @param typeA
* The type of the first requirement
* @param typeB
* The type of the second requirement
*/
private void initMergeRequirements(String typeA, String typeB) {
fRequirement = new TmfAnalysisRequirement(typeA);
fRequirement.addValue(VALUE_A, ValuePriorityLevel.MANDATORY);
fRequirement.addValue(VALUE_B, ValuePriorityLevel.MANDATORY);
fRequirement.addValue(VALUE_C, ValuePriorityLevel.OPTIONAL);
fRequirement.addValue(VALUE_D, ValuePriorityLevel.OPTIONAL);
fRequirement.addInformation(INFO_A);
fRequirement.addInformation(INFO_B);
/* This sub-requirement will be merged into requirement */
fSubRequirement = new TmfAnalysisRequirement(typeB);
fSubRequirement.addValue(VALUE_A, ValuePriorityLevel.MANDATORY);
fSubRequirement.addValue(VALUE_B, ValuePriorityLevel.OPTIONAL);
fSubRequirement.addValue(VALUE_C, ValuePriorityLevel.MANDATORY);
fSubRequirement.addValue(VALUE_D, ValuePriorityLevel.OPTIONAL);
fSubRequirement.addValue(VALUE_E, ValuePriorityLevel.MANDATORY);
fSubRequirement.addValue(VALUE_F, ValuePriorityLevel.OPTIONAL);
fSubRequirement.addInformation(INFO_B);
fSubRequirement.addInformation(INFO_C);
}
}