cmake_minimum_required(VERSION 3.12)

project(TestUnits VERSION 1.0.0)

set(TargetName ${PROJECT_NAME})

juce_add_console_app(${TargetName}
        PRODUCT_NAME "Test Units")

#set(MAIN_SRCS "../source/")     # Shortcut in case it changes...

#add_subdirectory(../binaryResources buildBinaryResources)        # Only useful for a few classes, such as Bar.

# Doesn't actually seem useful.
include_directories("${PROJECT_SOURCE_DIR}/../thirdParty/z80emulatorLibz80")

target_sources(${TargetName}
        PRIVATE
        main.cpp
        # The sources of the objects to test.
        ../source/audio/Volumes.cpp
        ../source/audio/Volumes.h
        ../source/audio/effect/BaseEffect.cpp
        ../source/audio/effect/BaseEffect.h
        ../source/audio/effect/StereoSeparationEffect.cpp
        ../source/audio/effect/StereoSeparationEffect.h
        ../source/audio/effect/SpeakerEffect.cpp
        ../source/audio/effect/SpeakerEffect.h
        ../source/audio/effect/VolumeEffect.cpp
        ../source/audio/effect/VolumeEffect.h
        ../source/audio/sources/PsgsProcessor.cpp
        ../source/audio/sources/PsgsProcessor.h
        ../source/audio/sources/EffectsProcessor.cpp
        ../source/audio/sources/EffectsProcessor.h
        ../source/audio/sources/PsgStreamGenerator.cpp
        ../source/audio/sources/PsgStreamGenerator.h
        ../source/audio/sources/HardwareTables.cpp
        ../source/audio/sources/HardwareTables.h
        ../source/song/tracks/TrackConstants.cpp
        ../source/song/tracks/TrackConstants.h
        ../source/utils/StringUtil.cpp
        ../source/utils/FpFloat.cpp
        ../source/utils/FpFloat.h
        ../source/utils/CircularBuffer.h
        ../source/utils/XmlHelper.cpp
        ../source/utils/NoteUtil.cpp
        ../source/utils/SimpleId.cpp
        ../source/utils/NumberUtil.cpp
        ../source/utils/OccurrenceMap.h
        ../source/utils/Remapper.h
        ../source/utils/SpeedUtil.cpp
        ../source/utils/SpeedUtil.h
        ../source/utils/Base64Util.cpp
        ../source/utils/Base64Util.h
        ../source/utils/BitNumber.cpp
        ../source/utils/BitNumber.h
        ../source/utils/TaggedObject.h
        ../source/utils/PsgValues.cpp
        ../source/utils/PsgValues.h
        ../source/utils/OptionalValue.h
        ../source/utils/Id.h
        ../source/utils/ZipHelper.cpp
        ../source/utils/ZipHelper.h
        ../source/business/model/Loop.cpp
        ../source/business/model/Loop.h
        ../source/business/model/StartEnd.cpp
        ../source/business/model/StartEnd.h
        ../source/business/model/Properties.cpp
        ../source/business/model/Properties.h
        ../source/business/song/validation/CheckTrackHeight.cpp
        ../source/business/song/validation/CheckLoopStartEnd.cpp
        ../source/business/song/tool/ChangeExpressionsOrdering.cpp
        ../source/business/song/tool/ChangeInstrumentsOrdering.cpp
        ../source/business/song/tool/browser/CellAndLocation.cpp
        ../source/business/song/tool/browser/CellAndLocation.h
        ../source/business/song/tool/browser/SpecialCellAndLocation.cpp
        ../source/business/song/tool/browser/SpecialCellAndLocation.h
        ../source/business/song/tool/browser/CellBrowser.cpp
        ../source/business/song/tool/browser/CellBrowser.h
        ../source/business/song/tool/browser/SpecialCellBrowser.cpp
        ../source/business/song/tool/browser/SpecialCellBrowser.h
        ../source/business/song/tool/browser/TrackBrowser.cpp
        ../source/business/song/tool/browser/TrackBrowser.h
        ../source/business/song/tool/browser/SpecialTrackBrowser.cpp
        ../source/business/song/tool/browser/SpecialTrackBrowser.h
        ../source/business/actions/expressions/RenameExpression.cpp
        ../source/business/actions/expressions/RenameExpression.h
        ../source/business/actions/expressions/ExpressionAction.cpp
        ../source/business/actions/expressions/ExpressionAction.h
        ../source/business/actions/expressions/DeleteExpressions.cpp
        ../source/business/actions/expressions/DeleteExpressions.h
        ../source/business/actions/expressions/AddExpressions.cpp
        ../source/business/actions/expressions/AddExpressions.h
        ../source/business/actions/expressions/MoveExpressions.cpp
        ../source/business/actions/expressions/MoveExpressions.h
        ../source/business/actions/expressions/ModifyExpressionCells.cpp
        ../source/business/actions/expressions/ModifyExpressionCells.h
        ../source/business/actions/expressions/SetExpressionCell.cpp
        ../source/business/actions/expressions/SetExpressionCell.h
        ../source/business/actions/expressions/SetExpressionCellMetadata.cpp
        ../source/business/actions/expressions/SetExpressionCellMetadata.h
        ../source/business/actions/expressions/DuplicateExpressionCell.cpp
        ../source/business/actions/expressions/DuplicateExpressionCell.h
        ../source/business/actions/expressions/DeleteExpressionCell.cpp
        ../source/business/actions/expressions/DeleteExpressionCell.h
        ../source/business/actions/linker/ModifyPositionMarker.cpp
        ../source/business/actions/linker/ModifyPositionMarker.h
        ../source/business/actions/linker/DeletePositions.cpp
        ../source/business/actions/linker/DeletePositions.h
        ../source/business/actions/linker/DuplicatePositions.cpp
        ../source/business/actions/linker/DuplicatePositions.h
        ../source/business/actions/linker/IncreasePatternInPosition.cpp
        ../source/business/actions/linker/IncreasePatternInPosition.h
        ../source/business/actions/linker/InsertPositions.cpp
        ../source/business/actions/linker/InsertPositions.h
        ../source/business/actions/linker/ModifyPosition.cpp
        ../source/business/actions/linker/ModifyPosition.h
        ../source/business/actions/linker/ModifyPositionsData.cpp
        ../source/business/actions/linker/ModifyPositionsData.h
        ../source/business/actions/linker/MovePositionMarker.cpp
        ../source/business/actions/linker/MovePositionMarker.h
        ../source/business/actions/linker/MovePositions.cpp
        ../source/business/actions/linker/MovePositions.h
        ../source/business/actions/linker/SetLoopStartAndEnd.cpp
        ../source/business/actions/linker/SetLoopStartAndEnd.h
        ../source/business/actions/linker/ModifyPattern.cpp
        ../source/business/actions/linker/ModifyPattern.h
        ../source/business/actions/linker/CreatePattern.cpp
        ../source/business/actions/linker/CreatePattern.h
        ../source/business/actions/linker/ClonePositions.cpp
        ../source/business/actions/linker/ClonePositions.h
        ../source/business/actions/linker/RearrangePatterns.cpp
        ../source/business/actions/linker/RearrangePatterns.h
        ../source/business/actions/linker/ClearPatterns.cpp
        ../source/business/actions/linker/ClearPatterns.h
        ../source/business/actions/patternViewer/SetPositionHeight.cpp
        ../source/business/actions/patternViewer/SetPositionHeight.h
        ../source/business/actions/patternViewer/SetCellData.cpp
        ../source/business/actions/patternViewer/SetCellData.h
        ../source/business/actions/patternViewer/SetSpecialCellData.cpp
        ../source/business/actions/patternViewer/SetSpecialCellData.h
        ../source/business/actions/patternViewer/PasteCells.cpp
        ../source/business/actions/patternViewer/PasteCells.h
        ../source/business/actions/patternViewer/LinkSpecialTrack.cpp
        ../source/business/actions/patternViewer/LinkSpecialTrack.h
        ../source/business/actions/patternViewer/LinkTrack.cpp
        ../source/business/actions/patternViewer/LinkTrack.h
        ../source/business/actions/patternViewer/ToggleReadOnly.cpp
        ../source/business/actions/patternViewer/ToggleReadOnly.h
        ../source/business/actions/patternViewer/Transpose.cpp
        ../source/business/actions/patternViewer/Transpose.h
        ../source/business/actions/patternViewer/TransposeNote.cpp
        ../source/business/actions/patternViewer/TransposeNote.h
        ../source/business/actions/patternViewer/TransposeRate.h
        ../source/business/actions/patternViewer/ClearCells.cpp
        ../source/business/actions/patternViewer/ClearCells.h
        ../source/business/actions/patternViewer/CellsModifier.cpp
        ../source/business/actions/patternViewer/CellsModifier.h
        ../source/business/actions/patternViewer/DeleteNote.cpp
        ../source/business/actions/patternViewer/DeleteNote.h
        ../source/business/actions/patternViewer/SelectedData.cpp
        ../source/business/actions/patternViewer/SelectedData.h
        ../source/business/actions/patternViewer/SetTrackName.cpp
        ../source/business/actions/patternViewer/SetTrackName.h
        ../source/business/actions/patternViewer/SetSpecialTrackName.cpp
        ../source/business/actions/patternViewer/SetSpecialTrackName.h
        ../source/business/actions/patternViewer/UnlinkSpecialTrack.cpp
        ../source/business/actions/patternViewer/UnlinkSpecialTrack.h
        ../source/business/actions/patternViewer/UnlinkTrack.cpp
        ../source/business/actions/patternViewer/UnlinkTrack.h
        ../source/business/actions/patternViewer/SwapCells.cpp
        ../source/business/actions/patternViewer/SwapCells.h
        ../source/business/instrument/GenerateInstrument.cpp
        ../source/business/instrument/GenerateInstrument.h
        ../source/business/instrument/SampleResampler.cpp
        ../source/business/instrument/SampleResampler.h
        ../source/business/actions/patternViewer/insertOrRemoveCellAt/InsertCellAt.cpp
        ../source/business/actions/patternViewer/insertOrRemoveCellAt/InsertCellAt.h
        ../source/business/actions/patternViewer/insertOrRemoveCellAt/InsertOrRemoveCellAt.cpp
        ../source/business/actions/patternViewer/insertOrRemoveCellAt/InsertOrRemoveCellAt.h
        ../source/business/actions/patternViewer/insertOrRemoveCellAt/RemoveCellAt.cpp
        ../source/business/actions/patternViewer/insertOrRemoveCellAt/RemoveCellAt.h
        ../source/business/actions/instruments/AddInstruments.cpp
        ../source/business/actions/instruments/AddInstruments.h
        ../source/business/actions/instruments/DeleteInstruments.cpp
        ../source/business/actions/instruments/DeleteInstruments.h
        ../source/business/actions/instruments/InstrumentAction.cpp
        ../source/business/actions/instruments/InstrumentAction.h
        ../source/business/actions/instruments/MoveInstruments.cpp
        ../source/business/actions/instruments/MoveInstruments.h
        ../source/business/actions/instruments/RenameInstrument.cpp
        ../source/business/actions/instruments/RenameInstrument.h
        ../source/business/actions/instruments/SetInstrumentColor.cpp
        ../source/business/actions/instruments/SetInstrumentColor.h
        ../source/business/actions/instruments/SwapInstruments.cpp
        ../source/business/actions/instruments/SwapInstruments.h
        ../source/business/actions/instruments/RemapInstruments.cpp
        ../source/business/actions/instruments/RemapInstruments.h
        ../source/business/actions/instruments/psg/SetPsgInstrumentCell.cpp
        ../source/business/actions/instruments/psg/SetPsgInstrumentCell.h
        ../source/business/actions/instruments/psg/SetPsgInstrumentMetadata.cpp
        ../source/business/actions/instruments/psg/SetPsgInstrumentMetadata.h
        ../source/business/actions/instruments/psg/DuplicatePsgInstrumentCell.cpp
        ../source/business/actions/instruments/psg/DuplicatePsgInstrumentCell.h
        ../source/business/actions/instruments/psg/DeletePsgInstrumentCell.cpp
        ../source/business/actions/instruments/psg/DeletePsgInstrumentCell.h
        ../source/business/actions/instruments/psg/ModifyPsgInstrumentCells.cpp
        ../source/business/actions/instruments/psg/ModifyPsgInstrumentCells.h
        ../source/business/actions/instruments/psg/action/ToggleRetrigAction.cpp
        ../source/business/actions/instruments/psg/action/ToggleRetrigAction.h
        ../source/business/actions/instruments/psg/action/GenerateVolumeCellsAction.cpp
        ../source/business/actions/instruments/psg/action/GenerateVolumeCellsAction.h
        ../source/business/actions/instruments/sample/ModifySampleInstrumentMetadata.cpp
        ../source/business/actions/instruments/sample/ModifySampleInstrumentMetadata.h
        ../source/business/actions/instruments/sample/ChangeSample.cpp
        ../source/business/actions/instruments/sample/ChangeSample.h
        ../source/business/actions/song/SetSongMetadata.cpp
        ../source/business/actions/song/SetSongMetadata.h
        ../source/business/actions/sfx/SetExportedSoundEffects.cpp
        ../source/business/actions/sfx/SetExportedSoundEffects.h
        ../source/business/actions/subsong/CreateSubsong.cpp
        ../source/business/actions/subsong/CreateSubsong.h
        ../source/business/actions/subsong/DeleteSubsong.cpp
        ../source/business/actions/subsong/DeleteSubsong.h
        ../source/business/actions/subsong/SetSubsongMetadata.cpp
        ../source/business/actions/subsong/SetSubsongMetadata.h
        ../source/business/actions/subsong/SetSubsongPsgs.cpp
        ../source/business/actions/subsong/SetSubsongPsgs.h
        ../source/business/actions/subsong/SubsongActionHelper.cpp
        ../source/business/actions/subsong/SubsongActionHelper.h
        ../source/business/song/cells/CellEffectsChecker.cpp
        ../source/business/song/cells/CellEffectsChecker.h

        ../source/song/Song.cpp
        ../source/song/Song.h
        ../source/song/Location.cpp
        ../source/song/Location.h
        ../source/song/SpecialCellLocationInPosition.cpp
        ../source/song/SpecialCellLocationInPosition.h
        ../source/song/CellLocationInPosition.cpp
        ../source/song/CellLocationInPosition.h
        ../source/song/TrackLocation.cpp
        ../source/song/TrackLocation.h
        ../source/song/SpecialTrackLocation.cpp
        ../source/song/SpecialTrackLocation.h
        ../source/song/ExpressionHandler.cpp
        ../source/song/ExpressionHandler.h
        ../source/song/Expression.cpp
        ../source/song/Expression.h
        ../source/song/ExpressionConstants.h
        ../source/song/ExpressionBuilder.cpp
        ../source/song/ExpressionBuilder.h
        ../source/song/CellLocationInTrack.cpp
        ../source/song/CellLocationInTrack.h
        ../source/song/SpecialCellLocationInTrack.cpp
        ../source/song/SpecialCellLocationInTrack.h
        ../source/song/cells/Cell.cpp
        ../source/song/cells/Cell.h
        ../source/song/cells/CellConstants.h
        ../source/song/cells/CellEffect.cpp
        ../source/song/cells/CellEffect.h
        ../source/song/cells/CellEffects.cpp
        ../source/song/cells/CellEffects.h
        ../source/song/cells/Effect.cpp
        ../source/song/cells/Effect.h
        ../source/song/cells/Note.cpp
        ../source/song/cells/Note.h
        ../source/song/cells/SpecialCell.cpp
        ../source/song/cells/SpecialCell.h
        ../source/song/cells/SpecialCellConstants.h
        ../source/song/psg/Psg.cpp
        ../source/song/psg/PsgFrequency.cpp
        ../source/song/psg/PsgFrequency.h
        ../source/song/psg/PsgMixingOutput.cpp
        ../source/song/psg/PsgType.cpp
        ../source/song/instrument/Instrument.cpp
        ../source/song/instrument/InstrumentType.h
        ../source/song/instrument/psg/PsgPart.cpp
        ../source/song/instrument/psg/LowLevelPsgInstrumentCell.cpp
        ../source/song/instrument/psg/PsgInstrumentCell.cpp
        ../source/song/instrument/psg/PsgInstrumentCellLink.h
        ../source/song/instrument/psg/PsgSection.cpp
        ../source/song/instrument/psg/PsgSection.h
        ../source/song/instrument/psg/SpreadPsgInstrumentCell.cpp
        ../source/song/instrument/sample/Sample.cpp
        ../source/song/instrument/sample/Sample.h
        ../source/song/instrument/sample/SamplePart.cpp
        ../source/song/instrument/sample/SamplePart.h
        ../source/song/instrument/sample/SamplePart.h
        ../source/song/subsong/Pattern.cpp
        ../source/song/subsong/Pattern.h
        ../source/song/subsong/Subsong.cpp
        ../source/song/subsong/Subsong.h
        ../source/song/subsong/SubsongConstants.cpp
        ../source/song/subsong/SubsongConstants.h
        ../source/song/subsong/Position.cpp
        ../source/song/subsong/LinkType.h
        ../source/song/subsong/LinkState.h
        ../source/controllers/SongController.h
        ../source/controllers/SongControllerImpl.cpp
        ../source/controllers/MainController.h
        ../source/controllers/MainControllerObservers.cpp
        ../source/controllers/model/OutputMix.cpp
        ../source/controllers/model/OutputMix.h
        ../source/controllers/model/Follow.h
        ../source/utils/MainControllerNoOp.cpp
        ../source/utils/PsgValues.cpp
        ../source/utils/Counter.cpp
        ../source/utils/MapUtil.h
        ../source/utils/MemoryBlockUtil.cpp
        ../source/utils/MemoryBlockUtil.h
        ../source/utils/ErrorReport.cpp
        ../source/utils/ErrorReport.h
        ../source/utils/StreamUtil.cpp
        ../source/utils/StreamUtil.h
        ../source/utils/FpFloat.cpp
        ../source/utils/FpFloat.h
        ../source/utils/FileUtil.cpp
        ../source/utils/FileUtil.h
        ../source/utils/TotalAndWeight.cpp
        ../source/utils/TotalAndWeight.h
        ../source/utils/CustomUndoManager.cpp
        ../source/utils/CustomUndoManager.h
        ../source/utils/task/OperationResult.h
        ../source/utils/task/CancelProvider.h
        ../source/utils/task/TaskProgressListener.h
        ../source/player/PsgPeriod.cpp
        ../source/player/PsgPeriod.h
        ../source/player/PsgPeriod.h
        ../source/player/PsgRegistersConverter.cpp
        ../source/player/PsgRegistersConverter.h
        ../source/player/TemperedScaleUtil.cpp
        ../source/player/TemperedScaleUtil.h
        ../source/player/PsgRegisters.cpp
        ../source/player/PsgRegisters.h
        ../source/player/SamplePlayInfo.cpp
        ../source/player/SamplePlayInfo.h
        ../source/player/SampleData.cpp
        ../source/player/SampleData.h
        ../source/player/NoteAndShift.cpp
        ../source/player/NoteAndShift.h
        ../source/player/InstrumentPlayedInfo.cpp
        ../source/player/InstrumentPlayedInfo.h
        ../source/player/CellToPlay.cpp
        ../source/player/CellToPlay.h
        ../source/reader/vgm/VgmReader.cpp
        ../source/reader/vgm/VgmReader.h
        ../source/reader/ym/YmReader.cpp
        ../source/reader/ym/YmReader.h
        ../source/reader/ym/YmReader.cpp
        ../source/reader/ym/YmReader.h
        ../source/reader/ym/decoder/YmDecoder.cpp
        ../source/reader/ym/decoder/YmDecoder.h
        ../source/reader/ym/decoder/YmDecoder123.cpp
        ../source/reader/ym/decoder/YmDecoder123.h
        ../source/reader/ym/decoder/YmDecoder3b.cpp
        ../source/reader/ym/decoder/YmDecoder3b.h
        ../source/reader/ym/decoder/YmDecoder456.cpp
        ../source/reader/ym/decoder/YmDecoder456.h
        ../source/reader/StreamedMusicReader.cpp
        ../source/reader/StreamedMusicReader.h
        ../source/ui/containerArranger/ViewArranger.cpp
        ../source/ui/containerArranger/ViewArranger.h
        ../source/ui/containerArranger/ArrangerView.cpp
        ../source/ui/containerArranger/ArrangerView.h
        ../source/ui/containerArranger/PanelSizes.h
        ../source/ui/containerArranger/storage/ContainerArrangement.cpp
        ../source/ui/containerArranger/storage/ContainerArrangement.h
        ../source/ui/containerArranger/storage/DocumentArrangement.cpp
        ../source/ui/containerArranger/storage/DocumentArrangement.h
        ../source/ui/containerArranger/storage/LineContainerArrangement.cpp
        ../source/ui/containerArranger/storage/LineContainerArrangement.h
        ../source/ui/containerArranger/PanelType.cpp
        ../source/ui/containerArranger/PanelType.h
        ../source/ui/containerArranger/Dimension.cpp
        ../source/ui/containerArranger/Dimension.h
        ../source/ui/components/colors/ColorConstants.cpp
        ../source/ui/components/colors/ColorConstants.h
        ../source/ui/instrumentEditor/controller/psg/ValueInterpreter.cpp
        ../source/ui/instrumentEditor/controller/psg/ValueInterpreter.h
        #../source/ui/instrumentEditor/view/component/Bar.cpp   # Strange, double declaration error if present...
        ../source/ui/instrumentEditor/controller/psg/PsgInstrumentEditorControllerLogic.cpp
        ../source/ui/instrumentEditor/controller/psg/PsgInstrumentEditorControllerLogic.h
        ../source/ui/patternViewer/controller/Selection.cpp
        ../source/ui/patternViewer/controller/Selection.h
        ../source/ui/patternViewer/controller/PasteData.cpp
        ../source/ui/patternViewer/controller/PasteData.h
        ../source/ui/patternViewer/CursorLocation.cpp
        ../source/ui/patternViewer/CursorLocation.h
        ../source/ui/patternViewer/controller/CaptureFlags.cpp
        ../source/ui/patternViewer/controller/CaptureFlags.h
        ../source/ui/tools/streamedMusicAnalyzer/InstrumentStreamExporter.cpp
        ../source/ui/tools/streamedMusicAnalyzer/InstrumentStreamExporter.h

        ../source/ui/editorWithBars/view/component/BarData.cpp
        ../source/ui/lookAndFeel/LookAndFeelConstants.cpp
        ../source/ui/lookAndFeel/LookAndFeelConstants.h
        ../source/business/channels/ChannelsMute.cpp
        ../source/business/channels/ChannelsMute.h
        ../source/business/link/LinkedTrackHelper.cpp
        ../source/business/link/LinkedTrackHelper.h
        ../source/business/link/LinkedSpecialTrackHelper.cpp
        ../source/business/link/LinkedSpecialTrackHelper.h
        ../source/business/patternViewer/DisplayedEffects.cpp
        ../source/business/patternViewer/DisplayedEffects.h
        ../source/business/serialization/song/ExpressionSerializer.cpp
        ../source/business/serialization/song/ExpressionSerializer.h
        ../source/business/serialization/instrument/InstrumentSerializer.cpp
        ../source/business/serialization/instrument/InstrumentSerializer.h
        ../source/business/serialization/instrument/InstrumentNodes.cpp
        ../source/business/serialization/instrument/InstrumentNodes.h
        ../source/business/serialization/instrument/InstrumentDeserializerAt2.cpp
        ../source/business/serialization/instrument/InstrumentDeserializerAt2.h
        ../source/business/serialization/song/CellSerializer.cpp
        ../source/business/serialization/song/CellSerializer.h
        ../source/business/serialization/song/SpecialCellSerializer.cpp
        ../source/business/serialization/song/SpecialCellSerializer.h
        ../source/business/serialization/song/PositionSerializer.cpp
        ../source/business/serialization/song/PositionSerializer.h
        ../source/business/serialization/song/PatternSerializer.cpp
        ../source/business/serialization/song/PatternSerializer.h
        ../source/business/serialization/patternViewer/EffectToCharSerializer.cpp
        ../source/business/serialization/patternViewer/EffectToCharSerializer.h
        ../source/business/serialization/patternViewer/TrackSerializer.cpp
        ../source/business/serialization/patternViewer/TrackSerializer.h
        ../source/business/serialization/sourceProfile/SourceProfileXmlNodes.cpp
        ../source/business/serialization/sourceProfile/SourceProfileXmlNodes.h
        ../source/business/serialization/sourceProfile/SourceProfileSerializer.cpp
        ../source/business/serialization/sourceProfile/SourceProfileSerializer.h
        ../source/business/song/validation/CorrectExpression.cpp
        ../source/business/song/validation/CheckTrackHeight.cpp
        ../source/business/song/validation/CorrectExpression.cpp
        ../source/business/song/validation/CorrectExpression.h
        ../source/business/song/validation/CorrectInstrument.cpp
        ../source/business/song/validation/CorrectInstrument.h
        ../source/business/song/validation/LoopChange.cpp
        ../source/business/song/validation/LoopChange.h
        ../source/business/song/tool/frameCounter/FrameCounter.cpp
        ../source/business/song/tool/frameCounter/FrameCounter.h
        ../source/business/song/tool/speed/DetermineSpeed.cpp
        ../source/business/song/tool/speed/DetermineSpeed.h
        ../source/business/song/tool/speed/BpmCalculator.cpp
        ../source/business/song/tool/speed/BpmCalculator.h
        ../source/business/song/tool/context/EffectContextImpl.cpp
        ../source/business/song/tool/context/EffectContextImpl.h
        ../source/business/song/tool/context/EffectContext.h
        ../source/business/song/tool/context/model/LineContext.cpp
        ../source/business/song/tool/context/model/LineContext.h
        ../source/business/song/tool/context/model/TrackContext.cpp
        ../source/business/song/tool/context/model/TrackContext.h
        ../source/business/song/tool/songStripper/SongStripper.cpp
        ../source/business/song/tool/songStripper/SongStripper.h
        ../source/business/song/tool/songStripper/SubsongsAndPsgs.cpp
        ../source/business/song/tool/songStripper/SubsongsAndPsgs.h
        ../source/business/song/tool/InlineArpeggioConverter.cpp
        ../source/business/song/tool/InlineArpeggioConverter.h
        ../source/business/song/tool/optimizers/PatternOptimizer.cpp
        ../source/business/song/tool/optimizers/PatternOptimizer.h
        ../source/business/song/tool/optimizers/InstrumentsOptimizer.cpp
        ../source/business/song/tool/optimizers/InstrumentsOptimizer.h
        ../source/business/song/tool/optimizers/InstrumentOptimizer.cpp
        ../source/business/song/tool/optimizers/InstrumentOptimizer.h
        ../source/business/song/tool/optimizers/ExpressionOptimizer.cpp
        ../source/business/song/tool/optimizers/ExpressionOptimizer.h
        ../source/business/song/tool/optimizers/ExpressionsOptimizer.cpp
        ../source/business/song/tool/optimizers/ExpressionsOptimizer.h
        ../source/business/song/tool/optimizers/BaseItemOptimizer.h
        ../source/business/song/tool/optimizers/SongOptimizer.cpp
        ../source/business/song/tool/optimizers/SongOptimizer.h
        ../source/business/song/tool/builder/SongBuilder.h
        ../source/business/song/tool/builder/SongBuilder.cpp
        ../source/business/song/tool/builder/SubsongBuilder.h
        ../source/business/song/tool/builder/SubsongBuilder.cpp
        ../source/business/song/tool/builder/PatternUnoptimizer.cpp
        ../source/business/song/tool/builder/PatternUnoptimizer.h
        ../source/business/song/tool/builder/TrailingEffectContext.cpp
        ../source/business/song/tool/builder/TrailingEffectContext.h
        ../source/business/song/tool/sfx/FirstNotePerInstrumentFinder.cpp
        ../source/business/song/tool/sfx/FirstNotePerInstrumentFinder.h
        ../source/business/song/tool/CellOperations.cpp
        ../source/business/song/tool/CellOperations.h
        ../source/business/song/tool/RetrigInInstrumentHeaderNormalizer.cpp
        ../source/business/song/tool/RetrigInInstrumentHeaderNormalizer.h
        ../source/business/song/tool/BaseNoteFinder.cpp
        ../source/business/song/tool/BaseNoteFinder.h
        ../source/business/song/tool/InstrumentCounter.cpp
        ../source/business/song/tool/InstrumentCounter.h
        ../source/business/song/tool/InstrumentSimpleCounter.cpp
        ../source/business/song/tool/InstrumentSimpleCounter.h
        ../source/business/song/tool/WaitCounter.cpp
        ../source/business/song/tool/WaitCounter.h
        ../source/business/sourceProfile/SourceProfile.cpp
        ../source/business/sourceProfile/SourceProfile.h
        ../source/business/sourceProfile/SourceProfileValidator.cpp
        ../source/business/sourceProfile/SourceProfileValidator.h
        ../source/business/instrument/GenericInstrumentGenerator.cpp
        ../source/business/instrument/GenericInstrumentGenerator.h
        ../source/business/instrument/SampleLoader.cpp
        ../source/business/instrument/SampleLoader.h
        ../source/controllers/SongControllerNoOp.cpp
        ../source/controllers/SongControllerNoOp.h

        ../source/song/Expression.cpp
        ../source/import/soundtrakker/Stk128Importer.cpp
        ../source/import/soundtrakker/Stk128Importer.h
        ../source/import/soundtrakker/SubsongImporter.cpp
        ../source/import/soundtrakker/SubsongImporter.h
        ../source/import/soundtrakker/Stk128Constants.h
        ../source/import/starkos/StarkosImporter.cpp
        ../source/import/starkos/StarkosImporter.h
        ../source/import/starkos/TrackReader.cpp
        ../source/import/starkos/TrackReader.h
        ../source/import/starkos/InstrumentReader.cpp
        ../source/import/starkos/InstrumentReader.h
        ../source/import/at1/At1SongImporter.cpp
        ../source/import/at1/At1SongImporter.h
        ../source/import/at2/At2SongImporter.cpp
        ../source/import/at2/At2SongImporter.h
        ../source/import/at2/SubsongReader.cpp
        ../source/import/at2/SubsongReader.h
        ../source/import/at3/At3SongImporter.cpp
        ../source/import/at3/At3SongImporter.h
        ../source/import/chp/ChpSongImporter.cpp
        ../source/import/chp/ChpSongImporter.h
        ../source/import/vt2/Vt2SongImporter.cpp
        ../source/import/vt2/Vt2SongImporter.h
        ../source/import/vt2/Vt2InstrumentBuilder.cpp
        ../source/import/vt2/Vt2InstrumentBuilder.h
        ../source/import/wyz/WyzSongImporter.cpp
        ../source/import/wyz/WyzSongImporter.h
        ../source/import/loader/SongLoader.cpp
        ../source/import/loader/SongLoader.h
        ../source/import/loader/configuration/ImportConfiguration.cpp
        ../source/import/loader/configuration/ImportConfiguration.h
        ../source/import/mod/ModConfiguration.cpp
        ../source/import/mod/ModConfiguration.h
        ../source/import/mod/ModSongImporter.cpp
        ../source/import/mod/ModSongImporter.h
        ../source/import/mod/ModTrackCell.cpp
        ../source/import/mod/ModTrackCell.h
        ../source/import/midi/MidiImporter.cpp
        ../source/import/midi/MidiImporter.h
        ../source/import/midi/MidiConfiguration.cpp
        ../source/import/midi/MidiConfiguration.h
        ../source/import/midi/MidiTrackReader.cpp
        ../source/import/midi/MidiTrackReader.h
        ../source/import/common/ChannelMixerKeeper.cpp
        ../source/import/common/ChannelMixerKeeper.h
        ../source/export/SongExportResult.cpp
        ../source/export/SongExportResult.h
        ../source/export/at3/SongExporter.cpp
        ../source/export/at3/SongExporter.h
        ../source/export/at3/SongNodes.cpp
        ../source/export/at3/SongNodes.h
        ../source/export/aky/AkyExporter.cpp
        ../source/export/aky/AkyExporter.h
        ../source/export/aky/process/RegisterBlockLabelProvider.h
        ../source/export/aky/process/AkyConstants.h
        ../source/export/aky/process/AkyPattern.cpp
        ../source/export/aky/process/AkyPattern.h
        ../source/export/aky/process/AkyPatterns.cpp
        ../source/export/aky/process/AkyPatterns.h
        ../source/export/aky/process/AkyTrack.cpp
        ../source/export/aky/process/AkyTrack.h
        ../source/export/aky/process/ChannelData.cpp
        ../source/export/aky/process/ChannelData.h
        ../source/export/aky/process/EncodedLine.cpp
        ../source/export/aky/process/EncodedLine.h
        ../source/export/aky/process/EncodedSequence.cpp
        ../source/export/aky/process/EncodedSequence.h
        ../source/export/aky/process/RegisterBlock.cpp
        ../source/export/aky/process/RegisterBlock.h
        ../source/export/aky/process/RegisterBlockEncoder.cpp
        ../source/export/aky/process/RegisterBlockEncoder.h
        ../source/export/aky/process/RegisterBlockOptimizer.cpp
        ../source/export/aky/process/RegisterBlockOptimizer.h
        ../source/export/aky/process/RegisterBlockPool.cpp
        ../source/export/aky/process/RegisterBlockPool.h
        ../source/export/akg/AkgExporter.cpp
        ../source/export/akg/AkgExporter.h
        ../source/export/akg/process/AkgSubsongExporter.cpp
        ../source/export/akg/process/AkgSubsongExporter.h
        ../source/export/akg/process/EncodedEffect.h
        ../source/export/akg/process/EncodedEffectBlock.cpp
        ../source/export/akg/process/EncodedEffectBlock.h
        ../source/export/akg/process/PsgInstrumentCellEncoder.cpp
        ../source/export/akg/process/PsgInstrumentCellEncoder.h
        ../source/export/akg/process/LinkerBlock.cpp
        ../source/export/akg/process/LinkerBlock.h
        ../source/export/akg/process/LinkerBlockContainer.cpp
        ../source/export/akg/process/LinkerBlockContainer.h
        ../source/export/akg/process/AkgPattern.cpp
        ../source/export/akg/process/AkgPattern.h
        ../source/export/akg/process/AkgPatternItem.cpp
        ../source/export/akg/process/AkgPatternItem.h
        ../source/export/akm/AkmExporter.cpp
        ../source/export/akm/AkmExporter.h
        ../source/export/akm/process/AkmSongEncoder.cpp
        ../source/export/akm/process/AkmSongEncoder.h
        ../source/export/akm/process/AkmInstrumentEncoder.cpp
        ../source/export/akm/process/AkmInstrumentEncoder.h
        ../source/export/akm/process/AkmSubsongEncoder.cpp
        ../source/export/akm/process/AkmSubsongEncoder.h
        ../source/export/akm/process/AkmSequenceEncoder.cpp
        ../source/export/akm/process/AkmSequenceEncoder.h
        ../source/export/akm/process/LinkerEncoder.cpp
        ../source/export/akm/process/LinkerEncoder.h
        ../source/export/events/EventsExporter.cpp
        ../source/export/events/EventsExporter.h
        ../source/export/model/EncodedDataFlag.cpp
        ../source/export/model/EncodedDataFlag.h
        ../source/export/raw/RawExporter.cpp
        ../source/export/raw/RawExporter.h
        ../source/export/rawLinear/RawLinearExport.cpp
        ../source/export/rawLinear/RawLinearExport.h
        ../source/export/sfx/SfxExporter.cpp
        ../source/export/sfx/SfxExporter.h
        ../source/export/txt/SongTxtExporter.cpp
        ../source/export/txt/SongTxtExporter.h
        ../source/export/ym/YmExporter.cpp
        ../source/export/ym/YmExporter.h
        ../source/export/ym/YmStreamEncoder.cpp
        ../source/export/ym/YmStreamEncoder.h
        ../source/export/ym/YmStreamEncoderInterleaved.cpp
        ../source/export/ym/YmStreamEncoderInterleaved.h
        ../source/export/ym/YmStreamEncoderNonInterleaved.cpp
        ../source/export/ym/YmStreamEncoderNonInterleaved.h
        ../source/export/vgm/VgmExporter.cpp
        ../source/export/vgm/VgmExporter.h
        ../source/export/wav/SongWavExporter.cpp
        ../source/export/wav/SongWavExporter.h
        ../source/export/wav/DcOffsetCalculator.cpp
        ../source/export/wav/DcOffsetCalculator.h
        ../source/export/sourceGenerator/SourceGenerator.cpp
        ../source/export/sourceGenerator/SourceGenerator.h
        ../source/export/sourceGenerator/SourceGeneratorConfiguration.cpp
        ../source/export/sourceGenerator/SourceGeneratorConfiguration.h
        ../source/export/sourceGenerator/SourceGeneratorException.h
        ../source/export/sourceGenerator/DisarkSourceGenerator.cpp
        ../source/export/sourceGenerator/DisarkSourceGenerator.h
        ../source/export/playerConfiguration/PlayerConfigurationFlag.h
        ../source/export/playerConfiguration/PlayerConfiguration.cpp
        ../source/export/playerConfiguration/PlayerConfiguration.h
        ../source/export/playerConfiguration/PlayerConfigurationExporter.cpp
        ../source/export/playerConfiguration/PlayerConfigurationExporter.h
        ../source/export/samples/SampleEncoder.cpp
        ../source/export/samples/SampleEncoder.h
        ../source/export/samples/SampleEncoderFlags.cpp
        ../source/export/samples/SampleEncoderFlags.h
        ../source/export/samples/SampleCodeGenerator.cpp
        ../source/export/samples/SampleCodeGenerator.h
        ../source/export/ExportConfiguration.cpp
        ../source/export/ExportConfiguration.h
        ../source/song/psg/Psg.cpp
        ../source/song/psg/Psg.h
        ../source/song/psg/PsgFrequency.cpp
        ../source/song/psg/PsgFrequency.h
        ../source/song/psg/PsgType.cpp
        ../source/song/psg/PsgType.h
        ../source/song/psg/PsgMixingOutput.cpp
        ../source/song/psg/PsgMixingOutput.h
        ../source/player/channel/ChannelPlayer.cpp
        ../source/player/channel/ChannelPlayer.h
        ../source/player/channel/ChannelPlayerResults.cpp
        ../source/player/channel/ChannelPlayerResults.h
        ../source/player/channel/ChannelOutputRegisters.cpp
        ../source/player/channel/ChannelOutputRegisters.h
        ../source/player/SongDataProvider.h
        ../source/player/SongPlayer.cpp
        ../source/player/SongPlayer.h

        # Disark is not stand-alone, but these files are still used. Much simpler to include them instead of creating a library to get from Git...
        ../source/disark/base/AreaTag.cpp
        ../source/disark/base/AreaTag.h
        ../source/disark/base/Symbol.cpp
        ../source/disark/base/Symbol.h

        # Test helpers.
        helper/TrackTestHelper.cpp
        helper/TrackTestHelper.h
        helper/RasmHelper.cpp
        helper/RasmHelper.h
        helper/SongTestHelper.cpp
        helper/SongTestHelper.h
        helper/z80Emulator/Z80PlayerEmulator.cpp
        helper/z80Emulator/Z80PlayerEmulator.h
        helper/z80Emulator/Z80Emulator.cpp
        helper/z80Emulator/Z80Emulator.h
        helper/z80Emulator/TargetHardware.h
        helper/z80Emulator/PlayerType.h
        helper/z80Emulator/ExpectedStatistics.h

        # The tests themselves.
        audio/effect/StereoSeparationEffectTest.cpp
        utils/StringUtilTest.cpp
        utils/CircularBufferTest.cpp
        utils/FpFloatTest.cpp
        utils/RemapperTest.cpp
        utils/NumberUtilTest.cpp
        utils/NoteUtilTest.cpp
        utils/MapUtilTest.cpp
        utils/Base64UtilTest.cpp
        utils/BitNumberTest.cpp
        ui/containerArranger/ViewArrangerTest.cpp
        ui/instrumentEditor/view/component/BarTest.cpp
        ui/instrumentEditor/controller/psg/PsgInstrumentEditorControllerLogicTest.cpp
        ui/patternViewer/controller/SelectionTest.cpp
        business/actions/linker/ClonePositionsTest.cpp
        business/actions/linker/MovePositionsTest.cpp
        business/actions/linker/RearrangePatternsTest.cpp
        business/channels/ChannelsMuteTest.cpp
        business/instrument/GenerateInstrumentTest.cpp
        business/instrument/SampleResamplerTest.cpp
        business/link/LinkedSpecialTrackHelperTest.cpp
        business/link/LinkedTrackHelperTest.cpp
        business/serialization/XmlTestHelper.cpp
        business/serialization/song/ExpressionSerializerTest.cpp
        business/serialization/instrument/InstrumentSerializerTest.cpp
        business/serialization/instrument/InstrumentDeserializerAt2Test.cpp
        business/serialization/patternViewer/EffectToCharSerializerTest.cpp
        business/serialization/patternViewer/TrackSerializerTest.cpp
        business/song/validation/CorrectExpressionTest.cpp
        business/song/validation/CorrectInstrumentTest.cpp
        business/song/validation/CheckTrackHeightTest.cpp
        business/song/validation/LoopChangeTest.cpp
        business/song/tool/builder/PatternUnoptimizerTest.cpp
        business/song/tool/builder/TrailingEffectContextTest.cpp
        business/song/tool/context/EffectContextTest.cpp
        business/song/tool/context/model/TrackContextTest.cpp
        business/song/tool/speed/DetermineSpeedTest.cpp
        business/song/tool/speed/BpmCalculatorTest.cpp
        business/song/tool/frameCounter/FrameCounterTest.cpp
        business/song/tool/songStripper/SongStripperTest.cpp
        business/song/tool/InlineArpeggioConverterTest.cpp
        business/song/tool/InstrumentCounterTest.cpp
        business/song/tool/optimizers/PatternOptimizerTest.cpp
        business/song/tool/optimizers/InstrumentsOptimizerTest.cpp
        business/song/tool/optimizers/InstrumentOptimizerTest.cpp
        business/song/tool/optimizers/ExpressionOptimizerTest.cpp
        business/song/tool/optimizers/ExpressionsOptimizerTest.cpp
        business/song/tool/optimizers/SongOptimizerTest.cpp
        business/song/tool/sfx/FirstNotePerInstrumentFinderTest.cpp
        business/song/cells/CellEffectsCheckerTest.cpp
        business/serialization/sourceProfile/SourceProfileSerializerTest.cpp
        business/serialization/sourceProfile/SourceProfileValidatorTest.cpp
        controllers/SongControllerForTest.cpp
        controllers/SongControllerForTest.h
        import/soundtrakker/Stk128ImporterTest.cpp
        import/starkos/StarkosImporterTest.cpp
        import/at1/At1SongImporterTest.cpp
        import/at2/At2SongImporterTest.cpp
        import/midi/MidiImporterTest.cpp
        import/midi/MidiTrackReaderTest.cpp
        import/at3/At3SongImporterTest.cpp
        import/chp/ChpSongImporterTest.cpp
        import/vt2/Vt2SongImporterTest.cpp
        import/wyz/WyzSongImporterTest.cpp
        import/mod/ModSongImporterTest.cpp
        import/loader/SongLoaderTest.cpp
        utils/StreamUtilTest.cpp
        player/channel/ChannelPlayerTest.cpp
        player/PsgPeriodTest.cpp
        player/PsgRegistersConverterTest.cpp
        export/at3/SongExporterTest.cpp
        export/aky/AkyExporterTest.cpp
        export/aky/AkyRegisterBlockTest.cpp
        export/aky/AkyRegisterBlockOptimizerTest.cpp
        export/akg/AkgExporterTest.cpp
        export/akm/AkmExporterTest.cpp
        export/akm/AkmSequenceEncoderTest.cpp
        export/events/EventsExporterTest.cpp
        export/raw/RawExporterTest.cpp
        export/rawLinear/RawLinearExporterTest.cpp
        export/samples/SampleEncoderTest.cpp
        export/sfx/SfxExporterTest.cpp
        export/txt/SongTxtExporterTest.cpp
        export/ym/YmExporterTest.cpp
        export/vgm/VgmExporterTest.cpp
        export/wav/WavExporterTest.cpp
        export/sourceGenerator/SourceGeneratorTest.cpp
        import/common/CheckHarmlessGrenade.cpp
        import/common/CheckHarmlessGrenade.h
        import/common/CheckSarkboteur.cpp
        import/common/CheckSarkboteur.h
        reader/VgmReaderTest.cpp
        thirdParty/fap/FapTest.cpp
        thirdParty/rasm/RasmTest.cpp
        z80Players/AkgZ80PlayerTest.cpp
        z80Players/AkyZ80PlayerTest.cpp
        z80Players/AkyMultiPsgZ80PlayerTest.cpp
        z80Players/AkyStabilizedZ80PlayerTest.cpp
        z80Players/AkmZ80PlayerTest.cpp
)

