blob: d3fa9ff415a84bd23de2ce04502b024c8ae8fd0b [file] [log] [blame]
// Copyright 2021 The Bazel Authors. All rights reserved.
//
// 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 net.starlark.java.eval;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertThrows;
import java.util.Map;
import net.starlark.java.eval.Dict.ImmutableKeyTrackingDict;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/** Tests for {@link ImmutableKeyTrackingDict}. */
@RunWith(JUnit4.class)
public final class ImmutableKeyTrackingDictTest {
private final ImmutableKeyTrackingDict<String, StarlarkInt> dict =
Dict.<String, StarlarkInt>builder()
.put("a", StarlarkInt.of(1))
.put("b", StarlarkInt.of(2))
.put("c", StarlarkInt.of(3))
.put("d", StarlarkInt.of(4))
.buildImmutableWithKeyTracking();
@Test
public void isImmutable() throws Exception {
assertThat(dict.mutability()).isEqualTo(Mutability.IMMUTABLE);
assertThrows(EvalException.class, () -> dict.putEntry("e", StarlarkInt.of(5)));
assertThat(dict.containsKey("e")).isFalse();
assertThat(dict.getAccessedKeys()).isEmpty();
}
@Test
public void containsKey_tracksPresentKeys() {
assertThat(dict.containsKey("a")).isTrue();
assertThat(dict.containsKey("b")).isTrue();
assertThat(dict.getAccessedKeys()).containsExactly("a", "b");
}
@Test
public void containsKey_ignoresAbsentKeys() {
assertThat(dict.containsKey("absent")).isFalse();
assertThat(dict.containsKey(new Object())).isFalse();
assertThat(dict.getAccessedKeys()).isEmpty();
}
@Test
public void get_tracksPresentKeys() {
assertThat(dict.get("a")).isEqualTo(StarlarkInt.of(1));
assertThat(dict.get("b")).isEqualTo(StarlarkInt.of(2));
assertThat(dict.getAccessedKeys()).containsExactly("a", "b");
}
@Test
public void get_ignoresAbsentKeys() {
assertThat(dict.get("absent")).isNull();
assertThat(dict.get(new Object())).isNull();
assertThat(dict.getAccessedKeys()).isEmpty();
}
@Test
public void keySet_reportsAllKeys() {
assertThat(dict.keySet()).containsExactly("a", "b", "c", "d").inOrder();
assertThat(dict.getAccessedKeys()).isEqualTo(dict.keySet());
}
@Test
public void entrySet_reportsAllKeys() {
assertThat(dict.entrySet()).hasSize(4);
assertThat(dict.getAccessedKeys()).isEqualTo(dict.keySet());
}
@Test
public void iteration_reportsAllKeys() {
for (String key : dict) {
assertThat(key).isAnyOf("a", "b", "c", "d");
}
assertThat(dict.getAccessedKeys()).isEqualTo(dict.keySet());
}
@Test
public void repr_reportsAllKeys() {
StringBuilder sb = new StringBuilder();
dict.repr(new Printer(sb));
assertThat(sb.toString()).isEqualTo("{\"a\": 1, \"b\": 2, \"c\": 3, \"d\": 4}");
assertThat(dict.getAccessedKeys()).isEqualTo(dict.keySet());
}
@Test
public void mutableCopy_reportsAllKeys() {
Map<String, StarlarkInt> copy = Dict.copyOf(Mutability.create("mutable"), dict);
assertThat(copy).isNotSameInstanceAs(dict);
assertThat(dict.getAccessedKeys()).isEqualTo(dict.keySet());
}
}