/**
* Copyright (c) 2010, 2013 Darmstadt University of Technology.
* 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:
* Andreas Sewe - initial API and implementation.
*/
package org.eclipse.recommenders.overrides;
import static org.eclipse.recommenders.testing.RecommendationMatchers.recommendation;
import static org.eclipse.recommenders.utils.names.VmTypeName.OBJECT;
import static org.hamcrest.CoreMatchers.hasItem;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import java.util.Arrays;
import java.util.Collections;
import org.eclipse.recommenders.utils.names.IMethodName;
import org.eclipse.recommenders.utils.names.VmMethodName;
import org.junit.Test;
import com.google.common.collect.ImmutableList;
public class JayesOverrideModelBuilderTest {
private static final IMethodName OBJECT_HASHCODE = VmMethodName.get("Ljava/lang/Object.hashCode()I");
private static final IMethodName OBJECT_WAIT = VmMethodName.get("Ljava/lang/Object.wait()V");
@Test(expected = IllegalArgumentException.class)
public void testNoObservation() {
@SuppressWarnings("unused")
JayesOverrideModelBuilder sut = new JayesOverrideModelBuilder(OBJECT,
Collections.<OverrideObservation>emptyList());
}
@Test
public void testOneObservation() {
JayesOverrideModelBuilder sut = new JayesOverrideModelBuilder(OBJECT, ImmutableList.of(observation(1,
OBJECT_HASHCODE)));
IOverrideModel model = sut.build();
assertThat(model.getKnownMethods().size(), is(1));
assertThat(model.getKnownMethods(), hasItem(OBJECT_HASHCODE));
assertThat(model.getKnownPatterns().size(), is(2));
assertThat(model.recommendOverrides().size(), is(1));
assertThat(model.recommendOverrides(), hasItem(recommendation(OBJECT_HASHCODE, 1.0)));
}
@Test
public void testTwoNonOverlappingObservations() {
JayesOverrideModelBuilder sut = new JayesOverrideModelBuilder(OBJECT, ImmutableList.of(
observation(2, OBJECT_HASHCODE), observation(1, OBJECT_WAIT)));
IOverrideModel model = sut.build();
assertThat(model.getKnownMethods().size(), is(2));
assertThat(model.getKnownMethods(), hasItem(OBJECT_HASHCODE));
assertThat(model.getKnownMethods(), hasItem(OBJECT_WAIT));
assertThat(model.getKnownPatterns().size(), is(3));
assertThat(model.recommendOverrides().size(), is(2));
assertThat(model.recommendOverrides(), hasItem(recommendation(OBJECT_HASHCODE, 0.66)));
assertThat(model.recommendOverrides(), hasItem(recommendation(OBJECT_WAIT, 0.33)));
model.setObservedMethod(OBJECT_WAIT);
assertThat(model.recommendOverrides().size(), is(1));
assertThat(model.recommendOverrides(), hasItem(recommendation(OBJECT_HASHCODE, 0.0)));
}
@Test
public void testTwoOverlappingObservations() {
JayesOverrideModelBuilder sut = new JayesOverrideModelBuilder(OBJECT, ImmutableList.of(
observation(2, OBJECT_HASHCODE), observation(1, OBJECT_HASHCODE, OBJECT_WAIT)));
IOverrideModel model = sut.build();
assertThat(model.getKnownMethods().size(), is(2));
assertThat(model.getKnownMethods(), hasItem(OBJECT_HASHCODE));
assertThat(model.getKnownMethods(), hasItem(OBJECT_WAIT));
assertThat(model.getKnownPatterns().size(), is(3));
assertThat(model.recommendOverrides().size(), is(2));
assertThat(model.recommendOverrides(), hasItem(recommendation(OBJECT_HASHCODE, 1.0)));
assertThat(model.recommendOverrides(), hasItem(recommendation(OBJECT_WAIT, 0.33)));
model.setObservedMethod(OBJECT_WAIT);
assertThat(model.recommendOverrides().size(), is(1));
assertThat(model.recommendOverrides(), hasItem(recommendation(OBJECT_HASHCODE, 1.0)));
}
private OverrideObservation observation(int frequency, IMethodName... overriddenMethods) {
OverrideObservation observation = new OverrideObservation();
observation.frequency = frequency;
observation.overriddenMethods.addAll(Arrays.asList(overriddenMethods));
return observation;
}
}