def test_measurement_with_neg_control_content_size_1(self):
        measurement_intent = MeasurementIntent()
        measurement_intent.set_measurement_type(
            ip_constants.MEASUREMENT_TYPE_CONDITION_SPACE)
        measurement_intent.add_file_type('SPREADSHEET')

        content = ContentIntent()
        num_neg_control = NamedIntegerValue(
            NamedLink(ip_constants.HEADER_NUMBER_OF_NEGATIVE_CONTROLS_VALUE),
            2)
        content.set_numbers_of_negative_controls([num_neg_control])
        measurement_intent.add_content(content)

        content_structure_request = [{
            dc_constants.NAME: {
                dc_constants.LABEL:
                ip_constants.HEADER_NUMBER_OF_NEGATIVE_CONTROLS_VALUE,
                dc_constants.SBH_URI: dc_constants.NO_PROGRAM_DICTIONARY
            },
            dc_constants.VALUE: 2
        }]
        self.assertDictEqual(
            {
                dc_constants.CONTENTS: [content_structure_request],
                dc_constants.FILE_TYPE: ['SPREADSHEET'],
                dc_constants.MEASUREMENT_TYPE:
                ip_constants.MEASUREMENT_TYPE_CONDITION_SPACE
            }, measurement_intent.to_structured_request())
    def _process_row(self, row_index, control_data):
        row = self._intent_parser_table.get_row(row_index)
        measurement = MeasurementIntent()
        content_intent = ContentIntent()

        row_offset = row_index  # Used for reporting row value to users
        for cell_index in range(len(row)):
            cell = self._intent_parser_table.get_cell(row_index, cell_index)

            # Cell type based on column header
            header_cell = self._intent_parser_table.get_cell(
                self._intent_parser_table.header_row_index(), cell_index)
            cell_type = cell_parser.PARSER.get_header_type(
                header_cell.get_text())

            column_offset = cell_index  # Used for reporting column value to users
            if not cell.get_text().strip() or cell_type in self.IGNORE_COLUMNS:
                continue

            if ip_constants.HEADER_MEASUREMENT_TYPE_TYPE == cell_type:
                self._process_measurement_type(cell, measurement, row_offset,
                                               column_offset)
            elif ip_constants.HEADER_FILE_TYPE_TYPE == cell_type:
                self._process_file_type(cell, measurement, row_offset,
                                        column_offset)
            elif ip_constants.HEADER_REPLICATE_TYPE == cell_type:
                self._process_replicate(cell, measurement, row_offset,
                                        column_offset)
            elif ip_constants.HEADER_STRAINS_TYPE == cell_type:
                self._process_strains(cell, measurement, row_offset,
                                      column_offset)
            elif ip_constants.HEADER_ODS_TYPE == cell_type:
                self._process_ods(cell, measurement, row_offset, column_offset)
            elif ip_constants.HEADER_TEMPERATURE_TYPE == cell_type:
                self._process_temperature(cell, measurement, row_offset,
                                          column_offset)
            elif ip_constants.HEADER_TIMEPOINT_TYPE == cell_type:
                self._process_timepoints(cell, measurement, row_offset,
                                         column_offset)
            elif ip_constants.HEADER_BATCH_TYPE == cell_type:
                self._process_batch(cell, measurement, row_offset,
                                    column_offset)
            elif ip_constants.HEADER_CONTROL_TYPE == cell_type:
                self._process_control(cell, control_data, measurement)
            elif ip_constants.HEADER_NUM_NEG_CONTROL_TYPE == cell_type:
                num_neg_controls = self._process_num_neg_controls(
                    cell, row_offset, column_offset)
                if num_neg_controls:
                    content_intent.set_numbers_of_negative_controls(
                        num_neg_controls)
            elif ip_constants.HEADER_RNA_INHIBITOR_REACTION_TYPE == cell_type:
                rna_inhibitor_reactions = self._process_rna_inhibitor_reaction(
                    cell, row_offset, column_offset)
                if rna_inhibitor_reactions:
                    content_intent.set_rna_inhibitor_reaction_flags(
                        rna_inhibitor_reactions)
            elif ip_constants.HEADER_DNA_REACTION_CONCENTRATION_TYPE == cell_type:
                dna_reaction_concentrations = self._process_dna_reaction_concentration(
                    cell, row_offset, column_offset)
                if dna_reaction_concentrations:
                    content_intent.set_dna_reaction_concentrations(
                        dna_reaction_concentrations)
            elif ip_constants.HEADER_TEMPLATE_DNA_TYPE == cell_type:
                dna_templates = self._process_template_dna(
                    cell, row_offset, column_offset)
                if dna_templates:
                    content_intent.set_template_dna_values(dna_templates)
            elif ip_constants.HEADER_COLUMN_ID_TYPE == cell_type:
                column_ids = self._process_col_id(cell, row_offset,
                                                  column_offset)
                if column_ids:
                    content_intent.set_column_ids(column_ids)
            elif ip_constants.HEADER_ROW_ID_TYPE == cell_type:
                row_ids = self._process_row_id(cell, row_offset, column_offset)
                if row_ids:
                    content_intent.set_row_ids(row_ids)
            elif ip_constants.HEADER_MEASUREMENT_LAB_ID_TYPE == cell_type:
                lab_ids = self._process_lab_id(cell, row_offset, column_offset)
                if lab_ids:
                    content_intent.set_lab_ids(lab_ids)
            else:
                reagents_and_medias = self._process_reagent_or_media(
                    cell, header_cell, row_offset, column_offset)
                self._processed_reagents_and_medias.extend(reagents_and_medias)
                self._has_medias_and_reagents = True
                for reagent_or_media in reagents_and_medias:
                    if isinstance(reagent_or_media, ReagentIntent):
                        content_intent.add_reagent(reagent_or_media)
                    elif isinstance(reagent_or_media, MediaIntent):
                        content_intent.add_media(reagent_or_media)
                    else:
                        self._validation_errors.append(
                            'Expected to process reagent or media but got %s' %
                            isinstance(reagent_or_media))

        if not content_intent.is_empty():
            measurement.add_content(content_intent)
        return measurement