Example #1
0
    def test_summary(self):
        """Check if the status bar is updated when data is received"""
        data = self.iris
        input_sum = self.widget.info.set_input_summary = Mock()
        output_sum = self.widget.info.set_output_summary = Mock()

        self.send_signal(self.widget.Inputs.data, data)
        input_sum.assert_called_with(len(data), format_summary_details(data))
        output = self.get_output(self.widget.Outputs.filtered_data)
        self.assertIsNone(output)
        simulate.combobox_activate_item(self.widget.controls.row_feature,
                                        self.iris.domain.attributes[0].name)
        simulate.combobox_activate_item(self.widget.controls.col_feature,
                                        self.iris.domain.class_var.name)
        self.widget.table_view.set_selection(set([(11, 0), (11, 1), (12, 0)]))
        self.widget.table_view.selection_changed.emit()
        filtered = self.get_output(self.widget.Outputs.filtered_data)
        pivot = self.get_output(self.widget.Outputs.pivot_table)
        grouped = self.get_output(self.widget.Outputs.grouped_data)
        output_sum.assert_called_with(
            f"{len(pivot)}, {len(filtered)}, {len(grouped)}",
            format_multiple_summaries([("Pivot table", pivot),
                                       ("Filtered data", filtered),
                                       ("Grouped data", grouped)]),
            format=1)
        input_sum.reset_mock()
        output_sum.reset_mock()
        self.send_signal(self.widget.Inputs.data, None)
        input_sum.assert_called_once()
        self.assertEqual(input_sum.call_args[0][0].brief, "")
        output_sum.assert_called_once()
        self.assertEqual(output_sum.call_args[0][0].brief, "")
Example #2
0
    def test_multiple_summaries(self):
        data = Table('zoo')
        extra_data = Table('zoo')[20:]
        n_features_data = len(data.domain.variables) + len(data.domain.metas)
        n_features_extra_data = len(extra_data.domain.variables) + \
                                len(extra_data.domain.metas)
        details = f'Data:<br>zoo: {len(data)} instance, ' \
                  f'{n_features_data} variables<br>' \
                  f'Features: {len(data.domain.attributes)} categorical ' \
                  f'(no missing values)<br>' \
                  f'Target: categorical<br>' \
                  f'Metas: string<hr>'\
                  f'Extra Data:<br>zoo: {len(extra_data)} instances, ' \
                  f'{n_features_extra_data} variables<br>' \
                  f'Features: {len(extra_data.domain.attributes)} ' \
                  f'categorical (no missing values)<br>' \
                  f'Target: categorical<br>' \
                  f'Metas: string'
        inputs = [('Data', data), ('Extra Data', extra_data)]
        self.assertEqual(details, format_multiple_summaries(inputs))

        details = f'zoo: {len(data)} instance, ' \
                  f'{n_features_data} variables<br>' \
                  f'Features: {len(data.domain.attributes)} categorical ' \
                  f'(no missing values)<br>' \
                  f'Target: categorical<br>' \
                  f'Metas: string<hr>'\
                  f'zoo: {len(extra_data)} instances, ' \
                  f'{n_features_extra_data} variables<br>' \
                  f'Features: {len(extra_data.domain.attributes)} ' \
                  f'categorical (no missing values)<br>' \
                  f'Target: categorical<br>' \
                  f'Metas: string'
        inputs = [('', data), ('', extra_data)]
        self.assertEqual(details, format_multiple_summaries(inputs))

        details = f'No data on output.<hr>' \
                  f'Extra data:<br>zoo: {len(extra_data)} instances, ' \
                  f'{n_features_extra_data} variables<br>' \
                  f'Features: {len(extra_data.domain.attributes)} ' \
                  f'categorical (no missing values)<br>' \
                  f'Target: categorical<br>' \
                  f'Metas: string<hr>'\
                  f'No data on output.'
        outputs = [('', None), ('Extra data', extra_data), ('', None)]
        self.assertEqual(details,
                         format_multiple_summaries(outputs, type_io='output'))
