### Question:
IntegerValue extends Value implements Comparable, IIntegerOperations { public IntegerValue mul(Value value) throws Exception { IntegerValue otherValue = (IntegerValue)value; IntegerValue result; BigInteger bigIntegerResult; if (haveSmallValue() && otherValue.haveSmallValue()) { throw new Exception("Small values are unsupported"); } else if (haveSmallValue()) { bigIntegerResult = BigInteger.valueOf(getSmallValue()).multiply(otherValue.getBigValue()); } else if (otherValue.haveSmallValue()) { bigIntegerResult = getBigValue().multiply(BigInteger.valueOf(otherValue.getSmallValue())); } else { bigIntegerResult = getBigValue().multiply(otherValue.getBigValue()); } prepareBitmasks(); bigIntegerResult = bigIntegerResult.and(negationMask); if (!type.isSigned()) { } else { bigIntegerResult = makeSigned(bigIntegerResult); } result = ValueContainer.getBigIntegerValue(type, bigIntegerResult); return invariantChecked(result); } IntegerValue(BigInteger bigInteger); private  IntegerValue(ASTNode type);  IntegerValue(ASTNode type, long value);  IntegerValue(String type, long value);  IntegerValue(ASTNode type, BigInteger value);  IntegerValue(ASTNode type, String value); boolean haveSmallValue(); BigInteger getBigValue(); @Override ASTNode getType(); static void setSuppressTypeAnnotations(boolean value); static boolean getSuppressTypeAnnotations(); @Override ASTNode toASTNode(boolean forJavaScript); @Override Object toJSONRepresentation(); @Override String toString(); int compareTo(Object other); int toInt(); IntegerValue getMinValue(); IntegerValue getMaxValue(); IntegerValue negate(); IntegerValue negateBitwise(); IntegerValue add(Value value); IntegerValue sub(Value value); IntegerValue div(Value value); IntegerValue mul(Value value); IntegerValue bitwiseOr(Value value); IntegerValue bitwiseAnd(Value value); IntegerValue bitwiseXor(Value value); IntegerValue bitwiseShiftLeft(Value value); IntegerValue bitwiseShiftRight(Value value); IntegerValue mod(Value value); IntegerValue exp(Value value); BoolValue isSmallerThan(Value value); BoolValue isSmallerThanOrEqualTo(Value value); BoolValue isGreaterThan(Value value); BoolValue isGreaterThanOrEqualTo(Value value); BoolValue isEqualTo(Value value); BoolValue isNotEqualTo(Value value); BytesValue convertToBytesType(ASTElementaryTypeName newType); AddressValue convertToAddressType(); IntegerValue convertToIntegerType(ASTElementaryTypeName newType);  }### Answer:
@Test public void mul() throws Exception { IntegerTestValues[] a = new IntegerTestValues[]{ new IntegerTestValues("uint8", "128", "2", false, 8, "0"), new IntegerTestValues("int8", "127", "2", true, 8, "-2") }; for (IntegerTestValues testData : a) { ASTNode type = TypeContainer.getIntegerType(testData.isSigned, testData.typeBits); IntegerValue firstOperand = new IntegerValue(type, testData.valueText); IntegerValue secondOperand = new IntegerValue(type, testData.secondValueText); assert firstOperand.toString().equals(testData.valueText); assert secondOperand.toString().equals(testData.secondValueText); IntegerValue resultValue = firstOperand.mul(secondOperand); System.out.println("got " + resultValue + " wanted " + testData.operationResult); assert resultValue.toString().equals(testData.operationResult); } }