// Copyright (c) 2017, 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 desugaringwithandroidjar25;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.function.Predicate;

public class DefaultMethodInAndroidJar25 {
  public static void main(String[] args) throws Exception {
    ClassWithDefaultPlatformMethods.test();
  }
}

class ClassWithDefaultPlatformMethods implements Collection<String> {
  private final ArrayList<String> list =
      new ArrayList<String>() {
        {
          add("First");
          add("Second");
        }
      };

  static void test() {
    ClassWithDefaultPlatformMethods instance = new ClassWithDefaultPlatformMethods();
    instance.forEach(x -> System.out.println("BEFORE: " + x));
    instance.removeIf(x -> true);
    instance.forEach(x -> System.out.println("AFTER: " + x));
  }

  @Override
  public int size() {
    throw new AssertionError();
  }

  @Override
  public boolean isEmpty() {
    throw new AssertionError();
  }

  @Override
  public boolean contains(Object o) {
    throw new AssertionError();
  }

  @Override
  public Iterator<String> iterator() {
    return list.iterator();
  }

  @Override
  public Object[] toArray() {
    throw new AssertionError();
  }

  @Override
  public <T> T[] toArray(T[] a) {
    throw new AssertionError();
  }

  @Override
  public boolean add(String s) {
    throw new AssertionError();
  }

  @Override
  public boolean remove(Object o) {
    return list.remove(o);
  }

  @Override
  public boolean containsAll(Collection<?> c) {
    throw new AssertionError();
  }

  @Override
  public boolean addAll(Collection<? extends String> c) {
    throw new AssertionError();
  }

  @Override
  public boolean removeAll(Collection<?> c) {
    throw new AssertionError();
  }

  @Override
  public boolean retainAll(Collection<?> c) {
    throw new AssertionError();
  }

  @Override
  public void clear() {
    throw new AssertionError();
  }

  @Override
  public boolean removeIf(Predicate<? super String> filter) {
    return Collection.super.removeIf(filter);
  }
}
