| // Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| package com.android.tools.r8.desugar.desugaredlibrary; |
| |
| import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8SHRINK; |
| import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.R8_L8SHRINK; |
| import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; |
| |
| import com.android.tools.r8.TestParameters; |
| import com.android.tools.r8.ToolHelper; |
| import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; |
| import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; |
| import com.android.tools.r8.utils.AndroidApiLevel; |
| import com.google.common.collect.ImmutableList; |
| import com.google.common.collect.ImmutableMultiset; |
| import com.google.common.collect.Multiset; |
| import java.util.Collection; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Set; |
| import org.checkerframework.checker.nullness.qual.Nullable; |
| import org.jetbrains.annotations.NotNull; |
| import org.junit.Assume; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.Parameterized; |
| import org.junit.runners.Parameterized.Parameters; |
| |
| @RunWith(Parameterized.class) |
| public class GuavaMultiSetSpliteratorTest extends DesugaredLibraryTestBase { |
| |
| private final TestParameters parameters; |
| private final LibraryDesugaringSpecification libraryDesugaringSpecification; |
| private final CompilationSpecification compilationSpecification; |
| |
| @Parameters(name = "{0}, spec: {1}, {2}") |
| public static List<Object[]> data() { |
| return buildParameters( |
| getTestParameters() |
| .withDexRuntimes() |
| .withApiLevel(AndroidApiLevel.L) |
| .withAllApiLevels() |
| .build(), |
| getJdk8Jdk11(), |
| ImmutableList.of(D8_L8SHRINK, R8_L8SHRINK)); |
| } |
| |
| public GuavaMultiSetSpliteratorTest( |
| TestParameters parameters, |
| LibraryDesugaringSpecification libraryDesugaringSpecification, |
| CompilationSpecification compilationSpecification) { |
| this.parameters = parameters; |
| this.libraryDesugaringSpecification = libraryDesugaringSpecification; |
| this.compilationSpecification = compilationSpecification; |
| } |
| |
| @Test |
| public void testGuava() throws Throwable { |
| if (!compilationSpecification.isProgramShrink()) { |
| // We need multidex for non shrinking build. |
| Assume.assumeTrue(parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.L)); |
| } |
| testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) |
| .addProgramFiles(ToolHelper.DEPS) |
| .addInnerClasses(getClass()) |
| .addOptionsModification(opt -> opt.ignoreMissingClasses = true) |
| .allowDiagnosticWarningMessages() |
| .addKeepMainRule(Main.class) |
| .run(parameters.getRuntime(), Main.class) |
| .assertSuccessWithOutputLines("17744", "NullPointerException"); |
| } |
| |
| public static class Main { |
| |
| public static void main(String[] args) { |
| System.out.println(ImmutableMultiset.of().spliterator().characteristics()); |
| try { |
| System.out.println(new MyMultiSet<>().spliterator().characteristics()); |
| } catch (Exception e) { |
| System.out.println(e.getClass().getSimpleName()); |
| } |
| } |
| } |
| |
| public static class MyMultiSet<E> implements Multiset<E> { |
| |
| @Override |
| public int size() { |
| return 0; |
| } |
| |
| @Override |
| public boolean isEmpty() { |
| return false; |
| } |
| |
| @Override |
| public int count(@Nullable Object element) { |
| return 0; |
| } |
| |
| @Override |
| public int add(@Nullable E element, int occurrences) { |
| return 0; |
| } |
| |
| @Override |
| public boolean add(E element) { |
| return false; |
| } |
| |
| @Override |
| public int remove(@Nullable Object element, int occurrences) { |
| return 0; |
| } |
| |
| @Override |
| public boolean remove(@Nullable Object element) { |
| return false; |
| } |
| |
| @Override |
| public int setCount(E element, int count) { |
| return 0; |
| } |
| |
| @Override |
| public boolean setCount(E element, int oldCount, int newCount) { |
| return false; |
| } |
| |
| @Override |
| public Set<E> elementSet() { |
| return null; |
| } |
| |
| @Override |
| public Set<Entry<E>> entrySet() { |
| return null; |
| } |
| |
| @Override |
| public Iterator<E> iterator() { |
| return null; |
| } |
| |
| @NotNull |
| @Override |
| public Object[] toArray() { |
| return new Object[0]; |
| } |
| |
| @NotNull |
| @Override |
| public <T> T[] toArray(@NotNull T[] ts) { |
| return null; |
| } |
| |
| @Override |
| public boolean contains(@Nullable Object element) { |
| return false; |
| } |
| |
| @Override |
| public boolean containsAll(Collection<?> elements) { |
| return false; |
| } |
| |
| @Override |
| public boolean addAll(@NotNull Collection<? extends E> collection) { |
| return false; |
| } |
| |
| @Override |
| public boolean removeAll(Collection<?> c) { |
| return false; |
| } |
| |
| @Override |
| public boolean retainAll(Collection<?> c) { |
| return false; |
| } |
| |
| @Override |
| public void clear() {} |
| } |
| } |