package com.venky.swf.db.model.io;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import org.json.simple.JSONObject;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.venky.core.io.ByteArrayInputStream;
import com.venky.core.util.ObjectUtil;
import com.venky.swf.db.Database;
import com.venky.swf.sql.*;
import com.venky.swf.db.model.Model;
import com.venky.swf.db.model.reflection.ModelReflector;
import com.venky.swf.routing.Router;
import com.venky.swf.db.model.User;
import com.venky.swf.test.db.model.xml.Country;
import com.venky.swf.test.db.model.xml.State;
import com.venky.xml.XMLElement;
public class SerializationTest {
@Before
public void setUp(){
Router.instance().setLoader(getClass().getClassLoader());
}
@Test
public void test() throws IOException {
Database.getInstance().open(new Select().from(User.class).execute().get(0));
Country c = Database.getTable(Country.class).newRecord();
c.setName("India");
c.save();
State s1 = Database.getTable(State.class).newRecord();
s1.setName("Karnataka");
s1.setCountryId(c.getId());
s1.save();
State s2 = Database.getTable(State.class).newRecord();
s2.setName("Maharashtra");
s2.setCountryId(c.getId());
s2.save();
serializeAndDeserialize(Arrays.asList(new State[]{s1,s2}), State.class, XMLElement.class);
serializeAndDeserialize(Arrays.asList(new State[]{s1,s2}), State.class, JSONObject.class);
}
private <M extends Model,T> void serializeAndDeserialize(List<M> models, Class<M> modelClass, Class<T> formatClass) throws IOException{
ModelWriter<M,T> mw = ModelIOFactory.getWriter(modelClass,formatClass);
ModelReader<M,T> mr = ModelIOFactory.getReader(modelClass,formatClass);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
mw.write(models, baos, ModelReflector.instance(modelClass).getRealFields());
System.out.println(baos.toString());
List<M> deserialized = mr.read(new ByteArrayInputStream(baos.toByteArray()));
Assert.assertEquals(deserialized.size(),models.size());
for (int i = 0 ; i < models.size() ; i ++){
Assert.assertTrue(ObjectUtil.equals(models.get(i),deserialized.get(i)));
}
}
}