//
//  Copyright 2015 Google, Inc.
//
//  Licensed under the Apache License, Version 2.0 (the "License");
//  you may not use this file except in compliance with the License.
//  You may obtain a copy of the License at:
//
//  http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.
//

#pragma once

#include <gmock/gmock.h>

#include "service/daemon.h"

namespace bluetooth {
namespace testing {

class MockAdapter : public Adapter {
 public:
  MockAdapter() = default;
  ~MockAdapter() override = default;

  MOCK_METHOD1(AddObserver, void(Observer*));
  MOCK_METHOD1(RemoveObserver, void(Observer*));
  MOCK_CONST_METHOD0(GetState, AdapterState());
  MOCK_CONST_METHOD0(IsEnabled, bool());
  MOCK_METHOD1(Enable, bool(bool));
  MOCK_METHOD0(Disable, bool());
  MOCK_CONST_METHOD0(GetName, std::string());
  MOCK_METHOD1(SetName, bool(const std::string&));
  MOCK_CONST_METHOD0(GetAddress, std::string());
  MOCK_METHOD0(IsMultiAdvertisementSupported, bool());
  MOCK_METHOD1(IsDeviceConnected, bool(const std::string&));
  MOCK_METHOD0(GetTotalNumberOfTrackableAdvertisements, int());
  MOCK_METHOD0(IsOffloadedFilteringSupported, bool());
  MOCK_METHOD0(IsOffloadedScanBatchingSupported, bool());
  MOCK_CONST_METHOD0(GetLowEnergyClientFactory, LowEnergyClientFactory*());
  MOCK_CONST_METHOD0(GetLeAdvertiserFactory, LowEnergyAdvertiserFactory*());
  MOCK_CONST_METHOD0(GetLeScannerFactory, LowEnergyScannerFactory*());
  MOCK_CONST_METHOD0(GetGattClientFactory, GattClientFactory*());
  MOCK_CONST_METHOD0(GetGattServerFactory, GattServerFactory*());

 private:
  DISALLOW_COPY_AND_ASSIGN(MockAdapter);
};

}  // namespace testing
}  // namespace bluetooth
