KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > hansel > probes > SelectProbe


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         // Some targets might point to default target.
34
// These targets have to be treated just like the defaultTarget
35
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         // Some targets might point to default target.
52
// These targets have to be treated just like the defaultTarget
53
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     /**
61      * Return the filure message for this probe.
62      * @return Failure message.
63      */

64     public String JavaDoc getFailureMessage() {
65         int count = 0;
66         String JavaDoc 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     /**
97      * Return wether this probe failed to be covered.
98      * A probe for a conditional branch fails, if the branch is only taken,
99      * or only omitted. If both cases are encountered, the probe is fully
100      * covered. If the probe is not executed at all, this method still returns
101      * false, because in that case, another probe has to fail (otherwise this
102      * probe had been reached). Because the other failure is more important,
103      * the result of this probe is left out in this case.
104      * @return true If covering this probe failed.
105      */

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             // Cover all keys that point to the same label.
150
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 JavaDoc(getID()));
162         cv.visitMethodInsn(Opcodes.INVOKESTATIC, HIT_CLASS, "hitSelect",
163         "(II)V");
164      }
165 }
166
Popular Tags