### Question:
B2JsonReader { public String readString() throws B2JsonException, IOException { skipWhitespace(); if (currentChar != '"') { throw new B2JsonException("string does not start with quote"); } next(); builder.setLength(0); while (currentChar != '"') { if (currentChar == EOF) { throw new B2JsonException("eof inside string"); } if (currentChar < 32) { throw new B2JsonException("control character in string"); } if (currentChar == '\\') { handleBackslashInString(); } else { appendAndNext(); } } next(); return builder.toString(); } B2JsonReader(Reader in); char peekNextNotWhitespaceChar(); void skipValue(); String readNumberAsString(); String readString(); boolean startObjectAndCheckForContents(); boolean objectHasMoreFields(); boolean nextNonWhitespaceIsEof(); String readObjectFieldNameAndColon(); void skipObjectColon(); void finishObject(); boolean startArrayAndCheckForContents(); boolean arrayHasMoreValues(); void finishArray(); void readNull(); void readFalse(); void readTrue();  }### Answer:
@Test public void testReadString() throws IOException, B2JsonException { checkString("", null); checkString("a", null); checkString("\"a", null); checkString("\"\\x\"", null); checkString("\"\"", ""); checkString("\"abc\"", "abc"); checkString("\"\\u0000\"", "\u0000"); checkString("\"\\uffFF\"", "\uffFF"); checkBackslashUCodePoint("\u0041", 0x41); checkBackslashUCodePoint("\u00DF", 0xDF); checkBackslashUCodePoint("\u6771", 0x6771); checkBackslashUCodePoint("\uD7FF", 0xD7FF); checkBackslashUCodePoint("\uE000", 0xE000); checkBackslashUCodePoint("\uFFFF", 0xFFFF); checkBackslashUCodePoint("\uD802\uDC5A", 0x1085A); checkUtf8CodePoint(new byte[]{0x41}, 0x41); checkUtf8CodePoint(new byte[]{(byte) 0xc3, (byte) 0x9f}, 0xDF); checkUtf8CodePoint(new byte[]{(byte) 0xe6, (byte) 0x9d, (byte) 0xb1}, 0x6771); checkUtf8CodePoint(new byte[]{(byte) 0xf0, (byte) 0x90, (byte) 0x90, (byte) 0x80}, 0x10400); }