|
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2020 - Raw Material Software Limited
-
- JUCE is an open source library subject to commercial or open-source
- licensing.
-
- By using JUCE, you agree to the terms of both the JUCE 6 End-User License
- Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).
-
- End User License Agreement: www.juce.com/juce-6-licence
- Privacy Policy: www.juce.com/juce-privacy-policy
-
- Or: You may also use this code under the terms of the GPL v3 (see
- www.gnu.org/licenses).
-
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
- DISCLAIMED.
-
- ==============================================================================
- */
-
- namespace juce
- {
-
- 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.reset (new OSCMessage (other.getMessage()));
- else
- bundle.reset (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", UnitTestCategories::osc)
- {}
-
- 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 (auto& element : bundle)
- {
- expect (element.isMessage());
- expect (! element.isBundle());
- ++numElementsCounted;
- }
- expectEquals (numElementsCounted, 2);
-
- auto* 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", UnitTestCategories::osc)
- {}
-
- 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
-
- } // namespace juce
|