Browse Source

Cleaned up some obscure compiler warnings and added some JSON unit tests.

tags/2021-05-28
Julian Storer 14 years ago
parent
commit
2009753eac
41 changed files with 299 additions and 179 deletions
  1. +1
    -4
      src/audio/audio_file_formats/juce_AiffAudioFormat.cpp
  2. +5
    -5
      src/audio/audio_file_formats/juce_OggVorbisAudioFormat.cpp
  3. +3
    -3
      src/audio/audio_sources/juce_ReverbAudioSource.cpp
  4. +2
    -2
      src/audio/devices/juce_AudioDeviceManager.cpp
  5. +2
    -2
      src/audio/synthesisers/juce_Synthesiser.cpp
  6. +8
    -8
      src/containers/juce_Array.h
  7. +1
    -1
      src/containers/juce_HashMap.h
  8. +8
    -8
      src/containers/juce_OwnedArray.h
  9. +9
    -9
      src/containers/juce_ReferenceCountedArray.h
  10. +13
    -13
      src/containers/juce_SortedSet.h
  11. +6
    -6
      src/containers/juce_Variant.cpp
  12. +6
    -1
      src/containers/juce_Variant.h
  13. +2
    -2
      src/events/juce_Timer.cpp
  14. +5
    -5
      src/gui/components/buttons/juce_ShapeButton.cpp
  15. +2
    -2
      src/gui/components/controls/juce_ImageComponent.cpp
  16. +2
    -2
      src/gui/components/controls/juce_Label.cpp
  17. +2
    -2
      src/gui/components/controls/juce_TextEditor.cpp
  18. +2
    -2
      src/gui/components/controls/juce_TreeView.cpp
  19. +1
    -1
      src/gui/components/juce_ModalComponentManager.cpp
  20. +1
    -1
      src/gui/components/keyboard/juce_KeyMappingEditorComponent.cpp
  21. +2
    -2
      src/gui/components/layout/juce_GroupComponent.cpp
  22. +6
    -6
      src/gui/components/layout/juce_ResizableBorderComponent.cpp
  23. +3
    -3
      src/gui/components/layout/juce_ResizableCornerComponent.cpp
  24. +10
    -10
      src/gui/components/layout/juce_ResizableEdgeComponent.cpp
  25. +2
    -2
      src/gui/components/layout/juce_Viewport.cpp
  26. +3
    -3
      src/gui/components/positioning/juce_RelativeCoordinatePositioner.cpp
  27. +2
    -2
      src/gui/components/positioning/juce_RelativeRectangle.cpp
  28. +13
    -13
      src/gui/components/windows/juce_CallOutBox.cpp
  29. +4
    -4
      src/gui/components/windows/juce_DialogWindow.cpp
  30. +5
    -5
      src/gui/components/windows/juce_ResizableWindow.cpp
  31. +3
    -3
      src/gui/components/windows/juce_TooltipWindow.cpp
  32. +4
    -4
      src/gui/graphics/drawables/juce_DrawableComposite.cpp
  33. +4
    -4
      src/gui/graphics/drawables/juce_DrawableImage.cpp
  34. +8
    -9
      src/gui/graphics/drawables/juce_DrawablePath.cpp
  35. +5
    -5
      src/gui/graphics/drawables/juce_DrawableRectangle.cpp
  36. +4
    -4
      src/gui/graphics/drawables/juce_DrawableShape.cpp
  37. +5
    -5
      src/gui/graphics/drawables/juce_DrawableText.cpp
  38. +2
    -2
      src/gui/graphics/imaging/image_file_formats/juce_GIFLoader.cpp
  39. +2
    -2
      src/maths/juce_Expression.cpp
  40. +5
    -5
      src/native/mac/juce_mac_Fonts.mm
  41. +126
    -7
      src/text/juce_JSON.cpp

+ 1
- 4
src/audio/audio_file_formats/juce_AiffAudioFormat.cpp View File

