1 /* 2 * Copyright (c) 2007 Mockito contributors 3 * This program is made available under the terms of the MIT License. 4 */ 5 package org.mockito.internal.verification.argumentmatching; 6 7 import java.util.LinkedList; 8 import java.util.List; 9 10 import org.hamcrest.Matcher; 11 import org.hamcrest.StringDescription; 12 import org.mockito.internal.matchers.ContainsExtraTypeInformation; 13 14 @SuppressWarnings("unchecked") 15 public class ArgumentMatchingTool { 16 17 /** 18 * Suspiciously not matching arguments are those that don't match, the toString() representation is the same but types are different. 19 */ 20 public Integer[] getSuspiciouslyNotMatchingArgsIndexes(List<Matcher> matchers, Object[] arguments) { 21 if (matchers.size() != arguments.length) { 22 return new Integer[0]; 23 } 24 25 List<Integer> suspicious = new LinkedList<Integer>(); 26 int i = 0; 27 for (Matcher m : matchers) { 28 if (m instanceof ContainsExtraTypeInformation 29 && !safelyMatches(m, arguments[i]) 30 && toStringEquals(m, arguments[i]) 31 && !((ContainsExtraTypeInformation) m).typeMatches(arguments[i])) { 32 suspicious.add(i); 33 } 34 i++; 35 } 36 return suspicious.toArray(new Integer[0]); 37 } 38 39 private boolean safelyMatches(Matcher m, Object arg) { 40 try { 41 return m.matches(arg); 42 } catch (Throwable t) { 43 return false; 44 } 45 } 46 47 private boolean toStringEquals(Matcher m, Object arg) { 48 return StringDescription.toString(m).equals(arg == null? "null" : arg.toString()); 49 } 50 } 51