Example #3
0
    def test_summary(self):
        """Check if the status bar is updated when data is received"""
        info = self.widget.info
        no_input, no_output = "No data on input", "No data on output"

        self.send_signal(self.widget.Inputs.primary_data, self.iris)
        data_list = [("Primary data", self.iris), ("", None)]
        summary, details = "150, 0", format_multiple_summaries(data_list)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        output = self.get_output(self.widget.Outputs.data)
        summary, details = f"{len(output)}", format_summary_details(output)
        self.assertEqual(info._StateInfo__output_summary.brief, summary)
        self.assertEqual(info._StateInfo__output_summary.details, details)

        self.send_signal(self.widget.Inputs.additional_data, self.titanic, 0)
        data_list = [("Primary data", self.iris), ("", self.titanic)]
        summary, details = "150, 2201", format_multiple_summaries(data_list)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        output = self.get_output(self.widget.Outputs.data)
        summary, details = f"{len(output)}", format_summary_details(output)
        self.assertEqual(info._StateInfo__output_summary.brief, summary)
        self.assertEqual(info._StateInfo__output_summary.details, details)

        self.send_signal(self.widget.Inputs.primary_data, None)
        self.send_signal(self.widget.Inputs.additional_data, self.iris, 1)
        data_list = [("Primary data", None), ("", self.titanic),
                     ("", self.iris)]
        summary, details = "0, 2201, 150", format_multiple_summaries(data_list)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        output = self.get_output(self.widget.Outputs.data)
        summary, details = f"{len(output)}", format_summary_details(output)
        self.assertEqual(info._StateInfo__output_summary.brief, summary)
        self.assertEqual(info._StateInfo__output_summary.details, details)

        self.send_signal(self.widget.Inputs.additional_data, None, 0)
        self.send_signal(self.widget.Inputs.additional_data, None, 1)
        self.assertEqual(info._StateInfo__input_summary.brief, "")
        self.assertEqual(info._StateInfo__input_summary.details, no_input)
        self.assertEqual(info._StateInfo__output_summary.brief, "")
        self.assertEqual(info._StateInfo__output_summary.details, no_output)
Example #4
0
    def _set_input_summary(self):
        n_data = len(self.data) if self.data else 0
        n_refs = len(self.reference) if self.reference else 0
        summary, details, kwargs = self.info.NoInput, "", {}

        if self.data or self.reference:
            summary = f"{self.info.format_number(n_data)}, " \
                      f"{self.info.format_number(n_refs)}"
            data_list = [("Data", self.data), ("Reference", self.reference)]
            details = format_multiple_summaries(data_list)
            kwargs = {"format": Qt.RichText}
        self.info.set_input_summary(summary, details, **kwargs)
    def test_summary(self):
        """Check if the status bar is updated when data is received"""
        data = Table("iris")
        info = self.widget.info
        no_input, no_output = "No data on input", "No data on output"

        self.send_signal(self.widget.Inputs.data, data)
        data_list = [("Data", data), ("Data subset", None)]
        summary, details = f"{len(data)}, 0", format_multiple_summaries(
            data_list)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        self.assertEqual(info._StateInfo__output_summary.brief, "0")

        self.send_signal(self.widget.Inputs.data_subset, data)
        data_list = [("Data", data), ("Data subset", data)]
        summary = f"{len(data)}, {len(data)}"
        details = format_multiple_summaries(data_list)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        output = self.get_output(self.widget.Outputs.matching_data)
        summary, details = f"{len(output)}", format_summary_details(output)
        self.assertEqual(info._StateInfo__output_summary.brief, summary)
        self.assertEqual(info._StateInfo__output_summary.details, details)

        self.send_signal(self.widget.Inputs.data, None)
        data_list = [("Data", None), ("Data subset", data)]
        summary, details = f"0, {len(data)}", format_multiple_summaries(
            data_list)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        self.assertEqual(info._StateInfo__output_summary.brief, "")
        self.assertEqual(info._StateInfo__output_summary.details, no_output)

        self.send_signal(self.widget.Inputs.data_subset, None)
        self.assertEqual(info._StateInfo__input_summary.brief, "")
        self.assertEqual(info._StateInfo__input_summary.details, no_input)
        self.assertEqual(info._StateInfo__output_summary.brief, "")
        self.assertEqual(info._StateInfo__output_summary.details, no_output)
 def handleNewSignals(self):
     summary, details, kwargs = self.info.NoInput, "", {}
     if self.data or self.template_data:
         n_data = len(self.data) if self.data else 0
         n_template = len(self.template_data) if self.template_data else 0
         summary = f"{self.info.format_number(n_data)}, " \
                   f"{self.info.format_number(n_template)}"
         kwargs = {"format": Qt.RichText}
         details = format_multiple_summaries([("Data", self.data),
                                              ("Template data",
                                               self.template_data)])
     self.info.set_input_summary(summary, details, **kwargs)
     self.apply()
