/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file LICENSE.rst or https://cmake.org/licensing for details.  */
#include "QCMakeCacheModelTest.h"

#include <algorithm>
#include <iostream>

#include "QCMakeCacheView.h"
#include <QtTest>

namespace {
QCMakeProperty makeProperty(
  QString const& name, QString const& value,
  QCMakeProperty::PropertyType type = QCMakeProperty::STRING,
  bool advanced = false)
{
  return QCMakeProperty{
    /*Key=*/name,
    /*Value=*/value,
    /*Strings=*/{},
    /*Help=*/"",
    /*Type=*/type,
    /*Advanced=*/advanced,
  };
}
}

void QCMakeCacheModelTest::setNewProperties()
{
  QFETCH(QCMakePropertyList, oldList);
  QFETCH(QCMakePropertyList, newList);
  QFETCH(QVector<QString>, names);
  QFETCH(QVector<QString>, values);
  QFETCH(QVector<QVariant>, background);

  QCMakeCacheModel model;
  model.setViewType(QCMakeCacheModel::FlatView);
  model.setProperties(oldList);
  model.setProperties(newList);

  auto rows = model.rowCount();
  QVector<QString> actualNames(rows);
  QVector<QString> actualValues(rows);
  QVector<QVariant> actualBackground1(rows);
  QVector<QVariant> actualBackground2(rows);
  for (int i = 0; i < rows; ++i) {
    auto idx1 = model.index(i, 0);
    auto idx2 = model.index(i, 1);

    auto name = model.data(idx1, Qt::DisplayRole);
    QVERIFY(name.canConvert<QString>());
    actualNames[i] = name.value<QString>();

    auto value = model.data(idx2, Qt::DisplayRole);
    QVERIFY(name.canConvert<QString>());
    actualValues[i] = value.value<QString>();

    actualBackground1[i] = model.data(idx1, Qt::BackgroundRole);
    actualBackground2[i] = model.data(idx2, Qt::BackgroundRole);
  }

  QCOMPARE(actualNames, names);
  QCOMPARE(actualValues, values);
  QCOMPARE(actualBackground1, background);
  QCOMPARE(actualBackground2, background);
}

void QCMakeCacheModelTest::setNewProperties_data()
{
  QTest::addColumn<QCMakePropertyList>("oldList");
  QTest::addColumn<QCMakePropertyList>("newList");
  QTest::addColumn<QVector<QString>>("names");
  QTest::addColumn<QVector<QString>>("values");
  QTest::addColumn<QVector<QVariant>>("background");

  QTest::newRow("empty") << QCMakePropertyList{} << QCMakePropertyList{}
                         << QVector<QString>{} << QVector<QString>{}
                         << QVector<QVariant>{};
  QTest::newRow("noNew") << QCMakePropertyList{ makeProperty("VARIABLE_1",
                                                             "Value 1") }
                         << QCMakePropertyList{} << QVector<QString>{}
                         << QVector<QString>{} << QVector<QVariant>{};
  QTest::newRow("allNew")
    << QCMakePropertyList{}
    << QCMakePropertyList{ makeProperty("VARIABLE_1", "Value 1") }
    << QVector<QString>{ "VARIABLE_1" } << QVector<QString>{ "Value 1" }
    << QVector<QVariant>{ QBrush{ QColor{ 255, 100, 100 } } };
  QTest::newRow("mixed")
    << QCMakePropertyList{ makeProperty("VARIABLE_1", "Value 1") }
    << QCMakePropertyList{ makeProperty("VARIABLE_2", "Value 2") }
    << QVector<QString>{ "VARIABLE_2" } << QVector<QString>{ "Value 2" }
    << QVector<QVariant>{ QBrush{ QColor{ 255, 100, 100 } } };
  QTest::newRow("overridden")
    << QCMakePropertyList{ makeProperty("VARIABLE_1", "Value 1") }
    << QCMakePropertyList{ makeProperty("VARIABLE_1", "Overridden value") }
    << QVector<QString>{ "VARIABLE_1" }
    << QVector<QString>{ "Overridden value" }
    << QVector<QVariant>{ QVariant{} };
  QTest::newRow("overriddenMixed")
    << QCMakePropertyList{ makeProperty("VARIABLE_1", "Value 1") }
    << QCMakePropertyList{ makeProperty("VARIABLE_1", "Overridden value"),
                           makeProperty("VARIABLE_2", "Value 2") }
    << QVector<QString>{ "VARIABLE_2", "VARIABLE_1" }
    << QVector<QString>{ "Value 2", "Overridden value" }
    << QVector<QVariant>{ QBrush{ QColor{ 255, 100, 100 } }, QVariant{} };
}

QTEST_MAIN(QCMakeCacheModelTest)
