### Question:
BytesValue extends Value implements IByteOperations { public BytesValue indexAccess(Value index) throws Exception { IntegerValue integerIndex = (IntegerValue)index; IntegerValue valueLength = length(); if (integerIndex.isGreaterThanOrEqualTo(valueLength).getValue() || integerIndex.isSmallerThan(ValueContainer.getBigIntegerValue(index.getType(), BigInteger.ZERO)).getValue()) { throw new Exception("Invalid bytes index access out of bounds for type " + type.toSolidityCode() + ": " + index.toString()); } byte selectedValue = value[integerIndex.toInt()]; return new BytesValue(TypeContainer.getByteType(1), new byte[]{selectedValue}); } BytesValue(ASTNode type, /*String*/ byte[] value); int getBytesCount(); @Override ASTNode getType(); @Override ASTNode toASTNode(boolean forJavaScript); String toHexConstantString(); @Override Object toJSONRepresentation(); BoolValue isEqualTo(BytesValue other); BoolValue isNotEqualTo(BytesValue other); BoolValue isSmallerThan(BytesValue value); BoolValue isSmallerThanOrEqualTo(BytesValue value); BoolValue isGreaterThan(BytesValue value); BoolValue isGreaterThanOrEqualTo(BytesValue value); BytesValue negateBitwise(); BytesValue bitwiseOr(Value otherValue); BytesValue bitwiseAnd(Value otherValue); BytesValue bitwiseXor(Value otherValue); BytesValue bitwiseShiftLeft(Value value); BytesValue bitwiseShiftRight(Value value); BytesValue indexAccess(Value index); IntegerValue length(); BytesValue convertToBytesType(ASTElementaryTypeName newType); IntegerValue convertToIntegerType(ASTElementaryTypeName newType);  }### Answer:
@Test public void indexAccess() throws Exception { BytesTestValues[] a = new BytesTestValues[] { new BytesTestValues("bytes4", new byte[]{b(0xaa), b(0xbb), b(0xcc), b(0xdd)}, new byte[]{0}, 4, new byte[]{b(0xaa)}), new BytesTestValues("bytes4", new byte[]{b(0xaa), b(0xbb), b(0xcc), b(0xdd)}, new byte[]{1}, 4, new byte[]{b(0xbb)}), new BytesTestValues("bytes4", new byte[]{b(0xaa), b(0xbb), b(0xcc), b(0xdd)}, new byte[]{2}, 4, new byte[]{b(0xcc)}), new BytesTestValues("bytes4", new byte[]{b(0xaa), b(0xbb), b(0xcc), b(0xdd)}, new byte[]{3}, 4, new byte[]{b(0xdd)}) }; for (BytesTestValues testData : a) { ASTNode type = TypeContainer.getByteType(testData.typeBytes); BytesValue value = new BytesValue(type, testData.valueArray); BytesValue resultValue = value.indexAccess(new IntegerValue(TypeContainer.getIntegerType(false, 8), testData.secondValueArray[0])); String resultString = resultValue.toASTNode(false).toSolidityCode(); String expectedResultString = String.format("bytes1(0x%02X)", testData.operationResult[0]); System.out.println("got " + resultString + " wanted " + expectedResultString); assert resultString.equals(expectedResultString); } }