Home | History | Annotate | Download | only in sig
      1 /*
      2  * Copyright 2016 Google Inc. All Rights Reserved.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.google.turbine.bytecode.sig;
     18 
     19 import static com.google.common.truth.Truth.assertThat;
     20 
     21 import com.google.common.collect.Iterables;
     22 import com.google.turbine.bytecode.sig.Sig.TySig.TySigKind;
     23 import org.junit.Test;
     24 import org.junit.runner.RunWith;
     25 import org.junit.runners.JUnit4;
     26 
     27 /** Regression tests for reading/writing interesting signatures. */
     28 @RunWith(JUnit4.class)
     29 public class SigRegressionTest {
     30 
     31   @Test
     32   public void collect() {
     33     String input = "<E:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Collection<TE;>;";
     34     Sig.ClassSig sig = new SigParser(input).parseClassSig();
     35 
     36     Sig.TyParamSig tyParam = Iterables.getOnlyElement(sig.tyParams());
     37     assertThat(tyParam.name()).isEqualTo("E");
     38     Sig.ClassTySig bound = (Sig.ClassTySig) tyParam.classBound();
     39     assertThat(bound.pkg()).isEqualTo("java/lang");
     40     assertThat(Iterables.getOnlyElement(bound.classes()).simpleName()).isEqualTo("Object");
     41 
     42     assertThat(sig.superClass().pkg()).isEqualTo("java/lang");
     43     assertThat(Iterables.getOnlyElement(sig.superClass().classes()).simpleName())
     44         .isEqualTo("Object");
     45 
     46     Sig.ClassTySig i = Iterables.getOnlyElement(sig.interfaces());
     47     assertThat(i.pkg()).isEqualTo("java/util");
     48 
     49     Sig.SimpleClassTySig simple = Iterables.getOnlyElement(i.classes());
     50     assertThat(simple.simpleName()).isEqualTo("Collection");
     51 
     52     Sig.TySig tyArg = Iterables.getOnlyElement(simple.tyArgs());
     53     assertThat(tyArg.kind()).isEqualTo(TySigKind.TY_VAR_SIG);
     54     Sig.TyVarSig tyVar = (Sig.TyVarSig) tyArg;
     55     assertThat(tyVar.name()).isEqualTo("E");
     56 
     57     assertThat(SigWriter.classSig(sig)).isEqualTo(input);
     58   }
     59 
     60   @Test
     61   public void chrono() {
     62     String input =
     63         "<D::Ljava/time/chrono/ChronoLocalDate;>Ljava/lang/Object;Ljava/time/temporal/Temporal;"
     64             + "Ljava/lang/Comparable<Ljava/time/chrono/ChronoZonedDateTime<*>;>;";
     65     Sig.ClassSig sig = new SigParser(input).parseClassSig();
     66     assertThat(SigWriter.classSig(sig)).isEqualTo(input);
     67   }
     68 
     69   @Test
     70   public void map() {
     71     String input =
     72         "<K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Map<TK;TV;>;";
     73     Sig.ClassSig sig = new SigParser(input).parseClassSig();
     74     assertThat(SigWriter.classSig(sig)).isEqualTo(input);
     75   }
     76 
     77   @Test
     78   public void longConsumer() {
     79     String input =
     80         "Ljava/util/stream/SpinedBuffer$OfPrimitive<Ljava/lang/Long;[JLjava/util/function/LongConsumer;>;"
     81             + "Ljava/util/function/LongConsumer;";
     82     Sig.ClassSig sig = new SigParser(input).parseClassSig();
     83     assertThat(SigWriter.classSig(sig)).isEqualTo(input);
     84   }
     85 
     86   @Test
     87   public void innerClass() {
     88     String input = "Ljava/lang/Enum<Lsun/util/logging/PlatformLogger.Level;>;";
     89     Sig.ClassSig sig = new SigParser(input).parseClassSig();
     90     assertThat(SigWriter.classSig(sig)).isEqualTo(input);
     91   }
     92 
     93   @Test
     94   public void wildArray() {
     95     String input = "LA<[*>.I;";
     96     Sig.ClassSig sig = new SigParser(input).parseClassSig();
     97     assertThat(SigWriter.classSig(sig)).isEqualTo(input);
     98 
     99     input = "LA<[+[Z>.I;";
    100     sig = new SigParser(input).parseClassSig();
    101     assertThat(SigWriter.classSig(sig)).isEqualTo(input);
    102 
    103     input = "LA<[-[Z>.I;";
    104     sig = new SigParser(input).parseClassSig();
    105   }
    106 }
    107