// Path: plugin/src/java/su/msu/cs/lvk/secbugs/bta/TaintnessFrame.java
// public class TaintnessFrame extends Frame<TaintnessValue> {
//     public TaintnessFrame(int numLocals) {
//         super(numLocals);
//     }
// 
//     /**
//      * Convert to string.
//      *
//      * Create a RLE representation, i.e. one T stands for itself, but several T's are shown as nT. 
//      */
//     @Override
//     public String toString() {
//         if (isTop())
//             return "[TOP]";
//         if (isBottom())
//             return "[BOTTOM]";
//         StringBuffer buf = new StringBuffer();
//         buf.append('[');
//         String prevValue = null;
//         int accumCnt = 0;
//         int numSlots = getNumSlots();
//         int start = 0;
//         for (int i = start; i < numSlots; ++i) {
//             if (i == getNumLocals()) {
//                 // Use a "|" character to visually separate locals from
//                 // the operand stack.
//                 int last = buf.length() - 1;
//                 if (last >= 0) {
//                     if (buf.charAt(last) == ',')
//                         buf.deleteCharAt(last);
//                 }
// 
//                 if (prevValue != null) {
//                     // show trailing values of locals
//                     if (accumCnt > 1) {
//                         buf.append(accumCnt);
//                     }
//                     buf.append(prevValue);
//                     accumCnt = 0;
//                 }
//                 prevValue = null;
//                 
//                 buf.append('|');
//             }
//             String value = valueToString(getValue(i));
//             boolean isLast = (i == numSlots - 1);
//             if (isLast && value.endsWith(","))
//                 value = value.substring(0, value.length() - 1);
// 
//             if (!isLast && (prevValue == null || prevValue.equals(value))) {
//                 accumCnt++;
//                 prevValue = value;
//             } else {
//                 boolean lastAccumulated = false;
//                 // show packed previous values
//                 if (prevValue != null) {
//                     if (isLast && prevValue.equals(value)) {
//                         lastAccumulated = true;
//                         ++accumCnt;
//                     }
//                     if (accumCnt > 1) {
//                         buf.append(accumCnt);
//                     }
//                     buf.append(prevValue);
//                 }
//                 accumCnt = 1;
//                 prevValue = value;
// 
//                 if (isLast && !lastAccumulated) {
//                     buf.append(value);
//                 }
//             }
//         }
//         buf.append(']');
//         return buf.toString();
//     }
// 
// }
// 
// Path: plugin/src/java/su/msu/cs/lvk/secbugs/bta/TaintnessValue.java
// public class TaintnessValue {
//     public static final int BOTTOM_VALUE = 1;
// 
//     public static final int TAINTED_VALUE = 2;
//     public static final int UNTAINTED_VALUE = 4;
// 
//     public static final TaintValue SENSITIVE_VALUE = new TaintValue();
// 
//     private int mask = TAINTED_VALUE;
//     /**
//      * Source line, where taint value is consumed.
//      */
//     private SourceLineAnnotation sinkSourceLine;
// 
//     public TaintnessValue() {
//     }
// 
//     public TaintnessValue(TaintnessValue source) {
//         this.mask = source.mask;
//         this.sinkSourceLine = source.sinkSourceLine;
//     }
// 
//     public void copyFrom(TaintnessValue other) {
//         this.mask = other.mask;
//         this.sinkSourceLine = other.sinkSourceLine;
//     }
// 
//     public void meetWith(TaintnessValue other) {
//         if ((other.mask & BOTTOM_VALUE) == BOTTOM_VALUE) {
//             this.mask = BOTTOM_VALUE;
//             this.sinkSourceLine = null;
//         }
// 
//         this.mask |= other.mask;
// 
//         if (this.sinkSourceLine == null) {
//             this.sinkSourceLine = other.sinkSourceLine;
//         } // else keep the first source line
//     }
// 
//     public static TaintnessValue merge(TaintnessValue a, TaintnessValue b) {
//         TaintnessValue result = new TaintnessValue(a);
//         result.meetWith(b);
//         return result;
//     }
// 
//     public boolean sameAs(TaintnessValue other) {
//         return this.mask == other.mask;
//     }
// 
//     public void setTainted(boolean tainted) {
//         if (tainted) {
//             mask |= TAINTED_VALUE;
//         } else {
//             mask &= ~TAINTED_VALUE;
//         }
//     }
// 
//     public boolean getTainted() {
//         return (mask & TAINTED_VALUE) != 0;
//     }
// 
//     public void setUntainted(boolean untainted) {
//         if (untainted) {
//             mask |= UNTAINTED_VALUE;
//         } else {
//             mask &= ~UNTAINTED_VALUE;
//         }
//     }
// 
//     public boolean getUntainted() {
//         return (mask & UNTAINTED_VALUE) != 0;
//     }
// 
//     public SourceLineAnnotation getSinkSourceLine() {
//         return sinkSourceLine;
//     }
// 
//     public void setSinkSourceLine(SourceLineAnnotation sinkSourceLine) {
//         this.sinkSourceLine = sinkSourceLine;
//     }
// 
//     public String toString() {
//         if (getTainted()) {
//             if (getUntainted()) {
//                 return "X";
//             } else {
//                 return "T";
//             }
//         } else if (getUntainted()) {
//             return "U";
//         } else {
//             return "?";
//         }
//     }
// 
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         TaintnessValue that = (TaintnessValue) o;
// 
//         return mask == that.mask;
//     }
// 
//     public int hashCode() {
//         return mask;
//     }
// }