Example #7
0
    def test_summary(self):
        info = self.widget.info
        reference = self.data[:1]
        no_input, no_output = "No data on input", "No data on output"

        self.assertIsInstance(info._StateInfo__input_summary, StateInfo.Empty)
        self.assertEqual(info._StateInfo__input_summary.details, no_input)
        self.assertIsInstance(info._StateInfo__output_summary, StateInfo.Empty)
        self.assertEqual(info._StateInfo__output_summary.details, no_output)

        self.send_signal(self.widget.Inputs.data, self.data)
        data_list = [("Data", self.data), ("Reference", None)]
        summary, details = "150, 0", format_multiple_summaries(data_list)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)

        output = self.get_output(self.widget.Outputs.data)
        details = format_summary_details(output)
        self.assertEqual(info._StateInfo__output_summary.brief, "151")
        self.assertEqual(info._StateInfo__output_summary.details, details)

        self.send_signal(self.widget.Inputs.reference, reference)
        data_list = [("Data", self.data), ("Reference", reference)]
        summary, details = "150, 1", format_multiple_summaries(data_list)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)

        self.send_signal(self.widget.Inputs.data, None)
        data_list = [("Data", None), ("Reference", reference)]
        summary, details = "0, 1", format_multiple_summaries(data_list)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        self.assertIsInstance(info._StateInfo__output_summary, StateInfo.Empty)
        self.assertEqual(info._StateInfo__output_summary.details, no_output)

        self.send_signal(self.widget.Inputs.reference, None)
        self.assertIsInstance(info._StateInfo__input_summary, StateInfo.Empty)
        self.assertEqual(info._StateInfo__input_summary.details, no_input)
Example #8
0
    def handleNewSignals(self):
        summary, details, kwargs = self.info.NoInput, "", {}
        if self.data or self.data_subset:
            n_data = len(self.data) if self.data else 0
            n_data_subset = len(self.data_subset) if self.data_subset else 0
            summary = f"{self.info.format_number(n_data)}, " \
                      f"{self.info.format_number(n_data_subset)}"
            kwargs = {"format": Qt.RichText}
            details = format_multiple_summaries([("Data", self.data),
                                                 ("Data subset",
                                                  self.data_subset)])
        self.info.set_input_summary(summary, details, **kwargs)

        self._invalidate()
Example #9
0
    def test_summary(self):
        """Check if status bar is updated when data is received"""
        info = self.widget.info
        data, reference = Table("iris"), Table("iris")[:5]
        no_input, no_output = "No data on input", "No data on output"

        self.send_signal(self.widget.Inputs.data, data)
        data_list = [("Data", data), ("Reference", None)]
        summary, details = "150, 0", format_multiple_summaries(data_list)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        self.assertEqual(info._StateInfo__output_summary.brief, "")
        self.assertEqual(info._StateInfo__output_summary.details, no_output)

        self.send_signal(self.widget.Inputs.reference, reference)
        data_list = [("Data", data), ("Reference", reference)]
        summary, details = "150, 5", format_multiple_summaries(data_list)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        output = self.get_output(self.widget.Outputs.data)
        summary, details = f"{len(output)}", format_summary_details(output)
        self.assertEqual(info._StateInfo__output_summary.brief, summary)
        self.assertEqual(info._StateInfo__output_summary.details, details)

        self.send_signal(self.widget.Inputs.data, None)
        data_list = [("Data", None), ("Reference", reference)]
        summary, details = "0, 5", format_multiple_summaries(data_list)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        self.assertEqual(info._StateInfo__output_summary.brief, "")
        self.assertEqual(info._StateInfo__output_summary.details, no_output)

        self.send_signal(self.widget.Inputs.reference, None)
        self.assertEqual(info._StateInfo__input_summary.brief, "")
        self.assertEqual(info._StateInfo__input_summary.details, no_input)
        self.assertEqual(info._StateInfo__output_summary.brief, "")
        self.assertEqual(info._StateInfo__output_summary.details, no_output)
