// Copyright (c) 2016, 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.utils;

import static org.junit.Assert.assertEquals;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.junit.Test;

public class DescriptorUtilsTest {

  @Test
  public void toShorty() throws IOException {
    assertEquals("Z", DescriptorUtils.javaTypeToShorty("boolean"));
    assertEquals("B", DescriptorUtils.javaTypeToShorty("byte"));
    assertEquals("S", DescriptorUtils.javaTypeToShorty("short"));
    assertEquals("C", DescriptorUtils.javaTypeToShorty("char"));
    assertEquals("I", DescriptorUtils.javaTypeToShorty("int"));
    assertEquals("J", DescriptorUtils.javaTypeToShorty("long"));
    assertEquals("F", DescriptorUtils.javaTypeToShorty("float"));
    assertEquals("D", DescriptorUtils.javaTypeToShorty("double"));
    assertEquals("L", DescriptorUtils.javaTypeToShorty("int[]"));
    assertEquals("L", DescriptorUtils.javaTypeToShorty("int[][]"));
    assertEquals("L", DescriptorUtils.javaTypeToShorty("java.lang.Object"));
    assertEquals("L", DescriptorUtils.javaTypeToShorty("a.b.C"));
  }

  @Test
  public void toDescriptor() throws IOException {
    assertEquals("Z", DescriptorUtils.javaTypeToDescriptor("boolean"));
    assertEquals("B", DescriptorUtils.javaTypeToDescriptor("byte"));
    assertEquals("S", DescriptorUtils.javaTypeToDescriptor("short"));
    assertEquals("C", DescriptorUtils.javaTypeToDescriptor("char"));
    assertEquals("I", DescriptorUtils.javaTypeToDescriptor("int"));
    assertEquals("J", DescriptorUtils.javaTypeToDescriptor("long"));
    assertEquals("F", DescriptorUtils.javaTypeToDescriptor("float"));
    assertEquals("D", DescriptorUtils.javaTypeToDescriptor("double"));
    assertEquals("[I", DescriptorUtils.javaTypeToDescriptor("int[]"));
    assertEquals("[[I", DescriptorUtils.javaTypeToDescriptor("int[][]"));
    assertEquals("Ljava/lang/Object;", DescriptorUtils.javaTypeToDescriptor("java.lang.Object"));
    assertEquals("La/b/C;", DescriptorUtils.javaTypeToDescriptor("a.b.C"));
  }

  @Test
  public void fromDescriptor() throws IOException {
    String obj = "Ljava/lang/Object;";
    assertEquals("Object", DescriptorUtils.getSimpleClassNameFromDescriptor(obj));
    assertEquals("java.lang.Object", DescriptorUtils.getClassNameFromDescriptor(obj));
    assertEquals("java.lang", DescriptorUtils.getPackageNameFromDescriptor(obj));
    assertEquals("java/lang/Object", DescriptorUtils.getClassBinaryNameFromDescriptor(obj));
  }

  @Test
  public void toJavaType() throws IOException {
    assertEquals("boolean", DescriptorUtils.descriptorToJavaType("Z"));
    assertEquals("byte", DescriptorUtils.descriptorToJavaType("B"));
    assertEquals("short", DescriptorUtils.descriptorToJavaType("S"));
    assertEquals("char", DescriptorUtils.descriptorToJavaType("C"));
    assertEquals("int", DescriptorUtils.descriptorToJavaType("I"));
    assertEquals("long", DescriptorUtils.descriptorToJavaType("J"));
    assertEquals("float", DescriptorUtils.descriptorToJavaType("F"));
    assertEquals("double", DescriptorUtils.descriptorToJavaType("D"));
    assertEquals("int[]", DescriptorUtils.descriptorToJavaType("[I"));
    assertEquals("int[][]", DescriptorUtils.descriptorToJavaType("[[I"));
    assertEquals("java.lang.Object", DescriptorUtils.descriptorToJavaType("Ljava/lang/Object;"));
    assertEquals("a.b.C", DescriptorUtils.descriptorToJavaType("La/b/C;"));
  }

  @Test
  public void guessClassDescriptor() {
    String obj = "java/lang/Object.class";
    assertEquals("Ljava/lang/Object;", DescriptorUtils.guessTypeDescriptor(obj));
    String objBackslash = "java\\lang\\Object.class";
    assertEquals("Ljava\\lang\\Object;", DescriptorUtils.guessTypeDescriptor(objBackslash));
    String objFileSeparatorChar =
        "java" + File.separatorChar + "lang" + File.separatorChar + "Object.class";
    assertEquals("Ljava/lang/Object;",
        DescriptorUtils.guessTypeDescriptor(Paths.get(objFileSeparatorChar)));
  }
}
