### Question:
Quaternion extends Message { public static Quaternion fromJsonObject(JsonObject jsonObject) { double x = jsonObject.containsKey(Quaternion.FIELD_X) ? jsonObject .getJsonNumber(Quaternion.FIELD_X).doubleValue() : 0.0; double y = jsonObject.containsKey(Quaternion.FIELD_Y) ? jsonObject .getJsonNumber(Quaternion.FIELD_Y).doubleValue() : 0.0; double z = jsonObject.containsKey(Quaternion.FIELD_Z) ? jsonObject .getJsonNumber(Quaternion.FIELD_Z).doubleValue() : 0.0; double w = jsonObject.containsKey(Quaternion.FIELD_W) ? jsonObject .getJsonNumber(Quaternion.FIELD_W).doubleValue() : 0.0; return new Quaternion(x, y, z, w); } Quaternion();  Quaternion(double x, double y, double z, double w); double getX(); double getY(); double getZ(); double getW(); @Override Quaternion clone(); static Quaternion fromJsonString(String jsonString); static Quaternion fromMessage(Message m); static Quaternion fromJsonObject(JsonObject jsonObject); static final String FIELD_X; static final String FIELD_Y; static final String FIELD_Z; static final String FIELD_W; static final String TYPE; }### Answer:
@Test public void testFromJsonObject() { JsonObject jsonObject = Json.createObjectBuilder() .add(Quaternion.FIELD_X, q1.getX()) .add(Quaternion.FIELD_Y, q1.getY()) .add(Quaternion.FIELD_Z, q1.getZ()) .add(Quaternion.FIELD_W, q1.getW()).build(); Quaternion p = Quaternion.fromJsonObject(jsonObject); assertEquals(q1.toString(), p.toString()); assertEquals(q1.toJsonObject(), p.toJsonObject()); assertEquals(q1.getMessageType(), p.getMessageType()); assertEquals(q1.getX(), p.getX(), 0); assertEquals(q1.getY(), p.getY(), 0); assertEquals(q1.getZ(), p.getZ(), 0); assertEquals(q1.getW(), p.getW(), 0); assertNotSame(q1, p); assertNotSame(q1.toString(), p.toString()); assertNotSame(q1.toJsonObject(), p.toJsonObject()); }