Example #10
0
 def set_input_summary(self):
     summary, details, kwargs = self.info.NoInput, "", {}
     if self.data and self.test_data:
         summary = f"{self.info.format_number(len(self.data))}," \
                   f" {self.info.format_number(len(self.test_data))}"
         details = format_multiple_summaries([
             ("Data", self.data), ("Test data", self.test_data)
         ])
         kwargs = {"format": Qt.RichText}
     elif self.data and not self.test_data:
         summary, details = len(self.data), format_summary_details(self.data)
     elif self.test_data and not self.data:
         summary = len(self.test_data)
         details = format_summary_details(self.test_data)
     self.info.set_input_summary(summary, details, **kwargs)
Example #11
0
 def set_output_summary(self, pivot: Table, filtered: Table,
                        grouped: Table):
     summary, detail, kwargs = self.info.NoOutput, "", {}
     if pivot or filtered or grouped:
         n_pivot = len(pivot) if pivot else 0
         n_filtered = len(filtered) if filtered else 0
         n_grouped = len(grouped) if grouped else 0
         summary = f"{self.info.format_number(n_pivot)}, " \
                   f"{self.info.format_number(n_filtered)}, " \
                   f"{self.info.format_number(n_grouped)}"
         detail = format_multiple_summaries([("Pivot table", pivot),
                                             ("Filtered data", filtered),
                                             ("Grouped data", grouped)])
         kwargs = {"format": Qt.RichText}
     self.info.set_output_summary(summary, detail, **kwargs)
Example #12
0
    def _set_input_summary(self):
        more_data = list(self.more_data.values()) if self.more_data else [None]
        n_primary = len(self.primary_data) if self.primary_data else 0
        n_more_data = [len(data) if data else 0 for data in more_data]

        summary, details, kwargs = self.info.NoInput, "", {}
        if self.primary_data or self.more_data:
            summary = f"{self.info.format_number(n_primary)}, " \
                    + ", ".join(self.info.format_number(i) for i in n_more_data)
            details = format_multiple_summaries([("Primary data",
                                                  self.primary_data)] +
                                                [("", data)
                                                 for data in more_data])
            kwargs = {"format": Qt.RichText}
        self.info.set_input_summary(summary, details, **kwargs)
    def check_inputs(self):
        if self.data and len(self.data) > 1:
            self.Information.multiple_instances()

        summary, details, kwargs = self.info.NoInput, "", {}
        if self.data or self.background_data:
            n_data = len(self.data) if self.data else 0
            n_background_data = len(self.background_data) \
                if self.background_data else 0
            summary = f"{self.info.format_number(n_background_data)}, " \
                      f"{self.info.format_number(n_data)}"
            kwargs = {"format": Qt.RichText}
            details = format_multiple_summaries([("Background data",
                                                  self.background_data),
                                                 ("Data", self.data)])
        self.info.set_input_summary(summary, details, **kwargs)
Example #14
0
    def handleNewSignals(self):
        self.closeContext()
        self.attr_pairs = [self._find_best_match()]
        self.openContext(self.data and self.data.domain, self.extra_data
                         and self.extra_data.domain)
        self.attr_boxes.set_state(self.attr_pairs)

        summary, details, kwargs = self.info.NoInput, "", {}
        if self.data or self.extra_data:
            n_data = len(self.data) if self.data else 0
            n_extra_data = len(self.extra_data) if self.extra_data else 0
            summary = f"{self.info.format_number(n_data)}, " \
                      f"{self.info.format_number(n_extra_data)}"
            kwargs = {"format": Qt.RichText}
            details = format_multiple_summaries([("Data", self.data),
                                                 ("Extra data",
                                                  self.extra_data)])
        self.info.set_input_summary(summary, details, **kwargs)

        self.unconditional_commit()
