// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm

#include <QString>
#include <QtTest>
#include "libvideostitch-gui/mainwindow/versionHelper.hpp"

class UpdateCheckerTest : public QObject {
  Q_OBJECT

 private Q_SLOTS:
  void checkUpdate();
  void checkUpdate_data();

  void checkAppInfo();
  void checkAppInfo_data();

  void versionToString();
  void versionToString_data();

  void appInfoToString();
  void appInfoToString_data();
};

void UpdateCheckerTest::checkUpdate() {
  QFETCH(QString, currentVer);
  QFETCH(QString, remoteVer);
  QFETCH(bool, isOlder);
  VideoStitch::Helper::AppsVersion version1(currentVer);
  VideoStitch::Helper::AppsVersion version2(remoteVer);
  QCOMPARE(version1 < version2, isOlder);
}

void UpdateCheckerTest::checkUpdate_data() {
  QTest::addColumn<QString>("currentVer");
  QTest::addColumn<QString>("remoteVer");
  QTest::addColumn<bool>("isOlder");

  QTest::newRow("Major version superior") << "v2.0.0"
                                          << "v1.0.0" << false;
  QTest::newRow("Medium version superior") << "v1.2.0"
                                           << "v1.1.0" << false;
  QTest::newRow("Minor version superior") << "v0.0.2"
                                          << "v0.0.1" << false;

  QTest::newRow("Major version inferior") << "v1.0.0"
                                          << "v2.0.0" << true;
  QTest::newRow("Medium version inferior") << "v1.1.0"
                                           << "v1.2.0" << true;
  QTest::newRow("Minor version inferior") << "v0.0.1"
                                          << "v0.0.2" << true;

  QTest::newRow("Major & Medium version inferior") << "v1.1.0"
                                                   << "v2.2.0" << true;
  QTest::newRow("Major & Minor inferior") << "v1.0.1"
                                          << "v2.0.2" << true;
  QTest::newRow("All inferior") << "v0.0.1"
                                << "v2.2.2" << true;

  QTest::newRow("Major & Medium version superior") << "v2.2.0"
                                                   << "v1.1.0" << false;
  QTest::newRow("Major & Minor superior") << "v2.0.2"
                                          << "v1.0.1" << false;
  QTest::newRow("All superior") << "v2.2.2"
                                << "v0.0.1" << false;
  QTest::newRow("All equal") << "v2.2.2"
                             << "v2.2.2" << false;

  QTest::newRow("Two digits") << "v12.0.0"
                              << "v9.0.0" << false;

  QTest::newRow("Major & Medium version inferior without v") << "1.1.0"
                                                             << "2.2.0" << true;
  QTest::newRow("Major & Minor inferior without v") << "1.0.1"
                                                    << "2.0.2" << true;
  QTest::newRow("All inferior without v") << "0.0.1"
                                          << "2.2.2" << true;

  QTest::newRow("With channel") << "1.1.0.alpha1"
                                << "1.1.0.alpha1" << false;
  QTest::newRow("With superior channel") << "1.1.0.beta1"
                                         << "1.1.0.alpha1" << false;
  QTest::newRow("With inferior channel") << "1.1.0.alpha1"
                                         << "1.1.0.beta1" << true;
  QTest::newRow("With inferior channel") << "1.1.0.beta1"
                                         << "1.1.0.rc1" << true;
  QTest::newRow("Without superior channel (alpha)") << "1.1.0"
                                                    << "1.1.0.alpha1" << false;
  QTest::newRow("Without superior channel (beta)") << "1.1.0"
                                                   << "1.1.0.beta1" << false;
  QTest::newRow("Without inferior channel (beta)") << "1.1.0.beta1"
                                                   << "1.1.0" << true;
  QTest::newRow("With superior channel") << "1.1.0.beta1"
                                         << "1.1.0.beta2" << true;
  QTest::newRow("Without inferior channel") << "1.1.0.beta2"
                                            << "1.1.0.beta1" << false;
  QTest::newRow("Without channel + inferior minor") << "v1.2.0"
                                                    << "v1.3.0.beta1" << true;
  QTest::newRow("With channel + superior minor") << "v1.3.0.beta1"
                                                 << "v1.2.0" << false;
  QTest::newRow("With case sensitivity") << "v1.1.0.alpha1"
                                         << "v1.1.0.RC1" << true;
}

