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

package android.telecom.cts;

import android.os.Parcel;
import android.telecom.PhoneAccountSuggestion;
import android.test.AndroidTestCase;

public class PhoneAccountSuggestionTest extends AndroidTestCase {
    public void testAccessors() {
        PhoneAccountSuggestion suggestion = new PhoneAccountSuggestion(
                TestUtils.TEST_PHONE_ACCOUNT_HANDLE,
                PhoneAccountSuggestion.REASON_INTRA_CARRIER, true);
        assertEquals(TestUtils.TEST_PHONE_ACCOUNT_HANDLE, suggestion.getPhoneAccountHandle());
        assertEquals(PhoneAccountSuggestion.REASON_INTRA_CARRIER, suggestion.getReason());
        assertTrue(suggestion.shouldAutoSelect());
    }

    public void testParcelUnparcel() {
        PhoneAccountSuggestion suggestion = new PhoneAccountSuggestion(
                TestUtils.TEST_PHONE_ACCOUNT_HANDLE,
                PhoneAccountSuggestion.REASON_INTRA_CARRIER, true);
        Parcel p = Parcel.obtain();
        suggestion.writeToParcel(p, 0);
        p.setDataPosition(0);
        PhoneAccountSuggestion suggestion2 = PhoneAccountSuggestion.CREATOR.createFromParcel(p);
        assertEquals(suggestion, suggestion2);
    }
}
