SparseBooleanArraySubject.java

/*
 * 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.
 */
package androidx.test.ext.truth.util;

import android.util.SparseBooleanArray;
import com.google.common.truth.ExpectFailure;
import com.google.common.truth.Fact;
import com.google.common.truth.FailureMetadata;
import com.google.common.truth.Subject;
import com.google.common.truth.Truth;

/** Subject for making assertions about {@link SparseBooleanArray}s. */
public final class SparseBooleanArraySubject extends Subject {

  private final SparseBooleanArray actual;

  private static Factory<SparseBooleanArraySubject, SparseBooleanArray> sparseBooleanArrays() {
    return SparseBooleanArraySubject::new;
  }

  SparseBooleanArraySubject(FailureMetadata failureMetadata, SparseBooleanArray subject) {
    super(failureMetadata, subject);
    this.actual = subject;
  }

  /** Assert that a {@link SparseBooleanArray} for the given key returns the value true */
  public void hasTrueValueAt(int key) {
    check("value for key <%s> expected to be true but was not", key).that(actual.get(key)).isTrue();
  }

  /** Assert that a {@link SparseBooleanArray} for the given key returns the value false */
  public void hasFalseValueAt(int key) {
    // We have to check for the presence of a key first, because {@link SparseBooleanArray#get}
    // returns false if no mapping to that key exists.
    if (actual.indexOfKey(key) == -1) {
      failWithoutActual(Fact.fact("key <%s> expected to be present but was not", key));
    }
    check("value for key <%s> expected to be false but was not", key)
        .that(actual.get(key))
        .isFalse();
  }

  /** Assert that a {@link SparseBooleanArray} contains the given key */
  public void containsKey(int key) {
    check("key <%s> expected to be present but was not.", key)
        .that(actual.indexOfKey(key))
        .isGreaterThan(-1);
  }

  /** Assert that a {@link SparseBooleanArray} doesn't contain the given key */
  public void doesNotContainKey(int key) {
    check("key <%s> expected to not be present but was.", key)
        .that(actual.indexOfKey(key))
        .isLessThan(0);
  }

  /** Assert that a {@link SparseBooleanArray} has size */
  public void hasSize(int size) {
    check("size()").that(actual.size()).isEqualTo(size);
  }

  /** Assert that a {@link SparseBooleanArray} is empty */
  public void isEmpty() {
    check(" expected to be empty but was not").that(actual.size() == 0).isTrue();
  }

  /** Assert that a {@link SparseBooleanArray} is not empty */
  public void isNotEmpty() {
    check(" expected not to be empty but it was").that(actual.size() == 0).isFalse();
  }

  /** Begins an assertion on a {@link SparseBooleanArray} */
  public static SparseBooleanArraySubject assertThat(SparseBooleanArray actual) {
    return Truth.assertAbout(sparseBooleanArrays()).that(actual);
  }

  /** Begins an assertion on a {@link SparseBooleanArray} where a predicate is expected to fail */
  public static AssertionError expectFailure(
      ExpectFailure.SimpleSubjectBuilderCallback<SparseBooleanArraySubject, SparseBooleanArray>
          callback) {
    return ExpectFailure.expectFailureAbout(sparseBooleanArrays(), callback);
  }
}