def test_header_tooltip(self):

        rat = get_rat(self.raster_layer_color, 1)
        model = RATModel(rat)
        tooltip = model.getHeaderTooltip(1)
        self.assertIn('<dt>Role</dt><dd>Class value(min=max)</dd>', tooltip)
        self.assertIn('<dt>Type</dt><dd>Integer</dd>', tooltip)
        tooltip = model.getHeaderTooltip(2)
        self.assertIn('<dt>Role</dt><dd>Histogram pixel count</dd>', tooltip)
        self.assertIn('<dt>Type</dt><dd>Integer</dd>', tooltip)
        tooltip = model.getHeaderTooltip(3)
        self.assertIn('<dt>Role</dt><dd>General purpose field</dd>', tooltip)
        self.assertIn('<dt>Type</dt><dd>String</dd>', tooltip)
    def test_remove_color(self):

        rat = get_rat(self.raster_layer_color, 1)
        model = RATModel(rat)
        tester = QAbstractItemModelTester(
            model, QAbstractItemModelTester.FailureReportingMode.Warning)

        self.assertTrue({'R', 'G', 'B'}.issubset(rat.keys))
        self.assertTrue({'R', 'G', 'B'}.issubset(model.headers))
        self.assertTrue(model.has_color)
        column_count = model.columnCount(QModelIndex())
        self.assertEqual(column_count, 17)

        # Remove colors
        self.assertTrue(model.remove_color())
        self.assertEqual(model.columnCount(QModelIndex()), column_count - 4)

        self.assertFalse(rat.has_color)
        self.assertFalse(model.has_color)
        self.assertFalse({'R', 'G', 'B'}.issubset(rat.keys))
        self.assertFalse({'R', 'G', 'B'}.issubset(model.headers))

        # Add color back (with alpha)
        self.assertTrue(model.insert_color(2))
        self.assertEqual(model.columnCount(QModelIndex()), column_count + 1)
        self.assertTrue({'R', 'G', 'B'}.issubset(rat.keys))
        self.assertTrue({'R', 'G', 'B'}.issubset(model.headers))
        self.assertTrue(rat.has_color)
        self.assertTrue(model.has_color)
        self.assertTrue(RAT_COLOR_HEADER_NAME in rat.keys)
    def loadRat(self, band_0_based) -> bool:
        """Load RAT for raster band 0-based"""

        if type(band_0_based) != int:
            rat_log(
                QCoreApplication.translate(
                    'RAT', 'Invalid band number for the selected raster.'),
                Qgis.Critical)
            return False

        self.mClassifyComboBox.clear()

        self.rat = get_rat(self.raster_layer, band_0_based + 1)

        if self.rat.keys:
            self.model = RATModel(self.rat)
            if os.environ.get('CI'):
                self.tester = QAbstractItemModelTester(self.model)
            self.model.dataChanged.connect(self.dirty)
            self.model.rowsInserted.connect(self.dirty)
            self.model.rowsRemoved.connect(self.dirty)
            self.model.columnsInserted.connect(self.dirty)
            self.model.columnsRemoved.connect(self.dirty)
            self.model.columnsInserted.connect(self.updateClassify)
            self.model.columnsRemoved.connect(self.updateClassify)
            self.proxyModel = QSortFilterProxyModel(self)
            self.proxyModel.setSourceModel(self.model)
            self.mRATView.setModel(self.proxyModel)
            self.mRATView.selectionModel().selectionChanged.connect(
                self.updateButtons)

            # Color picker
            if self.rat.has_color:
                if gdal.GFU_Alpha in self.rat.field_usages:
                    colorDelegate = ColorAlphaDelegate(self.mRATView)
                else:
                    colorDelegate = ColorDelegate(self.mRATView)
                self.mRATView.setItemDelegateForColumn(0, colorDelegate)

            self.updateClassify()
            self.mRATView.sortByColumn(
                self.model.headers.index(self.rat.value_columns[0]),
                Qt.AscendingOrder)
            return True
        else:
            rat_log(
                QCoreApplication.translate(
                    'RAT',
                    'There is no Raster Attribute Table for the selected raster.'
                ), Qgis.Critical)
            return False
    def test_edit_color(self):

        rat = get_rat(self.raster_layer_color, 1)
        model = RATModel(rat)
        tester = QAbstractItemModelTester(
            model, QAbstractItemModelTester.FailureReportingMode.Warning)

        index = model.index(0, 0)
        value = QColor(Qt.magenta)
        model.setData(index, value)

        self.assertEqual(model.data(index, Qt.BackgroundColorRole), value)
    def test_remove_column(self):

        rat = get_rat(self.raster_layer, 1)
        self.assertTrue(rat.isValid())

        model = RATModel(rat)
        tester = QAbstractItemModelTester(
            model, QAbstractItemModelTester.FailureReportingMode.Warning)
        column_count = model.columnCount(QModelIndex())
        self.assertFalse(model.remove_column(0)[0])
        self.assertFalse(model.remove_column(1)[0])
        self.assertTrue(model.remove_column(2)[0])
        self.assertEqual(model.columnCount(QModelIndex()), column_count - 1)
    def test_insert_column_color(self):

        rat = get_rat(self.raster_layer_color, 1)
        self.assertTrue(rat.isValid())

        model = RATModel(rat)
        tester = QAbstractItemModelTester(
            model, QAbstractItemModelTester.FailureReportingMode.Warning)
        column_count = model.columnCount(QModelIndex())
        field = RATField('f1', gdal.GFU_Generic, gdal.GFT_String)
        self.assertTrue(model.insert_column(3, field)[0])
        self.assertEqual(model.columnCount(QModelIndex()), column_count + 1)
        self.assertEqual(model.headers.index('f1'), 3)

        # Error
        field = RATField('f1', gdal.GFU_Generic, gdal.GFT_String)
        self.assertFalse(model.insert_column(3, field)[0])
        self.assertEqual(model.columnCount(QModelIndex()), column_count + 1)
        def _test(raster_layer):

            rat = get_rat(self.raster_layer_color, 1)
            model = RATModel(rat)
            tester = QAbstractItemModelTester(
                model, QAbstractItemModelTester.FailureReportingMode.Warning)

            row_count = model.rowCount(QModelIndex())
            value_index = 1 if model.has_color else 0
            value_0 = model.data(model.index(0, value_index, QModelIndex()))
            value_last = model.data(
                model.index(row_count - 1, value_index, QModelIndex()))

            # Insert first
            self.assertTrue(model.insert_row(0))
            self.assertEqual(model.rowCount(QModelIndex()), row_count + 1)
            self.assertNotEqual(
                model.data(model.index(0, value_index, QModelIndex())),
                value_0)
            self.assertEqual(
                model.data(model.index(0, value_index, QModelIndex())), 0)

            self.assertTrue(model.remove_row(0))
            self.assertEqual(model.rowCount(QModelIndex()), row_count)
            self.assertEqual(
                model.data(model.index(0, value_index, QModelIndex())),
                value_0)

            # Insert last
            self.assertTrue(model.insert_row(row_count))
            self.assertEqual(model.rowCount(QModelIndex()), row_count + 1)
            self.assertNotEqual(
                model.data(model.index(row_count, value_index, QModelIndex())),
                value_last)
            self.assertEqual(
                model.data(model.index(row_count, value_index, QModelIndex())),
                0)
            self.assertEqual(
                model.data(
                    model.index(row_count - 1, value_index, QModelIndex())),
                value_last)

            self.assertTrue(model.remove_row(row_count))
            self.assertEqual(model.rowCount(QModelIndex()), row_count)
            self.assertEqual(
                model.data(
                    model.index(row_count - 1, value_index, QModelIndex())),
                value_last)