mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
237 lines
7.1 KiB
C++
237 lines
7.1 KiB
C++
/*
|
|
==============================================================================
|
|
|
|
This file is part of the JUCE library.
|
|
Copyright (c) 2013 - Raw Material Software Ltd.
|
|
|
|
Permission is granted to use this software under the terms of either:
|
|
a) the GPL v2 (or any later version)
|
|
b) the Affero GPL v3
|
|
|
|
Details of these licenses can be found 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.juce.com for more information.
|
|
|
|
==============================================================================
|
|
*/
|
|
|
|
OSCBundle::OSCBundle()
|
|
{
|
|
}
|
|
|
|
OSCBundle::OSCBundle (OSCTimeTag t) : timeTag (t)
|
|
{
|
|
}
|
|
|
|
// Note: The class invariant of OSCBundle::Element is that
|
|
// at least one of the pointers bundle and message is nullptr
|
|
// and the other one always points to a valid object.
|
|
|
|
OSCBundle::Element::Element (OSCMessage m)
|
|
: message (new OSCMessage (m)), bundle (nullptr)
|
|
{
|
|
}
|
|
|
|
OSCBundle::Element::Element (OSCBundle b)
|
|
: message (nullptr), bundle (new OSCBundle (b))
|
|
{
|
|
}
|
|
|
|
//==============================================================================
|
|
OSCBundle::Element::Element (const Element& other)
|
|
{
|
|
if (this != &other)
|
|
{
|
|
message = nullptr;
|
|
bundle = nullptr;
|
|
|
|
if (other.isMessage())
|
|
message = new OSCMessage (other.getMessage());
|
|
else
|
|
bundle = new OSCBundle (other.getBundle());
|
|
}
|
|
}
|
|
|
|
//==============================================================================
|
|
OSCBundle::Element::~Element()
|
|
{
|
|
bundle = nullptr;
|
|
message = nullptr;
|
|
}
|
|
|
|
//==============================================================================
|
|
bool OSCBundle::Element::isMessage() const noexcept
|
|
{
|
|
return message != nullptr;
|
|
}
|
|
|
|
bool OSCBundle::Element::isBundle() const noexcept
|
|
{
|
|
return bundle != nullptr;
|
|
}
|
|
|
|
//==============================================================================
|
|
const OSCMessage& OSCBundle::Element::getMessage() const
|
|
{
|
|
if (message == nullptr)
|
|
{
|
|
// This element is not a bundle! You must check this first before accessing.
|
|
jassertfalse;
|
|
throw OSCInternalError ("Access error in OSC bundle element.");
|
|
}
|
|
|
|
return *message;
|
|
}
|
|
|
|
//==============================================================================
|
|
const OSCBundle& OSCBundle::Element::getBundle() const
|
|
{
|
|
if (bundle == nullptr)
|
|
{
|
|
// This element is not a bundle! You must check this first before accessing.
|
|
jassertfalse;
|
|
throw OSCInternalError ("Access error in OSC bundle element.");
|
|
}
|
|
|
|
return *bundle;
|
|
}
|
|
|
|
//==============================================================================
|
|
#if JUCE_UNIT_TESTS
|
|
|
|
class OSCBundleTests : public UnitTest
|
|
{
|
|
public:
|
|
OSCBundleTests() : UnitTest ("OSCBundle class") {}
|
|
|
|
void runTest()
|
|
{
|
|
beginTest ("Construction");
|
|
{
|
|
OSCBundle bundle;
|
|
expect (bundle.getTimeTag().isImmediately());
|
|
}
|
|
|
|
beginTest ("Construction with time tag");
|
|
{
|
|
Time in100Seconds = (Time (Time::currentTimeMillis()) + RelativeTime (100.0));
|
|
OSCBundle bundle (in100Seconds);
|
|
expect (! bundle.getTimeTag().isImmediately());
|
|
expect (bundle.getTimeTag().toTime() == in100Seconds);
|
|
}
|
|
|
|
beginTest ("Usage when containing messages");
|
|
{
|
|
OSCBundle testBundle = generateTestBundle();
|
|
expectBundleEqualsTestBundle (testBundle);
|
|
|
|
}
|
|
|
|
beginTest ("Usage when containing other bundles (recursively)");
|
|
{
|
|
OSCBundle complexTestBundle;
|
|
complexTestBundle.addElement (generateTestBundle());
|
|
complexTestBundle.addElement (OSCMessage ("/test/"));
|
|
complexTestBundle.addElement (generateTestBundle());
|
|
|
|
expect (complexTestBundle.size() == 3);
|
|
|
|
OSCBundle::Element* elements = complexTestBundle.begin();
|
|
|
|
expect (! elements[0].isMessage());
|
|
expect (elements[0].isBundle());
|
|
expect (elements[1].isMessage());
|
|
expect (! elements[1].isBundle());
|
|
expect (! elements[2].isMessage());
|
|
expect (elements[2].isBundle());
|
|
|
|
expectBundleEqualsTestBundle (elements[0].getBundle());
|
|
expect (elements[1].getMessage().size() == 0);
|
|
expect (elements[1].getMessage().getAddressPattern().toString() == "/test");
|
|
expectBundleEqualsTestBundle (elements[2].getBundle());
|
|
}
|
|
}
|
|
|
|
private:
|
|
|
|
int testInt = 127;
|
|
float testFloat = 1.5;
|
|
|
|
OSCBundle generateTestBundle()
|
|
{
|
|
OSCBundle bundle;
|
|
|
|
OSCMessage msg1 ("/test/fader");
|
|
msg1.addInt32 (testInt);
|
|
|
|
OSCMessage msg2 ("/test/foo");
|
|
msg2.addString ("bar");
|
|
msg2.addFloat32 (testFloat);
|
|
|
|
bundle.addElement (msg1);
|
|
bundle.addElement (msg2);
|
|
|
|
return bundle;
|
|
}
|
|
|
|
void expectBundleEqualsTestBundle (const OSCBundle& bundle)
|
|
{
|
|
expect (bundle.size() == 2);
|
|
expect (bundle[0].isMessage());
|
|
expect (! bundle[0].isBundle());
|
|
expect (bundle[1].isMessage());
|
|
expect (! bundle[1].isBundle());
|
|
|
|
int numElementsCounted = 0;
|
|
for (OSCBundle::Element* element = bundle.begin(); element != bundle.end(); ++element)
|
|
{
|
|
expect (element->isMessage());
|
|
expect (! element->isBundle());
|
|
++numElementsCounted;
|
|
}
|
|
expectEquals (numElementsCounted, 2);
|
|
|
|
OSCBundle::Element* e = bundle.begin();
|
|
expect (e[0].getMessage().size() == 1);
|
|
expect (e[0].getMessage().begin()->getInt32() == testInt);
|
|
expect (e[1].getMessage().size() == 2);
|
|
expect (e[1].getMessage()[1].getFloat32() == testFloat);
|
|
}
|
|
};
|
|
|
|
static OSCBundleTests OSCBundleUnitTests;
|
|
|
|
//==============================================================================
|
|
class OSCBundleElementTests : public UnitTest
|
|
{
|
|
public:
|
|
OSCBundleElementTests() : UnitTest ("OSCBundle::Element class") {}
|
|
|
|
void runTest()
|
|
{
|
|
beginTest ("Construction from OSCMessage");
|
|
{
|
|
float testFloat = -0.125;
|
|
OSCMessage msg ("/test");
|
|
msg.addFloat32 (testFloat);
|
|
|
|
OSCBundle::Element element (msg);
|
|
|
|
expect (element.isMessage());
|
|
expect (element.getMessage().size() == 1);
|
|
expect (element.getMessage()[0].getType() == OSCTypes::float32);
|
|
expect (element.getMessage()[0].getFloat32() == testFloat);
|
|
}
|
|
}
|
|
};
|
|
|
|
static OSCBundleElementTests OSCBundleElementUnitTests;
|
|
|
|
#endif // JUCE_UNIT_TESTS
|