@Test
  public void testAverageIntDataElement() {
    DataElement dataElement = createDataElement('A', categoryCombo);

    dataElement.setType(DataElement.VALUE_TYPE_INT);
    dataElement.setAggregationOperator(DataElement.AGGREGATION_OPERATOR_AVERAGE_SUM);

    dataElementIds.add(dataElementService.addDataElement(dataElement));

    DataSet dataSet = createDataSet('A', new YearlyPeriodType());
    dataSet.getDataElements().add(dataElement);
    dataSetService.addDataSet(dataSet);
    dataElement.getDataSets().add(dataSet);
    dataElementService.updateDataElement(dataElement);

    Period dataPeriod =
        createPeriod(new YearlyPeriodType(), getDate(2000, 1, 1), getDate(2000, 12, 31));

    OrganisationUnit unit = createOrganisationUnit('A');

    organisationUnitIds.add(organisationUnitService.addOrganisationUnit(unit));

    dataValueService.addDataValue(
        createDataValue(dataElement, dataPeriod, unit, "100", categoryOptionCombo));

    Period periodA =
        createPeriod(new MonthlyPeriodType(), getDate(2000, 3, 1), getDate(2000, 3, 31));
    Period periodB =
        createPeriod(new MonthlyPeriodType(), getDate(2000, 4, 1), getDate(2000, 4, 30));
    Period periodC =
        createPeriod(new QuarterlyPeriodType(), getDate(2000, 3, 1), getDate(2000, 5, 31));

    periodIds.add(periodService.addPeriod(periodA));
    periodIds.add(periodService.addPeriod(periodB));
    periodIds.add(periodService.addPeriod(periodC));

    dataMartEngine.export(dataElementIds, indicatorIds, periodIds, organisationUnitIds);

    assertEquals(
        100.0,
        aggregatedDataValueService.getAggregatedValue(
            dataElement, categoryOptionCombo, periodA, unit),
        DELTA);
    assertEquals(
        100.0,
        aggregatedDataValueService.getAggregatedValue(
            dataElement, categoryOptionCombo, periodB, unit),
        DELTA);
    assertEquals(
        100.0,
        aggregatedDataValueService.getAggregatedValue(
            dataElement, categoryOptionCombo, periodC, unit),
        DELTA);
  }
  @Override
  public void setUpTest() {
    // ---------------------------------------------------------------------
    // Services
    // ---------------------------------------------------------------------

    dataIntegrityService = (DataIntegrityService) getBean(DataIntegrityService.ID);
    dataElementService = (DataElementService) getBean(DataElementService.ID);
    indicatorService = (IndicatorService) getBean(IndicatorService.ID);
    dataSetService = (DataSetService) getBean(DataSetService.ID);
    organisationUnitService = (OrganisationUnitService) getBean(OrganisationUnitService.ID);
    organisationUnitGroupService =
        (OrganisationUnitGroupService) getBean(OrganisationUnitGroupService.ID);

    // ---------------------------------------------------------------------
    // Objects
    // ---------------------------------------------------------------------

    elementA = createDataElement('A');
    elementB = createDataElement('B');
    elementC = createDataElement('C');

    dataElementService.addDataElement(elementA);
    dataElementService.addDataElement(elementB);
    dataElementService.addDataElement(elementC);

    indicatorTypeA = createIndicatorType('A');

    indicatorService.addIndicatorType(indicatorTypeA);

    indicatorA = createIndicator('A', indicatorTypeA);
    indicatorB = createIndicator('B', indicatorTypeA);
    indicatorC = createIndicator('C', indicatorTypeA);

    indicatorA.setNumerator(" ");
    indicatorB.setNumerator("Numerator");
    indicatorB.setDenominator("Denominator");
    indicatorC.setNumerator("Numerator");
    indicatorC.setDenominator("Denominator");

    indicatorService.addIndicator(indicatorA);
    indicatorService.addIndicator(indicatorB);
    indicatorService.addIndicator(indicatorC);

    unitA = createOrganisationUnit('A');
    unitB = createOrganisationUnit('B', unitA);
    unitC = createOrganisationUnit('C', unitB);
    unitD = createOrganisationUnit('D', unitC);
    unitE = createOrganisationUnit('E', unitD);
    unitF = createOrganisationUnit('F');

    organisationUnitService.addOrganisationUnit(unitA);
    organisationUnitService.addOrganisationUnit(unitB);
    organisationUnitService.addOrganisationUnit(unitC);
    organisationUnitService.addOrganisationUnit(unitD);
    organisationUnitService.addOrganisationUnit(unitE);
    organisationUnitService.addOrganisationUnit(unitF);

    unitA.setParent(unitC);

    organisationUnitService.updateOrganisationUnit(unitA);

    dataSetA = createDataSet('A', new MonthlyPeriodType());
    dataSetB = createDataSet('B', new QuarterlyPeriodType());

    dataSetA.getDataElements().add(elementA);
    dataSetA.getDataElements().add(elementB);
    elementA.getDataSets().add(dataSetA);
    elementB.getDataSets().add(dataSetA);

    dataSetA.getSources().add(unitA);
    unitA.getDataSets().add(dataSetA);

    dataSetB.getDataElements().add(elementA);
    elementA.getDataSets().add(dataSetB);

    dataSetService.addDataSet(dataSetA);
    dataSetService.addDataSet(dataSetB);

    // ---------------------------------------------------------------------
    // Groups
    // ---------------------------------------------------------------------

    elementGroupA = createDataElementGroup('A');

    elementGroupA.getMembers().add(elementA);
    elementA.getGroups().add(elementGroupA);

    dataElementService.addDataElementGroup(elementGroupA);

    indicatorGroupA = createIndicatorGroup('A');

    indicatorGroupA.getMembers().add(indicatorA);
    indicatorA.getGroups().add(indicatorGroupA);

    indicatorService.addIndicatorGroup(indicatorGroupA);

    unitGroupA = createOrganisationUnitGroup('A');
    unitGroupB = createOrganisationUnitGroup('B');
    unitGroupC = createOrganisationUnitGroup('C');
    unitGroupD = createOrganisationUnitGroup('D');

    unitGroupA.getMembers().add(unitA);
    unitGroupA.getMembers().add(unitB);
    unitGroupA.getMembers().add(unitC);
    unitA.getGroups().add(unitGroupA);
    unitB.getGroups().add(unitGroupA);
    unitC.getGroups().add(unitGroupA);

    unitGroupB.getMembers().add(unitA);
    unitGroupB.getMembers().add(unitB);
    unitGroupB.getMembers().add(unitF);
    unitA.getGroups().add(unitGroupB);
    unitB.getGroups().add(unitGroupB);
    unitF.getGroups().add(unitGroupB);

    unitGroupC.getMembers().add(unitA);
    unitA.getGroups().add(unitGroupC);

    organisationUnitGroupService.addOrganisationUnitGroup(unitGroupA);
    organisationUnitGroupService.addOrganisationUnitGroup(unitGroupB);
    organisationUnitGroupService.addOrganisationUnitGroup(unitGroupC);
    organisationUnitGroupService.addOrganisationUnitGroup(unitGroupD);

    // ---------------------------------------------------------------------
    // Group sets
    // ---------------------------------------------------------------------

    unitGroupSetA = createOrganisationUnitGroupSet('A');
    unitGroupSetB = createOrganisationUnitGroupSet('B');

    unitGroupSetA.setCompulsory(true);
    unitGroupSetB.setCompulsory(false);

    unitGroupSetA.getOrganisationUnitGroups().add(unitGroupA);
    unitGroupA.setGroupSet(unitGroupSetA);

    unitGroupSetB.getOrganisationUnitGroups().add(unitGroupB);
    unitGroupSetB.getOrganisationUnitGroups().add(unitGroupC);
    unitGroupB.setGroupSet(unitGroupSetB);
    unitGroupC.setGroupSet(unitGroupSetB);

    organisationUnitGroupService.addOrganisationUnitGroupSet(unitGroupSetA);
    organisationUnitGroupService.addOrganisationUnitGroupSet(unitGroupSetB);
  }
  @Override
  public void setUpTest() {
    aggregationService = (AggregationService) getBean(AggregationService.ID);

    categoryService = (DataElementCategoryService) getBean(DataElementCategoryService.ID);

    dataElementService = (DataElementService) getBean(DataElementService.ID);

    indicatorService = (IndicatorService) getBean(IndicatorService.ID);

    dataSetService = (DataSetService) getBean(DataSetService.ID);

    periodService = (PeriodService) getBean(PeriodService.ID);

    organisationUnitService = (OrganisationUnitService) getBean(OrganisationUnitService.ID);

    dataValueService = (DataValueService) getBean(DataValueService.ID);

    expressionService = (ExpressionService) getBean(ExpressionService.ID);

    // ---------------------------------------------------------------------
    // Setup Dimensions
    // ---------------------------------------------------------------------

    categoryOptionA = new DataElementCategoryOption("Male");
    categoryOptionB = new DataElementCategoryOption("Female");

    categoryService.addDataElementCategoryOption(categoryOptionA);
    categoryService.addDataElementCategoryOption(categoryOptionB);

    category = new DataElementCategory("Gender");
    category.getCategoryOptions().add(categoryOptionA);
    category.getCategoryOptions().add(categoryOptionB);

    categoryService.addDataElementCategory(category);

    categoryCombo = new DataElementCategoryCombo("Gender");
    categoryCombo.getCategories().add(category);

    categoryService.addDataElementCategoryCombo(categoryCombo);

    categoryOptionComboA = createCategoryOptionCombo(categoryCombo, categoryOptionA);
    categoryOptionComboB = createCategoryOptionCombo(categoryCombo, categoryOptionB);

    categoryService.addDataElementCategoryOptionCombo(categoryOptionComboA);
    categoryService.addDataElementCategoryOptionCombo(categoryOptionComboB);

    // ---------------------------------------------------------------------
    // Setup DataElements
    // ---------------------------------------------------------------------

    dataElementA =
        createDataElement(
            'A', DataElement.VALUE_TYPE_INT, DataElement.AGGREGATION_OPERATOR_SUM, categoryCombo);
    dataElementB =
        createDataElement(
            'B', DataElement.VALUE_TYPE_BOOL, DataElement.AGGREGATION_OPERATOR_SUM, categoryCombo);
    dataElementC =
        createDataElement(
            'C', DataElement.VALUE_TYPE_INT, DataElement.AGGREGATION_OPERATOR_SUM, categoryCombo);

    dataElementService.addDataElement(dataElementA);
    dataElementService.addDataElement(dataElementB);
    dataElementService.addDataElement(dataElementC);

    // ---------------------------------------------------------------------
    // Setup Indicators
    // ---------------------------------------------------------------------

    indicatorType = createIndicatorType('A');
    indicatorType.setFactor(100);

    indicatorService.addIndicatorType(indicatorType);

    indicatorA = createIndicator('A', indicatorType);
    indicatorA.setNumerator(
        "#{" + dataElementA.getUid() + SEPARATOR + categoryOptionComboA.getUid() + "}+150");
    indicatorA.setDenominator(
        "#{" + dataElementB.getUid() + SEPARATOR + categoryOptionComboA.getUid() + "}");

    indicatorB = createIndicator('B', indicatorType);
    indicatorB.setNumerator("#{" + dataElementC.getUid() + "}");
    indicatorB.setDenominator("1");

    indicatorService.addIndicator(indicatorA);
    indicatorService.addIndicator(indicatorB);

    // ---------------------------------------------------------------------
    // Setup DataSets (to get correct PeriodType for DataElements)
    // ---------------------------------------------------------------------

    dataSet = createDataSet('A', new MonthlyPeriodType());
    dataSet.getDataElements().add(dataElementA);
    dataSet.getDataElements().add(dataElementB);
    dataSetService.addDataSet(dataSet);
    dataElementA.getDataSets().add(dataSet);
    dataElementB.getDataSets().add(dataSet);
    dataElementC.getDataSets().add(dataSet);
    dataElementService.updateDataElement(dataElementA);
    dataElementService.updateDataElement(dataElementB);
    dataElementService.updateDataElement(dataElementC);

    // ---------------------------------------------------------------------
    // Setup Periods
    // ---------------------------------------------------------------------

    PeriodType monthly = new MonthlyPeriodType();

    periodA = createPeriod(monthly, mar01, mar31);
    periodB = createPeriod(monthly, apr01, apr30);
    periodC = createPeriod(monthly, may01, may31);

    periodService.addPeriod(periodA);
    periodService.addPeriod(periodB);
    periodService.addPeriod(periodC);

    // ---------------------------------------------------------------------
    // Setup OrganisationUnits
    // ---------------------------------------------------------------------

    unitA = createOrganisationUnit('A');
    unitB = createOrganisationUnit('B', unitA);
    unitC = createOrganisationUnit('C', unitA);
    unitD = createOrganisationUnit('D', unitB);
    unitE = createOrganisationUnit('E', unitB);
    unitF = createOrganisationUnit('F', unitB);
    unitG = createOrganisationUnit('G', unitF);
    unitH = createOrganisationUnit('H', unitF);
    unitI = createOrganisationUnit('I');

    organisationUnitService.addOrganisationUnit(unitA);
    organisationUnitService.addOrganisationUnit(unitB);
    organisationUnitService.addOrganisationUnit(unitC);
    organisationUnitService.addOrganisationUnit(unitD);
    organisationUnitService.addOrganisationUnit(unitE);
    organisationUnitService.addOrganisationUnit(unitF);
    organisationUnitService.addOrganisationUnit(unitG);
    organisationUnitService.addOrganisationUnit(unitH);
    organisationUnitService.addOrganisationUnit(unitI);

    // ---------------------------------------------------------------------
    // Setup DataValues
    // ---------------------------------------------------------------------

    dataValueService.addDataValue(
        createDataValue(dataElementA, periodA, unitC, "90", categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementA, periodA, unitD, "10", categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementA, periodA, unitE, "35", categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementA, periodA, unitF, "25", categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementA, periodA, unitG, "20", categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementA, periodA, unitH, "60", categoryOptionComboA));

    dataValueService.addDataValue(
        createDataValue(dataElementA, periodB, unitC, "70", categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementA, periodB, unitD, "40", categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementA, periodB, unitE, "65", categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementA, periodB, unitF, "55", categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementA, periodB, unitG, "20", categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementA, periodB, unitH, "15", categoryOptionComboA));

    dataValueService.addDataValue(
        createDataValue(dataElementA, periodC, unitC, "95", categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementA, periodC, unitD, "40", categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementA, periodC, unitE, "45", categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementA, periodC, unitF, "30", categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementA, periodC, unitG, "50", categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementA, periodC, unitH, "70", categoryOptionComboA));

    dataValueService.addDataValue(
        createDataValue(dataElementB, periodA, unitC, T, categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementB, periodA, unitD, T, categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementB, periodA, unitE, F, categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementB, periodA, unitF, T, categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementB, periodA, unitG, F, categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementB, periodA, unitH, T, categoryOptionComboA));

    dataValueService.addDataValue(
        createDataValue(dataElementB, periodB, unitC, T, categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementB, periodB, unitD, F, categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementB, periodB, unitE, T, categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementB, periodB, unitF, T, categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementB, periodB, unitG, F, categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementB, periodB, unitH, T, categoryOptionComboA));

    dataValueService.addDataValue(
        createDataValue(dataElementB, periodC, unitC, F, categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementB, periodC, unitD, T, categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementB, periodC, unitE, F, categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementB, periodC, unitF, T, categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementB, periodC, unitG, T, categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementB, periodC, unitH, T, categoryOptionComboA));

    dataValueService.addDataValue(
        createDataValue(dataElementC, periodA, unitB, "30", categoryOptionComboA));
    dataValueService.addDataValue(
        createDataValue(dataElementC, periodA, unitB, "20", categoryOptionComboB));

    aggregationService.clearCache();
  }