package xapi.model.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import org.junit.Assert; import org.junit.Test; import xapi.jre.model.ModelServiceJre; import xapi.model.X_Model; import xapi.model.api.Model; import xapi.model.api.ModelKey; import xapi.model.api.ModelManifest; import xapi.model.api.ModelModule; import xapi.model.content.ModelContent; import xapi.model.content.ModelRating; import xapi.model.content.ModelText; import xapi.model.impl.ModelUtil; import xapi.time.X_Time; import xapi.util.api.Pointer; import xapi.util.api.RemovalHandler; import xapi.util.api.SuccessHandler; public class ModelServiceTestJre { @Test public void testKeySerialization_Empty() { final ModelKey key = X_Model.newKey("testkind"); final String serialized = X_Model.keyToString(key); final ModelKey asKey = X_Model.keyFromString(serialized); Assert.assertEquals(key, asKey); } @Test public void testKeySerialization_Simple() { final ModelKey key = X_Model.newKey("ns", "testkind"); final String serialized = X_Model.keyToString(key); final ModelKey asKey = X_Model.keyFromString(serialized); assertEquals(key, asKey); assertEquals("ns", key.getNamespace()); assertEquals("testkind", key.getKind()); assertEquals(null, key.getId()); } @Test public void testKeySerialization_Full() { final ModelKey key = X_Model.newKey("ns", "testkind", "id"); final String serialized = X_Model.keyToString(key); final ModelKey asKey = X_Model.keyFromString(serialized); assertEquals(key, asKey); assertEquals("ns", key.getNamespace()); assertEquals("testkind", key.getKind()); assertEquals("id", key.getId()); } @Test public void testKeySerialization_WithParent() { ModelKey key = X_Model.newKey("ns", "testkind", "id"); key = key.getChild("child", "123"); final String serialized = X_Model.keyToString(key); final ModelKey asKey = X_Model.keyFromString(serialized); assertEquals(key, asKey); assertEquals("ns", key.getNamespace()); assertEquals("child", key.getKind()); assertEquals("123", key.getId()); assertEquals("ns", key.getParent().getNamespace()); assertEquals("testkind", key.getParent().getKind()); assertEquals("id", key.getParent().getId()); } @Test public void testSimpleSerialization() { final ModelText text = X_Model.create(ModelText.class); final long time = System.currentTimeMillis(); text.setText("Hello World"); text.setTime(time); final String serialized = X_Model.serialize(ModelText.class, text); final ModelText asModel = X_Model.deserialize(ModelText.class, serialized); assertEquals(text, asModel); } @Test public void testSimpleSerialization_WithKey() { final ModelText text = X_Model.create(ModelText.class); text.setKey(X_Model.newKey("ns", "text", "id")); final long time = System.currentTimeMillis(); text.setText("Hello World"); text.setTime(time); final String serialized = X_Model.serialize(ModelText.class, text); final ModelText asModel = X_Model.deserialize(ModelText.class, serialized); assertEquals(text, asModel); assertNotNull("Deserialized model must have a key!", asModel.getKey()); // Because there is a key in the model, these objects should still be equal // if the values of the model changed. text.setText("different"); assertEquals(text, asModel); } @Test public void testComplexSerialization() { final ModelContent content = X_Model.create(ModelContent.class); final long time = System.currentTimeMillis(); content.setText("Hello World"); content.setTime(time); content.setRelated(new ModelContent[]{X_Model.create(ModelContent.class)}); final String serialized = X_Model.serialize(ModelContent.class, content); final ModelContent asModel = X_Model.deserialize(ModelContent.class, serialized); assertEquals(content, asModel); } @Test public void testLiveExample() { final ModelModule module = ModelModule.deserialize("G3gmqkyvrvshfl7tdTeTDFD444A63B7C8030BDB6EDBB406508FEMWeTheInternetZHcontent\\xapi.model.content.ModelContentHrelatedItextItimeHupvotesDdownvotesaT[Lxapi.model.content.ModelContent;Gjava.lang.StringSdoubletT[Lxapi.model.content.ModelRating;[xapi.model.content.ModelTextSrating>xapi.model.content.ModelRatingSauthorZxapi.model.user.ModelUserIuserAidNemailDfirstNameRlastNameNvaliddTxapi.util.validators.ChecksStringNotEmptyHbooleanHisValidIETNAOINSAHNOTEE EAE T ORNOTEE EAE T IDNOTEE EAT E NLNOTEE EAT E SLNOTEE EAE T OCAOIORNOTEE EAE T IDNOTEE EAT E UMAUWUDNOTEE EAT E WFNOTEE EAT E GFNYPBVKYRNOTEE TJAEYT PRNOTEE TJAT E BRNOTEE TJAT E VRNOTEE TJAT E KXNOTEE ETEQ"); final RemovalHandler handler = ModelServiceJre.registerModule(module); try { final ModelManifest manifest = module.getManifest("content"); final Model model = X_Model.deserialize(manifest, "U EHcontentTETnT EHcontentEZqes6dvg09t023fa2h5fwxko6r UTest Me Out!E E "); } finally { handler.remove(); } } @Test public void testModelPersistence() { final ModelContent content = X_Model.create(ModelContent.class); final long time = System.currentTimeMillis(); content.setText("Hello World"); content.setTime(time); content.setRelated(new ModelContent[]{X_Model.create(ModelContent.class)}); content.setKey(X_Model.newKey(content.getType())); final Pointer<Boolean> waiting = new Pointer<>(true); X_Model.persist(content, new SuccessHandler<ModelContent>() { @Override public void onSuccess(final ModelContent m) { X_Model.load(ModelContent.class, m.getKey(), new SuccessHandler<ModelContent>() { @Override public void onSuccess(final ModelContent loaded) { Assert.assertFalse(loaded == m); Assert.assertTrue(loaded.equals(m)); waiting.set(false); } }); } }); final long deadline = System.currentTimeMillis()+3000; while (waiting.get()) { X_Time.trySleep(10, 0); Assert.assertTrue(X_Time.isFuture(deadline)); } } @Test public void testModuleSerializationRoundTrip() { final ModelModule module = new ModelModule(); module.addManifest(ModelUtil.createManifest(ModelContent.class)); module.addManifest(ModelUtil.createManifest(ModelText.class)); module.addManifest(ModelUtil.createManifest(ModelRating.class)); final String serialized = ModelModule.serialize(module); System.out.println(serialized); final ModelModule deserialized = ModelModule.deserialize(serialized); Assert.assertEquals(module, deserialized); } }