blob: 3af2addab56d71c0a00ab7444c1b4cbc76a3dbd9 [file] [log] [blame]
/*
* Copyright (c) 2007 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockito.internal.verification.argumentmatching;
import org.junit.Test;
import org.mockito.ArgumentMatcher;
import org.mockito.internal.matchers.ContainsExtraTypeInfo;
import org.mockito.internal.matchers.Equals;
import org.mockitoutil.TestBase;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static java.util.Collections.singletonList;
import static junit.framework.TestCase.assertEquals;
import static org.junit.Assert.*;
@SuppressWarnings({ "unchecked", "serial" })
public class ArgumentMatchingToolTest extends TestBase {
@Test
public void shouldNotFindAnySuspiciousMatchersWhenNumberOfArgumentsDoesntMatch() {
// given
List<ArgumentMatcher> matchers = (List) Arrays.asList(new Equals(1));
// when
Integer[] suspicious = ArgumentMatchingTool.getSuspiciouslyNotMatchingArgsIndexes(matchers, new Object[] { 10, 20 });
// then
assertEquals(0, suspicious.length);
}
@Test
public void shouldNotFindAnySuspiciousMatchersWhenArgumentsMatch() {
// given
List<ArgumentMatcher> matchers = (List) Arrays.asList(new Equals(10), new Equals(20));
// when
Integer[] suspicious = ArgumentMatchingTool.getSuspiciouslyNotMatchingArgsIndexes(matchers, new Object[] { 10, 20 });
// then
assertEquals(0, suspicious.length);
}
@Test
public void shouldFindSuspiciousMatchers() {
// given
Equals matcherInt20 = new Equals(20);
Long longPretendingAnInt = 20L;
// when
List<ArgumentMatcher> matchers = (List) Arrays.asList(new Equals(10), matcherInt20);
Integer[] suspicious = ArgumentMatchingTool.getSuspiciouslyNotMatchingArgsIndexes(matchers, new Object[] { 10, longPretendingAnInt });
// then
assertEquals(1, suspicious.length);
assertEquals(new Integer(1), suspicious[0]);
}
@Test
public void shouldNotFindSuspiciousMatchersWhenTypesAreTheSame() {
// given
Equals matcherWithBadDescription = new Equals(20) {
public String toString() {
return "10";
}
};
Integer argument = 10;
// when
Integer[] suspicious = ArgumentMatchingTool.getSuspiciouslyNotMatchingArgsIndexes((List) Arrays.asList(matcherWithBadDescription), new Object[] { argument });
// then
assertEquals(0, suspicious.length);
}
@Test
public void shouldWorkFineWhenGivenArgIsNull() {
// when
Integer[] suspicious = ArgumentMatchingTool.getSuspiciouslyNotMatchingArgsIndexes((List) Arrays.asList(new Equals(20)), new Object[] { null });
// then
assertEquals(0, suspicious.length);
}
/**
*
*/
@Test
@SuppressWarnings("rawtypes")
public void shouldUseMatchersSafely() {
/** This matcher is evil cause typeMatches(Object) returns true for every passed type but matches(T)
* method accepts only Strings. When a Integer is passed (thru the matches(Object) bridge method ) a
* ClassCastException will be thrown. */
class StringMatcher implements ArgumentMatcher<String>, ContainsExtraTypeInfo {
@Override
public boolean matches(String item) {
return true; // in this test we never get here
}
@Override
public String toStringWithType() {
return "";
}
@Override
public boolean typeMatches(Object target) {
return true;
}
}
// given
List<ArgumentMatcher> matchers = (List) singletonList(new StringMatcher());
// when
Integer[] suspicious = ArgumentMatchingTool.getSuspiciouslyNotMatchingArgsIndexes(matchers, new Object[] { 10 });
// then
assertEquals(0, suspicious.length);
}
}