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

import static org.junit.Assert.assertEquals;

import com.android.tools.r8.D8CommandParser.OrderedClassFileResourceProvider;
import com.android.tools.r8.origin.Origin;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import java.io.InputStream;
import java.util.Map;
import java.util.Set;
import org.junit.Test;

public class OrderedClassFileResourceProviderTest extends TestBase {
  class SimpleClassFileResourceProvider implements ClassFileResourceProvider {

    private final Set<String> descriptors;
    private final ProgramResource fixedProgramResource;

    SimpleClassFileResourceProvider(int id, Set<String> descriptors) {
      this.descriptors = descriptors;
      this.fixedProgramResource = new SimpleProgramResource(id);
    }

    @Override
    public Set<String> getClassDescriptors() {
      return descriptors;
    }

    @Override
    public ProgramResource getProgramResource(String descriptor) {
      return fixedProgramResource;
    }
  }

  class SimpleProgramResource implements ProgramResource {

    private final Origin origin;

    SimpleProgramResource(int id) {
      origin = new SimpleOrigin(id);
    }

    @Override
    public Kind getKind() {
      return null;
    }

    @Override
    public InputStream getByteStream() {
      return null;
    }

    @Override
    public byte[] getBytes() {
      return null;
    }

    @Override
    public Set<String> getClassDescriptors() {
      return null;
    }

    @Override
    public Origin getOrigin() {
      return origin;
    }
  }

  public class SimpleOrigin extends Origin {

    private final int id;

    private SimpleOrigin(int index) {
      super(root());
      this.id = index;
    }

    int getId() {
      return id;
    }

    @Override
    public String part() {
      return "Test";
    }
  }

  @Test
  public void test() {
    OrderedClassFileResourceProvider.Builder builder = OrderedClassFileResourceProvider.builder();
    builder.addClassFileResourceProvider(new SimpleClassFileResourceProvider(1, ImmutableSet.of(
        "L/a/a/a", "L/a/a/b", "L/a/a/c"
    )));
    builder.addClassFileResourceProvider(new SimpleClassFileResourceProvider(2, ImmutableSet.of(
        "L/a/a/b", "L/a/a/c", "L/a/a/d"
        )));
    ClassFileResourceProvider provider = builder.build();
    assertEquals(
        ImmutableSet.of("L/a/a/a", "L/a/a/b", "L/a/a/c", "L/a/a/d"),
        provider.getClassDescriptors());

    Map<String, Integer> expectations = ImmutableMap.of(
        "L/a/a/a", 1,
        "L/a/a/b", 1,
        "L/a/a/c", 1,
        "L/a/a/d", 2
    );
    expectations.forEach((descriptor, id) ->
        assertEquals(
            (int) id,
            ((SimpleOrigin) provider.getProgramResource(descriptor).getOrigin()).getId()));
  }
}
