Skip to content

Commit dbf1fe8

Browse files
committed
Port jvm.StringConcatTest from backend
Ported from cb68d9c1868e9fbb3e58cdfd606274e070db5b31
1 parent acde7c8 commit dbf1fe8

File tree

1 file changed

+129
-0
lines changed

1 file changed

+129
-0
lines changed
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package dotty.tools.backend.jvm
2+
3+
import org.junit.runner.RunWith
4+
import org.junit.runners.JUnit4
5+
import org.junit.Test
6+
import scala.tools.asm.Opcodes._
7+
import org.junit.Assert._
8+
9+
import ASMConverters._
10+
11+
12+
class StringConcatTest extends DottyBytecodeTest {
13+
import ASMConverters._
14+
15+
@Test
16+
def appendOverloadNoBoxing(): Unit = {
17+
val code =
18+
"""class C {
19+
| def t1(
20+
| v: Unit,
21+
| z: Boolean,
22+
| c: Char,
23+
| b: Byte,
24+
| s: Short,
25+
| i: Int,
26+
| l: Long,
27+
| f: Float,
28+
| d: Double,
29+
| str: String,
30+
| sbuf: java.lang.StringBuffer,
31+
| chsq: java.lang.CharSequence,
32+
| chrs: Array[Char]) = str + this + v + z + c + b + s + i + f + l + d + sbuf + chsq + chrs
33+
|
34+
| // similar, but starting off with any2stringadd
35+
| def t2(
36+
| v: Unit,
37+
| z: Boolean,
38+
| c: Char,
39+
| b: Byte,
40+
| s: Short,
41+
| i: Int,
42+
| l: Long,
43+
| f: Float,
44+
| d: Double,
45+
| str: String,
46+
| sbuf: java.lang.StringBuffer,
47+
| chsq: java.lang.CharSequence,
48+
| chrs: Array[Char]) = this + str + v + z + c + b + s + i + f + l + d + sbuf + chsq + chrs
49+
|}
50+
""".stripMargin
51+
52+
checkBCode(code) { dir =>
53+
def instructions(meth: String): List[Instruction] = {
54+
val clsIn = dir.lookupName("C.class", directory = false).input
55+
val clsNode = loadClassNode(clsIn)
56+
instructionsFromMethod(getMethod(clsNode, meth))
57+
}
58+
59+
def invokeNameDesc(m: String): List[String] = instructions(m) collect {
60+
case Invoke(_, _, name, desc, _) => name + desc
61+
}
62+
63+
assertEquals(invokeNameDesc("t1"), List(
64+
"<init>()V",
65+
"append(Ljava/lang/String;)Ljava/lang/StringBuilder;",
66+
"append(Ljava/lang/Object;)Ljava/lang/StringBuilder;",
67+
"append(Ljava/lang/Object;)Ljava/lang/StringBuilder;",
68+
"append(Z)Ljava/lang/StringBuilder;",
69+
"append(C)Ljava/lang/StringBuilder;",
70+
"append(I)Ljava/lang/StringBuilder;",
71+
"append(I)Ljava/lang/StringBuilder;",
72+
"append(I)Ljava/lang/StringBuilder;",
73+
"append(F)Ljava/lang/StringBuilder;",
74+
"append(J)Ljava/lang/StringBuilder;",
75+
"append(D)Ljava/lang/StringBuilder;",
76+
"append(Ljava/lang/StringBuffer;)Ljava/lang/StringBuilder;",
77+
"append(Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;",
78+
"append(Ljava/lang/Object;)Ljava/lang/StringBuilder;", // test that we're not using the [C overload
79+
"toString()Ljava/lang/String;"))
80+
81+
assertEquals(invokeNameDesc("t2"), List(
82+
"any2stringadd(Ljava/lang/Object;)Ljava/lang/Object;",
83+
"<init>()V",
84+
"$plus$extension(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String;",
85+
"append(Ljava/lang/String;)Ljava/lang/StringBuilder;",
86+
"append(Ljava/lang/Object;)Ljava/lang/StringBuilder;",
87+
"append(Z)Ljava/lang/StringBuilder;",
88+
"append(C)Ljava/lang/StringBuilder;",
89+
"append(I)Ljava/lang/StringBuilder;",
90+
"append(I)Ljava/lang/StringBuilder;",
91+
"append(I)Ljava/lang/StringBuilder;",
92+
"append(F)Ljava/lang/StringBuilder;",
93+
"append(J)Ljava/lang/StringBuilder;",
94+
"append(D)Ljava/lang/StringBuilder;",
95+
"append(Ljava/lang/StringBuffer;)Ljava/lang/StringBuilder;",
96+
"append(Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;",
97+
"append(Ljava/lang/Object;)Ljava/lang/StringBuilder;", // test that we're not using the [C overload
98+
"toString()Ljava/lang/String;"))
99+
}
100+
}
101+
102+
@Test
103+
def concatPrimitiveCorrectness(): Unit = {
104+
val obj: Object = new { override def toString = "TTT" }
105+
def t(
106+
v: Unit,
107+
z: Boolean,
108+
c: Char,
109+
b: Byte,
110+
s: Short,
111+
i: Int,
112+
l: Long,
113+
f: Float,
114+
d: Double,
115+
str: String,
116+
sbuf: java.lang.StringBuffer,
117+
chsq: java.lang.CharSequence,
118+
chrs: Array[Char]) = {
119+
val s1 = str + obj + v + z + c + b + s + i + f + l + d + sbuf + chsq + chrs
120+
val s2 = obj + str + v + z + c + b + s + i + f + l + d + sbuf + chsq + chrs
121+
s1 + "//" + s2
122+
}
123+
def sbuf = { val r = new java.lang.StringBuffer(); r.append("sbuf"); r }
124+
def chsq: java.lang.CharSequence = "chsq"
125+
val s = t((), true, 'd', 3: Byte, 12: Short, 3, -32l, 12.3f, -4.2d, "me", sbuf, chsq, Array('a', 'b'))
126+
val r = s.replaceAll("""\[C@\w+""", "<ARRAY>")
127+
assertEquals(r, "meTTT()trued312312.3-32-4.2sbufchsq<ARRAY>//TTTme()trued312312.3-32-4.2sbufchsq<ARRAY>")
128+
}
129+
}

0 commit comments

Comments
 (0)