### Question:
TimeZoneDataCallback extends ProfileReadResponse implements TimeZoneCallback { @Override public void onDataReceived(@NonNull final BluetoothDevice device, @NonNull final Data data) { super.onDataReceived(device, data); final Integer offset = readTimeZone(data, 0); if (offset == null) { onInvalidDataReceived(device, data); return; } if (offset == -128) { onUnknownTimeZoneReceived(device); } else if (offset < -48 || offset > 56) { onInvalidDataReceived(device, data); } else { onTimeZoneReceived(device, offset * 15); } } TimeZoneDataCallback(); protected  TimeZoneDataCallback(final Parcel in); @Override void onDataReceived(@NonNull final BluetoothDevice device, @NonNull final Data data); @Nullable static Integer readTimeZone(@NonNull final Data data, final int offset);  }### Answer:
@Test public void onTimeZoneReceived_basic() { final Data data = new Data(new byte[] { 1 }); callback.onDataReceived(null, data); assertTrue(success); assertEquals(15, result); }
@Test public void onTimeZoneReceived_unknown() { final Data data = new Data(new byte[] { -128 }); callback.onDataReceived(null, data); assertTrue(unknownTimeZone); }
@Test public void onTimeZoneReceived_invalid() { final Data data = new Data(new byte[] { 60 }); callback.onDataReceived(null, data); assertTrue(invalidData); }