target_compile_features(${TargetName} PRIVATE cxx_std_11)

target_compile_definitions(${TargetName}
        PRIVATE
        # JUCE_WEB_BROWSER and JUCE_USE_CURL would be on by default, but you might not need them.
        JUCE_WEB_BROWSER=0  # If you remove this, add `NEEDS_WEB_BROWSER TRUE` to the `juce_add_console_app` call
        JUCE_USE_CURL=0    # If you remove this, add `NEEDS_CURL TRUE` to the `juce_add_console_app` call
        JUCE_MODULE_AVAILABLE_juce_opengl=0
        DONT_SET_USING_JUCE_NAMESPACE=1
        JUCE_SILENCE_XCODE_15_LINKER_WARNING=1
)

# Note: the Z80 emulator is not a project because has no CPP, so is included directly as a directory.
target_link_libraries(${TargetName}
        PRIVATE
        TestUnitResources
        ThirdPartyFap
        ThirdPartyLzh
        ThirdPartyRasm
        juce::juce_gui_basics
        juce::juce_audio_basics
        juce::juce_audio_devices
        juce::juce_audio_formats
        juce::juce_audio_processors
        juce::juce_audio_utils
        PUBLIC
        juce::juce_recommended_config_flags
        juce::juce_recommended_lto_flags
        juce::juce_recommended_warning_flags
)

if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
    target_link_options(${TargetName}
            PRIVATE
            -Wl,-ld_classic     # To avoid Linker warnings. See https://forum.juce.com/t/vst-au-builds-fail-after-upgrading-to-xcode-15/57936/64?u=jnv
    )
endif()