1 #pragma once
2 
3 #include <gtest/gtest.h>
4 #include <gmock/gmock.h>
5 
6 #include <QScopedPointer>
7 
8 #include "effects/effectchain.h"
9 #include "effects/effect.h"
10 #include "effects/effectsmanager.h"
11 #include "effects/effectmanifest.h"
12 #include "effects/effectsbackend.h"
13 #include "effects/effectinstantiator.h"
14 #include "effects/effectprocessor.h"
15 
16 
17 #include "test/mixxxtest.h"
18 
19 class TestEffectBackend : public EffectsBackend {
20   public:
TestEffectBackend()21     TestEffectBackend() : EffectsBackend(NULL, EffectBackendType::Unknown) {
22     }
23 
24     // Expose as public
registerEffect(const QString & id,EffectManifestPointer pManifest,EffectInstantiatorPointer pInstantiator)25     void registerEffect(const QString& id,
26                         EffectManifestPointer pManifest,
27                         EffectInstantiatorPointer pInstantiator) {
28         EffectsBackend::registerEffect(id, pManifest, pInstantiator);
29     }
30 };
31 
32 class MockEffectProcessor : public EffectProcessor {
33   public:
MockEffectProcessor()34     MockEffectProcessor() {}
35 
36     MOCK_METHOD3(initialize, void(const QSet<ChannelHandleAndGroup>& activeInputChannels,
37                                   EffectsManager* pEffectsManager,
38                                   const mixxx::EngineParameters& bufferParameters));
39     MOCK_METHOD1(createState, EffectState*(const mixxx::EngineParameters& bufferParameters));
40     MOCK_METHOD2(loadStatesForInputChannel, bool(const ChannelHandle* inputChannel,
41           const EffectStatesMap* pStatesMap));
42     MOCK_METHOD1(deleteStatesForInputChannel, void(const ChannelHandle* inputChannel));
43     MOCK_METHOD7(process, void(const ChannelHandle& inputHandle,
44                                const ChannelHandle& outputHandle,
45                                const CSAMPLE* pInput,
46                                CSAMPLE* pOutput,
47                                const mixxx::EngineParameters& bufferParameters,
48                                const EffectEnableState enableState,
49                                const GroupFeatureState& groupFeatures));
50 
51 };
52 
53 class MockEffectInstantiator : public EffectInstantiator {
54   public:
MockEffectInstantiator()55     MockEffectInstantiator() {}
56     MOCK_METHOD2(instantiate, EffectProcessor*(EngineEffect* pEngineEffect,
57                                                EffectManifestPointer pManifest));
58 };
59 
60 
61 class BaseEffectTest : public MixxxTest {
62   protected:
BaseEffectTest()63     BaseEffectTest()
64             : m_pChannelHandleFactory(std::make_shared<ChannelHandleFactory>()),
65               m_pTestBackend(nullptr),
66               m_pEffectsManager(new EffectsManager(nullptr, config(), m_pChannelHandleFactory)) {
67     }
68 
registerTestBackend()69     void registerTestBackend() {
70         m_pTestBackend = new TestEffectBackend();
71         m_pEffectsManager->addEffectsBackend(m_pTestBackend);
72     }
73 
74     void registerTestEffect(EffectManifestPointer pManifest, bool willAddToEngine);
75 
76     ChannelHandleFactoryPointer m_pChannelHandleFactory;
77 
78     // Deleted by EffectsManager. Do not delete.
79     TestEffectBackend* m_pTestBackend;
80     QScopedPointer<EffectsManager> m_pEffectsManager;
81 };
82