// Copyright (c) 2019, 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 stream;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Set;
import java.util.stream.IntStream;

public class ProgramRewritingTestClass {

  // Each print to the console is immediately followed by the expected result so the tests
  // can assert the results by checking the lines 2 by 2.
  public static void main(String[] args) {
    Set<Object> set = new HashSet<>();
    List<Object> list = new ArrayList<>();
    ArrayList<Object> aList = new ArrayList<>();
    Queue<Object> queue = new LinkedList<>();
    LinkedHashSet<Object> lhs = new LinkedHashSet<>();
    // Following should be rewritten to invokeStatic to the dispatch class.
    System.out.println(set.spliterator().getClass().getName());
    System.out.println("j$.util.Spliterators$IteratorSpliterator");
    // Following should be rewritten to invokeStatic to Collection dispatch class.
    System.out.println(set.stream().getClass().getName());
    System.out.println("j$.util.stream.ReferencePipeline$Head");
    // Following should not be rewritten.
    System.out.println(set.iterator().getClass().getName());
    System.out.println("java.util.HashMap$KeyIterator");
    // Following should be rewritten to invokeStatic to Collection dispatch class.
    System.out.println(queue.stream().getClass().getName());
    System.out.println("j$.util.stream.ReferencePipeline$Head");
    // Following should be rewritten as retarget core lib member.
    System.out.println(lhs.spliterator().getClass().getName());
    System.out.println("j$.util.Spliterators$IteratorSpliterator");
    // Remove follows the don't rewrite rule.
    list.add(new Object());
    Iterator iterator = list.iterator();
    iterator.next();
    iterator.remove();
    // Static methods (same name, different signatures).
    System.out.println(Arrays.spliterator(new Object[]{new Object()}).getClass().getName());
    System.out.println("j$.util.Spliterators$ArraySpliterator");
    System.out.println(Arrays.spliterator(new Object[]{new Object()}, 0, 0).getClass().getName());
    System.out.println("j$.util.Spliterators$ArraySpliterator");
    System.out.println(Arrays.stream(new Object[]{new Object()}).getClass().getName());
    System.out.println("j$.util.stream.ReferencePipeline$Head");
    System.out.println(Arrays.stream(new Object[]{new Object()}, 0, 0).getClass().getName());
    System.out.println("j$.util.stream.ReferencePipeline$Head");
    // Following should be rewritten to invokeStatic to dispatch class.
    System.out.println(list.stream().getClass().getName());
    System.out.println("j$.util.stream.ReferencePipeline$Head");
    // Following should call companion method (desugared library class).
    System.out.println(IntStream.range(0, 5).getClass().getName());
    System.out.println("j$.util.stream.IntPipeline$Head");
    // Following should call List dispatch (sort), rewritten from invoke interface.
    // Comparator.comparingInt should call companion method (desugared library class).
    Collections.addAll(list, new Object(), new Object());
    list.sort(Comparator.comparingInt(Object::hashCode));
    // Following  should call List dispatch (sort), rewritten from invoke virtual.
    // Comparator.comparingInt should call companion method (desugared library class).
    Collections.addAll(aList, new Object(), new Object());
    aList.sort(Comparator.comparingInt(Object::hashCode));
    // Following should be rewritten to invokeStatic to Collection dispatch class.
    System.out.println(list.stream().getClass().getName());
    System.out.println("j$.util.stream.ReferencePipeline$Head");
    // Following should call companion method (desugared library class) [Java 9].
    // System.out.println(Stream.iterate(0,x->x<10,x->x+1).getClass().getName());
  }
}
