diff --git a/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_NonParamState.cpp b/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_NonParamState.cpp index f5879dd4..39b5c45e 100644 --- a/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_NonParamState.cpp +++ b/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_NonParamState.cpp @@ -31,88 +31,6 @@ void NonParamState::reset() value->reset(); } -void NonParamState::serialize (ChainedArenaAllocator& arena, const NonParamState& state) -{ - auto* serialize_num_bytes = arena.allocate (1, 1); - size_t num_bytes = 0; - for (const auto& value : state.values) - { - num_bytes += serialize_string (value->name, arena); - num_bytes += value->serialize (arena); - } - serialize_direct (serialize_num_bytes, num_bytes); -} - -void NonParamState::deserialize (nonstd::span& serial_data, NonParamState& state, ChainedArenaAllocator& arena) -{ - if (serial_data.size() < bytes_detail::sizeof_s) - { - state.reset(); - return; - } - - auto num_bytes = deserialize_direct (serial_data); - if (num_bytes == 0) - { - state.reset(); - return; - } - - auto data = serial_data.subspan (0, num_bytes); - serial_data = serial_data.subspan (num_bytes); - - const auto _ = arena.create_frame(); - auto values_copy = arena::make_span (arena, state.values.size()); - std::copy (state.values.begin(), state.values.end(), values_copy.begin()); - auto values_iter = values_copy.begin(); - size_t counter = 0; - const auto get_value_ptr = [&] (std::string_view name) -> StateValueBase* - { - const auto returner = [&] (auto& iter) - { - auto* ptr = *iter; - *iter = nullptr; - ++iter; - values_iter = iter; - counter++; - return ptr; - }; - - for (auto iter = values_iter; iter != values_copy.end(); ++iter) - { - if (*iter != nullptr && (*iter)->name == name) - return returner (iter); - } - for (auto iter = values_copy.begin(); iter != values_iter; ++iter) - { - if (*iter != nullptr && (*iter)->name == name) - return returner (iter); - } - return nullptr; - }; - - while (! data.empty()) - { - const auto value_name = deserialize_string (data); - auto* value = get_value_ptr (value_name); - if (value == nullptr) - { - const auto value_num_bytes = deserialize_direct (data); - data = data.subspan (value_num_bytes); - continue; - } - - value->deserialize (data); - } - - if (counter < values_copy.size()) - { - for (auto* value : values_copy) - if (value != nullptr) - value->reset(); - } -} - json NonParamState::serialize_json (const NonParamState& state) { auto serial = nlohmann::json::object(); diff --git a/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_NonParamState.h b/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_NonParamState.h index 52ff4138..7e3e7acd 100644 --- a/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_NonParamState.h +++ b/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_NonParamState.h @@ -35,12 +35,6 @@ class NonParamState /** Resets all the state values to their defaults */ void reset(); - /** Custom serializer */ - static void serialize (ChainedArenaAllocator& arena, const NonParamState& state); - - /** Custom deserializer */ - static void deserialize (nonstd::span& serial_data, NonParamState& state, ChainedArenaAllocator& arena); - /** Custom serializer */ static json serialize_json (const NonParamState& state); diff --git a/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_ParamHolder.cpp b/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_ParamHolder.cpp index 06816494..8b4917c4 100644 --- a/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_ParamHolder.cpp +++ b/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_ParamHolder.cpp @@ -255,6 +255,12 @@ size_t ParamHolder::doForAllParameters (Callable&& callable, size_t index) const return index; } +inline void ParamHolder::reset() +{ + doForAllParameters ([] (auto& param, size_t) + { ParameterTypeHelpers::resetParameter (param); }); +} + inline void ParamHolder::getParameterPointers (ParamHolder& holder, ParamDeserialList& parameters) { for (auto& thing : holder.things) @@ -286,124 +292,6 @@ inline void ParamHolder::getParameterPointers (ParamHolder& holder, ParamDeseria } } -inline void ParamHolder::serialize (ChainedArenaAllocator& arena, const ParamHolder& paramHolder) -{ - auto* serialize_num_bytes = arena.allocate (1, 1); - size_t num_bytes = 0; - paramHolder.doForAllParameters ( - [&] (auto& param, size_t) - { - num_bytes += serialize_string (toStringView (param.paramID), arena); - num_bytes += serialize_object (ParameterTypeHelpers::getValue (param), arena); - }); - serialize_direct (serialize_num_bytes, num_bytes); -} - -inline void ParamHolder::deserialize (nonstd::span& serial_data, ParamHolder& paramHolder) -{ - using namespace ParameterTypeHelpers; - auto num_bytes = deserialize_direct (serial_data); - if (num_bytes == 0) - { - paramHolder.doForAllParameters ( - [&] (auto& param, size_t) - { - ParameterTypeHelpers::resetParameter (param); - }); - return; - } - - auto data = serial_data.subspan (0, num_bytes); - serial_data = serial_data.subspan (num_bytes); - - const auto _ = paramHolder.arena->create_frame(); - ParamDeserialList parameters { *paramHolder.arena }; - getParameterPointers (paramHolder, parameters); - - auto params_iter = parameters.begin(); - size_t counter = 0; - const auto get_param_ptr = [&] (std::string_view paramID) -> ThingPtr - { - const auto returner = [&] (auto& iter) - { - (*iter).found = true; - auto ptr = (*iter).ptr; - ++iter; - params_iter = iter; - counter++; - return ptr; - }; - - for (auto iter = params_iter; iter != parameters.end(); ++iter) - { - if ((*iter).id == paramID) - return returner (iter); - } - for (auto iter = parameters.begin(); iter != params_iter; ++iter) - { - if ((*iter).id == paramID) - return returner (iter); - } - return {}; - }; - - while (! data.empty()) - { - const auto param_id = deserialize_string (data); - auto param_ptr = get_param_ptr (param_id); - if (param_ptr == nullptr) - { - const auto param_num_bytes = deserialize_direct (data); - data = data.subspan (param_num_bytes); - continue; - } - - const auto type = getType (param_ptr); - switch (type) - { - case FloatParam: - setValue (deserialize_object> (data), - *reinterpret_cast (param_ptr.get_ptr())); - break; - case ChoiceParam: - setValue (deserialize_object> (data), - *reinterpret_cast (param_ptr.get_ptr())); - break; - case BoolParam: - setValue (deserialize_object> (data), - *reinterpret_cast (param_ptr.get_ptr())); - break; - default: - break; - } - } - - if (counter < parameters.count()) - { - for (auto [param_id, param_ptr, found] : parameters) - { - if (found) - continue; - - const auto type = getType (param_ptr); - switch (type) - { - case FloatParam: - resetParameter (*reinterpret_cast (param_ptr.get_ptr())); - break; - case ChoiceParam: - resetParameter (*reinterpret_cast (param_ptr.get_ptr())); - break; - case BoolParam: - resetParameter (*reinterpret_cast (param_ptr.get_ptr())); - break; - default: - break; - } - } - } -} - inline json ParamHolder::serialize_json (const ParamHolder& paramHolder) { auto serial = nlohmann::json::object(); diff --git a/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_ParamHolder.h b/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_ParamHolder.h index b7582f0a..cf63fdf7 100644 --- a/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_ParamHolder.h +++ b/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_ParamHolder.h @@ -91,11 +91,8 @@ class ParamHolder template size_t doForAllParameters (Callable&& callable, size_t index = 0) const; - /** Custom serializer */ - static void serialize (ChainedArenaAllocator& arena, const ParamHolder& paramHolder); - - /** Custom deserializer */ - static void deserialize (nonstd::span& serial_data, ParamHolder& paramHolder); + /** Resets all parameters to their default values */ + void reset(); /** Custom serializer */ static json serialize_json (const ParamHolder& paramHolder); diff --git a/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_PluginStateImpl.cpp b/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_PluginStateImpl.cpp index ac70ee4e..86aa57d7 100644 --- a/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_PluginStateImpl.cpp +++ b/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_PluginStateImpl.cpp @@ -22,19 +22,7 @@ PluginStateImpl::~PluginStateImpl() template void PluginStateImpl::serialize (juce::MemoryBlock& data) const { - auto& arena = const_cast (*params.arena); - const auto frame = arena.create_frame(); - -#if defined JucePlugin_VersionString - serialize_object (currentPluginVersion.getVersionHint(), arena); -#else - serialize_object (int {}, arena); -#endif - - NonParamState::serialize (arena, nonParams); - ParamHolder::serialize (arena, params); - - dump_serialized_bytes (data, arena, &frame); + JSONUtils::toMemoryBlock (serialize (*this), data); } template @@ -43,26 +31,23 @@ void PluginStateImpl::deserialize (juce::Memo callOnMainThread ( [this, data = std::move (dataBlock)] { - nonstd::span serial_data { static_cast (data.getData()), data.getSize() }; - if (serial_data.size() > 8 - && (static_cast (serial_data[2]) == '[' - || static_cast (serial_data[2]) == '{')) + try { deserialize (JSONUtils::fromMemoryBlock (data), *this); + + params.applyVersionStreaming (pluginStateVersion); + if (nonParams.versionStreamingCallback != nullptr) + nonParams.versionStreamingCallback (pluginStateVersion); } - else + catch (const std::exception& e) { - pluginStateVersion = Version::fromVersionHint (deserialize_object (serial_data)); - NonParamState::deserialize (serial_data, nonParams, *params.arena); - ParamHolder::deserialize (serial_data, params); + juce::Logger::writeToLog (juce::String { "Encountered exception while deserializing plugin state: " } + e.what()); + juce::Logger::writeToLog ("Resetting plugin state..."); + params.reset(); + nonParams.reset(); } - params.applyVersionStreaming (pluginStateVersion); - if (nonParams.versionStreamingCallback != nullptr) - nonParams.versionStreamingCallback (pluginStateVersion); - getParameterListeners().updateBroadcastersFromMessageThread(); - if (undoManager != nullptr) undoManager->clearUndoHistory(); }); diff --git a/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_StateValue.h b/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_StateValue.h index cc858c8e..4ab971f4 100644 --- a/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_StateValue.h +++ b/modules/plugin/chowdsp_plugin_state/Backend/chowdsp_StateValue.h @@ -15,9 +15,6 @@ struct StateValueBase [[nodiscard]] virtual nlohmann::json serialize_json() const { return {}; } virtual void deserialize_json (const nlohmann::json&) {} - [[nodiscard]] virtual size_t serialize (ChainedArenaAllocator&) const { return 0; } - virtual void deserialize (nonstd::span&) {} - const std::string_view name {}; Broadcaster changeBroadcaster {}; }; @@ -85,71 +82,6 @@ struct StateValue : StateValueBase set (deserial.get()); } - /** Binary serializer */ - [[nodiscard]] size_t serialize (ChainedArenaAllocator& arena) const override - { - static constexpr auto is_span = TypeTraits::IsIterable && ! TypeTraits::IsMapLike; - - // Values need to track how many bytes they're serializing so the parent can know also. - auto* serialize_num_bytes = arena.allocate (1, 1); - - size_t num_bytes = 0; - if constexpr (std::is_same_v) - { - num_bytes = serialize_string (get().dump(), arena); - } - else if constexpr (std::is_same_v || std::is_same_v) - { - num_bytes = serialize_string (currentValue, arena); - } - else if constexpr (std::is_same_v) - { - num_bytes = serialize_string (toStringView (currentValue), arena); - } - else if constexpr (is_span) - { - num_bytes = serialize_span (currentValue, arena); - } - else - { - num_bytes = serialize_object (get(), arena); - } - - serialize_direct (serialize_num_bytes, num_bytes); - return bytes_detail::sizeof_s + num_bytes; - } - - void deserialize (nonstd::span& data) override - { - static constexpr auto is_span = TypeTraits::IsIterable && ! TypeTraits::IsMapLike; - - [[maybe_unused]] const auto num_bytes = deserialize_direct (data); - if constexpr (std::is_same_v) - { - set (json::parse (deserialize_string (data))); - } - else if constexpr (std::is_same_v) - { - set (std::string { deserialize_string (data) }); - } - else if constexpr (std::is_same_v) - { - set (deserialize_string (data)); - } - else if constexpr (std::is_same_v) - { - set (toString (deserialize_string (data))); - } - else if constexpr (is_span) - { - deserialize_span (currentValue, data); - } - else - { - set (deserialize_object (data)); - } - } - const element_type defaultValue; private: diff --git a/modules/plugin/chowdsp_presets_v2/Backend/chowdsp_PresetState.cpp b/modules/plugin/chowdsp_presets_v2/Backend/chowdsp_PresetState.cpp index d1632411..852bfcfc 100644 --- a/modules/plugin/chowdsp_presets_v2/Backend/chowdsp_PresetState.cpp +++ b/modules/plugin/chowdsp_presets_v2/Backend/chowdsp_PresetState.cpp @@ -56,33 +56,6 @@ void PresetState::deserialize_json (const nlohmann::json& deserial) set (PresetPtr { deserial }); } -[[nodiscard]] size_t PresetState::serialize (ChainedArenaAllocator& arena) const -{ - size_t num_bytes = 0; - if (preset == nullptr) - { - num_bytes += serialize_string ("", arena); - return num_bytes; - } - - num_bytes += serialize_string (preset->toJson().dump(), arena); - return num_bytes; -} - -void PresetState::deserialize (nonstd::span& bytes) -{ - try - { - const auto stateJson = json::parse (deserialize_string (bytes)); - set (PresetPtr { stateJson }); - } - catch (const std::exception& e) - { - juce::Logger::writeToLog (std::string { "Unable to load preset state: " } + e.what()); - reset(); - } -} - bool operator== (const PresetState& presetState, std::nullptr_t) { return presetState.get() == nullptr; diff --git a/modules/plugin/chowdsp_presets_v2/Backend/chowdsp_PresetState.h b/modules/plugin/chowdsp_presets_v2/Backend/chowdsp_PresetState.h index 06746ae1..14c65f58 100644 --- a/modules/plugin/chowdsp_presets_v2/Backend/chowdsp_PresetState.h +++ b/modules/plugin/chowdsp_presets_v2/Backend/chowdsp_PresetState.h @@ -47,12 +47,6 @@ class PresetState : public StateValueBase /** Internal use only! */ void deserialize_json (const nlohmann::json& deserial) override; - /** Internal use only! */ - [[nodiscard]] size_t serialize (ChainedArenaAllocator&) const override; - - /** Internal use only! */ - void deserialize (nonstd::span&) override; - private: PresetPtr preset {}; diff --git a/tests/plugin_tests/chowdsp_plugin_state_test/NonParamTest.cpp b/tests/plugin_tests/chowdsp_plugin_state_test/NonParamTest.cpp index 20cacc45..51ed96ba 100644 --- a/tests/plugin_tests/chowdsp_plugin_state_test/NonParamTest.cpp +++ b/tests/plugin_tests/chowdsp_plugin_state_test/NonParamTest.cpp @@ -1,7 +1,7 @@ #include #include -TEST_CASE ("Non-Param Test", "[plugin][state]") +TEST_CASE ("Non-Param Test", "[plugin][state][serial]") { SECTION ("JSON Serialization") { @@ -53,196 +53,4 @@ TEST_CASE ("Non-Param Test", "[plugin][state]") REQUIRE (juce_string_val.get() == "ecuj"); REQUIRE (json_val.get().is_null()); } - - SECTION ("Bytes Serialization") - { - chowdsp::StateValue int_val { "int", 42 }; - chowdsp::StateValue, int> atomic_int_val { "atomic_int", 99 }; - chowdsp::StateValue> bool_vals { "bools", { true, false, true, true } }; - chowdsp::StateValue string_val { "string", "blah" }; - chowdsp::StateValue string_view_val { "string_view", "fff" }; - chowdsp::StateValue juce_string_val { "juce_string", "juce" }; - chowdsp::StateValue json_val { "json", { { "val1", 100 }, { "val2", "test" } } }; - - chowdsp::ChainedArenaAllocator arena { 1024 }; - { - chowdsp::NonParamState state {}; - state.addStateValues ({ &int_val, &atomic_int_val, &bool_vals, &string_val, &string_view_val, &juce_string_val, &json_val }); - int_val = 101; - atomic_int_val.set (102); - bool_vals.set ({ false, true, false, true }); - string_val = "blah blah"; - string_view_val = "ggg"; - juce_string_val = "ecuj"; - json_val.set ({}); - chowdsp::NonParamState::serialize (arena, state); - } - - std::vector serial_bytes (chowdsp::get_serial_num_bytes (arena)); - chowdsp::dump_serialized_bytes (serial_bytes, arena); - nonstd::span bytes { serial_bytes }; - - chowdsp::NonParamState state {}; - state.addStateValues ({ &int_val, &atomic_int_val, &bool_vals, &string_val, &string_view_val, &juce_string_val, &json_val }); - state.reset(); - REQUIRE (int_val.get() == 42); - REQUIRE (atomic_int_val.get() == 99); - REQUIRE (bool_vals.get()[0]); - REQUIRE (! bool_vals.get()[1]); - REQUIRE (bool_vals.get()[2]); - REQUIRE (bool_vals.get()[3]); - REQUIRE (string_val.get() == "blah"); - REQUIRE (string_view_val.get() == "fff"); - REQUIRE (juce_string_val.get() == "juce"); - REQUIRE (json_val.get() == chowdsp::json { { "val1", 100 }, { "val2", "test" } }); - - chowdsp::NonParamState::deserialize (bytes, state, arena); - REQUIRE (int_val.get() == 101); - REQUIRE (atomic_int_val.get() == 102); - REQUIRE (! bool_vals.get()[0]); - REQUIRE (bool_vals.get()[1]); - REQUIRE (! bool_vals.get()[2]); - REQUIRE (bool_vals.get()[3]); - REQUIRE (string_val.get() == "blah blah"); - REQUIRE (string_view_val.get() == "ggg"); - REQUIRE (juce_string_val.get() == "ecuj"); - REQUIRE (json_val.get().is_null()); - } - - SECTION ("Bytes Serialization Re-order") - { - chowdsp::StateValue int_val { "int", 42 }; - chowdsp::StateValue, int> atomic_int_val { "atomic_int", 99 }; - chowdsp::StateValue string_val { "string", "blah" }; - - chowdsp::ChainedArenaAllocator arena { 1024 }; - { - chowdsp::NonParamState state {}; - state.addStateValues ({ &int_val, &atomic_int_val, &string_val }); - int_val = 101; - atomic_int_val.set (102); - string_val = "blah blah"; - chowdsp::NonParamState::serialize (arena, state); - } - - std::vector serial_bytes (chowdsp::get_serial_num_bytes (arena)); - chowdsp::dump_serialized_bytes (serial_bytes, arena); - nonstd::span bytes { serial_bytes }; - - chowdsp::NonParamState state {}; - state.addStateValues ({ &string_val, &atomic_int_val, &int_val }); - state.reset(); - REQUIRE (int_val.get() == 42); - REQUIRE (atomic_int_val.get() == 99); - REQUIRE (string_val.get() == "blah"); - - chowdsp::NonParamState::deserialize (bytes, state, arena); - REQUIRE (int_val.get() == 101); - REQUIRE (atomic_int_val.get() == 102); - REQUIRE (string_val.get() == "blah blah"); - } - - SECTION ("Bytes Serialization Adding Value") - { - chowdsp::StateValue int_val { "int", 42 }; - chowdsp::StateValue string_val { "string", "blah" }; - - chowdsp::ChainedArenaAllocator arena { 1024 }; - { - chowdsp::NonParamState state {}; - state.addStateValues ({ &int_val, &string_val }); - int_val = 101; - string_val = "blah blah"; - chowdsp::NonParamState::serialize (arena, state); - } - - std::vector serial_bytes (chowdsp::get_serial_num_bytes (arena)); - chowdsp::dump_serialized_bytes (serial_bytes, arena); - nonstd::span bytes { serial_bytes }; - - chowdsp::StateValue float_val { "float", 90.0f }; - chowdsp::NonParamState state {}; - state.addStateValues ({ &string_val, &float_val, &int_val }); - state.reset(); - float_val = 100.0f; - REQUIRE (int_val.get() == 42); - REQUIRE (float_val.get() == 100.0f); - REQUIRE (string_val.get() == "blah"); - - chowdsp::NonParamState::deserialize (bytes, state, arena); - REQUIRE (int_val.get() == 101); - REQUIRE (float_val.get() == 90.0f); - REQUIRE (string_val.get() == "blah blah"); - } - - SECTION ("Bytes Serialization Removing Value") - { - chowdsp::StateValue int_val { "int", 42 }; - chowdsp::StateValue, int> atomic_int_val { "atomic_int", 99 }; - chowdsp::StateValue string_val { "string", "blah" }; - - chowdsp::ChainedArenaAllocator arena { 1024 }; - { - chowdsp::NonParamState state {}; - state.addStateValues ({ &int_val, &atomic_int_val, &string_val }); - int_val = 101; - atomic_int_val.set (102); - string_val = "blah blah"; - chowdsp::NonParamState::serialize (arena, state); - } - - std::vector serial_bytes (chowdsp::get_serial_num_bytes (arena)); - chowdsp::dump_serialized_bytes (serial_bytes, arena); - nonstd::span bytes { serial_bytes }; - - chowdsp::NonParamState state {}; - state.addStateValues ({ &string_val, &int_val }); - state.reset(); - REQUIRE (int_val.get() == 42); - REQUIRE (string_val.get() == "blah"); - - chowdsp::NonParamState::deserialize (bytes, state, arena); - REQUIRE (int_val.get() == 101); - REQUIRE (string_val.get() == "blah blah"); - } - - SECTION ("Bytes Serialization Removing Value") - { - chowdsp::StateValue int_val { "int", 42 }; - chowdsp::StateValue, int> atomic_int_val { "atomic_int", 99 }; - chowdsp::StateValue string_val { "string", "blah" }; - - chowdsp::NonParamState state {}; - state.addStateValues ({ &int_val, &atomic_int_val, &string_val }); - - { - int_val = 101; - atomic_int_val.set (102); - string_val = "blah blah"; - - const auto serial = std::array {}; - nonstd::span bytes { serial }; - - chowdsp::ChainedArenaAllocator arena { 1024 }; - chowdsp::NonParamState::deserialize (bytes, state, arena); - REQUIRE (int_val.get() == 42); - REQUIRE (atomic_int_val.get() == 99); - REQUIRE (string_val.get() == "blah"); - } - - { - int_val = 101; - atomic_int_val.set (102); - string_val = "blah blah"; - - const auto serial = std::array {}; - nonstd::span bytes { serial }; - - chowdsp::ChainedArenaAllocator arena { 1024 }; - chowdsp::NonParamState::deserialize (bytes, state, arena); - REQUIRE (int_val.get() == 42); - REQUIRE (atomic_int_val.get() == 99); - REQUIRE (string_val.get() == "blah"); - } - } } diff --git a/tests/plugin_tests/chowdsp_plugin_state_test/ParamHolderTest.cpp b/tests/plugin_tests/chowdsp_plugin_state_test/ParamHolderTest.cpp index 7434bc97..39d0a689 100644 --- a/tests/plugin_tests/chowdsp_plugin_state_test/ParamHolderTest.cpp +++ b/tests/plugin_tests/chowdsp_plugin_state_test/ParamHolderTest.cpp @@ -1,7 +1,7 @@ #include #include -TEST_CASE ("ParamHolder Test", "[plugin][state]") +TEST_CASE ("ParamHolder Test", "[plugin][state][serial]") { std::array floatParams { chowdsp::PercentParameter::Ptr { "param3", "Param", 0.5f }, @@ -55,7 +55,7 @@ TEST_CASE ("ParamHolder Test", "[plugin][state]") REQUIRE (getValue (*choiceNested) == 1); } - SECTION ("Serialize Bytes") + SECTION ("reset()") { using namespace chowdsp::ParameterTypeHelpers; setValue (0.0f, *floatParams[0]); @@ -63,24 +63,10 @@ TEST_CASE ("ParamHolder Test", "[plugin][state]") setValue (true, *boolNested); setValue (1, *choiceNested); - chowdsp::ChainedArenaAllocator arena { 128 }; - chowdsp::ParamHolder::serialize (arena, params); - juce::MemoryBlock state {}; - chowdsp::dump_serialized_bytes (state, arena); - - params.doForAllParameters ([] (auto& param, size_t) - { setValue (getDefaultValue (param), param); }); - + params.reset(); REQUIRE (getValue (*floatParams[0]) == 0.5f); REQUIRE (getValue (*floatParams[1]) == 0.5f); REQUIRE (getValue (*boolNested) == false); REQUIRE (getValue (*choiceNested) == 0); - - nonstd::span state_data = { (const std::byte*) state.getData(), state.getSize() }; - chowdsp::ParamHolder::deserialize (state_data, params); - REQUIRE (getValue (*floatParams[0]) == 0.0f); - REQUIRE (getValue (*floatParams[1]) == 1.0f); - REQUIRE (getValue (*boolNested) == true); - REQUIRE (getValue (*choiceNested) == 1); } } diff --git a/tests/plugin_tests/chowdsp_plugin_state_test/StateSerializationTest.cpp b/tests/plugin_tests/chowdsp_plugin_state_test/StateSerializationTest.cpp index fac60ec2..020db2fc 100644 --- a/tests/plugin_tests/chowdsp_plugin_state_test/StateSerializationTest.cpp +++ b/tests/plugin_tests/chowdsp_plugin_state_test/StateSerializationTest.cpp @@ -170,7 +170,7 @@ struct PluginNonParameterStateNewField : chowdsp::NonParamState using StateWithNewNonParameterField = chowdsp::PluginStateImpl; -TEST_CASE ("State Serialization Test", "[plugin][state]") +TEST_CASE ("State Serialization Test", "[plugin][state][serial]") { SECTION ("Save/Load Parameters Test") { @@ -232,6 +232,21 @@ TEST_CASE ("State Serialization Test", "[plugin][state]") REQUIRE_MESSAGE (state.nonParams.jsonThing.get() == testJSON, "JSON thing is incorrect"); } + SECTION ("Load invalid state") + { + static constexpr float percentVal = 0.25f; + static constexpr int width = 200; + + State state {}; + static_cast (state.params.levelParams.percent) = percentVal; + state.nonParams.editorWidth = width; + + juce::MemoryBlock block {}; + state.deserialize (std::move (block)); + REQUIRE_MESSAGE (juce::approximatelyEqual (state.params.levelParams.percent->get(), 0.5f), "Percent value is incorrect"); + REQUIRE_MESSAGE (state.nonParams.editorWidth.get() == 300, "Editor width is incorrect"); + } + SECTION ("Added Parameter Test") { static constexpr float newGainVal = -22.0f; diff --git a/tests/plugin_tests/chowdsp_plugin_state_test/VersionStreamingTest.cpp b/tests/plugin_tests/chowdsp_plugin_state_test/VersionStreamingTest.cpp index 0656c4cc..ee733373 100644 --- a/tests/plugin_tests/chowdsp_plugin_state_test/VersionStreamingTest.cpp +++ b/tests/plugin_tests/chowdsp_plugin_state_test/VersionStreamingTest.cpp @@ -44,7 +44,7 @@ struct NonParams : chowdsp::NonParamState chowdsp::StateValue editorSize { "editor_size", 1.0f }; }; -TEST_CASE ("Version Streaming Test", "[plugin][state][version]") +TEST_CASE ("Version Streaming Test", "[plugin][state][version][serial]") { SECTION ("Apply Version Streaming to Parameters") {