text: // Copyright (c) 2018 The Syscoin Core developers
  // Distributed under the MIT software license, see the accompanying
  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
  
  #include <qt/test/apptests.h>
  
  #include <chainparams.h>
  #include <qt/syscoin.h>
  #include <qt/syscoingui.h>
  #include <qt/networkstyle.h>
  #include <qt/rpcconsole.h>
  #include <shutdown.h>
  #include <validation.h>
  
  #if defined(HAVE_CONFIG_H)
  #include <config/syscoin-config.h>
  #endif
  
  #include <QAction>
  #include <QEventLoop>
  #include <QLineEdit>
  #include <QScopedPointer>
  #include <QTest>
  #include <QTextEdit>
  #include <QtGlobal>
  #include <QtTest/QtTestWidgets>
  #include <QtTest/QtTestGui>
  #include <new>
  #include <string>
  #include <univalue.h>
  
  namespace {
  //! Call getblockchaininfo RPC and check first field of JSON output.
  void TestRpcCommand(RPCConsole* console)
  {
      QEventLoop loop;
      QTextEdit* messagesWidget = console->findChild<QTextEdit*>("messagesWidget");
      QObject::connect(messagesWidget, &QTextEdit::textChanged, &loop, &QEventLoop::quit);
      QLineEdit* lineEdit = console->findChild<QLineEdit*>("lineEdit");
      QTest::keyClicks(lineEdit, "getblockchaininfo");
      QTest::keyClick(lineEdit, Qt::Key_Return);
      loop.exec();
      QString output = messagesWidget->toPlainText();
      UniValue value;
      value.read(output.right(output.size() - output.lastIndexOf(QChar::ObjectReplacementCharacter) - 1).toStdString());
      QCOMPARE(value["chain"].get_str(), std::string("regtest"));
  }
  } // namespace
  
  //! Entry point for SyscoinApplication tests.
  void AppTests::appTests()
  {
  #ifdef Q_OS_MAC
      if (QApplication::platformName() == "minimal") {
          // Disable for mac on "minimal" platform to avoid crashes inside the Qt
          // framework when it tries to look up unimplemented cocoa functions,
          // and fails to handle returned nulls
          // (https://bugreports.qt.io/browse/QTBUG-49686).
          QWARN("Skipping AppTests on mac build with 'minimal' platform set due to Qt bugs. To run AppTests, invoke "
                "with 'test_syscoin-qt -platform cocoa' on mac, or else use a linux or windows build.");
          return;
      }
  #endif
  
      m_app.parameterSetup();
      m_app.createOptionsModel(true /* reset settings */);
      QScopedPointer<const NetworkStyle> style(
          NetworkStyle::instantiate(QString::fromStdString(Params().NetworkIDString())));
      m_app.setupPlatformStyle();
      m_app.createWindow(style.data());
      connect(&m_app, &SyscoinApplication::windowShown, this, &AppTests::guiTests);
      expectCallback("guiTests");
      // SYSCOIN
      m_app.baseInitialize(nullptr);
      m_app.requestInitialize();
      m_app.exec();
      m_app.requestShutdown();
      m_app.exec();
  
      // Reset global state to avoid interfering with later tests.
      AbortShutdown();
      UnloadBlockIndex();
  }
  
  //! Entry point for SyscoinGUI tests.
  void AppTests::guiTests(SyscoinGUI* window)
  {
      HandleCallback callback{"guiTests", *this};
      connect(window, &SyscoinGUI::consoleShown, this, &AppTests::consoleTests);
      expectCallback("consoleTests");
      QAction* action = window->findChild<QAction*>("openRPCConsoleAction");
      action->activate(QAction::Trigger);
  }
  
  //! Entry point for RPCConsole tests.
  void AppTests::consoleTests(RPCConsole* console)
  {
      HandleCallback callback{"consoleTests", *this};
      TestRpcCommand(console);
  }
  
  //! Destructor to shut down after the last expected callback completes.
  AppTests::HandleCallback::~HandleCallback()
  {
      auto& callbacks = m_app_tests.m_callbacks;
      auto it = callbacks.find(m_callback);
      assert(it != callbacks.end());
      callbacks.erase(it);
      if (callbacks.empty()) {
          m_app_tests.m_app.quit();
      }
  }
  