Example #15
0
    def test_summary(self):
        """Check if the status bar updates when data is on input"""
        iris = Table("iris")
        train, test = iris[:120], iris[120:]
        info = self.widget.info
        no_input, no_output = "No data on input", "No data on output"

        self.send_signal(self.widget.Inputs.train_data, train)
        self.send_signal(self.widget.Inputs.learner,
                         LogisticRegressionLearner(), 0)
        summary, details = f"{len(train)}", format_summary_details(train)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        output = self.get_output(self.widget.Outputs.predictions)
        summary, details = f"{len(output)}", format_summary_details(output)
        self.assertEqual(info._StateInfo__output_summary.brief, summary)
        self.assertEqual(info._StateInfo__output_summary.details, details)

        self.send_signal(self.widget.Inputs.test_data, test)
        summary = f"{len(train)}, {len(test)}"
        details = format_multiple_summaries([("Data", train),
                                             ("Test data", test)])
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        output = self.get_output(self.widget.Outputs.predictions)
        summary, details = f"{len(output)}", format_summary_details(output)
        self.assertEqual(info._StateInfo__output_summary.brief, summary)
        self.assertEqual(info._StateInfo__output_summary.details, details)

        self.send_signal(self.widget.Inputs.train_data, None)
        summary, details = f"{len(test)}", format_summary_details(test)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        self.assertEqual(info._StateInfo__output_summary.brief, "-")
        self.assertEqual(info._StateInfo__output_summary.details, no_output)

        self.send_signal(self.widget.Inputs.test_data, None)
        self.assertEqual(info._StateInfo__input_summary.brief, "-")
        self.assertEqual(info._StateInfo__input_summary.details, no_input)
        self.assertEqual(info._StateInfo__output_summary.brief, "-")
        self.assertEqual(info._StateInfo__output_summary.details, no_output)
Example #16
0
    def test_output(self):
        # send data and template data
        info = self.widget.info
        no_input, no_output = "No data on input", "No data on output"
        self.send_signal(self.widget.Inputs.data, self.data[::15])
        self.send_signal(self.widget.Inputs.template_data, self.disc_data)
        output = self.get_output(self.widget.Outputs.transformed_data)
        self.assertTableEqual(output, self.disc_data[::15])
        self.assertEqual("Input data with 10 instances and 4 features.",
                         self.widget.input_label.text())
        self.assertEqual("Template domain applied.",
                         self.widget.template_label.text())
        self.assertEqual("Output data includes 4 features.",
                         self.widget.output_label.text())
        data_list = [("Data", self.data[::15]),
                     ("Template data", self.disc_data)]
        summary, details = "10, 150", format_multiple_summaries(data_list)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        summary, details = "10", format_summary_details(output)
        self.assertEqual(info._StateInfo__output_summary.brief, summary)
        self.assertEqual(info._StateInfo__output_summary.details, details)

        # remove template data
        self.send_signal(self.widget.Inputs.template_data, None)
        output = self.get_output(self.widget.Outputs.transformed_data)
        self.assertIsNone(output)
        self.assertEqual("Input data with 10 instances and 4 features.",
                         self.widget.input_label.text())
        self.assertEqual("No template data on input.",
                         self.widget.template_label.text())
        self.assertEqual("", self.widget.output_label.text())
        data_list = [("Data", self.data[::15]), ("Template data", None)]
        summary, details = "10, 0", format_multiple_summaries(data_list)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        self.assertEqual(info._StateInfo__output_summary.brief, "-")
        self.assertEqual(info._StateInfo__output_summary.details, no_output)

        # send template data
        self.send_signal(self.widget.Inputs.template_data, self.disc_data)
        output = self.get_output(self.widget.Outputs.transformed_data)
        self.assertTableEqual(output, self.disc_data[::15])
        self.assertEqual("Input data with 10 instances and 4 features.",
                         self.widget.input_label.text())
        self.assertEqual("Template domain applied.",
                         self.widget.template_label.text())
        self.assertEqual("Output data includes 4 features.",
                         self.widget.output_label.text())

        # remove data
        self.send_signal(self.widget.Inputs.data, None)
        output = self.get_output(self.widget.Outputs.transformed_data)
        self.assertIsNone(output)
        self.assertEqual("No data on input.", self.widget.input_label.text())
        self.assertEqual("Template data includes 4 features.",
                         self.widget.template_label.text())
        self.assertEqual("", self.widget.output_label.text())
        data_list = [("Data", None), ("Template data", self.disc_data)]
        summary, details = "0, 150", format_multiple_summaries(data_list)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        self.assertEqual(info._StateInfo__output_summary.brief, "-")
        self.assertEqual(info._StateInfo__output_summary.details, no_output)

        # remove template data
        self.send_signal(self.widget.Inputs.template_data, None)
        self.assertEqual("No data on input.", self.widget.input_label.text())
        self.assertEqual("No template data on input.",
                         self.widget.template_label.text())
        self.assertEqual("", self.widget.output_label.text())
        self.assertEqual(info._StateInfo__input_summary.brief, "-")
        self.assertEqual(info._StateInfo__input_summary.details, no_input)
        self.assertEqual(info._StateInfo__output_summary.brief, "-")
        self.assertEqual(info._StateInfo__output_summary.details, no_output)
