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
17package com.google.turbine.bytecode.sig;
18
19import static com.google.common.truth.Truth.assertThat;
20
21import com.google.common.collect.Iterables;
22import com.google.turbine.bytecode.sig.Sig.TySig.TySigKind;
23import org.junit.Test;
24import org.junit.runner.RunWith;
25import org.junit.runners.JUnit4;
26
27/** Regression tests for reading/writing interesting signatures. */
28@RunWith(JUnit4.class)
29public 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