/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * 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 <cstdint>
#include <string>

#include <binder/Parcelable.h>
#include <utils/Errors.h>
#include <utils/String16.h>

namespace android {
namespace aidl {
namespace tests {

class BadParcelable : public Parcelable {
 public:
  BadParcelable() = default;
  BadParcelable(bool bad, const std::string& name, int32_t number);
  virtual ~BadParcelable() = default;

  status_t writeToParcel(Parcel* parcel) const override;
  status_t readFromParcel(const Parcel* parcel) override;

  std::string toString() const;

  friend bool operator==(const BadParcelable& lhs, const BadParcelable& rhs) {
    return (lhs.bad_ == rhs.bad_) && (lhs.name_ == rhs.name_) && (lhs.number_ == rhs.number_);
  }
  friend bool operator!=(const BadParcelable& lhs, const BadParcelable& rhs) {
    return !(lhs == rhs);
  }

 private:
  bool bad_;
  String16 name_;
  int32_t number_ = 0;
};  // class BadParcelable

}  // namespace tests
}  // namespace aidl
}  // namespace android