Example #17
0
    def test_summary(self):
        """Check if status bar is updated when data is received"""
        info = self.widget.info
        no_input, no_output = "No data on input", "No data on output"

        zoo = Table("zoo")
        data_list = [("zoo", zoo)]
        self.send_signal(self.widget.Inputs.data, zoo, 1)
        summary, details = "101", format_multiple_summaries(data_list)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        self.assertEqual(info._StateInfo__output_summary.brief, "")
        self.assertEqual(info._StateInfo__output_summary.details, no_output)
        self._select_data()
        output = self.get_output(self.widget.Outputs.selected_data)
        summary, details = f"{len(output)}", format_summary_details(output)
        self.assertEqual(info._StateInfo__output_summary.brief, summary)
        self.assertEqual(info._StateInfo__output_summary.details, details)

        iris = Table("iris")
        data_list = [("zoo", zoo), ("iris", iris)]
        self.send_signal(self.widget.Inputs.data, iris, 2)
        summary, details = "101, 150", format_multiple_summaries(data_list)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        self.assertEqual(info._StateInfo__output_summary.brief, "")
        self.assertEqual(info._StateInfo__output_summary.details, no_output)
        self._select_data()
        output = self.get_output(self.widget.Outputs.selected_data)
        summary, details = f"{len(output)}", format_summary_details(output)
        self.assertEqual(info._StateInfo__output_summary.brief, summary)
        self.assertEqual(info._StateInfo__output_summary.details, details)

        brown = Table("brown-selected")
        data_list = [("zoo", zoo), ("iris", iris), ("brown-selected", brown)]
        self.send_signal(self.widget.Inputs.data, brown, 3)
        summary, details = "101, 150, 186", format_multiple_summaries(data_list)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        self._select_data()
        output = self.get_output(self.widget.Outputs.selected_data)
        summary, details = f"{len(output)}", format_summary_details(output)
        self.assertEqual(info._StateInfo__output_summary.brief, summary)
        self.assertEqual(info._StateInfo__output_summary.details, details)

        self.send_signal(self.widget.Inputs.data, None, 1)
        data_list = [("iris", iris), ("brown-selected", brown)]
        summary, details = "150, 186", format_multiple_summaries(data_list)
        self.assertEqual(info._StateInfo__input_summary.brief, summary)
        self.assertEqual(info._StateInfo__input_summary.details, details)
        self.assertEqual(info._StateInfo__output_summary.brief, "")
        self.assertEqual(info._StateInfo__output_summary.details, no_output)
        self._select_data()
        output = self.get_output(self.widget.Outputs.selected_data)
        summary, details = f"{len(output)}", format_summary_details(output)
        self.assertEqual(info._StateInfo__output_summary.brief, summary)
        self.assertEqual(info._StateInfo__output_summary.details, details)

        self.send_signal(self.widget.Inputs.data, None, 2)
        self.send_signal(self.widget.Inputs.data, None, 3)
        self.assertEqual(info._StateInfo__input_summary.brief, "")
        self.assertEqual(info._StateInfo__input_summary.details, no_input)
        self.assertEqual(info._StateInfo__output_summary.brief, "")
        self.assertEqual(info._StateInfo__output_summary.details, no_output)