/*
 * Copyright (C) 2016 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.
 */

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits>
#include <cstddef>
#include <vector>

#include "android-base/file.h"
#include "android-base/test_utils.h"
#include <gtest/gtest.h>

#include <binder/Parcel.h>
#include <binder/Value.h>
#include <binder/Debug.h>

using ::android::binder::Value;
using ::android::os::PersistableBundle;
using ::android::String16;
using ::std::vector;

#define VALUE_TYPE_TEST(T, TYPENAME, VAL)         \
    TEST(ValueType, Handles ## TYPENAME) {        \
        T x = VAL;                                \
        T y = T();                                \
        Value value = VAL;                        \
        ASSERT_FALSE(value.empty());              \
        ASSERT_TRUE(value.is ## TYPENAME ());     \
        ASSERT_TRUE(value.get ## TYPENAME (&y));  \
        ASSERT_EQ(x, y);                          \
        ASSERT_EQ(value, Value(y));               \
        value.put ## TYPENAME (x);                \
        ASSERT_EQ(value, Value(y));               \
        value = Value();                          \
        ASSERT_TRUE(value.empty());               \
        ASSERT_NE(value, Value(y));               \
        value = y;                                \
        ASSERT_EQ(value, Value(x));               \
    }

#define VALUE_TYPE_VECTOR_TEST(T, TYPENAME, VAL)      \
    TEST(ValueType, Handles ## TYPENAME ## Vector) {  \
        vector<T> x;                                  \
        vector<T> y;                                  \
        x.push_back(VAL);                             \
        x.push_back(T());                             \
        Value value(x);                               \
        ASSERT_FALSE(value.empty());                  \
        ASSERT_TRUE(value.is ## TYPENAME ## Vector());    \
        ASSERT_TRUE(value.get ## TYPENAME ## Vector(&y)); \
        ASSERT_EQ(x, y);                              \
        ASSERT_EQ(value, Value(y));                   \
        value.put ## TYPENAME ## Vector(x);           \
        ASSERT_EQ(value, Value(y));                   \
        value = Value();                              \
        ASSERT_TRUE(value.empty());                   \
        ASSERT_NE(value, Value(y));                   \
        value = y;                                    \
        ASSERT_EQ(value, Value(x));                   \
    }

VALUE_TYPE_TEST(bool, Boolean, true)
VALUE_TYPE_TEST(int32_t, Int, 31337)
VALUE_TYPE_TEST(int64_t, Long, 13370133701337l)
VALUE_TYPE_TEST(double, Double, 3.14159265358979323846)
VALUE_TYPE_TEST(String16, String, String16("Lovely"))

VALUE_TYPE_VECTOR_TEST(bool, Boolean, true)
VALUE_TYPE_VECTOR_TEST(int32_t, Int, 31337)
VALUE_TYPE_VECTOR_TEST(int64_t, Long, 13370133701337l)
VALUE_TYPE_VECTOR_TEST(double, Double, 3.14159265358979323846)
VALUE_TYPE_VECTOR_TEST(String16, String, String16("Lovely"))

VALUE_TYPE_TEST(PersistableBundle, PersistableBundle, PersistableBundle())

TEST(ValueType, HandlesClear) {
    Value value;
    ASSERT_TRUE(value.empty());
    value.putInt(31337);
    ASSERT_FALSE(value.empty());
    value.clear();
    ASSERT_TRUE(value.empty());
}

TEST(ValueType, HandlesSwap) {
    Value value_a, value_b;
    int32_t int_x;
    value_a.putInt(31337);
    ASSERT_FALSE(value_a.empty());
    ASSERT_TRUE(value_b.empty());
    value_a.swap(value_b);
    ASSERT_FALSE(value_b.empty());
    ASSERT_TRUE(value_a.empty());
    ASSERT_TRUE(value_b.getInt(&int_x));
    ASSERT_EQ(31337, int_x);
}
