UnitTestDockWidget.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #if !defined(Q_MOC_RUN)
  10. #include <QAbstractListModel>
  11. #include <QAbstractItemView>
  12. #include <QListView>
  13. #include <QVBoxLayout>
  14. #include <QHeaderView>
  15. #include <QTimer>
  16. #include <QSortFilterProxyModel>
  17. #include <QStandardItemModel>
  18. #include <QFocusEvent>
  19. #include <QMenu>
  20. #include <QStyledItemDelegate>
  21. #include <QPainter>
  22. #include <AzCore/Casting/numeric_cast.h>
  23. #include <AzCore/Component/ComponentApplicationBus.h>
  24. #include <AzCore/Component/Entity.h>
  25. #include <AzCore/Component/EntityId.h>
  26. #include <AzCore/Component/TickBus.h>
  27. #include <AzCore/std/containers/vector.h>
  28. #include <AzToolsFramework/API/ToolsApplicationAPI.h>
  29. #include <AzQtComponents/Components/StyledDockWidget.h>
  30. #include <GraphCanvas/Editor/AssetEditorBus.h>
  31. #include <GraphCanvas/Components/GraphCanvasPropertyBus.h>
  32. #include <GraphCanvas/Components/SceneBus.h>
  33. #include <GraphCanvas/Components/Nodes/NodeBus.h>
  34. #include <GraphCanvas/Components/Nodes/NodeTitleBus.h>
  35. #include <GraphCanvas/Widgets/GraphCanvasTreeItem.h>
  36. #include <GraphCanvas/Widgets/GraphCanvasTreeModel.h>
  37. #include <ScriptCanvas/Bus/RequestBus.h>
  38. #include <ScriptCanvas/Bus/UnitTestVerificationBus.h>
  39. #endif
  40. class QAction;
  41. class QLineEdit;
  42. class QPushButton;
  43. namespace Ui
  44. {
  45. class UnitTestDockWidget;
  46. }
  47. namespace AzToolsFramework
  48. {
  49. namespace AssetBrowser
  50. {
  51. class SourceAssetBrowserEntry;
  52. }
  53. }
  54. namespace ScriptCanvasEditor
  55. {
  56. class ItemButtonsDelegate
  57. : public QStyledItemDelegate
  58. {
  59. Q_OBJECT
  60. public:
  61. explicit ItemButtonsDelegate(QObject* parent = nullptr);
  62. ItemButtonsDelegate(const ItemButtonsDelegate&) = delete;
  63. ItemButtonsDelegate& operator= (const ItemButtonsDelegate&) = delete;
  64. void paint(QPainter* painter, const QStyleOptionViewItem &option, const QModelIndex& index) const override;
  65. bool editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index) override;
  66. Q_SIGNALS:
  67. void EditButtonClicked(QModelIndex);
  68. void ResultsButtonClicked(QModelIndex);
  69. private:
  70. QPoint GetEditPosition(const QStyleOptionViewItem& option) const;
  71. QPoint GetResultsPosition(const QStyleOptionViewItem& option) const;
  72. QPixmap m_editIcon;
  73. static const int m_leftIconPadding = 9;
  74. };
  75. class UnitTestComponent
  76. : public GraphCanvas::GraphCanvasPropertyComponent
  77. {
  78. public:
  79. AZ_COMPONENT(UnitTestComponent, "{D4C073E6-DBFA-48A0-8B43-0A699A6CE293}", GraphCanvasPropertyComponent);
  80. static void Reflect(AZ::ReflectContext*);
  81. static AZ::Entity* CreateUnitTestEntity();
  82. UnitTestComponent();
  83. ~UnitTestComponent() override = default;
  84. AZStd::string_view GetTitle();
  85. private:
  86. AZStd::string m_componentTitle;
  87. };
  88. class UnitTestDockWidget;
  89. class UnitTestBrowserFilterModel;
  90. class UnitTestContextMenu
  91. : public QMenu
  92. {
  93. public:
  94. UnitTestContextMenu(UnitTestDockWidget* dockWidget, AzToolsFramework::AssetBrowser::SourceAssetBrowserEntry* sourceEntry);
  95. };
  96. class UnitTestDockWidget
  97. : public AzQtComponents::StyledDockWidget
  98. , public GraphCanvas::AssetEditorNotificationBus::Handler
  99. , public AzToolsFramework::EditorEvents::Bus::Handler
  100. , public UnitTestWidgetNotificationBus::Handler
  101. , private AZ::Data::AssetBus::MultiHandler
  102. , private AZ::SystemTickBus::Handler
  103. {
  104. Q_OBJECT
  105. public:
  106. AZ_CLASS_ALLOCATOR(UnitTestDockWidget, AZ::SystemAllocator);
  107. UnitTestDockWidget(QWidget* parent = nullptr);
  108. ~UnitTestDockWidget();
  109. // ScriptCanvasEditor::UnitTestWidgetNotificationBus
  110. void OnCheckStateCountChange(const int count) override;
  111. ////
  112. friend class UnitTestContextMenu;
  113. public Q_SLOTS:
  114. void OnContextMenuRequested(const QPoint &pos);
  115. void OnRowDoubleClicked(QModelIndex index);
  116. void OnEditButtonClicked(QModelIndex index);
  117. void OnResultsButtonClicked(QModelIndex index);
  118. private:
  119. bool IsModeEnabled(ScriptCanvas::ExecutionMode mode);
  120. QLabel* GetStatusLabel(ScriptCanvas::ExecutionMode mode);
  121. QCheckBox* GetEnabledCheckBox(ScriptCanvas::ExecutionMode mode);
  122. void ClearSearchFilter();
  123. void UpdateSearchFilter();
  124. void OnReturnPressed();
  125. void OnQuickFilterChanged(const QString &text);
  126. void OnStartTestsButton();
  127. void OnCloseResultsButton();
  128. void OpenScriptInEditor(AZ::Uuid sourceUuid);
  129. void OpenTestResults(AZ::Uuid sourceUuid, AZStd::string_view sourceDisplayName);
  130. void RunTests(const AZStd::vector<AZ::Uuid>& scriptUuids);
  131. void RunTestGraph(SourceHandle sourceHandle, ScriptCanvas::ExecutionMode);
  132. void OnTestsComplete();
  133. void OnSystemTick() override;
  134. AZ::EntityId m_scriptCanvasGraphId;
  135. AZ::EntityId m_graphCanvasGraphId;
  136. bool widgetActive;
  137. AZStd::unique_ptr<Ui::UnitTestDockWidget> m_ui;
  138. UnitTestBrowserFilterModel* m_filter;
  139. ItemButtonsDelegate* m_itemButtonsDelegate;
  140. QTimer m_filterTimer;
  141. class PendingTests
  142. {
  143. public:
  144. void Add(SourceHandle assetId, ExecutionMode mode);
  145. void Complete(SourceHandle assetId, ExecutionMode mode);
  146. bool IsFinished() const;
  147. private:
  148. AZStd::vector<AZStd::pair<SourceHandle, ExecutionMode>> m_pendingTests;
  149. };
  150. PendingTests m_pendingTests;
  151. struct TestMetrics
  152. {
  153. int m_graphsTested = 0;
  154. int m_success = 0;
  155. int m_failures = 0;
  156. int m_compilationFailures = 0;
  157. void Clear()
  158. {
  159. m_graphsTested = 0;
  160. m_success = 0;
  161. m_failures = 0;
  162. m_compilationFailures = 0;
  163. }
  164. };
  165. TestMetrics m_testMetrics[static_cast<int>(ExecutionMode::COUNT)];
  166. };
  167. }