Checks if two classes are similiar. @param c1 @param c2 @return
(MappedClass c1, MappedClass c2)
| 313 | * @return |
| 314 | */ |
| 315 | private static boolean areSimiliar(MappedClass c1, MappedClass c2) { |
| 316 | if (c1 == null || c2 == null) { |
| 317 | return false; |
| 318 | } |
| 319 | if (c1.hasParent() && !c2.hasParent()) { |
| 320 | return false; |
| 321 | } |
| 322 | if (c1.getNode() == null || c2.getNode() == null) { |
| 323 | return false; |
| 324 | } |
| 325 | if (c1.getInterfaces().size() != c2.getInterfaces().size()) { |
| 326 | return false; |
| 327 | } |
| 328 | // Must have a similar # of fields. Change is porportionate to class |
| 329 | // size. |
| 330 | double f1 = c1.getFields().size(); |
| 331 | double f2 = c1.getFields().size(); |
| 332 | double percDiffFields = (Math.abs(f1 - f2) / ((f1 + f2) / 2)) * 100; |
| 333 | double maxDiffLevelField = Math.min(25, 52 * (Math.pow(f2, -0.5))); |
| 334 | if (percDiffFields > maxDiffLevelField) { |
| 335 | return false; |
| 336 | } |
| 337 | |
| 338 | // Must have a similar # of methods. Change is porportionate to class |
| 339 | // size. |
| 340 | double m1 = c1.getMethods().size(); |
| 341 | double m2 = c2.getMethods().size(); |
| 342 | double percDiffMethods = (Math.abs(m1 - m2) / ((m1 + m2) / 2)) * 100; |
| 343 | double maxDiffLevelMethod = Math.min(25, 52 * (Math.pow(m2, -0.5))); |
| 344 | if (percDiffMethods > maxDiffLevelMethod) { |
| 345 | return false; |
| 346 | } |
| 347 | return true; |
| 348 | } |
| 349 | |
| 350 | /** |
| 351 | * Get's a member's class types from its description. Best for methods. |
no test coverage detected