Integrating latest 47acbe8

This commit is contained in:
alexpete
2021-03-25 13:57:57 -07:00
parent 448c549698
commit 75dc720198
10312 changed files with 2711566 additions and 671451 deletions
@@ -37,29 +37,29 @@
#include <AzToolsFramework/ToolsComponents/EditorComponentBase.h>
#include <AzToolsFramework/AssetBrowser/AssetBrowserEntry.h>
#include <Data/Data.h>
#include <Editor/GraphCanvas/GraphCanvasEditorNotificationBusId.h>
#include <Editor/QtMetaTypes.h>
#include <Editor/Settings.h>
#include <Editor/Translation/TranslationHelper.h>
#include <Editor/View/Widgets/PropertyGridBus.h>
#include <Editor/Assets/ScriptCanvasAssetHelpers.h>
#include <Editor/GraphCanvas/GraphCanvasEditorNotificationBusId.h>
#include <Editor/Include/ScriptCanvas/GraphCanvas/NodeDescriptorBus.h>
#include <Editor/Model/UnitTestBrowserFilterModel.h>
#include <ScriptCanvas/Data/DataRegistry.h>
#include <ScriptCanvas/Assets/ScriptCanvasAsset.h>
#include <ScriptCanvas/Assets/ScriptCanvasAssetHandler.h>
#include <ScriptCanvas/GraphCanvas/NodeDescriptorBus.h>
#include <ScriptCanvas/Bus/ScriptCanvasExecutionBus.h>
#include <ScriptCanvas/Bus/UnitTestVerificationBus.h>
#include <LyViewPaneNames.h>
#include <Editor/Translation/TranslationHelper.h>
#include <Editor/View/Widgets/PropertyGridBus.h>
#include <Editor/View/Widgets/UnitTestPanel/UnitTestDockWidget.h>
#include <Editor/View/Widgets/UnitTestPanel/ui_UnitTestDockWidget.h>
#include <Editor/View/Widgets/UnitTestPanel/moc_UnitTestDockWidget.cpp>
#include <Data/Data.h>
#include <ScriptCanvas/Assets/ScriptCanvasAsset.h>
#include <ScriptCanvas/Assets/ScriptCanvasAssetHandler.h>
#include <ScriptCanvas/Bus/ScriptCanvasExecutionBus.h>
#include <ScriptCanvas/Bus/UnitTestVerificationBus.h>
#include <ScriptCanvas/Data/DataRegistry.h>
#include <ScriptCanvas/GraphCanvas/NodeDescriptorBus.h>
#include <LyViewPaneNames.h>
namespace ScriptCanvasEditor
{
@@ -352,6 +352,38 @@ namespace ScriptCanvasEditor
}
}
QCheckBox* UnitTestDockWidget::GetEnabledCheckBox(ScriptCanvas::ExecutionMode mode)
{
switch (mode)
{
case ScriptCanvas::ExecutionMode::Interpreted:
return m_ui->executionInterpretedEnabled;
case ScriptCanvas::ExecutionMode::Native:
return m_ui->executionNativeEnabled;
default:
AZ_Assert(false, "Unsupported type");
return nullptr;
}
}
QLabel* UnitTestDockWidget::GetStatusLabel(ScriptCanvas::ExecutionMode mode)
{
switch (mode)
{
case ScriptCanvas::ExecutionMode::Interpreted:
return m_ui->labelInterpretedStatus;
case ScriptCanvas::ExecutionMode::Native:
return m_ui->labelNativeStatus;
default:
AZ_Assert(false, "Unsupported type");
return nullptr;
}
}
void UnitTestDockWidget::ClearSearchFilter()
{
{
@@ -423,73 +455,192 @@ namespace ScriptCanvasEditor
}
}
QString ModeToString(ScriptCanvas::ExecutionMode mode)
{
using namespace ScriptCanvas;
switch (mode)
{
case ExecutionMode::Interpreted:
return QString("Interpreted");
case ExecutionMode::Native:
return QString("Native");
default:
return QString("<invalid>");
}
}
bool UnitTestDockWidget::IsModeEnabled(ScriptCanvas::ExecutionMode mode)
{
return GetEnabledCheckBox(mode)->checkState() == Qt::Checked;
}
void UnitTestDockWidget::RunTests(const AZStd::vector<AZ::Uuid>& scriptUuids)
{
m_ui->consoleOutput->hide();
AZStd::vector<ScriptCanvas::ExecutionMode> activeModes;
m_filter->FlushLatestTestRun();
m_filter->TestsStart();
int successCount = 0;
int failureCount = 0;
m_ui->label->setText(QString("Starting %1 tests.").arg(scriptUuids.size()));
for (const AZ::Uuid& scriptUuid : scriptUuids)
auto executionModes = { ExecutionMode::Interpreted, ExecutionMode::Native };
for (auto mode : executionModes)
{
const SourceAssetBrowserEntry* sourceBrowserEntry = SourceAssetBrowserEntry::GetSourceByUuid(scriptUuid);
if (sourceBrowserEntry == nullptr)
if (IsModeEnabled(mode))
{
++failureCount;
activeModes.push_back(mode);
}
else
{
AZStd::string scriptAbsolutePath = sourceBrowserEntry->GetFullPath();
GetStatusLabel(mode)->setText(ModeToString(mode) + QString(" not running"));
}
}
if (activeModes.empty() || scriptUuids.empty())
{
m_ui->consoleOutput->hide();
m_filter->FlushLatestTestRun();
return;
}
else
{
AZ::SystemTickBus::Handler::BusConnect();
Reporter reporter;
m_ui->label->setText(QString("Starting %1 tests.").arg(scriptUuids.size()));
m_filter->FlushLatestTestRun();
m_filter->TestsStart();
m_ui->consoleOutput->hide();
UnitTestWidgetNotificationBus::Broadcast(&UnitTestWidgetNotifications::OnTestStart, scriptUuid);
for (size_t modeIndex = 0; modeIndex < activeModes.size(); ++modeIndex)
{
auto mode = activeModes[modeIndex];
ScriptCanvasExecutionBus::BroadcastResult(reporter, &ScriptCanvasExecutionRequests::RunGraph, scriptAbsolutePath);
GetStatusLabel(mode)->setText(QString("Starting %1 tests.").arg(scriptUuids.size()));
for (const AZ::Uuid& scriptUuid : scriptUuids)
{
const SourceAssetBrowserEntry* sourceBrowserEntry = SourceAssetBrowserEntry::GetSourceByUuid(scriptUuid);
if (sourceBrowserEntry == nullptr)
{
AZ_Error("Script Canvas", false, "The source asset file with ID: %s was not found", scriptUuid.ToString<AZStd::string>().c_str());
continue;
}
UnitTestResult testResult;
UnitTestVerificationBus::BroadcastResult(testResult, &UnitTestVerificationRequests::Verify, reporter);
UnitTestWidgetNotificationBus::Broadcast(&UnitTestWidgetNotifications::OnTestResult, scriptUuid, testResult);
if (testResult.m_success)
{
++successCount;
AZ::Data::AssetInfo assetInfo;
if (AssetHelpers::GetAssetInfo(sourceBrowserEntry->GetFullPath(), assetInfo))
{
auto asset = AZ::Data::AssetManager::Instance().GetAsset(assetInfo.m_assetId, azrtti_typeid<ScriptCanvasAsset>(), AZ::Data::AssetLoadBehavior::PreLoad);
asset.BlockUntilLoadComplete();
if (asset.IsReady())
{
RunTestGraph(asset, mode);
}
}
}
else
{
++failureCount;
}
}
QString executionMessage = QString("Executed %1 out of %2 test(s) - ").arg(successCount + failureCount).arg(scriptUuids.size());
}
}
}
if (successCount > 0)
{
executionMessage += QString("%1 passed").arg(successCount);
}
void UnitTestDockWidget::OnTestsComplete()
{
AZ::SystemTickBus::Handler::BusDisconnect();
if (successCount > 0 && failureCount > 0)
{
executionMessage += ", ";
}
QString testCompletionString;
if (failureCount > 0)
{
executionMessage += QString("%1 failed").arg(failureCount);
}
const int nativeMode = static_cast<int>(ExecutionMode::Native);
if (m_testMetrics[nativeMode].m_graphsTested > 0)
{
testCompletionString = ModeToString(ExecutionMode::Native);
testCompletionString += QString(": ");
executionMessage += ".";
testCompletionString += QString("Attempted %1 test(s) - %2 Succeeded, %3 Failed, %4 Failed to Compile")
.arg(m_testMetrics[nativeMode].m_graphsTested)
.arg(m_testMetrics[nativeMode].m_success)
.arg(m_testMetrics[nativeMode].m_failures)
.arg(m_testMetrics[nativeMode].m_compilationFailures);
m_ui->label->setText(QString(executionMessage));
GetStatusLabel(ExecutionMode::Native)->setText(testCompletionString);
}
const int interpretedMode = static_cast<int>(ExecutionMode::Interpreted);
if (m_testMetrics[interpretedMode].m_graphsTested > 0)
{
testCompletionString = ModeToString(ExecutionMode::Interpreted);
testCompletionString += QString(": ");
testCompletionString += QString("Attempted %1 test(s) - %2 Succeeded, %3 Failed, %4 Failed to Compile")
.arg(m_testMetrics[interpretedMode].m_graphsTested)
.arg(m_testMetrics[interpretedMode].m_success)
.arg(m_testMetrics[interpretedMode].m_failures)
.arg(m_testMetrics[interpretedMode].m_compilationFailures);
GetStatusLabel(ExecutionMode::Interpreted)->setText(testCompletionString);
}
m_filter->TestsEnd();
m_ui->label->setText(QString("Finished"));
m_testMetrics[nativeMode].Clear();
m_testMetrics[interpretedMode].Clear();
}
void UnitTestDockWidget::RunTestGraph(AZ::Data::Asset<AZ::Data::AssetData> asset, ScriptCanvas::ExecutionMode mode)
{
Reporter reporter;
UnitTestWidgetNotificationBus::Broadcast(&UnitTestWidgetNotifications::OnTestStart, asset.GetId().m_guid);
ScriptCanvasExecutionBus::BroadcastResult(reporter, &ScriptCanvasExecutionRequests::RunAssetGraph, asset, mode);
UnitTestResult testResult;
UnitTestVerificationBus::BroadcastResult(testResult, &UnitTestVerificationRequests::Verify, reporter);
UnitTestWidgetNotificationBus::Broadcast(&UnitTestWidgetNotifications::OnTestResult, asset.GetId().m_guid, testResult);
m_pendingTests.Add(asset.GetId(), mode);
++m_testMetrics[static_cast<int>(mode)].m_graphsTested;
if (testResult.m_compiled)
{
if (testResult.m_completed)
{
++m_testMetrics[static_cast<int>(mode)].m_success;
}
else
{
++m_testMetrics[static_cast<int>(mode)].m_failures;
}
}
else
{
++m_testMetrics[static_cast<int>(mode)].m_compilationFailures;
}
m_pendingTests.Complete(asset.GetId(), mode);
}
void UnitTestDockWidget::OnSystemTick()
{
if (m_pendingTests.IsFinished())
{
OnTestsComplete();
}
}
void UnitTestDockWidget::PendingTests::Add(AZ::Data::AssetId assetId, ExecutionMode mode)
{
m_pendingTests.push_back(AZStd::make_pair(assetId, mode));
}
void UnitTestDockWidget::PendingTests::Complete(AZ::Data::AssetId assetId, ExecutionMode mode)
{
AZStd::erase_if(m_pendingTests, [assetId, mode](const AZStd::pair<AZ::Data::AssetId, ExecutionMode>& pending)
{
return (assetId == pending.first && mode == pending.second);
});
}
bool UnitTestDockWidget::PendingTests::IsFinished() const
{
return m_pendingTests.empty();
}
}
@@ -25,11 +25,12 @@
#include <QStyledItemDelegate>
#include <QPainter>
#include <AzCore/Component/EntityId.h>
#include <AzCore/Casting/numeric_cast.h>
#include <AzCore/Component/ComponentApplicationBus.h>
#include <AzCore/Component/Entity.h>
#include <AzCore/Component/EntityId.h>
#include <AzCore/Component/TickBus.h>
#include <AzCore/std/containers/vector.h>
#include <AzCore/Casting/numeric_cast.h>
#include <AzToolsFramework/API/ToolsApplicationAPI.h>
@@ -125,6 +126,8 @@ namespace ScriptCanvasEditor
, public GraphCanvas::AssetEditorNotificationBus::Handler
, public AzToolsFramework::EditorEvents::Bus::Handler
, public UnitTestWidgetNotificationBus::Handler
, private AZ::Data::AssetBus::MultiHandler
, private AZ::SystemTickBus::Handler
{
Q_OBJECT
@@ -147,6 +150,9 @@ namespace ScriptCanvasEditor
void OnResultsButtonClicked(QModelIndex index);
private:
bool IsModeEnabled(ScriptCanvas::ExecutionMode mode);
QLabel* GetStatusLabel(ScriptCanvas::ExecutionMode mode);
QCheckBox* GetEnabledCheckBox(ScriptCanvas::ExecutionMode mode);
void ClearSearchFilter();
void UpdateSearchFilter();
@@ -160,6 +166,12 @@ namespace ScriptCanvasEditor
void OpenTestResults(AZ::Uuid sourceUuid, AZStd::string_view sourceDisplayName);
void RunTests(const AZStd::vector<AZ::Uuid>& scriptUuids);
void RunTestGraph(AZ::Data::Asset<AZ::Data::AssetData>, ScriptCanvas::ExecutionMode);
void OnTestsComplete();
void OnSystemTick() override;
AZ::EntityId m_scriptCanvasGraphId;
AZ::EntityId m_graphCanvasGraphId;
@@ -171,5 +183,39 @@ namespace ScriptCanvasEditor
ItemButtonsDelegate* m_itemButtonsDelegate;
QTimer m_filterTimer;
class PendingTests
{
public:
void Add(AZ::Data::AssetId assetId, ExecutionMode mode);
void Complete(AZ::Data::AssetId assetId, ExecutionMode mode);
bool IsFinished() const;
private:
AZStd::vector<AZStd::pair<AZ::Data::AssetId, ExecutionMode>> m_pendingTests;
};
PendingTests m_pendingTests;
struct TestMetrics
{
int m_graphsTested = 0;
int m_success = 0;
int m_failures = 0;
int m_compilationFailures = 0;
void Clear()
{
m_graphsTested = 0;
m_success = 0;
m_failures = 0;
m_compilationFailures = 0;
}
};
TestMetrics m_testMetrics[static_cast<int>(ExecutionMode::COUNT)];
};
}
}
@@ -26,189 +26,298 @@
<string>Test Manager</string>
</property>
<widget class="QWidget" name="dockWidgetContents">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPushButton" name="runButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Run Selected Tests</string>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="AzQtComponents::SearchLineEdit" name="searchFilter">
<property name="placeholderText">
<string>Search...</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QFrame" name="unitTestFrame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<property name="spacing">
<number>4</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="ScriptCanvasEditor::UnitTestTreeView" name="testsTree">
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
<property name="dragEnabled">
<bool>false</bool>
</property>
<property name="alternatingRowColors">
<bool>false</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QFrame" name="consoleOutput">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="spacing">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="testResultsLabel">
<property name="text">
<string>Test Results</string>
</property>
</widget>
</item>
<item alignment="Qt::AlignRight">
<widget class="QPushButton" name="closeResults">
<property name="toolTip">
<string>Close Frame</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../../Windows/ScriptCanvasEditorResources.qrc">
<normaloff>:/ScriptCanvasEditorResources/Resources/lineedit_clear.png</normaloff>:/ScriptCanvasEditorResources/Resources/lineedit_clear.png</iconset>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QPlainTextEdit" name="testResultsOutput">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
<widget class="QPushButton" name="runButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>100</height>
</size>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
<property name="textInteractionFlags">
<set>Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
</property>
<property name="text">
<string>Run Selected Tests</string>
</property>
</widget>
</item>
<item>
<widget class ="QCheckBox" name ="graphTraversalExecutionEnabled">
<property name = "text">
<string>Graph Traversal Execution</string>
</property>
</widget>
</item>
<item>
<widget class ="QCheckBox" name ="executionInterpretedEnabled">
<property name = "text">
<string>Interpreted Execution</string>
</property>
</widget>
</item>
<item>
<widget class ="QCheckBox" name ="executionNativeEnabled">
<property name = "text">
<string>Native Execution</string>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="AzQtComponents::SearchLineEdit" name="searchFilter">
<property name="placeholderText">
<string>Search...</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QFrame" name="labelFrame">
<property name="minimumSize">
<size>
<width>0</width>
</item>
<item>
<widget class="QFrame" name="unitTestFrame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<property name="spacing">
<number>4</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="ScriptCanvasEditor::UnitTestTreeView" name="testsTree">
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
<property name="dragEnabled">
<bool>false</bool>
</property>
<property name="alternatingRowColors">
<bool>false</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QFrame" name="consoleOutput">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="spacing">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="testResultsLabel">
<property name="text">
<string>Test Results</string>
</property>
</widget>
</item>
<item alignment="Qt::AlignRight">
<widget class="QPushButton" name="closeResults">
<property name="toolTip">
<string>Close Frame</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../../Windows/ScriptCanvasEditorResources.qrc">
<normaloff>:/ScriptCanvasEditorResources/Resources/lineedit_clear.png</normaloff>:/ScriptCanvasEditorResources/Resources/lineedit_clear.png
</iconset>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QPlainTextEdit" name="testResultsOutput">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>100</height>
</size>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
<property name="textInteractionFlags">
<set>Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QFrame" name="labelFrame">
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>640</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Selected 0 test(s).</string>
</property>
</widget>
</widget>
</item>
</layout>
</size>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>640</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Selected 0 test(s).</string>
</property>
</widget>
</widget>
</item>
<item>
<widget class="QFrame" name="labelGraphTraversalFrame">
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<widget class="QLabel" name="labelGraphTraversalStatus">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>640</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Graph Traversal Tests</string>
</property>
</widget>
</widget>
</item>
<item>
<widget class="QFrame" name="labelInterpretedFrame">
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<widget class="QLabel" name="labelInterpretedStatus">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>640</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Interpreted Tests</string>
</property>
</widget>
</widget>
</item>
<item>
<widget class="QFrame" name="labelNativeFrame">
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<widget class="QLabel" name="labelNativeStatus">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>640</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Native Tests</string>
</property>
</widget>
</widget>
</item>
</layout>
</widget>
</widget>
<customwidgets>