1 package org.hansel.probes; 2 3 import org.hansel.Probe; 4 import org.hansel.ProbeData; 5 import org.objectweb.asm.Label; 6 import org.objectweb.asm.MethodVisitor; 7 import org.objectweb.asm.Opcodes; 8 9 public class SelectProbe extends Probe { 10 private boolean[] covered; 11 private int[] keys; 12 private Label[] labels; 13 private boolean[] isDefault; 14 private boolean defaultCovered; 15 16 private boolean isHit; 17 18 public SelectProbe(ProbeData pd, 19 int min, 20 int max, 21 Label dflt, 22 Label labels[]) { 23 super(pd); 24 25 this.labels = labels; 26 this.keys = new int[max - min + 1]; 27 for (int i=0; i<max - min + 1; i++) { 28 keys[i] = min + i; 29 } 30 31 this.covered = new boolean[labels.length]; 32 33 isDefault = new boolean[labels.length]; 36 for (int i=0; i<isDefault.length; i++) { 37 isDefault[i] = (labels[i] == dflt); 38 covered[i] = isDefault[i]; 39 } 40 } 41 42 public SelectProbe(ProbeData pd, 43 Label dflt, int[] keys, 44 Label[] labels) { 45 super(pd); 46 47 this.labels = labels; 48 this.keys = keys; 49 this.covered = new boolean[labels.length]; 50 51 isDefault = new boolean[labels.length]; 54 for (int i=0; i<isDefault.length; i++) { 55 isDefault[i] = (labels[i] == dflt); 56 covered[i] = isDefault[i]; 57 } 58 } 59 60 64 public String getFailureMessage() { 65 int count = 0; 66 String cases = ""; 67 68 for (int i=0; i<covered.length; i++) { 69 if (!covered[i]) { 70 cases += "'" + keys[i] + "', "; 71 count++; 72 } 73 } 74 75 if (!defaultCovered) { 76 count++; 77 cases += "'default', "; 78 } 79 80 cases = cases.substring(0, cases.length() - 2); 81 82 int index = cases.lastIndexOf(','); 83 if (index > -1) { 84 cases = cases.substring(0, index) 85 + " and " 86 + cases.substring(index + 2); 87 } 88 89 if (count > 1) { 90 return "Switch-cases " + cases + " have not been covered."; 91 } else { 92 return "Switch-case " + cases + " has not been covered."; 93 } 94 } 95 96 106 public boolean displayFailure() { 107 if (!isHit) { 108 return false; 109 } 110 111 return coverageFailure(); 112 } 113 114 public boolean coverageFailure() { 115 if (!defaultCovered) { 116 return true; 117 } 118 119 for (int i=0; i<covered.length; i++) { 120 if (!covered[i]) { 121 return true; 122 } 123 } 124 125 return false; 126 } 127 128 private final int getIndex(int value) { 129 for (int i=0; i<keys.length; i++) { 130 if (keys[i] == value) { 131 return i; 132 } else if (keys[i] > value) { 133 return -1; 134 } 135 136 } 137 138 return -1; 139 } 140 141 public void hit(int value) { 142 isHit = true; 143 144 int index = getIndex(value); 145 146 if ((index == -1) || isDefault[index]) { 147 defaultCovered = true; 148 } else { 149 Label label = labels[index]; 151 for (int i = 0; i < labels.length; i++) { 152 if (labels[i] == label) { 153 covered[i] = true; 154 } 155 } 156 } 157 } 158 159 public void insertProbeCode(MethodVisitor cv) { 160 cv.visitInsn(Opcodes.DUP); 161 cv.visitLdcInsn(new Integer (getID())); 162 cv.visitMethodInsn(Opcodes.INVOKESTATIC, HIT_CLASS, "hitSelect", 163 "(II)V"); 164 } 165 } 166
| Popular Tags
|