diff --git a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
index ede822f0de..e2fa131de4 100644
--- a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
+++ b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
@@ -1086,6 +1086,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_core/native/juce_Network_mac.mm"
"../../../../../modules/juce_core/native/juce_Network_windows.cpp"
"../../../../../modules/juce_core/native/juce_ObjCHelpers_mac.h"
+ "../../../../../modules/juce_core/native/juce_ObjCHelpers_mac_test.mm"
"../../../../../modules/juce_core/native/juce_PlatformTimer_generic.cpp"
"../../../../../modules/juce_core/native/juce_PlatformTimer_windows.cpp"
"../../../../../modules/juce_core/native/juce_PlatformTimerListener.h"
@@ -3154,6 +3155,7 @@ set_source_files_properties(
"../../../../../modules/juce_core/native/juce_Network_mac.mm"
"../../../../../modules/juce_core/native/juce_Network_windows.cpp"
"../../../../../modules/juce_core/native/juce_ObjCHelpers_mac.h"
+ "../../../../../modules/juce_core/native/juce_ObjCHelpers_mac_test.mm"
"../../../../../modules/juce_core/native/juce_PlatformTimer_generic.cpp"
"../../../../../modules/juce_core/native/juce_PlatformTimer_windows.cpp"
"../../../../../modules/juce_core/native/juce_PlatformTimerListener.h"
diff --git a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
index 9a235c7283..1f03591db4 100644
--- a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
@@ -2017,6 +2017,9 @@
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
index e755256d7a..d30cd74271 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
@@ -2017,6 +2017,9 @@
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
index c0383e7013..7e9ce3f1df 100644
--- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
@@ -2017,6 +2017,9 @@
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
diff --git a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
index 1f929bf994..277b4502e9 100644
--- a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
@@ -962,6 +962,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_core/native/juce_Network_mac.mm"
"../../../../../modules/juce_core/native/juce_Network_windows.cpp"
"../../../../../modules/juce_core/native/juce_ObjCHelpers_mac.h"
+ "../../../../../modules/juce_core/native/juce_ObjCHelpers_mac_test.mm"
"../../../../../modules/juce_core/native/juce_PlatformTimer_generic.cpp"
"../../../../../modules/juce_core/native/juce_PlatformTimer_windows.cpp"
"../../../../../modules/juce_core/native/juce_PlatformTimerListener.h"
@@ -2730,6 +2731,7 @@ set_source_files_properties(
"../../../../../modules/juce_core/native/juce_Network_mac.mm"
"../../../../../modules/juce_core/native/juce_Network_windows.cpp"
"../../../../../modules/juce_core/native/juce_ObjCHelpers_mac.h"
+ "../../../../../modules/juce_core/native/juce_ObjCHelpers_mac_test.mm"
"../../../../../modules/juce_core/native/juce_PlatformTimer_generic.cpp"
"../../../../../modules/juce_core/native/juce_PlatformTimer_windows.cpp"
"../../../../../modules/juce_core/native/juce_PlatformTimerListener.h"
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
index c4870e885a..76c06ba59b 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
@@ -1726,6 +1726,9 @@
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
diff --git a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
index f862d52a88..da78ba0dcf 100644
--- a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
@@ -995,6 +995,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_core/native/juce_Network_mac.mm"
"../../../../../modules/juce_core/native/juce_Network_windows.cpp"
"../../../../../modules/juce_core/native/juce_ObjCHelpers_mac.h"
+ "../../../../../modules/juce_core/native/juce_ObjCHelpers_mac_test.mm"
"../../../../../modules/juce_core/native/juce_PlatformTimer_generic.cpp"
"../../../../../modules/juce_core/native/juce_PlatformTimer_windows.cpp"
"../../../../../modules/juce_core/native/juce_PlatformTimerListener.h"
@@ -2916,6 +2917,7 @@ set_source_files_properties(
"../../../../../modules/juce_core/native/juce_Network_mac.mm"
"../../../../../modules/juce_core/native/juce_Network_windows.cpp"
"../../../../../modules/juce_core/native/juce_ObjCHelpers_mac.h"
+ "../../../../../modules/juce_core/native/juce_ObjCHelpers_mac_test.mm"
"../../../../../modules/juce_core/native/juce_PlatformTimer_generic.cpp"
"../../../../../modules/juce_core/native/juce_PlatformTimer_windows.cpp"
"../../../../../modules/juce_core/native/juce_PlatformTimerListener.h"
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
index 4328bd6980..ff9e4dd18e 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
@@ -1801,6 +1801,9 @@
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
index 51192816ed..77a4d0494d 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
@@ -1801,6 +1801,9 @@
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
index 374d5b4ee6..da5051c2c9 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
@@ -1801,6 +1801,9 @@
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
diff --git a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters
index 9c939bbb83..fab1061206 100644
--- a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters
+++ b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters
@@ -247,6 +247,9 @@
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
diff --git a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
index ddcb2c4cac..2295ce27ed 100644
--- a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
+++ b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
@@ -966,6 +966,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_core/native/juce_Network_mac.mm"
"../../../../../modules/juce_core/native/juce_Network_windows.cpp"
"../../../../../modules/juce_core/native/juce_ObjCHelpers_mac.h"
+ "../../../../../modules/juce_core/native/juce_ObjCHelpers_mac_test.mm"
"../../../../../modules/juce_core/native/juce_PlatformTimer_generic.cpp"
"../../../../../modules/juce_core/native/juce_PlatformTimer_windows.cpp"
"../../../../../modules/juce_core/native/juce_PlatformTimerListener.h"
@@ -2814,6 +2815,7 @@ set_source_files_properties(
"../../../../../modules/juce_core/native/juce_Network_mac.mm"
"../../../../../modules/juce_core/native/juce_Network_windows.cpp"
"../../../../../modules/juce_core/native/juce_ObjCHelpers_mac.h"
+ "../../../../../modules/juce_core/native/juce_ObjCHelpers_mac_test.mm"
"../../../../../modules/juce_core/native/juce_PlatformTimer_generic.cpp"
"../../../../../modules/juce_core/native/juce_PlatformTimer_windows.cpp"
"../../../../../modules/juce_core/native/juce_PlatformTimerListener.h"
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
index 8efe2dcdbd..8d1e2131d2 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
@@ -1756,6 +1756,9 @@
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
index 66c254e7a2..00f60d067e 100644
--- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
+++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
@@ -724,6 +724,9 @@
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
index 96316102a1..dba37976d9 100644
--- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
+++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
@@ -724,6 +724,9 @@
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
diff --git a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
index 879f8c7344..8466cd4661 100644
--- a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
+++ b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
@@ -724,6 +724,9 @@
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
index 02381aa7fb..8cb0a7dec9 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -1813,6 +1813,9 @@
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
index ecee283b15..235f735e4e 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -1813,6 +1813,9 @@
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
index a5a3234801..c8f89ebdcd 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -1813,6 +1813,9 @@
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters
index a0e2a5a947..726c48a51b 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters
+++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters
@@ -1753,6 +1753,9 @@
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
diff --git a/modules/juce_core/juce_core.cpp b/modules/juce_core/juce_core.cpp
index c187355fd7..7bbe6ba697 100644
--- a/modules/juce_core/juce_core.cpp
+++ b/modules/juce_core/juce_core.cpp
@@ -283,6 +283,9 @@
#include "misc/juce_EnumHelpers_test.cpp"
#include "containers/juce_FixedSizeFunction_test.cpp"
#include "javascript/juce_JSONSerialisation_test.cpp"
+ #if JUCE_MAC || JUCE_IOS
+ #include "native/juce_ObjCHelpers_mac_test.mm"
+ #endif
#endif
//==============================================================================
diff --git a/modules/juce_core/native/juce_ObjCHelpers_mac.h b/modules/juce_core/native/juce_ObjCHelpers_mac.h
index e622b836f7..0b56b71340 100644
--- a/modules/juce_core/native/juce_ObjCHelpers_mac.h
+++ b/modules/juce_core/native/juce_ObjCHelpers_mac.h
@@ -76,127 +76,62 @@ inline NSURL* createNSURLFromFile (const File& f)
inline NSArray* createNSArrayFromStringArray (const StringArray& strings)
{
- auto array = [[NSMutableArray alloc] init];
+ auto array = [[NSMutableArray alloc] initWithCapacity: (NSUInteger) strings.size()];
- for (auto string: strings)
- [array addObject:juceStringToNS (string)];
+ for (const auto& string: strings)
+ [array addObject: juceStringToNS (string)];
return [array autorelease];
}
-inline NSArray* varArrayToNSArray (const var& varToParse);
+inline NSData* varToJsonData (const var& varToParse)
+{
+ return [juceStringToNS (JSON::toString (varToParse)) dataUsingEncoding: NSUTF8StringEncoding];
+}
+
+inline var jsonDataToVar (NSData* jsonData)
+{
+ auto* jsonString = [[NSString alloc] initWithData: jsonData
+ encoding: NSUTF8StringEncoding];
+
+ jassert (jsonString != nullptr);
+ return JSON::parse (nsStringToJuce ([jsonString autorelease]));
+}
inline NSDictionary* varObjectToNSDictionary (const var& varToParse)
{
- auto dictionary = [NSMutableDictionary dictionary];
+ jassert (varToParse.isObject());
- if (varToParse.isObject())
- {
- auto* dynamicObject = varToParse.getDynamicObject();
+ if (! varToParse.isObject())
+ return nullptr;
- auto& properties = dynamicObject->getProperties();
+ NSError* error { nullptr };
+ NSDictionary* dictionary = [NSJSONSerialization JSONObjectWithData: varToJsonData (varToParse)
+ options: NSJSONReadingMutableContainers
+ error: &error];
- for (int i = 0; i < properties.size(); ++i)
- {
- auto* keyString = juceStringToNS (properties.getName (i).toString());
-
- const var& valueVar = properties.getValueAt (i);
-
- if (valueVar.isObject())
- {
- auto* valueDictionary = varObjectToNSDictionary (valueVar);
-
- [dictionary setObject: valueDictionary forKey: keyString];
- }
- else if (valueVar.isArray())
- {
- auto* valueArray = varArrayToNSArray (valueVar);
-
- [dictionary setObject: valueArray forKey: keyString];
- }
- else
- {
- auto* valueString = juceStringToNS (valueVar.toString());
-
- [dictionary setObject: valueString forKey: keyString];
- }
- }
- }
+ jassert (error == nullptr);
+ jassert (dictionary != nullptr);
return dictionary;
}
-inline NSArray* varArrayToNSArray (const var& varToParse)
+inline NSData* jsonObjectToData (const NSObject* jsonObject)
{
- jassert (varToParse.isArray());
+ NSError* error { nullptr };
+ auto* jsonData = [NSJSONSerialization dataWithJSONObject: jsonObject
+ options: 0
+ error: &error];
- if (! varToParse.isArray())
- return nil;
+ jassert (error == nullptr);
+ jassert (jsonData != nullptr);
- const auto* varArray = varToParse.getArray();
-
- auto array = [NSMutableArray arrayWithCapacity: (NSUInteger) varArray->size()];
-
- for (const auto& aVar : *varArray)
- {
- if (aVar.isObject())
- {
- auto* valueDictionary = varObjectToNSDictionary (aVar);
-
- [array addObject: valueDictionary];
- }
- else if (aVar.isArray())
- {
- auto* valueArray = varArrayToNSArray (aVar);
-
- [array addObject: valueArray];
- }
- else
- {
- auto* valueString = juceStringToNS (aVar.toString());
-
- [array addObject: valueString];
- }
- }
-
- return array;
+ return jsonData;
}
-var nsObjectToVar (NSObject* array);
-
inline var nsDictionaryToVar (NSDictionary* dictionary)
{
- DynamicObject::Ptr dynamicObject (new DynamicObject());
-
- for (NSString* key in dictionary)
- dynamicObject->setProperty (nsStringToJuce (key), nsObjectToVar ([dictionary objectForKey: key]));
-
- return var (dynamicObject.get());
-}
-
-inline var nsArrayToVar (NSArray* array)
-{
- Array resultArray;
-
- for (id value in array)
- resultArray.add (nsObjectToVar (value));
-
- return var (resultArray);
-}
-
-inline var nsObjectToVar (NSObject* obj)
-{
- if ([obj isKindOfClass: [NSString class]]) return nsStringToJuce ((NSString*) obj);
- else if ([obj isKindOfClass: [NSNumber class]]) return nsStringToJuce ([(NSNumber*) obj stringValue]);
- else if ([obj isKindOfClass: [NSDictionary class]]) return nsDictionaryToVar ((NSDictionary*) obj);
- else if ([obj isKindOfClass: [NSArray class]]) return nsArrayToVar ((NSArray*) obj);
- else
- {
- // Unsupported yet, add here!
- jassertfalse;
- }
-
- return {};
+ return jsonDataToVar (jsonObjectToData (dictionary));
}
#if JUCE_MAC
diff --git a/modules/juce_core/native/juce_ObjCHelpers_mac_test.mm b/modules/juce_core/native/juce_ObjCHelpers_mac_test.mm
new file mode 100644
index 0000000000..9b55cabc26
--- /dev/null
+++ b/modules/juce_core/native/juce_ObjCHelpers_mac_test.mm
@@ -0,0 +1,70 @@
+namespace juce {
+
+class ObjCHelpersTest final : public UnitTest {
+public:
+ ObjCHelpersTest() : UnitTest{"ObjCHelpers", UnitTestCategories::native} {}
+
+ void runTest() final {
+ beginTest("Range");
+ {
+ constexpr auto start = 10;
+ constexpr auto length = 20;
+
+ const auto juceRange = Range::withStartAndLength(start, length);
+ const auto nsRange = NSMakeRange(start, length);
+
+ expect(nsRangeToJuce(nsRange) == juceRange);
+ expect(NSEqualRanges(nsRange, juceRangeToNS(juceRange)));
+ }
+
+ beginTest("String");
+ {
+ String juceString{"Hello world!"};
+ NSString *nsString{@"Hello world!"};
+
+ expect(nsStringToJuce(nsString) == juceString);
+ expect([nsString isEqualToString:juceStringToNS(juceString)]);
+ expect([nsString isEqualToString:nsStringLiteral("Hello world!")]);
+ }
+
+ beginTest("StringArray");
+ {
+ const StringArray stringArray{"Hello world!", "this", "is", "a", "test"};
+ NSArray *nsArray { @[ @"Hello world!", @"this", @"is", @"a", @"test" ] };
+
+ expect(
+ [nsArray isEqualToArray:createNSArrayFromStringArray(stringArray)]);
+ }
+
+ beginTest("Dictionary");
+ {
+ DynamicObject::Ptr data{new DynamicObject()};
+ data->setProperty("integer", 1);
+ data->setProperty("double", 2.3);
+ data->setProperty("boolean", true);
+ data->setProperty("string", "Hello world!");
+
+ Array array{45, 67.8, true, "Hello array!"};
+ data->setProperty("array", array);
+
+ auto *nsDictionary = varObjectToNSDictionary(data.get());
+ auto clone = nsDictionaryToVar(nsDictionary);
+
+ expect(clone.getProperty("integer", {}).isInt());
+ expect(clone.getProperty("double", {}).isDouble());
+ expect(clone.getProperty("boolean", {}).isBool());
+ expect(clone.getProperty("string", {}).isString());
+ expect(clone.getProperty("array", {}).isArray());
+
+ expect(clone.getProperty("integer", {}) == var{1});
+ expect(clone.getProperty("double", {}) == var{2.3});
+ expect(clone.getProperty("boolean", {}) == var{true});
+ expect(clone.getProperty("string", {}) == var{"Hello world!"});
+ expect(clone.getProperty("array", {}) == array);
+ }
+ }
+};
+
+static ObjCHelpersTest objCHelpersTest;
+
+} // namespace juce
diff --git a/modules/juce_core/unit_tests/juce_UnitTestCategories.h b/modules/juce_core/unit_tests/juce_UnitTestCategories.h
index c4fa4b5dfc..267991f486 100644
--- a/modules/juce_core/unit_tests/juce_UnitTestCategories.h
+++ b/modules/juce_core/unit_tests/juce_UnitTestCategories.h
@@ -40,6 +40,7 @@ namespace UnitTestCategories
static const String json { "JSON" };
static const String maths { "Maths" };
static const String midi { "MIDI" };
+ static const String native { "Native" };
static const String networking { "Networking" };
static const String osc { "OSC" };
static const String smoothedValues { "SmoothedValues" };