void UpdateCheckerTest::checkAppInfo() {
  QFETCH(QString, appInfoString);
  QFETCH(bool, isDevVersion);
  VideoStitch::Helper::AppsInfo appInfo(appInfoString);
  QCOMPARE(appInfo.isDevVersion(), isDevVersion);
}

void UpdateCheckerTest::checkAppInfo_data() {
  QTest::addColumn<QString>("appInfoString");
  QTest::addColumn<bool>("isDevVersion");

  QTest::newRow("Dev version, two - in branch name")
      << "AppName-v1.1.5-16246-g42c3f6ce8a-some-branch-name.2017-01-02" << true;
  QTest::newRow("Dev version, one - in branch name")
      << "AppName-v1.1.5-16246-g42c3f6ce8a-somebranch-name.2017-01-02" << true;
  QTest::newRow("Dev version, no -") << "VahanaVR-v1.1.5-16246-g42c3f6ce8a-somebranchname.2017-01-02" << true;

  QTest::newRow("Public version, VahanaVR") << "VahanaVR-v1.1.5-stable-vahanaVR.2017-01-02" << false;
  QTest::newRow("Public version, Studio") << "VahanaVR-v1.1.5-stable-studio.2017-01-02" << false;
}

void UpdateCheckerTest::versionToString() {
  QFETCH(QString, versionString);
  QFETCH(QString, expectedString);
  VideoStitch::Helper::AppsVersion version(versionString);
  QCOMPARE(version.toString(), expectedString);
}

void UpdateCheckerTest::versionToString_data() {
  QTest::addColumn<QString>("versionString");
  QTest::addColumn<QString>("expectedString");

  QTest::newRow("Release tag") << "v1.0.0"
                               << "v1.0.0";
  QTest::newRow("alpha1 tag") << "v1.0.0.alpha1"
                              << "v1.0.0.alpha1";
  QTest::newRow("beta1 tag") << "v1.0.0.beta1"
                             << "v1.0.0.beta1";
  QTest::newRow("rc1 tag") << "v1.0.0.rc1"
                           << "v1.0.0.RC1";
  QTest::newRow("Upper case tag") << "v1.0.0.BETA1"
                                  << "v1.0.0.beta1";
  QTest::newRow("dev tag") << "v1.0.0.beta1-53-dummyhash123"
                           << "v1.0.0.beta1";
  QTest::newRow("With product name") << "VahanaVR-v1.0.0.beta1-53"
                                     << "v1.0.0.beta1";
  QTest::newRow("With product name and date") << "VahanaVR-v1.0.0.beta1-53-dummyhash123-branchname.2017-01-02"
                                              << "v1.0.0.beta1";
}

void UpdateCheckerTest::appInfoToString() {
  QFETCH(QString, appInfoString);
  QFETCH(QString, expectedString);
  VideoStitch::Helper::AppsInfo appInfo(appInfoString);
  QCOMPARE(appInfo.toString(), expectedString);
}

void UpdateCheckerTest::appInfoToString_data() {
  QTest::addColumn<QString>("appInfoString");
  QTest::addColumn<QString>("expectedString");

  QTest::newRow("Dev tag") << "VahanaVR-v1.0.0.beta1-53-dummyhash123-branchname.2017-01-02"
                           << "VahanaVR-v1.0.0.beta1-dummyhash123-branchname";
  QTest::newRow("Dev tag, multi -") << "VahanaVR-v1.0.0.beta1-53-dummyhash123-some-branch-name.2017-01-02"
                                    << "VahanaVR-v1.0.0.beta1-dummyhash123-some-branch-name";
  QTest::newRow("Public beta1 tag") << "VahanaVR-v1.0.0.beta1-stable-vahanaVR.2017-01-02"
                                    << "VahanaVR-v1.0.0.beta1";
  QTest::newRow("Public rc1 tag") << "VahanaVR-v1.0.0.rc1-stable-vahanaVR.2017-01-02"
                                  << "VahanaVR-v1.0.0.RC1";
  QTest::newRow("Public release tag") << "VahanaVR-v1.0.0-stable-vahanaVR.2017-01-02"
                                      << "VahanaVR-v1.0.0";
}

QTEST_APPLESS_MAIN(UpdateCheckerTest)
#include "updateCheckerTest.moc"