import junit.framework.TestCase;
import su.msu.cs.lvk.secbugs.bta.TaintnessFrame;
import su.msu.cs.lvk.secbugs.bta.TaintnessValue;
package su.msu.cs.lvk.secbugs.junit;


/**
 * @author Igor Konnov
 */
public class TestTaintnessFrame extends TestCase {
    public void testToStringEmptyStackOneLocal() {
        TaintnessFrame frame = new TaintnessFrame(1);
// Path: plugin/src/java/su/msu/cs/lvk/secbugs/bta/TaintnessFrame.java
// public class TaintnessFrame extends Frame<TaintnessValue> {
//     public TaintnessFrame(int numLocals) {
//         super(numLocals);
//     }
// 
//     /**
//      * Convert to string.
//      *
//      * Create a RLE representation, i.e. one T stands for itself, but several T's are shown as nT. 
//      */
//     @Override
//     public String toString() {
//         if (isTop())
//             return "[TOP]";
//         if (isBottom())
//             return "[BOTTOM]";
//         StringBuffer buf = new StringBuffer();
//         buf.append('[');
//         String prevValue = null;
//         int accumCnt = 0;
//         int numSlots = getNumSlots();
//         int start = 0;
//         for (int i = start; i < numSlots; ++i) {
//             if (i == getNumLocals()) {
//                 // Use a "|" character to visually separate locals from
//                 // the operand stack.
//                 int last = buf.length() - 1;
//                 if (last >= 0) {
//                     if (buf.charAt(last) == ',')
//                         buf.deleteCharAt(last);
//                 }
// 
//                 if (prevValue != null) {
//                     // show trailing values of locals
//                     if (accumCnt > 1) {
//                         buf.append(accumCnt);
//                     }
//                     buf.append(prevValue);
//                     accumCnt = 0;
//                 }
//                 prevValue = null;
//                 
//                 buf.append('|');
//             }
//             String value = valueToString(getValue(i));
//             boolean isLast = (i == numSlots - 1);
//             if (isLast && value.endsWith(","))
//                 value = value.substring(0, value.length() - 1);
// 
//             if (!isLast && (prevValue == null || prevValue.equals(value))) {
//                 accumCnt++;
//                 prevValue = value;
//             } else {
//                 boolean lastAccumulated = false;
//                 // show packed previous values
//                 if (prevValue != null) {
//                     if (isLast && prevValue.equals(value)) {
//                         lastAccumulated = true;
//                         ++accumCnt;
//                     }
//                     if (accumCnt > 1) {
//                         buf.append(accumCnt);
//                     }
//                     buf.append(prevValue);
//                 }
//                 accumCnt = 1;
//                 prevValue = value;
// 
//                 if (isLast && !lastAccumulated) {
//                     buf.append(value);
//                 }
//             }
//         }
//         buf.append(']');
//         return buf.toString();
//     }
// 
// }
// 
// Path: plugin/src/java/su/msu/cs/lvk/secbugs/bta/TaintnessValue.java
// public class TaintnessValue {
//     public static final int BOTTOM_VALUE = 1;
// 
//     public static final int TAINTED_VALUE = 2;
//     public static final int UNTAINTED_VALUE = 4;
// 
//     public static final TaintValue SENSITIVE_VALUE = new TaintValue();
// 
//     private int mask = TAINTED_VALUE;
//     /**
//      * Source line, where taint value is consumed.
//      */
//     private SourceLineAnnotation sinkSourceLine;
// 
//     public TaintnessValue() {
//     }
// 
//     public TaintnessValue(TaintnessValue source) {
//         this.mask = source.mask;
//         this.sinkSourceLine = source.sinkSourceLine;
//     }
// 
//     public void copyFrom(TaintnessValue other) {
//         this.mask = other.mask;
//         this.sinkSourceLine = other.sinkSourceLine;
//     }
// 
//     public void meetWith(TaintnessValue other) {
//         if ((other.mask & BOTTOM_VALUE) == BOTTOM_VALUE) {
//             this.mask = BOTTOM_VALUE;
//             this.sinkSourceLine = null;
//         }
// 
//         this.mask |= other.mask;
// 
//         if (this.sinkSourceLine == null) {
//             this.sinkSourceLine = other.sinkSourceLine;
//         } // else keep the first source line
//     }
// 
//     public static TaintnessValue merge(TaintnessValue a, TaintnessValue b) {
//         TaintnessValue result = new TaintnessValue(a);
//         result.meetWith(b);
//         return result;
//     }
// 
//     public boolean sameAs(TaintnessValue other) {
//         return this.mask == other.mask;
//     }
// 
//     public void setTainted(boolean tainted) {
//         if (tainted) {
//             mask |= TAINTED_VALUE;
//         } else {
//             mask &= ~TAINTED_VALUE;
//         }
//     }
// 
//     public boolean getTainted() {
//         return (mask & TAINTED_VALUE) != 0;
//     }
// 
//     public void setUntainted(boolean untainted) {
//         if (untainted) {
//             mask |= UNTAINTED_VALUE;
//         } else {
//             mask &= ~UNTAINTED_VALUE;
//         }
//     }
// 
//     public boolean getUntainted() {
//         return (mask & UNTAINTED_VALUE) != 0;
//     }
// 
//     public SourceLineAnnotation getSinkSourceLine() {
//         return sinkSourceLine;
//     }
// 
//     public void setSinkSourceLine(SourceLineAnnotation sinkSourceLine) {
//         this.sinkSourceLine = sinkSourceLine;
//     }
// 
//     public String toString() {
//         if (getTainted()) {
//             if (getUntainted()) {
//                 return "X";
//             } else {
//                 return "T";
//             }
//         } else if (getUntainted()) {
//             return "U";
//         } else {
//             return "?";
//         }
//     }
// 
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         TaintnessValue that = (TaintnessValue) o;
// 
//         return mask == that.mask;
//     }
// 
//     public int hashCode() {
//         return mask;
//     }
// }


// Path: tests/cases/src/junit/su/msu/cs/lvk/secbugs/junit/TestTaintnessFrame.java
import junit.framework.TestCase;
import su.msu.cs.lvk.secbugs.bta.TaintnessFrame;
import su.msu.cs.lvk.secbugs.bta.TaintnessValue;

package su.msu.cs.lvk.secbugs.junit;


/**
 * @author Igor Konnov
 */
public class TestTaintnessFrame extends TestCase {
    public void testToStringEmptyStackOneLocal() {
        TaintnessFrame frame = new TaintnessFrame(1);
        frame.setValue(0, new TaintnessValue());