1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00
JUCE/examples/Demo/Source/Demos/UnitTestsDemo.cpp
2014-11-12 17:18:18 +00:00

193 lines
6 KiB
C++

/*
==============================================================================
This file is part of the JUCE library - "Jules' Utility Class Extensions"
Copyright 2004-12 by Raw Material Software Ltd.
------------------------------------------------------------------------------
JUCE can be redistributed and/or modified under the terms of the GNU General
Public License (Version 2), as published by the Free Software Foundation.
A copy of the license is included in the JUCE distribution, or can be found
online at www.gnu.org/licenses.
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
------------------------------------------------------------------------------
To release a closed-source product which uses JUCE, commercial licenses are
available: visit www.rawmaterialsoftware.com/juce for more information.
==============================================================================
*/
#include "../JuceDemoHeader.h"
struct UnitTestClasses
{
class UnitTestsDemo;
class TestRunnerThread;
//==============================================================================
// This subclass of UnitTestRunner is used to redirect the test output to our
// TextBox, and to interrupt the running tests when our thread is asked to stop..
class CustomTestRunner : public UnitTestRunner
{
public:
CustomTestRunner (TestRunnerThread& trt) : owner (trt)
{
}
void logMessage (const String& message) override
{
owner.logMessage (message);
}
bool shouldAbortTests() override
{
return owner.threadShouldExit();
}
private:
TestRunnerThread& owner;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CustomTestRunner);
};
//==============================================================================
class TestRunnerThread : public Thread,
private Timer
{
public:
TestRunnerThread (UnitTestsDemo& utd)
: Thread ("Unit Tests"),
owner (utd)
{
}
void run() override
{
CustomTestRunner runner (*this);
runner.runAllTests();
startTimer (50); // when finished, start the timer which will
// wait for the thread to end, then tell our component.
}
void logMessage (const String& message)
{
MessageManagerLock mm (this);
if (mm.lockWasGained()) // this lock may fail if this thread has been told to stop
owner.logMessage (message);
}
void timerCallback() override
{
if (! isThreadRunning())
owner.testFinished(); // inform the demo page when done, so it can delete this thread.
}
private:
UnitTestsDemo& owner;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TestRunnerThread);
};
//==============================================================================
class UnitTestsDemo : public Component,
public Button::Listener
{
public:
UnitTestsDemo()
: startTestButton ("Run Unit Tests...")
{
setOpaque (true);
addAndMakeVisible (startTestButton);
addAndMakeVisible (testResultsBox);
testResultsBox.setMultiLine (true);
testResultsBox.setFont (Font (Font::getDefaultMonospacedFontName(), 12.0f, Font::plain));
startTestButton.addListener (this);
logMessage ("This panel runs all the built-in JUCE unit-tests.\n");
logMessage ("To add your own unit-tests, see the JUCE_UNIT_TESTS macro.");
}
~UnitTestsDemo()
{
stopTest();
}
//==============================================================================
void paint (Graphics& g) override
{
g.fillAll (Colours::grey);
}
void resized() override
{
Rectangle<int> r (getLocalBounds().reduced (6));
startTestButton.setBounds (r.removeFromTop (25).removeFromLeft (200));
testResultsBox.setBounds (r.withTrimmedTop (5));
}
void buttonClicked (Button* buttonThatWasClicked) override
{
if (buttonThatWasClicked == &startTestButton)
{
startTest();
}
}
void startTest()
{
testResultsBox.clear();
startTestButton.setEnabled (false);
currentTestThread = new TestRunnerThread (*this);
currentTestThread->startThread();
}
void stopTest()
{
if (currentTestThread != nullptr)
{
currentTestThread->stopThread (15000);
currentTestThread = nullptr;
}
}
void logMessage (const String& message)
{
testResultsBox.moveCaretToEnd();
testResultsBox.insertTextAtCaret (message + newLine);
testResultsBox.moveCaretToEnd();
}
void testFinished()
{
stopTest();
startTestButton.setEnabled (true);
logMessage (newLine + "*** Tests finished ***");
}
private:
ScopedPointer<TestRunnerThread> currentTestThread;
TextButton startTestButton;
TextEditor testResultsBox;
Label label;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UnitTestsDemo);
};
};
// This static object will register this demo type in a global list of demos..
static JuceDemoType<UnitTestClasses::UnitTestsDemo> demo ("40 Unit Tests");