/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.core.transformer;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.mule.runtime.api.metadata.DataType;
import org.mule.runtime.core.api.transformer.Transformer;
import org.mule.runtime.core.transformer.builder.MockConverterBuilder;
import org.mule.tck.junit4.AbstractMuleTestCase;
import org.mule.tck.size.SmallTest;
import org.mule.tck.testmodels.fruit.FruitBowl;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.Serializable;
import org.junit.Test;
@SmallTest
public class TransformerWeightingTestCase extends AbstractMuleTestCase {
@Test
public void testExactMatch() throws Exception {
Transformer trans = new MockConverterBuilder().from(DataType.fromType(IOException.class)).to(DataType.BYTE_ARRAY).build();
TransformerWeighting weighting = new TransformerWeighting(IOException.class, byte[].class, trans);
assertFalse(weighting.isNotMatch());
assertTrue(weighting.isExactMatch());
}
@Test
public void testNearMatch() throws Exception {
Transformer trans = new MockConverterBuilder().from(DataType.INPUT_STREAM).to(DataType.BYTE_ARRAY).build();
TransformerWeighting weighting = new TransformerWeighting(FilterInputStream.class, byte[].class, trans);
assertFalse(weighting.isNotMatch());
assertFalse(weighting.isExactMatch());
assertEquals(1, weighting.getInputWeighting());
assertEquals(0, weighting.getOutputWeighting());
}
@Test
public void testNoMatchWeighting() throws Exception {
Transformer trans = new MockConverterBuilder().from(DataType.fromType(Serializable.class)).to(DataType.BYTE_ARRAY).build();
TransformerWeighting weighting = new TransformerWeighting(FruitBowl.class, byte[].class, trans);
assertTrue(weighting.isNotMatch());
assertEquals(-1, weighting.getInputWeighting());
assertEquals(0, weighting.getOutputWeighting());
}
@Test
public void testCompareWeightingWithNearMatches() throws Exception {
Transformer trans1 = new MockConverterBuilder().from(DataType.fromType(Serializable.class)).to(DataType.BYTE_ARRAY).build();
Transformer trans2 = new MockConverterBuilder().from(DataType.fromType(Exception.class)).to(DataType.BYTE_ARRAY).build();
TransformerWeighting weighting1 = new TransformerWeighting(IOException.class, byte[].class, trans1);
TransformerWeighting weighting2 = new TransformerWeighting(IOException.class, byte[].class, trans2);
assertFalse(weighting1.isNotMatch());
assertFalse(weighting2.isNotMatch());
assertFalse(weighting1.isExactMatch());
assertFalse(weighting2.isExactMatch());
// Weighting2 two is a better match
assertEquals(1, weighting2.compareTo(weighting1));
assertEquals(3, weighting1.getInputWeighting());
assertEquals(1, weighting2.getInputWeighting());
assertEquals(0, weighting1.getOutputWeighting());
assertEquals(0, weighting2.getOutputWeighting());
}
@Test
public void testCompareWeightingWithExactMatch() throws Exception {
Transformer trans1 = new MockConverterBuilder().from(DataType.fromType(Serializable.class)).to(DataType.BYTE_ARRAY).build();
Transformer trans2 = new MockConverterBuilder().from(DataType.fromType(IOException.class)).to(DataType.BYTE_ARRAY).build();
TransformerWeighting weighting1 = new TransformerWeighting(IOException.class, byte[].class, trans1);
TransformerWeighting weighting2 = new TransformerWeighting(IOException.class, byte[].class, trans2);
assertFalse(weighting1.isNotMatch());
assertFalse(weighting2.isNotMatch());
assertFalse(weighting1.isExactMatch());
assertTrue(weighting2.isExactMatch());
// Weighting2 two is an exact match
assertEquals(1, weighting2.compareTo(weighting1));
assertEquals(3, weighting1.getInputWeighting());
assertEquals(0, weighting2.getInputWeighting());
assertEquals(0, weighting1.getOutputWeighting());
assertEquals(0, weighting2.getOutputWeighting());
}
@Test
public void testCompareWeightingWithNoMatch() throws Exception {
Transformer trans1 = new MockConverterBuilder().from(DataType.fromType(Serializable.class)).to(DataType.BYTE_ARRAY).build();
Transformer trans2 = new MockConverterBuilder().from(DataType.fromType(FruitBowl.class)).to(DataType.BYTE_ARRAY).build();
TransformerWeighting weighting1 = new TransformerWeighting(IOException.class, byte[].class, trans1);
TransformerWeighting weighting2 = new TransformerWeighting(IOException.class, byte[].class, trans2);
assertFalse(weighting1.isNotMatch());
assertTrue(weighting2.isNotMatch());
assertFalse(weighting1.isExactMatch());
assertFalse(weighting2.isExactMatch());
// Weighting2 two is not a match
assertEquals(-1, weighting2.compareTo(weighting1));
assertEquals(3, weighting1.getInputWeighting());
assertEquals(-1, weighting2.getInputWeighting());
assertEquals(0, weighting1.getOutputWeighting());
assertEquals(0, weighting2.getOutputWeighting());
}
}