/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2017 - ROLI Ltd. 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 5 End-User License Agreement and JUCE 5 Privacy Policy (both updated and effective as of the 27th April 2017). End User License Agreement: www.juce.com/juce-5-licence Privacy Policy: www.juce.com/juce-5-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 { OSCArgument::OSCArgument (int32 value) noexcept : type (OSCTypes::int32), intValue (value) { } OSCArgument::OSCArgument (float value) noexcept : type (OSCTypes::float32), floatValue (value) { } OSCArgument::OSCArgument (const String& value) noexcept : type (OSCTypes::string), stringValue (value) { } OSCArgument::OSCArgument (const MemoryBlock& b) : type (OSCTypes::blob), blob (b) { } //============================================================================== String OSCArgument::getString() const noexcept { if (isString()) return stringValue; jassertfalse; // you must check the type of an argument before attempting to get its value! return {}; } int32 OSCArgument::getInt32() const noexcept { if (isInt32()) return intValue; jassertfalse; // you must check the type of an argument before attempting to get its value! return 0; } float OSCArgument::getFloat32() const noexcept { if (isFloat32()) return floatValue; jassertfalse; // you must check the type of an argument before attempting to get its value! return 0.0f; } const MemoryBlock& OSCArgument::getBlob() const noexcept { // you must check the type of an argument before attempting to get its value! jassert (isBlob()); return blob; } //============================================================================== //============================================================================== #if JUCE_UNIT_TESTS class OSCArgumentTests : public UnitTest { public: OSCArgumentTests() : UnitTest ("OSCArgument class", "OSC") {} MemoryBlock getMemoryBlockWithRandomData (size_t numBytes) { MemoryBlock block (numBytes); Random rng = getRandom(); for (size_t i = 0; i < numBytes; ++i) block[i] = (char) rng.nextInt (256); return block; } void runTest() { runTestInitialisation(); } void runTestInitialisation() { beginTest ("Int32"); { int value = 123456789; OSCArgument arg (value); expect (arg.getType() == OSCTypes::int32); expect (arg.isInt32()); expect (! arg.isFloat32()); expect (! arg.isString()); expect (! arg.isBlob()); expect (arg.getInt32() == value); } beginTest ("Float32"); { float value = 12345.6789f; OSCArgument arg (value); expect (arg.getType() == OSCTypes::float32); expect (! arg.isInt32()); expect (arg.isFloat32()); expect (! arg.isString()); expect (! arg.isBlob()); expect (arg.getFloat32() == value); } beginTest ("String"); { String value = "Hello, World!"; OSCArgument arg (value); expect (arg.getType() == OSCTypes::string); expect (! arg.isInt32()); expect (! arg.isFloat32()); expect (arg.isString()); expect (! arg.isBlob()); expect (arg.getString() == value); } beginTest ("String (from C string)"); { OSCArgument arg ("Hello, World!"); expect (arg.getType() == OSCTypes::string); expect (! arg.isInt32()); expect (! arg.isFloat32()); expect (arg.isString()); expect (! arg.isBlob()); expect (arg.getString() == String ("Hello, World!")); } beginTest ("Blob"); { const size_t numBytes = 412; MemoryBlock blob = getMemoryBlockWithRandomData (numBytes); OSCArgument arg (blob); expect (arg.getType() == OSCTypes::blob); expect (! arg.isInt32()); expect (! arg.isFloat32()); expect (! arg.isString()); expect (arg.isBlob()); expect (arg.getBlob() == blob); } beginTest ("Copy, move and assignment"); { { int value = -42; OSCArgument arg (value); OSCArgument copy = arg; expect (copy.getType() == OSCTypes::int32); expect (copy.getInt32() == value); OSCArgument assignment ("this will be overwritten!"); assignment = copy; expect (assignment.getType() == OSCTypes::int32); expect (assignment.getInt32() == value); } { const size_t numBytes = 412; MemoryBlock blob = getMemoryBlockWithRandomData (numBytes); OSCArgument arg (blob); OSCArgument copy = arg; expect (copy.getType() == OSCTypes::blob); expect (copy.getBlob() == blob); OSCArgument assignment ("this will be overwritten!"); assignment = copy; expect (assignment.getType() == OSCTypes::blob); expect (assignment.getBlob() == blob); } } } }; static OSCArgumentTests OSCArgumentUnitTests; #endif // JUCE_UNIT_TESTS } // namespace juce