@Test
  public void testConnection() {

    // Test view
    // Set 1st data source, then dash board
    assertEquals("connectionA", view1.getDataSourceDefinition().getConnection().getCubeAlias());
    assertNotNull(view1.getDashBoardDefinition());

    // Test view
    // Set 1st dash board, then data source
    assertEquals("connectionA", view2.getDataSourceDefinition().getConnection().getCubeAlias());
    assertNotNull(view2.getDashBoardDefinition());

    // Test view
    // with connection
    assertEquals("connectionB", view3.getDataSourceDefinition().getConnection().getCubeAlias());
    assertNotNull(view3.getDashBoardDefinition());

    // Test filter
    // Set 1st data source, then dash board
    assertEquals("connectionA", filter1.getDataSourceDefinition().getConnection().getCubeAlias());
    assertNotNull(filter1.getDashBoardDefinition());

    // Test filter
    // Set 1st dash board, then data source
    assertEquals("connectionA", filter2.getDataSourceDefinition().getConnection().getCubeAlias());
    assertNotNull(filter2.getDashBoardDefinition());

    // Test filter
    // with connection
    assertEquals("connectionB", filter3.getDataSourceDefinition().getConnection().getCubeAlias());
    assertNotNull(filter3.getDashBoardDefinition());
  }
  @Before
  public void setUp() throws Exception {
    dashBoard = new DashBoardDefinition();
    dashBoard.setConnection(new ConnectionDefinition());
    dashBoard.getConnection().setCubeAlias("connectionA");

    // Test view
    // Set 1st data source, then dash board
    view1 = new ViewDefinition();
    view1.setName("view1");
    view1.setDataSourceDefinition(new DataSourceDefinition());
    dashBoard.addView(view1);

    // Test view
    // Set 1st dash board, then data source
    view2 = new ViewDefinition();
    view2.setName("view2");
    dashBoard.addView(view2);
    view2.setDataSourceDefinition(new DataSourceDefinition());

    // Test view
    // with connection
    view3 = new ViewDefinition();
    view3.setName("view3");
    view3.setDataSourceDefinition(new DataSourceDefinition());
    view3.getDataSourceDefinition().setConnection(new ConnectionDefinition());
    view3.getDataSourceDefinition().getConnection().setCubeAlias("connectionB");
    dashBoard.addView(view3);

    // Test filter
    // Set 1st data source, then dash board
    filter1 = new FilterDefinition();
    filter1.setName("filter1");
    filter1.setDataSourceDefinition(new DataSourceDefinition());
    dashBoard.addFilter(filter1);

    // Test filter
    // Set 1st dash board, then data source
    filter2 = new FilterDefinition();
    filter2.setName("filter2");
    dashBoard.addFilter(filter2);
    filter2.setDataSourceDefinition(new DataSourceDefinition());

    // Test filter
    // with connection
    filter3 = new FilterDefinition();
    filter3.setName("filter3");
    filter3.setDataSourceDefinition(new DataSourceDefinition());
    filter3.getDataSourceDefinition().setConnection(new ConnectionDefinition());
    filter3.getDataSourceDefinition().getConnection().setCubeAlias("connectionB");
    dashBoard.addFilter(filter3);
  }
  @SuppressWarnings("unchecked")
  @Test
  public void testDeSerealize() {
    Reader reader =
        new StringReader(
            "<dashboard>"
                + "<connection>"
                + "<cubeAlias>cubeA</cubeAlias>"
                + "<dataBaseAlias>dbA</dataBaseAlias>"
                + "<template>templateA</template>"
                + "</connection>"
                + "<look>"
                + "<cols>2</cols>"
                + "</look>"
                + "<views>"
                + "<view>"
                + "<name>view1</name>"
                + "<datasource>"
                + "<query>"
                + "query view 1"
                + "</query>"
                + "<dependencies>"
                + "<filter>month</filter>"
                + "<filter>brand</filter>"
                + "</dependencies>"
                + "</datasource>"
                + "<look>"
                + "<lookType>ext.grid</lookType>"
                + "<width>400</width>"
                + "<height>200</height>"
                + "<fields>Product</fields>"
                + "<fields>SalePrice</fields>"
                + "<fields>Quantity</fields>"
                + "<columns>"
                + "<header>Product</header>"
                + "<dataIndex>Product</dataIndex>"
                + "</columns>"
                + "<columns>"
                + "<header>Precio Venta $</header>"
                + "<dataIndex>SalePrice</dataIndex>"
                + "</columns>"
                + "<columns>"
                + "<header>Cantidad</header>"
                + "<dataIndex>Quantity</dataIndex>"
                + "</columns>"
                + "<series type=\"list\">"
                + "<type>line</type>"
                + "<displayName>Cantidad</displayName>"
                + "<yField>Quantity</yField>"
                + "<label>"
                + "<field>Product</field>"
                + "</label>"
                + "</series>"
                + "<axes>"
                + "<type>Numeric</type>"
                + "<position>left</position>"
                + "<fields>DirectCost</fields>"
                + "<fields>IndirectCost</fields>"
                + "<fields>TotalCost</fields>"
                + "</axes>"
                + "<axes>"
                + "<type>Category</type>"
                + "<position>bottom</position>"
                + "<fields type=\"list\">Time</fields>"
                + "</axes>"
                + "<legend>"
                + "<position>right</position>"
                + "</legend>"
                + "</look>"
                + "</view>"
                + "<view>"
                + "<name>view2</name>"
                + "<datasource>"
                + "<query>"
                + "query view 2"
                + "</query>"
                + "<connection>"
                + "<cubeAlias>cubeB</cubeAlias>"
                + "<dataBaseAlias>dbB</dataBaseAlias>"
                + "<template>templateB</template>"
                + "</connection>"
                + "</datasource>"
                + "<look type=\"ext.graph\">"
                + "<lookType>ext.graph</lookType>"
                + "</look>"
                + "</view>"
                + "</views>"
                + "<filters>"
                + "<filter>"
                + "<name>brand</name>"
                + "<label>Marca</label>"
                + "<datasource>"
                + "<query>"
                + "WITH MEMBER [Measures].[one] AS '1' "
                + "SELECT {[Measures].[one]} ON COLUMNS, "
                + "{[Brand].members} on rows "
                + "FROM [Sales]"
                + "</query>"
                + "<connection>"
                + "<cubeAlias>cubeC</cubeAlias>"
                + "<dataBaseAlias>dbC</dataBaseAlias>"
                + "<template>templateC</template>"
                + "</connection>"
                + "<dependencies>"
                + "<filter>quarter</filter>"
                + "</dependencies>"
                + "</datasource>"
                + "</filter>"
                + "<filter>"
                + "<name>month</name>"
                + "<label>Mes</label>"
                + "<datasource>"
                + "<query>"
                + "WITH MEMBER [Measures].[one] AS '1' "
                + "SELECT {[Measures].[one]} ON COLUMNS, "
                + "{[Time].members} on rows "
                + "FROM [Sales]"
                + "</query>"
                + "<dependencies>"
                + "<filter>quarter</filter>"
                + "<filter>year</filter>"
                + "</dependencies>"
                + "</datasource>"
                + "</filter>"
                + "<filter>"
                + "<name>quarter</name>"
                + "</filter>"
                + "<filter>"
                + "<name>year</name>"
                + "</filter>"
                + "</filters>"
                + "</dashboard>");

    InputSource source = new InputSource(reader);

    DashBoardDefinition dashBoardDefinition = serializer.DeSerealize(source);

    // Connection
    assertEquals("cubeA", dashBoardDefinition.getConnection().getCubeAlias());
    assertEquals("dbA", dashBoardDefinition.getConnection().getDataBaseAlias());
    assertEquals("templateA", dashBoardDefinition.getConnection().getTemplate());

    // Dashboard look
    assertEquals("cols", dashBoardDefinition.getLookDefinition().getProperties().get(0).getName());
    assertEquals(2, dashBoardDefinition.getLookDefinition().getProperties().get(0).getValue());

    // View 1
    ViewDefinition viewDefinition1 = dashBoardDefinition.getViews().get(0);
    assertEquals("view1", viewDefinition1.getName());
    assertEquals("query view 1", viewDefinition1.getDataSourceDefinition().getQuery());
    assertEquals("cubeA", viewDefinition1.getDataSourceDefinition().getConnection().getCubeAlias());
    assertEquals(
        "dbA", viewDefinition1.getDataSourceDefinition().getConnection().getDataBaseAlias());
    assertEquals(
        "templateA", viewDefinition1.getDataSourceDefinition().getConnection().getTemplate());

    // Dependencies 1
    assertEquals(2, viewDefinition1.getDataSourceDefinition().getDependencies().size());
    assertEquals("month", viewDefinition1.getDataSourceDefinition().getDependencies().get(0));
    assertEquals("brand", viewDefinition1.getDataSourceDefinition().getDependencies().get(1));

    // look 1
    assertEquals("lookType", viewDefinition1.getLookDefinition().getProperties().get(0).getName());
    assertEquals("ext.grid", viewDefinition1.getLookDefinition().getProperties().get(0).getValue());

    assertEquals("width", viewDefinition1.getLookDefinition().getProperties().get(1).getName());
    assertEquals(400, viewDefinition1.getLookDefinition().getProperties().get(1).getValue());

    assertEquals("height", viewDefinition1.getLookDefinition().getProperties().get(2).getName());
    assertEquals(200, viewDefinition1.getLookDefinition().getProperties().get(2).getValue());

    // fields
    assertEquals("fields", viewDefinition1.getLookDefinition().getProperties().get(3).getName());
    List<String> fields =
        (List<String>) viewDefinition1.getLookDefinition().getProperties().get(3).getValue();
    assertEquals("Product", fields.get(0));
    assertEquals("SalePrice", fields.get(1));
    assertEquals("Quantity", fields.get(2));

    // columns
    assertEquals("columns", viewDefinition1.getLookDefinition().getProperties().get(4).getName());
    List<GenericDefinition> columns =
        (List<GenericDefinition>)
            viewDefinition1.getLookDefinition().getProperties().get(4).getValue();
    GenericDefinition column2 = columns.get(1);
    assertEquals("header", column2.getProperties().get(0).getName());
    assertEquals("Precio Venta $", column2.getProperties().get(0).getValue());
    assertEquals("dataIndex", column2.getProperties().get(1).getName());
    assertEquals("SalePrice", column2.getProperties().get(1).getValue());

    // serie
    assertEquals("series", viewDefinition1.getLookDefinition().getProperties().get(5).getName());
    List<GenericDefinition> series =
        (List<GenericDefinition>)
            viewDefinition1.getLookDefinition().getProperties().get(5).getValue();
    GenericDefinition serie = series.get(0);

    assertEquals("type", serie.getProperties().get(0).getName());
    assertEquals("line", serie.getProperties().get(0).getValue());
    assertEquals("displayName", serie.getProperties().get(1).getName());
    assertEquals("Cantidad", serie.getProperties().get(1).getValue());
    assertEquals("yField", serie.getProperties().get(2).getName());
    assertEquals("Quantity", serie.getProperties().get(2).getValue());

    GenericDefinition serieLabel = serie.getProperty("label");
    assertNotNull("falta el label", serieLabel);
    assertEquals("field", serieLabel.getProperties().get(0).getName());
    assertEquals("Product", serieLabel.getProperties().get(0).getValue());

    // axes 1
    assertEquals("axes", viewDefinition1.getLookDefinition().getProperties().get(6).getName());
    List<GenericDefinition> axes =
        (List<GenericDefinition>)
            viewDefinition1.getLookDefinition().getProperties().get(6).getValue();
    GenericDefinition axe1 = axes.get(0);

    assertEquals("fields", axe1.getProperties().get(2).getName());

    // axes 2
    GenericDefinition axe2fields = axes.get(1).getProperties().get(2);
    assertEquals("fields", axe2fields.getName());

    List<GenericDefinition> axe2fieldsList = (List<GenericDefinition>) axe2fields.getValue();
    assertEquals(1, axe2fieldsList.size());

    // position
    GenericDefinition legend = viewDefinition1.getLookDefinition().getProperties().get(7);
    assertEquals("legend", legend.getName());

    GenericDefinition legendValue = (GenericDefinition) legend.getValue();
    assertEquals(1, legendValue.getProperties().size());
    assertEquals("position", legendValue.getProperties().get(0).getName());
    assertEquals("right", legendValue.getProperties().get(0).getValue());

    // View 2
    ViewDefinition viewDefinition2 = dashBoardDefinition.getViews().get(1);
    assertEquals("view2", viewDefinition2.getName());
    assertEquals("query view 2", viewDefinition2.getDataSourceDefinition().getQuery());
    assertEquals("lookType", viewDefinition2.getLookDefinition().getProperties().get(0).getName());
    assertEquals(
        "ext.graph", viewDefinition2.getLookDefinition().getProperties().get(0).getValue());

    assertEquals("cubeB", viewDefinition2.getDataSourceDefinition().getConnection().getCubeAlias());
    assertEquals(
        "dbB", viewDefinition2.getDataSourceDefinition().getConnection().getDataBaseAlias());
    assertEquals(
        "templateB", viewDefinition2.getDataSourceDefinition().getConnection().getTemplate());

    // Filter brand
    FilterDefinition filterBrand = dashBoardDefinition.getFilters().get(0);
    assertEquals("brand", filterBrand.getName());
    assertEquals("Marca", filterBrand.getLabel());
    assertEquals(
        "WITH MEMBER [Measures].[one] AS '1' SELECT {[Measures].[one]} ON COLUMNS, {[Brand].members} on rows FROM [Sales]",
        filterBrand.getDataSourceDefinition().getQuery());
    assertEquals("cubeC", filterBrand.getDataSourceDefinition().getConnection().getCubeAlias());
    assertEquals("dbC", filterBrand.getDataSourceDefinition().getConnection().getDataBaseAlias());
    assertEquals(0, filterBrand.getDependants().size());

    // Filter month
    FilterDefinition filterMonth = dashBoardDefinition.getFilters().get(1);
    assertEquals("month", filterMonth.getName());
    assertEquals("Mes", filterMonth.getLabel());
    assertEquals(
        "WITH MEMBER [Measures].[one] AS '1' SELECT {[Measures].[one]} ON COLUMNS, {[Time].members} on rows FROM [Sales]",
        filterMonth.getDataSourceDefinition().getQuery());
    assertEquals("cubeA", filterMonth.getDataSourceDefinition().getConnection().getCubeAlias());
    assertEquals("dbA", filterMonth.getDataSourceDefinition().getConnection().getDataBaseAlias());
    assertEquals("templateA", filterMonth.getDataSourceDefinition().getConnection().getTemplate());

    assertEquals(2, filterMonth.getDataSourceDefinition().getDependencies().size());
    assertEquals("quarter", filterMonth.getDataSourceDefinition().getDependencies().get(0));
    assertEquals("year", filterMonth.getDataSourceDefinition().getDependencies().get(1));
    assertEquals(0, filterMonth.getDependants().size());

    // Filter quarter
    FilterDefinition filterQuarter = dashBoardDefinition.getFilters().get(2);
    assertEquals(2, filterQuarter.getDependants().size());
    assertEquals("brand", filterQuarter.getDependants().get(0));
    assertEquals("month", filterQuarter.getDependants().get(1));

    // Filter year
    FilterDefinition filterYear = dashBoardDefinition.getFilters().get(3);
    assertEquals(1, filterYear.getDependants().size());
    assertEquals("month", filterYear.getDependants().get(0));
  }