diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2015-01-15 21:48:47 +1000 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2015-01-16 11:36:49 +1000 |
commit | 09ce5c32f1db71ccaa5d4b22076d9ec606ad5ec9 (patch) | |
tree | d7188ff810f1d9a2cc6eb2faad18ebd40a0ac587 /test/files | |
parent | 05612399f78f34cb01fb31070eacf4a51b489dfb (diff) | |
download | scala-09ce5c32f1db71ccaa5d4b22076d9ec606ad5ec9.tar.gz scala-09ce5c32f1db71ccaa5d4b22076d9ec606ad5ec9.tar.bz2 scala-09ce5c32f1db71ccaa5d4b22076d9ec606ad5ec9.zip |
SI-6502 More robust REPL :require
- handle missing files gracefully (rather than NPE)
- read the class name with ASM, rather than with a dummy
classloader. The dummy classloader is prone to throwing
`LinkageError`s, as reported in the comments of SI-6502.
Manual test of the original report:
```
% qscala
Welcome to Scala version 2.11.5-20150115-183424-155dbf3fdf (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_25).
Type in expressions to have them evaluated.
Type :help for more information.
scala> :require does/not/exist
Cannot read: does/not/exist
scala> classOf[org.junit.Test]
<console>:8: error: object junit is not a member of package org
classOf[org.junit.Test]
^
scala> :require /Users/jason/.m2/repository/junit/junit/4.11/junit-4.11.jar
Added '/Users/jason/.m2/repository/junit/junit/4.11/junit-4.11.jar' to classpath.
scala> classOf[org.junit.Test]
res1: Class[org.junit.Test] = interface org.junit.Test
```
I have commited an automated test that is a minimization of this one.
Diffstat (limited to 'test/files')
-rw-r--r-- | test/files/run/t6502.scala | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/test/files/run/t6502.scala b/test/files/run/t6502.scala index 4ce034a482..b0d93ac3fd 100644 --- a/test/files/run/t6502.scala +++ b/test/files/run/t6502.scala @@ -46,6 +46,12 @@ object Test extends StoreReporterDirectTest { } }""" + def app6 = """ + package test6 + class A extends Test { println("created test6.A") } + class Z extends Test { println("created test6.Z") } + trait Test""" + def test1(): Unit = { val jar = "test1.jar" compileCode(app1, jar) @@ -105,11 +111,31 @@ object Test extends StoreReporterDirectTest { println(s"test4 res2: $res2") } + def test5(): Unit = { + val codeToRun = ":require /does/not/exist.jar" + val output = ILoop.run(codeToRun, settings) + assert(!output.contains("NullPointerException"), output) + assert(output.contains("Cannot load '/does/not/exist.jar'"), output) + } + + def test6(): Unit = { + // Avoid java.lang.NoClassDefFoundError triggered by the old appoach of using a Java + // classloader to parse .class files in order to read their names. + val jar = "test6.jar" + compileCode(app6, jar) + val codeToRun = toCodeInSeparateLines(s":require ${testOutput.path}/$jar", "import test6._; new A; new Z") + val output = ILoop.run(codeToRun, settings) + assert(output.contains("created test6.A"), output) + assert(output.contains("created test6.Z"), output) + } + def show(): Unit = { test1() test2() test3() test4() + test5() + test6() } def toCodeInSeparateLines(lines: String*): String = lines.map(_ + "\n").mkString |