@@ -176,8 +176,6 @@ namespace MarkChunk
for (int i = 0; i < numCues; ++i) for (int i = 0; i < numCues; ++i)
{ {
const String prefixCue ("Cue" + String (i)); const String prefixCue ("Cue" + String (i));
const String prefixLabel ("CueLabel" + String (i));
const int identifier = idOffset + values.getValue (prefixCue + "Identifier", "1").getIntValue(); const int identifier = idOffset + values.getValue (prefixCue + "Identifier", "1").getIntValue();
#if JUCE_DEBUG #if JUCE_DEBUG
@@ -186,8 +184,7 @@ namespace MarkChunk
#endif #endif
const int offset = values.getValue (prefixCue + "Offset", "0").getIntValue(); const int offset = values.getValue (prefixCue + "Offset", "0").getIntValue();
String label (prefixLabel);
String label ("CueLabel" + String (i));
for (int labelIndex = 0; labelIndex < numCueLabels; ++labelIndex) for (int labelIndex = 0; labelIndex < numCueLabels; ++labelIndex)
{ {


+ 5
- 5
src/audio/audio_file_formats/juce_OggVorbisAudioFormat.cpp View File

@@ -250,18 +250,18 @@ class OggWriter : public AudioFormatWriter
public: public:
//============================================================================== //==============================================================================
OggWriter (OutputStream* const out, OggWriter (OutputStream* const out,
const double sampleRate,
const int numChannels,
const int bitsPerSample,
const double sampleRate_,
const int numChannels_,
const int bitsPerSample_,
const int qualityIndex) const int qualityIndex)
: AudioFormatWriter (out, TRANS (oggFormatName), sampleRate, numChannels, bitsPerSample),
: AudioFormatWriter (out, TRANS (oggFormatName), sampleRate_, numChannels_, bitsPerSample_),
ok (false) ok (false)
{ {
using namespace OggVorbisNamespace; using namespace OggVorbisNamespace;
vorbis_info_init (&vi); vorbis_info_init (&vi);
if (vorbis_encode_init_vbr (&vi, numChannels, (int) sampleRate,
if (vorbis_encode_init_vbr (&vi, numChannels_, (int) sampleRate_,
jlimit (0.0f, 1.0f, qualityIndex * 0.1f)) == 0) jlimit (0.0f, 1.0f, qualityIndex * 0.1f)) == 0)
{ {
vorbis_comment_init (&vc); vorbis_comment_init (&vc);


+ 3
- 3
src/audio/audio_sources/juce_ReverbAudioSource.cpp View File

@@ -78,12 +78,12 @@ void ReverbAudioSource::setParameters (const Reverb::Parameters& newParams)
reverb.setParameters (newParams); reverb.setParameters (newParams);
} }
void ReverbAudioSource::setBypassed (bool isBypassed) noexcept
void ReverbAudioSource::setBypassed (bool b) noexcept
{ {
if (bypass != isBypassed)
if (bypass != b)
{ {
const ScopedLock sl (lock); const ScopedLock sl (lock);
bypass = isBypassed;
bypass = b;
reverb.reset(); reverb.reset();
} }
} }


+ 2
- 2
src/audio/devices/juce_AudioDeviceManager.cpp View File

@@ -775,11 +775,11 @@ void AudioDeviceManager::addMidiInputCallback (const String& name,
} }
} }
void AudioDeviceManager::removeMidiInputCallback (const String& name, MidiInputCallback* callback)
void AudioDeviceManager::removeMidiInputCallback (const String& name, MidiInputCallback* callbackToRemove)
{ {
for (int i = midiCallbacks.size(); --i >= 0;) for (int i = midiCallbacks.size(); --i >= 0;)
{ {
if (midiCallbackDevices[i] == name && midiCallbacks.getUnchecked(i) == callback)
if (midiCallbackDevices[i] == name && midiCallbacks.getUnchecked(i) == callbackToRemove)
{ {
const ScopedLock sl (midiCallbackLock); const ScopedLock sl (midiCallbackLock);
midiCallbacks.remove (i); midiCallbacks.remove (i);


+ 2
- 2
src/audio/synthesisers/juce_Synthesiser.cpp View File

@@ -235,9 +235,9 @@ void Synthesiser::noteOn (const int midiChannel,
{ {
// If hitting a note that's still ringing, stop it first (it could be // If hitting a note that's still ringing, stop it first (it could be
// still playing because of the sustain or sostenuto pedal). // still playing because of the sustain or sostenuto pedal).
for (int i = voices.size(); --i >= 0;)
for (int j = voices.size(); --j >= 0;)
{ {
SynthesiserVoice* const voice = voices.getUnchecked (i);
SynthesiserVoice* const voice = voices.getUnchecked (j);
if (voice->getCurrentlyPlayingNote() == midiNoteNumber if (voice->getCurrentlyPlayingNote() == midiNoteNumber
&& voice->isPlayingChannel (midiChannel)) && voice->isPlayingChannel (midiChannel))


+ 8
- 8
src/containers/juce_Array.h View File

@@ -315,9 +315,9 @@ public:
{ {
const ScopedLockType lock (getLock()); const ScopedLockType lock (getLock());
const ElementType* e = data.elements.getData(); const ElementType* e = data.elements.getData();
const ElementType* const end = e + numUsed;
const ElementType* const end_ = e + numUsed;
for (; e != end; ++e)
for (; e != end_; ++e)
if (elementToLookFor == *e) if (elementToLookFor == *e)
return static_cast <int> (e - data.elements.getData()); return static_cast <int> (e - data.elements.getData());
@@ -333,9 +333,9 @@ public:
{ {
const ScopedLockType lock (getLock()); const ScopedLockType lock (getLock());
const ElementType* e = data.elements.getData(); const ElementType* e = data.elements.getData();
const ElementType* const end = e + numUsed;
const ElementType* const end_ = e + numUsed;
for (; e != end; ++e)
for (; e != end_; ++e)
if (elementToLookFor == *e) if (elementToLookFor == *e)
return true; return true;
@@ -668,11 +668,11 @@ public:
const ScopedLockType lock (getLock()); const ScopedLockType lock (getLock());
int start = 0; int start = 0;
int end = numUsed;
int end_ = numUsed;
for (;;) for (;;)
{ {
if (start >= end)
if (start >= end_)
{ {
return -1; return -1;
} }
@@ -682,14 +682,14 @@ public:
} }
else else
{ {
const int halfway = (start + end) >> 1;
const int halfway = (start + end_) >> 1;
if (halfway == start) if (halfway == start)
return -1; return -1;
else if (comparator.compareElements (elementToLookFor, data.elements [halfway]) >= 0) else if (comparator.compareElements (elementToLookFor, data.elements [halfway]) >= 0)
start = halfway; start = halfway;
else else
end = halfway;
end_ = halfway;
} }
} }
} }


+ 1
- 1
src/containers/juce_HashMap.h View File

@@ -108,7 +108,7 @@ public:
will be the "upperLimit" parameter that is passed to your generateHash() function. The number will be the "upperLimit" parameter that is passed to your generateHash() function. The number
of hash slots will grow automatically if necessary, or it can be remapped manually using remapTable(). of hash slots will grow automatically if necessary, or it can be remapped manually using remapTable().
*/ */
HashMap (const int numberOfSlots = defaultHashTableSize)
explicit HashMap (const int numberOfSlots = defaultHashTableSize)
: totalNumItems (0) : totalNumItems (0)
{ {
slots.insertMultiple (0, nullptr, numberOfSlots); slots.insertMultiple (0, nullptr, numberOfSlots);


+ 8
- 8
src/containers/juce_OwnedArray.h View File

@@ -185,9 +185,9 @@ public:
{ {
const ScopedLockType lock (getLock()); const ScopedLockType lock (getLock());
ObjectClass* const* e = data.elements.getData(); ObjectClass* const* e = data.elements.getData();
ObjectClass* const* const end = e + numUsed;
ObjectClass* const* const end_ = e + numUsed;
for (; e != end; ++e)
for (; e != end_; ++e)
if (objectToLookFor == *e) if (objectToLookFor == *e)
return static_cast <int> (e - data.elements.getData()); return static_cast <int> (e - data.elements.getData());
@@ -203,9 +203,9 @@ public:
{ {
const ScopedLockType lock (getLock()); const ScopedLockType lock (getLock());
ObjectClass* const* e = data.elements.getData(); ObjectClass* const* e = data.elements.getData();
ObjectClass* const* const end = e + numUsed;
ObjectClass* const* const end_ = e + numUsed;
for (; e != end; ++e)
for (; e != end_; ++e)
if (objectToLookFor == *e) if (objectToLookFor == *e)
return true; return true;
@@ -463,11 +463,11 @@ public:
const ScopedLockType lock (getLock()); const ScopedLockType lock (getLock());
int start = 0; int start = 0;
int end = numUsed;
int end_ = numUsed;
for (;;) for (;;)
{ {
if (start >= end)
if (start >= end_)
{ {
return -1; return -1;
} }
@@ -477,14 +477,14 @@ public:
} }
else else
{ {
const int halfway = (start + end) >> 1;
const int halfway = (start + end_) >> 1;
if (halfway == start) if (halfway == start)
return -1; return -1;
else if (comparator.compareElements (objectToLookFor, data.elements [halfway]) >= 0) else if (comparator.compareElements (objectToLookFor, data.elements [halfway]) >= 0)
start = halfway; start = halfway;
else else
end = halfway;
end_ = halfway;
} }
} }
} }


+ 9
- 9
src/containers/juce_ReferenceCountedArray.h View File

@@ -198,9 +198,9 @@ public:
{ {
const ScopedLockType lock (getLock()); const ScopedLockType lock (getLock());
ObjectClass** e = data.elements.getData(); ObjectClass** e = data.elements.getData();
ObjectClass** const end = e + numUsed;
ObjectClass** const end_ = e + numUsed;
while (e != end)
while (e != end_)
{ {
if (objectToLookFor == *e) if (objectToLookFor == *e)
return static_cast <int> (e - data.elements.getData()); return static_cast <int> (e - data.elements.getData());
@@ -220,9 +220,9 @@ public:
{ {
const ScopedLockType lock (getLock()); const ScopedLockType lock (getLock());
ObjectClass** e = data.elements.getData(); ObjectClass** e = data.elements.getData();
ObjectClass** const end = e + numUsed;
ObjectClass** const end_ = e + numUsed;
while (e != end)
while (e != end_)
{ {
if (objectToLookFor == *e) if (objectToLookFor == *e)
return true; return true;
@@ -529,12 +529,12 @@ public:
const ScopedLockType lock (getLock()); const ScopedLockType lock (getLock());
const int start = jlimit (0, numUsed, startIndex); const int start = jlimit (0, numUsed, startIndex);
const int end = jlimit (0, numUsed, startIndex + numberToRemove);
const int end_ = jlimit (0, numUsed, startIndex + numberToRemove);
if (end > start)
if (end_ > start)
{ {
int i; int i;
for (i = start; i < end; ++i)
for (i = start; i < end_; ++i)
{ {
if (data.elements[i] != nullptr) if (data.elements[i] != nullptr)
{ {
@@ -543,9 +543,9 @@ public:
} }
} }
const int rangeSize = end - start;
const int rangeSize = end_ - start;
ObjectClass** e = data.elements + start; ObjectClass** e = data.elements + start;
i = numUsed - end;
i = numUsed - end_;
numUsed -= rangeSize; numUsed -= rangeSize;
while (--i >= 0) while (--i >= 0)


+ 13
- 13
src/containers/juce_SortedSet.h View File

@@ -270,11 +270,11 @@ public:
const ScopedLockType lock (getLock()); const ScopedLockType lock (getLock());
int start = 0; int start = 0;
int end = numUsed;
int end_ = numUsed;
for (;;) for (;;)
{ {
if (start >= end)
if (start >= end_)
{ {
return -1; return -1;
} }
@@ -284,12 +284,12 @@ public:
} }
else else
{ {
const int halfway = (start + end) >> 1;
const int halfway = (start + end_) >> 1;
if (halfway == start) if (halfway == start)
return -1; return -1;
else if (elementToLookFor < data.elements [halfway]) else if (elementToLookFor < data.elements [halfway])
end = halfway;
end_ = halfway;
else else
start = halfway; start = halfway;
} }
@@ -306,11 +306,11 @@ public:
const ScopedLockType lock (getLock()); const ScopedLockType lock (getLock());
int start = 0; int start = 0;
int end = numUsed;
int end_ = numUsed;
for (;;) for (;;)
{ {
if (start >= end)
if (start >= end_)
{ {
return false; return false;
} }
@@ -320,12 +320,12 @@ public:
} }
else else
{ {
const int halfway = (start + end) >> 1;
const int halfway = (start + end_) >> 1;
if (halfway == start) if (halfway == start)
return false; return false;
else if (elementToLookFor < data.elements [halfway]) else if (elementToLookFor < data.elements [halfway])
end = halfway;
end_ = halfway;
else else
start = halfway; start = halfway;
} }
@@ -343,13 +343,13 @@ public:
const ScopedLockType lock (getLock()); const ScopedLockType lock (getLock());
int start = 0; int start = 0;
int end = numUsed;
int end_ = numUsed;
for (;;) for (;;)
{ {
if (start >= end)
if (start >= end_)
{ {
jassert (start <= end);
jassert (start <= end_);
insertInternal (start, newElement); insertInternal (start, newElement);
break; break;
} }
@@ -359,7 +359,7 @@ public:
} }
else else
{ {
const int halfway = (start + end) >> 1;
const int halfway = (start + end_) >> 1;
if (halfway == start) if (halfway == start)
{ {
@@ -371,7 +371,7 @@ public:
break; break;
} }
else if (newElement < data.elements [halfway]) else if (newElement < data.elements [halfway])
end = halfway;
end_ = halfway;
else else
start = halfway; start = halfway;
} }


+ 6
- 6
src/containers/juce_Variant.cpp View File

@@ -565,9 +565,9 @@ Array<var>* var::convertToArray()
return array; return array;
} }
void var::append (const var& value)
void var::append (const var& n)
{ {
convertToArray()->add (value);
convertToArray()->add (n);
} }
void var::remove (const int index) void var::remove (const int index)
@@ -578,9 +578,9 @@ void var::remove (const int index)
array->remove (index); array->remove (index);
} }
void var::insert (const int index, const var& value)
void var::insert (const int index, const var& n)
{ {
convertToArray()->insert (index, value);
convertToArray()->insert (index, n);
} }
void var::resize (const int numArrayElementsWanted) void var::resize (const int numArrayElementsWanted)
@@ -588,10 +588,10 @@ void var::resize (const int numArrayElementsWanted)
convertToArray()->resize (numArrayElementsWanted); convertToArray()->resize (numArrayElementsWanted);
} }
int var::indexOf (const var& value) const
int var::indexOf (const var& n) const
{ {
const Array<var>* const array = getArray(); const Array<var>* const array = getArray();
return array != nullptr ? array->indexOf (value) : -1;
return array != nullptr ? array->indexOf (n) : -1;
} }
//============================================================================== //==============================================================================


+ 6
- 1
src/containers/juce_Variant.h View File

@@ -44,7 +44,10 @@
any kind of ReferenceCountedObject. The var class is intended to act like any kind of ReferenceCountedObject. The var class is intended to act like
the kind of values used in dynamic scripting languages. the kind of values used in dynamic scripting languages.
@see DynamicObject
You can save/load var objects either in a small, proprietary binary format
using writeToStream()/readFromStream(), or as JSON by using the JSON class.
@see JSON, DynamicObject
*/ */
class JUCE_API var class JUCE_API var
{ {
@@ -208,12 +211,14 @@ public:
//============================================================================== //==============================================================================
/** Writes a binary representation of this value to a stream. /** Writes a binary representation of this value to a stream.
The data can be read back later using readFromStream(). The data can be read back later using readFromStream().
@see JSON
*/ */
void writeToStream (OutputStream& output) const; void writeToStream (OutputStream& output) const;
/** Reads back a stored binary representation of a value. /** Reads back a stored binary representation of a value.
The data in the stream must have been written using writeToStream(), or this The data in the stream must have been written using writeToStream(), or this
will have unpredictable results. will have unpredictable results.
@see JSON
*/ */
static var readFromStream (InputStream& input); static var readFromStream (InputStream& input);


+ 2
- 2
src/events/juce_Timer.cpp View File

@@ -65,7 +65,7 @@ public:
void run() void run()
{ {
uint32 lastTime = Time::getMillisecondCounter(); uint32 lastTime = Time::getMillisecondCounter();
Message::Ptr message (new Message());
Message::Ptr messageToSend (new Message());
while (! threadShouldExit()) while (! threadShouldExit())
{ {
@@ -92,7 +92,7 @@ public:
*/ */
if (callbackNeeded.compareAndSetBool (1, 0)) if (callbackNeeded.compareAndSetBool (1, 0))
{ {
postMessage (message);
postMessage (messageToSend);
/* Sometimes our message can get discarded by the OS (e.g. when running as an RTAS /* Sometimes our message can get discarded by the OS (e.g. when running as an RTAS
when the app has a modal loop), so this is how long to wait before assuming the when the app has a modal loop), so this is how long to wait before assuming the


+ 5
- 5
src/gui/components/buttons/juce_ShapeButton.cpp View File

@@ -77,15 +77,15 @@ void ShapeButton::setShape (const Path& newShape,
if (resizeNowToFitThisShape) if (resizeNowToFitThisShape)
{ {
Rectangle<float> bounds (shape.getBounds());
Rectangle<float> newBounds (shape.getBounds());
if (hasShadow) if (hasShadow)
bounds.expand (4.0f, 4.0f);
newBounds.expand (4.0f, 4.0f);
shape.applyTransform (AffineTransform::translation (-bounds.getX(), -bounds.getY()));
shape.applyTransform (AffineTransform::translation (-newBounds.getX(), -newBounds.getY()));
setSize (1 + (int) (bounds.getWidth() + outlineWidth),
1 + (int) (bounds.getHeight() + outlineWidth));
setSize (1 + (int) (newBounds.getWidth() + outlineWidth),
1 + (int) (newBounds.getHeight() + outlineWidth));
} }
} }


+ 2
- 2
src/gui/components/controls/juce_ImageComponent.cpp View File

@@ -31,8 +31,8 @@ BEGIN_JUCE_NAMESPACE
//============================================================================== //==============================================================================
ImageComponent::ImageComponent (const String& componentName)
: Component (componentName),
ImageComponent::ImageComponent (const String& name)
: Component (name),
placement (RectanglePlacement::centred) placement (RectanglePlacement::centred)
{ {
} }


+ 2
- 2
src/gui/components/controls/juce_Label.cpp View File

@@ -34,9 +34,9 @@ BEGIN_JUCE_NAMESPACE
//============================================================================== //==============================================================================
Label::Label (const String& componentName,
Label::Label (const String& name,
const String& labelText) const String& labelText)
: Component (componentName),
: Component (name),
textValue (labelText), textValue (labelText),
lastTextValue (labelText), lastTextValue (labelText),
font (15.0f), font (15.0f),


+ 2
- 2
src/gui/components/controls/juce_TextEditor.cpp View File

@@ -1715,9 +1715,9 @@ void TextEditor::drawContent (Graphics& g)
} }
} }
for (int i = underlinedSections.size(); --i >= 0;)
for (int j = underlinedSections.size(); --j >= 0;)
{ {
const Range<int>& underlinedSection = underlinedSections.getReference (i);
const Range<int>& underlinedSection = underlinedSections.getReference (j);
Iterator i2 (sections, wordWrapWidth, passwordCharacter); Iterator i2 (sections, wordWrapWidth, passwordCharacter);


+ 2
- 2
src/gui/components/controls/juce_TreeView.cpp View File

@@ -459,8 +459,8 @@ private:
//============================================================================== //==============================================================================
TreeView::TreeView (const String& componentName)
: Component (componentName),
TreeView::TreeView (const String& name)
: Component (name),
rootItem (nullptr), rootItem (nullptr),
indentSize (24), indentSize (24),
defaultOpenness (false), defaultOpenness (false),


+ 1
- 1
src/gui/components/juce_ModalComponentManager.cpp View File

@@ -200,7 +200,7 @@ void ModalComponentManager::handleAsyncUpdate()
if (! item->isActive) if (! item->isActive)
{ {
ScopedPointer<ModalItem> item (stack.removeAndReturn (i));
ScopedPointer<ModalItem> deleter (stack.removeAndReturn (i));
for (int j = item->callbacks.size(); --j >= 0;) for (int j = item->callbacks.size(); --j >= 0;)
item->callbacks.getUnchecked(j)->modalStateFinished (item->returnValue); item->callbacks.getUnchecked(j)->modalStateFinished (item->returnValue);


+ 1
- 1
src/gui/components/keyboard/juce_KeyMappingEditorComponent.cpp View File

@@ -385,7 +385,7 @@ public:
void changeListenerCallback (ChangeBroadcaster*) void changeListenerCallback (ChangeBroadcaster*)
{ {
const OpennessRestorer openness (*this);
const OpennessRestorer opennessRestorer (*this);
clearSubItems(); clearSubItems();
const StringArray categories (owner.getMappings().getCommandManager()->getCommandCategories()); const StringArray categories (owner.getMappings().getCommandManager()->getCommandCategories());


+ 2
- 2
src/gui/components/layout/juce_GroupComponent.cpp View File

@@ -32,9 +32,9 @@ BEGIN_JUCE_NAMESPACE
//============================================================================== //==============================================================================
GroupComponent::GroupComponent (const String& componentName,
GroupComponent::GroupComponent (const String& name,
const String& labelText) const String& labelText)
: Component (componentName),
: Component (name),
text (labelText), text (labelText),
justification (Justification::left) justification (Justification::left)
{ {


+ 6
- 6
src/gui/components/layout/juce_ResizableBorderComponent.cpp View File

@@ -150,11 +150,11 @@ void ResizableBorderComponent::mouseDrag (const MouseEvent& e)
return; return;
} }
const Rectangle<int> bounds (mouseZone.resizeRectangleBy (originalBounds, e.getOffsetFromDragStart()));
const Rectangle<int> newBounds (mouseZone.resizeRectangleBy (originalBounds, e.getOffsetFromDragStart()));
if (constrainer != nullptr) if (constrainer != nullptr)
{ {
constrainer->setBoundsForComponent (component, bounds,
constrainer->setBoundsForComponent (component, newBounds,
mouseZone.isDraggingTopEdge(), mouseZone.isDraggingTopEdge(),
mouseZone.isDraggingLeftEdge(), mouseZone.isDraggingLeftEdge(),
mouseZone.isDraggingBottomEdge(), mouseZone.isDraggingBottomEdge(),
@@ -162,12 +162,12 @@ void ResizableBorderComponent::mouseDrag (const MouseEvent& e)
} }
else else
{ {
Component::Positioner* const positioner = component->getPositioner();
Component::Positioner* const pos = component->getPositioner();
if (positioner != nullptr)
positioner->applyNewBounds (bounds);
if (pos != nullptr)
pos->applyNewBounds (newBounds);
else else
component->setBounds (bounds);
component->setBounds (newBounds);
} }
} }


+ 3
- 3
src/gui/components/layout/juce_ResizableCornerComponent.cpp View File

@@ -87,10 +87,10 @@ void ResizableCornerComponent::mouseDrag (const MouseEvent& e)
} }
else else
{ {
Component::Positioner* const positioner = component->getPositioner();
Component::Positioner* const pos = component->getPositioner();
if (positioner != nullptr)
positioner->applyNewBounds (r);
if (pos != nullptr)
pos->applyNewBounds (r);
else else
component->setBounds (r); component->setBounds (r);
} }


+ 10
- 10
src/gui/components/layout/juce_ResizableEdgeComponent.cpp View File

@@ -82,20 +82,20 @@ void ResizableEdgeComponent::mouseDrag (const MouseEvent& e)
return; return;
} }
Rectangle<int> bounds (originalBounds);
Rectangle<int> newBounds (originalBounds);
switch (edge) switch (edge)
{ {
case leftEdge: bounds.setLeft (jmin (bounds.getRight(), bounds.getX() + e.getDistanceFromDragStartX())); break;
case rightEdge: bounds.setWidth (jmax (0, bounds.getWidth() + e.getDistanceFromDragStartX())); break;
case topEdge: bounds.setTop (jmin (bounds.getBottom(), bounds.getY() + e.getDistanceFromDragStartY())); break;
case bottomEdge: bounds.setHeight (jmax (0, bounds.getHeight() + e.getDistanceFromDragStartY())); break;
case leftEdge: newBounds.setLeft (jmin (newBounds.getRight(), newBounds.getX() + e.getDistanceFromDragStartX())); break;
case rightEdge: newBounds.setWidth (jmax (0, newBounds.getWidth() + e.getDistanceFromDragStartX())); break;
case topEdge: newBounds.setTop (jmin (newBounds.getBottom(), newBounds.getY() + e.getDistanceFromDragStartY())); break;
case bottomEdge: newBounds.setHeight (jmax (0, newBounds.getHeight() + e.getDistanceFromDragStartY())); break;
default: jassertfalse; break; default: jassertfalse; break;
} }
if (constrainer != nullptr) if (constrainer != nullptr)
{ {
constrainer->setBoundsForComponent (component, bounds,
constrainer->setBoundsForComponent (component, newBounds,
edge == topEdge, edge == topEdge,
edge == leftEdge, edge == leftEdge,
edge == bottomEdge, edge == bottomEdge,
@@ -103,12 +103,12 @@ void ResizableEdgeComponent::mouseDrag (const MouseEvent& e)
} }
else else
{ {
Component::Positioner* const positioner = component->getPositioner();
Component::Positioner* const pos = component->getPositioner();
if (positioner != nullptr)
positioner->applyNewBounds (bounds);
if (pos != nullptr)
pos->applyNewBounds (newBounds);
else else
component->setBounds (bounds);
component->setBounds (newBounds);
} }
} }


+ 2
- 2
src/gui/components/layout/juce_Viewport.cpp View File

@@ -32,8 +32,8 @@ BEGIN_JUCE_NAMESPACE
//============================================================================== //==============================================================================
Viewport::Viewport (const String& componentName)
: Component (componentName),
Viewport::Viewport (const String& name)
: Component (name),
scrollBarThickness (0), scrollBarThickness (0),
singleStepX (16), singleStepX (16),
singleStepY (16), singleStepY (16),


+ 3
- 3
src/gui/components/positioning/juce_RelativeCoordinatePositioner.cpp View File

@@ -220,10 +220,10 @@ void RelativeCoordinatePositionerBase::componentChildrenChanged (Component& chan
apply(); apply();
} }
void RelativeCoordinatePositionerBase::componentBeingDeleted (Component& component)
void RelativeCoordinatePositionerBase::componentBeingDeleted (Component& comp)
{ {
jassert (sourceComponents.contains (&component));
sourceComponents.removeValue (&component);
jassert (sourceComponents.contains (&comp));
sourceComponents.removeValue (&comp);
registeredOk = false; registeredOk = false;
} }


+ 2
- 2
src/gui/components/positioning/juce_RelativeRectangle.cpp View File

@@ -147,8 +147,8 @@ const Rectangle<float> RelativeRectangle::resolve (const Expression::Scope* scop
{ {
if (scope == nullptr) if (scope == nullptr)
{ {
RelativeRectangleLocalScope scope (*this);
return resolve (&scope);
RelativeRectangleLocalScope defaultScope (*this);
return resolve (&defaultScope);
} }
else else
{ {


+ 13
- 13
src/gui/components/windows/juce_CallOutBox.cpp View File

@@ -36,17 +36,17 @@ BEGIN_JUCE_NAMESPACE
//============================================================================== //==============================================================================
CallOutBox::CallOutBox (Component& contentComponent, CallOutBox::CallOutBox (Component& contentComponent,
Component& componentToPointTo, Component& componentToPointTo,
Component* const parentComponent)
Component* const parent)
: borderSpace (20), arrowSize (16.0f), content (contentComponent) : borderSpace (20), arrowSize (16.0f), content (contentComponent)
{ {
addAndMakeVisible (&content); addAndMakeVisible (&content);
if (parentComponent != nullptr)
if (parent != nullptr)
{ {
parentComponent->addChildComponent (this);
parent->addChildComponent (this);
updatePosition (parentComponent->getLocalArea (&componentToPointTo, componentToPointTo.getLocalBounds()),
parentComponent->getLocalBounds());
updatePosition (parent->getLocalArea (&componentToPointTo, componentToPointTo.getLocalBounds()),
parent->getLocalBounds());
setVisible (true); setVisible (true);
} }
@@ -155,12 +155,12 @@ void CallOutBox::updatePosition (const Rectangle<int>& newAreaToPointTo, const R
targetArea = newAreaToPointTo; targetArea = newAreaToPointTo;
availableArea = newAreaToFitIn; availableArea = newAreaToFitIn;
Rectangle<int> bounds (0, 0,
content.getWidth() + borderSpace * 2,
content.getHeight() + borderSpace * 2);
Rectangle<int> newBounds (0, 0,
content.getWidth() + borderSpace * 2,
content.getHeight() + borderSpace * 2);
const int hw = bounds.getWidth() / 2;
const int hh = bounds.getHeight() / 2;
const int hw = newBounds.getWidth() / 2;
const int hh = newBounds.getHeight() / 2;
const float hwReduced = (float) (hw - borderSpace * 3); const float hwReduced = (float) (hw - borderSpace * 3);
const float hhReduced = (float) (hh - borderSpace * 3); const float hhReduced = (float) (hh - borderSpace * 3);
const float arrowIndent = borderSpace - arrowSize; const float arrowIndent = borderSpace - arrowSize;
@@ -195,12 +195,12 @@ void CallOutBox::updatePosition (const Rectangle<int>& newAreaToPointTo, const R
nearest = distanceFromCentre; nearest = distanceFromCentre;
targetPoint = targets[i]; targetPoint = targets[i];
bounds.setPosition ((int) (centre.getX() - hw),
(int) (centre.getY() - hh));
newBounds.setPosition ((int) (centre.getX() - hw),
(int) (centre.getY() - hh));
} }
} }
setBounds (bounds);
setBounds (newBounds);
} }
void CallOutBox::refreshPath() void CallOutBox::refreshPath()


+ 4
- 4
src/gui/components/windows/juce_DialogWindow.cpp View File

@@ -65,18 +65,18 @@ class TempDialogWindow : public DialogWindow
{ {
public: public:
TempDialogWindow (const String& title, TempDialogWindow (const String& title,
Component* contentComponent,
Component* contentComponent_,
Component* componentToCentreAround, Component* componentToCentreAround,
const Colour& colour, const Colour& colour,
const bool escapeKeyTriggersCloseButton,
const bool escapeKeyTriggersCloseButton_,
const bool shouldBeResizable, const bool shouldBeResizable,
const bool useBottomRightCornerResizer) const bool useBottomRightCornerResizer)
: DialogWindow (title, colour, escapeKeyTriggersCloseButton, true)
: DialogWindow (title, colour, escapeKeyTriggersCloseButton_, true)
{ {
if (! JUCEApplication::isStandaloneApp()) if (! JUCEApplication::isStandaloneApp())
setAlwaysOnTop (true); // for a plugin, make it always-on-top because the host windows are often top-level setAlwaysOnTop (true); // for a plugin, make it always-on-top because the host windows are often top-level
setContentNonOwned (contentComponent, true);
setContentNonOwned (contentComponent_, true);
centreAroundComponent (componentToCentreAround, getWidth(), getHeight()); centreAroundComponent (componentToCentreAround, getWidth(), getHeight());
setResizable (shouldBeResizable, useBottomRightCornerResizer); setResizable (shouldBeResizable, useBottomRightCornerResizer);
} }


+ 5
- 5
src/gui/components/windows/juce_ResizableWindow.cpp View File

@@ -83,13 +83,13 @@ ResizableWindow::~ResizableWindow()
jassert (getNumChildComponents() == 0); jassert (getNumChildComponents() == 0);
} }
void ResizableWindow::initialise (const bool addToDesktop)
void ResizableWindow::initialise (const bool shouldAddToDesktop)
{ {
defaultConstrainer.setMinimumOnscreenAmounts (0x10000, 16, 24, 16); defaultConstrainer.setMinimumOnscreenAmounts (0x10000, 16, 24, 16);
lastNonFullScreenPos.setBounds (50, 50, 256, 256); lastNonFullScreenPos.setBounds (50, 50, 256, 256);
if (addToDesktop)
if (shouldAddToDesktop)
Component::addToDesktop (ResizableWindow::getDesktopWindowStyleFlags()); Component::addToDesktop (ResizableWindow::getDesktopWindowStyleFlags());
} }
@@ -349,12 +349,12 @@ void ResizableWindow::setConstrainer (ComponentBoundsConstrainer* newConstrainer
} }
} }
void ResizableWindow::setBoundsConstrained (const Rectangle<int>& bounds)
void ResizableWindow::setBoundsConstrained (const Rectangle<int>& newBounds)
{ {
if (constrainer != nullptr) if (constrainer != nullptr)
constrainer->setBoundsForComponent (this, bounds, false, false, false, false);
constrainer->setBoundsForComponent (this, newBounds, false, false, false, false);
else else
setBounds (bounds);
setBounds (newBounds);
} }
//============================================================================== //==============================================================================


+ 3
- 3
src/gui/components/windows/juce_TooltipWindow.cpp View File

@@ -37,7 +37,7 @@ BEGIN_JUCE_NAMESPACE
//============================================================================== //==============================================================================
TooltipWindow::TooltipWindow (Component* const parentComponent,
TooltipWindow::TooltipWindow (Component* const parent_,
const int millisecondsBeforeTipAppears_) const int millisecondsBeforeTipAppears_)
: Component ("tooltip"), : Component ("tooltip"),
millisecondsBeforeTipAppears (millisecondsBeforeTipAppears_), millisecondsBeforeTipAppears (millisecondsBeforeTipAppears_),
@@ -52,8 +52,8 @@ TooltipWindow::TooltipWindow (Component* const parentComponent,
setAlwaysOnTop (true); setAlwaysOnTop (true);
setOpaque (true); setOpaque (true);
if (parentComponent != nullptr)
parentComponent->addChildComponent (this);
if (parent_ != nullptr)
parent_->addChildComponent (this);
} }
TooltipWindow::~TooltipWindow() TooltipWindow::~TooltipWindow()


+ 4
- 4
src/gui/graphics/drawables/juce_DrawableComposite.cpp View File

@@ -146,11 +146,11 @@ void DrawableComposite::resetContentAreaAndBoundingBoxToFitChildren()
resetBoundingBoxToContentArea(); resetBoundingBoxToContentArea();
} }
bool DrawableComposite::registerCoordinates (RelativeCoordinatePositionerBase& positioner)
bool DrawableComposite::registerCoordinates (RelativeCoordinatePositionerBase& pos)
{ {
bool ok = positioner.addPoint (bounds.topLeft);
ok = positioner.addPoint (bounds.topRight) && ok;
return positioner.addPoint (bounds.bottomLeft) && ok;
bool ok = pos.addPoint (bounds.topLeft);
ok = pos.addPoint (bounds.topRight) && ok;
return pos.addPoint (bounds.bottomLeft) && ok;
} }
void DrawableComposite::recalculateCoordinates (Expression::Scope* scope) void DrawableComposite::recalculateCoordinates (Expression::Scope* scope)


+ 4
- 4
src/gui/graphics/drawables/juce_DrawableImage.cpp View File

@@ -98,11 +98,11 @@ void DrawableImage::setBoundingBox (const RelativeParallelogram& newBounds)
} }
//============================================================================== //==============================================================================
bool DrawableImage::registerCoordinates (RelativeCoordinatePositionerBase& positioner)
bool DrawableImage::registerCoordinates (RelativeCoordinatePositionerBase& pos)
{ {
bool ok = positioner.addPoint (bounds.topLeft);
ok = positioner.addPoint (bounds.topRight) && ok;
return positioner.addPoint (bounds.bottomLeft) && ok;
bool ok = pos.addPoint (bounds.topLeft);
ok = pos.addPoint (bounds.topRight) && ok;
return pos.addPoint (bounds.bottomLeft) && ok;
} }
void DrawableImage::recalculateCoordinates (Expression::Scope* scope) void DrawableImage::recalculateCoordinates (Expression::Scope* scope)


+ 8
- 9
src/gui/graphics/drawables/juce_DrawablePath.cpp View File

@@ -210,16 +210,15 @@ void DrawablePath::ValueTreeWrapper::writeTo (RelativePointPath& relativePath) c
for (int j = 0; j < numCps; ++j) for (int j = 0; j < numCps; ++j)
points[j] = e.getControlPoint (j); points[j] = e.getControlPoint (j);
const Identifier type (e.getType());
RelativePointPath::ElementBase* newElement = 0; RelativePointPath::ElementBase* newElement = 0;
if (type == Element::startSubPathElement) newElement = new RelativePointPath::StartSubPath (points[0]);
else if (type == Element::closeSubPathElement) newElement = new RelativePointPath::CloseSubPath();
else if (type == Element::lineToElement) newElement = new RelativePointPath::LineTo (points[0]);
else if (type == Element::quadraticToElement) newElement = new RelativePointPath::QuadraticTo (points[0], points[1]);
else if (type == Element::cubicToElement) newElement = new RelativePointPath::CubicTo (points[0], points[1], points[2]);
else jassertfalse;
const Identifier t (e.getType());
if (t == Element::startSubPathElement) newElement = new RelativePointPath::StartSubPath (points[0]);
else if (t == Element::closeSubPathElement) newElement = new RelativePointPath::CloseSubPath();
else if (t == Element::lineToElement) newElement = new RelativePointPath::LineTo (points[0]);
else if (t == Element::quadraticToElement) newElement = new RelativePointPath::QuadraticTo (points[0], points[1]);
else if (t == Element::cubicToElement) newElement = new RelativePointPath::CubicTo (points[0], points[1], points[2]);
else jassertfalse;
relativePath.addElement (newElement); relativePath.addElement (newElement);
} }


+ 5
- 5
src/gui/graphics/drawables/juce_DrawableRectangle.cpp View File

@@ -87,12 +87,12 @@ void DrawableRectangle::rebuildPath()
} }
} }
bool DrawableRectangle::registerCoordinates (RelativeCoordinatePositionerBase& positioner)
bool DrawableRectangle::registerCoordinates (RelativeCoordinatePositionerBase& pos)
{ {
bool ok = positioner.addPoint (bounds.topLeft);
ok = positioner.addPoint (bounds.topRight) && ok;
ok = positioner.addPoint (bounds.bottomLeft) && ok;
return positioner.addPoint (cornerSize) && ok;
bool ok = pos.addPoint (bounds.topLeft);
ok = pos.addPoint (bounds.topRight) && ok;
ok = pos.addPoint (bounds.bottomLeft) && ok;
return pos.addPoint (cornerSize) && ok;
} }
void DrawableRectangle::recalculateCoordinates (Expression::Scope* scope) void DrawableRectangle::recalculateCoordinates (Expression::Scope* scope)


+ 4
- 4
src/gui/graphics/drawables/juce_DrawableShape.cpp View File

@@ -101,17 +101,17 @@ void DrawableShape::setStrokeFill (const FillType& newFill)
} }
void DrawableShape::setFillInternal (RelativeFillType& fill, const RelativeFillType& newFill, void DrawableShape::setFillInternal (RelativeFillType& fill, const RelativeFillType& newFill,
ScopedPointer<RelativeCoordinatePositionerBase>& positioner)
ScopedPointer<RelativeCoordinatePositionerBase>& pos)
{ {
if (fill != newFill) if (fill != newFill)
{ {
fill = newFill; fill = newFill;
positioner = nullptr;
pos = nullptr;
if (fill.isDynamic()) if (fill.isDynamic())
{ {
positioner = new RelativePositioner (*this, fill, true);
positioner->apply();
pos = new RelativePositioner (*this, fill, true);
pos->apply();
} }
else else
{ {


+ 5
- 5
src/gui/graphics/drawables/juce_DrawableText.cpp View File

@@ -130,12 +130,12 @@ void DrawableText::refreshBounds()
} }
} }
bool DrawableText::registerCoordinates (RelativeCoordinatePositionerBase& positioner)
bool DrawableText::registerCoordinates (RelativeCoordinatePositionerBase& pos)
{ {
bool ok = positioner.addPoint (bounds.topLeft);
ok = positioner.addPoint (bounds.topRight) && ok;
ok = positioner.addPoint (bounds.bottomLeft) && ok;
return positioner.addPoint (fontSizeControlPoint) && ok;
bool ok = pos.addPoint (bounds.topLeft);
ok = pos.addPoint (bounds.topRight) && ok;
ok = pos.addPoint (bounds.bottomLeft) && ok;
return pos.addPoint (fontSizeControlPoint) && ok;
} }
void DrawableText::recalculateCoordinates (Expression::Scope* scope) void DrawableText::recalculateCoordinates (Expression::Scope* scope)


+ 2
- 2
src/gui/graphics/imaging/image_file_formats/juce_GIFLoader.cpp View File

@@ -315,9 +315,9 @@ private:
return code; return code;
} }
int getCode (const int codeSize_, const bool initialise)
int getCode (const int codeSize_, const bool shouldInitialise)
{ {
if (initialise)
if (shouldInitialise)
{ {
currentBit = 0; currentBit = 0;
lastBit = 0; lastBit = 0;


+ 2
- 2
src/maths/juce_Expression.cpp View File

@@ -1056,9 +1056,9 @@ Expression Expression::withRenamedSymbol (const Expression::Symbol& oldSymbol, c
return e; return e;
} }
bool Expression::referencesSymbol (const Expression::Symbol& symbol, const Scope& scope) const
bool Expression::referencesSymbol (const Expression::Symbol& symbolToCheck, const Scope& scope) const
{ {
Helpers::SymbolCheckVisitor visitor (symbol);
Helpers::SymbolCheckVisitor visitor (symbolToCheck);
try try
{ {


+ 5
- 5
src/native/mac/juce_mac_Fonts.mm View File

@@ -51,9 +51,9 @@ public:
unitsToHeightScaleFactor (0.0f) unitsToHeightScaleFactor (0.0f)
{ {
JUCE_AUTORELEASEPOOL JUCE_AUTORELEASEPOOL
CFStringRef name = PlatformUtilities::juceStringToCFString (font.getTypefaceName());
ctFontRef = CTFontCreateWithName (name, 1024, nullptr);
CFRelease (name);
CFStringRef cfName = PlatformUtilities::juceStringToCFString (font.getTypefaceName());
ctFontRef = CTFontCreateWithName (cfName, 1024, nullptr);
CFRelease (cfName);
if (ctFontRef != nullptr) if (ctFontRef != nullptr)
{ {
@@ -61,7 +61,7 @@ public:
if (font.isItalic()) if (font.isItalic())
{ {
CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits (ctFontRef, 0.0, nullptr,
CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits (ctFontRef, 0.0f, nullptr,
kCTFontItalicTrait, kCTFontItalicTrait); kCTFontItalicTrait, kCTFontItalicTrait);
if (newFont != nullptr) if (newFont != nullptr)
@@ -77,7 +77,7 @@ public:
if (font.isBold()) if (font.isBold())
{ {
CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits (ctFontRef, 0.0, nullptr,
CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits (ctFontRef, 0.0f, nullptr,
kCTFontBoldTrait, kCTFontBoldTrait); kCTFontBoldTrait, kCTFontBoldTrait);
if (newFont != nullptr) if (newFont != nullptr)
{ {


+ 126
- 7
src/text/juce_JSON.cpp View File

@@ -156,6 +156,7 @@ private:
{ {
DynamicObject* const resultObject = new DynamicObject(); DynamicObject* const resultObject = new DynamicObject();
result = resultObject; result = resultObject;
NamedValueSet& resultProperties = resultObject->getProperties();
for (;;) for (;;)
{ {
@@ -185,17 +186,17 @@ private:
t = t.findEndOfWhitespace(); t = t.findEndOfWhitespace();
oldT = t; oldT = t;
const juce_wchar c = t.getAndAdvance();
if (c != ':')
const juce_wchar c2 = t.getAndAdvance();
if (c2 != ':')
return createFail ("Expected ':', but found", &oldT); return createFail ("Expected ':', but found", &oldT);
var propertyValue;
Result r (parseAny (t, propertyValue));
resultProperties.set (propertyName, var::null);
var* propertyValue = resultProperties.getVarPointer (propertyName);
if (r.failed())
return r;
Result r2 (parseAny (t, *propertyValue));
resultObject->setProperty (propertyName, propertyValue);
if (r2.failed())
return r2;
t = t.findEndOfWhitespace(); t = t.findEndOfWhitespace();
oldT = t; oldT = t;
@@ -528,5 +529,123 @@ void JSON::writeToStream (OutputStream& output, const var& data, const bool allO
JSONFormatter::write (output, data, 0, allOnOneLine); JSONFormatter::write (output, data, 0, allOnOneLine);
} }
//==============================================================================
//==============================================================================
#if JUCE_UNIT_TESTS
#include "../utilities/juce_UnitTest.h"
#include "../maths/juce_Random.h"
class JSONTests : public UnitTest
{
public:
JSONTests() : UnitTest ("JSON") {}
static String createRandomWideCharString (Random& r)
{
juce_wchar buffer[40] = { 0 };
for (int i = 0; i < numElementsInArray (buffer) - 1; ++i)
{
if (r.nextBool())
{
do
{
buffer[i] = (juce_wchar) (1 + r.nextInt (0x10ffff - 1));
}
while (! CharPointer_UTF16::canRepresent (buffer[i]));
}
else
buffer[i] = (juce_wchar) (1 + r.nextInt (0xff));
}
return CharPointer_UTF32 (buffer);
}
static String createRandomIdentifier (Random& r)
{
char buffer[30] = { 0 };
for (int i = 0; i < numElementsInArray (buffer) - 1; ++i)
{
static const char chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-:";
buffer[i] = chars [r.nextInt (sizeof (chars) - 1)];
}
return CharPointer_ASCII (buffer);
}
static var createRandomVar (Random& r, int depth)
{
switch (r.nextInt (depth > 3 ? 6 : 8))
{
case 0: return var::null;
case 1: return r.nextInt();
case 2: return r.nextInt64();
case 3: return r.nextBool();
case 4: return r.nextDouble();
case 5: return createRandomWideCharString (r);
case 6:
{
var v (createRandomVar (r, depth + 1));
for (int i = 1 + r.nextInt (30); --i >= 0;)
v.append (createRandomVar (r, depth + 1));
return v;
}
case 7:
{
DynamicObject* o = new DynamicObject();
for (int i = r.nextInt (30); --i >= 0;)
o->setProperty (createRandomIdentifier (r), createRandomVar (r, depth + 1));
return o;
}
default:
return var::null;
}
}
void runTest()
{
beginTest ("JSON");
Random r;
r.setSeedRandomly();
expect (JSON::parse (String::empty) == var::null);
expect (JSON::parse ("{}").isObject());
expect (JSON::parse ("[]").isArray());
expect (JSON::parse ("1234").isInt());
expect (JSON::parse ("12345678901234").isInt64());
expect (JSON::parse ("1.123e3").isDouble());
expect (JSON::parse ("-1234").isInt());
expect (JSON::parse ("-12345678901234").isInt64());
expect (JSON::parse ("-1.123e3").isDouble());
for (int i = 100; --i >= 0;)
{
var v;
if (i > 0)
v = createRandomVar (r, 0);
const bool oneLine = r.nextBool();
String asString (JSON::toString (v, oneLine));
var parsed = JSON::parse (asString);
String parsedString (JSON::toString (parsed, oneLine));
expect (asString.isNotEmpty() && parsedString == asString);
}
}
};
static JSONTests JSONUnitTests;
#endif
END_JUCE_NAMESPACE END_JUCE_NAMESPACE

Loading…
Cancel
Save