blob: 2b8bcdae9d6444ab674582352bdf348d03e00ec6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 Christian W. Damus and others.
*
* 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
*
* Contributors:
* Christian W. Damus - initial API and implementation
******************************************************************************/
package org.eclipse.emfforms.bazaar.internal;
import static java.util.Arrays.asList;
import static org.hamcrest.CoreMatchers.hasItems;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import java.util.Arrays;
import org.eclipse.e4.core.contexts.EclipseContextFactory;
import org.eclipse.emfforms.bazaar.Bazaar;
import org.eclipse.emfforms.bazaar.Bazaar.PriorityOverlapCallBack;
import org.eclipse.emfforms.bazaar.BazaarContext;
import org.eclipse.emfforms.bazaar.Vendor;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/**
* Test cases for the {@link org.eclipse.emfforms.bazaar.Bazaar.Builder} class.
*
* @author Christian W. Damus
*/
@RunWith(Parameterized.class)
public class BazaarBuilder_Test {
private final BazaarVariant variant;
/**
* Initializes me.
*/
public BazaarBuilder_Test(BazaarVariant variant) {
super();
this.variant = variant;
}
@Test
public void addVendor() {
final MyProduct myProductMock = mock(MyProduct.class);
final Bazaar.Builder<MyProduct> fixture = basicFixture();
final Bazaar<MyProduct> bazaar = fixture
.add(new FullVendorParameter2(myProductMock))
.build();
assertThat(bazaar.createProduct(context()), is(myProductMock));
}
@Test
public void addTwoVendors() {
final MyProduct myProductMock1 = mock(MyProduct.class);
final MyProduct myProductMock2 = mock(MyProduct.class);
final Bazaar.Builder<MyProduct> fixture = basicFixture();
@SuppressWarnings("unchecked")
final Bazaar<MyProduct> bazaar = fixture
.add(new FullVendorParameter2(myProductMock1), new FullVendorParameter2(myProductMock2))
.build();
assertThat(bazaar.createProducts(context()), hasItems(myProductMock1, myProductMock2));
}
@Test
public void addThreeVendors() {
final MyProduct myProductMock1 = mock(MyProduct.class);
final MyProduct myProductMock2 = mock(MyProduct.class);
final MyProduct myProductMock3 = mock(MyProduct.class);
final Bazaar.Builder<MyProduct> fixture = basicFixture();
@SuppressWarnings("unchecked")
final Bazaar<MyProduct> bazaar = fixture
.add(new FullVendorParameter2(myProductMock1),
new FullVendorParameter2(myProductMock2),
new FullVendorParameter2(myProductMock3))
.build();
assertThat(bazaar.createProducts(context()), hasItems(myProductMock1, myProductMock2, myProductMock3));
}
@Test
public void addAllVendors() {
final MyProduct myProductMock1 = mock(MyProduct.class);
final MyProduct myProductMock2 = mock(MyProduct.class);
final MyProduct myProductMock3 = mock(MyProduct.class);
final Bazaar.Builder<MyProduct> fixture = basicFixture();
final Bazaar<MyProduct> bazaar = fixture
.addAll(Arrays.asList(new FullVendorParameter2(myProductMock1),
new FullVendorParameter2(myProductMock2),
new FullVendorParameter2(myProductMock3)))
.build();
assertThat(bazaar.createProducts(context()), hasItems(myProductMock1, myProductMock2, myProductMock3));
}
@Test
public void onPriorityOverlap() {
final Vendor<MyProduct> vendor = new VendorPriority1Parameter0();
final Vendor<MyProduct> vendor2 = new VendorPriority1Parameter0();
@SuppressWarnings("unchecked")
final Bazaar.Builder<MyProduct> fixture = vendorFixture(vendor, vendor2);
@SuppressWarnings("unchecked")
final PriorityOverlapCallBack<MyProduct> priorityOverlapCallBackMock = mock(PriorityOverlapCallBack.class);
final Bazaar<MyProduct> bazaar = fixture
.onPriorityOverlap(priorityOverlapCallBackMock)
.build();
((BazaarImpl<?>) bazaar).getBestVendor(EclipseContextFactory.create());
verify(priorityOverlapCallBackMock, times(1)).priorityOverlap(vendor, vendor2);
}
@Test(expected = IllegalStateException.class)
public void onPriorityOverlapAlreadySet() {
final Bazaar.Builder<MyProduct> fixture = basicFixture();
@SuppressWarnings("unchecked")
final PriorityOverlapCallBack<MyProduct> priorityOverlapCallBackMock1 = mock(PriorityOverlapCallBack.class);
@SuppressWarnings("unchecked")
final PriorityOverlapCallBack<MyProduct> priorityOverlapCallBackMock2 = mock(PriorityOverlapCallBack.class);
fixture.onPriorityOverlap(priorityOverlapCallBackMock1);
fixture.onPriorityOverlap(priorityOverlapCallBackMock2);
}
//
// Test framework
//
@Parameters(name = "{0}")
public static Object[] parameters() {
return BazaarVariant.values();
}
Bazaar.Builder<MyProduct> basicFixture() {
return variant.<MyProduct> builder()
.addContextFunction(String.class, new BazaarContextFunctionParameter1("")); //$NON-NLS-1$
}
Bazaar.Builder<MyProduct> vendorFixture(Vendor<? extends MyProduct>... vendors) {
return variant.builder(asList(vendors))
.addContextFunction(String.class, new BazaarContextFunctionParameter1("")); //$NON-NLS-1$
}
static BazaarContext context() {
return BazaarContext.Builder.empty().add(0).build();
}
}