package io.ddf.ml;


import io.basic.ddf.BasicDDF;
import io.basic.ddf.content.PersistenceHandler;
import io.ddf.DDF;
import io.ddf.DDFManager;
import io.ddf.content.APersistenceHandler;
import io.ddf.content.Schema;
import io.ddf.exception.DDFException;
import junit.framework.Assert;
import org.junit.Ignore;
import org.junit.Test;

import java.util.List;

import static org.junit.Assert.assertEquals;

/**
 */

public class ModelPersistenceTest {

  class DummyModel {
    private double mNumber;
    private String mName;

    public DummyModel(double number, String name) {
      this.mNumber = number;
      this.mName = name;
    }

    public double getNumber() {
      return mNumber;
    }

    public String getName() {
      return mName;
    }
  }

  @Test
  public void testModelSerializationTest() throws DDFException {

    DummyModel dummyModel = new DummyModel(10.0, "dummyModel");
    Model model = new Model(dummyModel);

    String json = model.toJson();

    Model deserializedModel = Model.fromJson(json);

    assertEquals(deserializedModel.getName(), model.getName());
    DummyModel model2 = (DummyModel) deserializedModel.getRawModel();

    assertEquals(model2.getName(), "dummyModel");
    assertEquals(model2.getNumber(), 10.0, 0.001);
  }

  @Ignore
  public void testModelSerialize2DDF() throws DDFException {
    DummyModel dummyModel = new DummyModel(20, "dummymodel2");
    Model model = new Model(dummyModel);
    DDFManager manager = DDFManager.get(DDFManager.EngineType.BASIC);

    DDF ddf = model.serialize2DDF(manager);

    Object obj = ddf.getRepresentationHandler().get(List.class, String.class);
    List<Schema.Column> cols = ddf.getSchema().getColumns();
    List<String> lsString = (List<String>) obj;

    Assert.assertTrue(obj != null);
    Assert.assertTrue(obj instanceof List);
    Assert.assertTrue(ddf != null);

    APersistenceHandler.PersistenceUri uri = ddf.persist();
    PersistenceHandler pHandler = new PersistenceHandler(null);
    DDF ddf2 = (DDF) pHandler.load(uri);
    Model model2 = Model.deserializeFromDDF((BasicDDF) ddf2);

    Assert.assertTrue(ddf2 != null);
    Assert.assertTrue(model2 != null);
    Assert.assertTrue(model2.getRawModel() instanceof DummyModel);
  }
}